Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 0 additions & 13 deletions abi/bscvalidatorset.abi
Original file line number Diff line number Diff line change
Expand Up @@ -107,19 +107,6 @@
],
"stateMutability": "view"
},
{
"type": "function",
"name": "EPOCH",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"type": "function",
"name": "ERROR_FAIL_CHECK_VALIDATORS",
Expand Down
10 changes: 5 additions & 5 deletions contracts/BSCValidatorSet.sol
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica
hex"f905ec80f905e8f846942a7cdd959bfe8d9487b2a43b33565295a698f7e294b6a7edd747c0554875d3fc531d19ba1497992c5e941ff80f3f7f110ffd8920a3ac38fdef318fe94a3f86048c27395000f846946488aa4d1955ee33403f8ccb1d4de5fb97c7ade294220f003d8bdfaadf52aa1e55ae4cc485e6794875941a87e90e440a39c99aa9cb5cea0ad6a3f0b2407b86048c27395000f846949ef9f4360c606c7ab4db26b016007d3ad0ab86a0946103af86a874b705854033438383c82575f25bc29418e2db06cbff3e3c5f856410a1838649e760175786048c27395000f84694ee01c3b1283aa067c58eab4709f85e99d46de5fe94ee4b9bfb1871c64e2bcabb1dc382dc8b7c4218a29415904ab26ab0e99d70b51c220ccdcccabee6e29786048c27395000f84694685b1ded8013785d6623cc18d214320b6bb6475994a20ef4e5e4e7e36258dbf51f4d905114cb1b34bc9413e39085dc88704f4394d35209a02b1a9520320c86048c27395000f8469478f3adfc719c99674c072166708589033e2d9afe9448a30d5eaa7b64492a160f139e2da2800ec3834e94055838358c29edf4dcc1ba1985ad58aedbb6be2b86048c27395000f84694c2be4ec20253b8642161bc3f444f53679c1f3d479466f50c616d737e60d7ca6311ff0d9c434197898a94d1d678a2506eeaa365056fe565df8bc8659f28b086048c27395000f846942f7be8361c80a4c1e7e9aaf001d0877f1cfde218945f93992ac37f3e61db2ef8a587a436a161fd210b94ecbc4fb1a97861344dad0867ca3cba2b860411f086048c27395000f84694ce2fd7544e0b2cc94692d4a704debef7bcb613289444abc67b4b2fba283c582387f54c9cba7c34bafa948acc2ab395ded08bb75ce85bf0f95ad2abc51ad586048c27395000f84694b8f7166496996a7da21cf1f1b04d9b3e26a3d077946770572763289aac606e4f327c2f6cc1aa3b3e3b94882d745ed97d4422ca8da1c22ec49d880c4c097286048c27395000f846942d4c407bbe49438ed859fe965b140dcf1aab71a9943ad0939e120f33518fbba04631afe7a3ed6327b194b2bbb170ca4e499a2b0f3cc85ebfa6e8c4dfcbea86048c27395000f846946bbad7cf34b5fa511d8e963dbba288b1960e75d694853b0f6c324d1f4e76c8266942337ac1b0af1a229442498946a51ca5924552ead6fc2af08b94fcba648601d1a94a2000f846944430b3230294d12c6ab2aac5c2cd68e80b16b581947b107f4976a252a6939b771202c28e64e03f52d694795811a7f214084116949fc4f53cedbf189eeab28601d1a94a2000f84694ea0a6e3c511bbd10f4519ece37dc24887e11b55d946811ca77acfb221a49393c193f3a22db829fcc8e9464feb7c04830dd9ace164fc5c52b3f5a29e5018a8601d1a94a2000f846947ae2f5b9e386cd1b50a4550696d957cb4900f03a94e83bcc5077e6b873995c24bac871b5ad856047e19464e48d4057a90b233e026c1041e6012ada897fe88601d1a94a2000f8469482012708dafc9e1b880fd083b32182b869be8e09948e5adc73a2d233a1b496ed3115464dd6c7b887509428b383d324bc9a37f4e276190796ba5a8947f5ed8601d1a94a2000f8469422b81f8e175ffde54d797fe11eb03f9e3bf75f1d94a1c3ef7ca38d8ba80cce3bfc53ebd2903ed21658942767f7447f7b9b70313d4147b795414aecea54718601d1a94a2000f8469468bf0b8b6fb4e317a0f9d6f03eaf8ce6675bc60d94675cfe570b7902623f47e7f59c9664b5f5065dcf94d84f0d2e50bcf00f2fc476e1c57f5ca2d57f625b8601d1a94a2000f846948c4d90829ce8f72d0163c1d5cf348a862d5506309485c42a7b34309bee2ed6a235f86d16f059deec5894cc2cedc53f0fa6d376336efb67e43d167169f3b78601d1a94a2000f8469435e7a025f4da968de7e4d7e4004197917f4070f194b1182abaeeb3b4d8eba7e6a4162eac7ace23d57394c4fd0d870da52e73de2dd8ded19fe3d26f43a1138601d1a94a2000f84694d6caa02bbebaebb5d7e581e4b66559e635f805ff94c07335cf083c1c46a487f0325769d88e163b653694efaff03b42e41f953a925fc43720e45fb61a19938601d1a94a2000";

uint256 public constant INIT_NUM_OF_CABINETS = 21;
uint256 public constant EPOCH = 200; // TODO(Nathan): Only used as 'shuffle interval' in `getMiningValidators`; does not correspond to `epochLength` in the BSC client.

/*----------------- state of the contract -----------------*/
Validator[] public currentValidatorSet;
Expand Down Expand Up @@ -298,7 +297,7 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica
uint256 totalValue;
uint256 balanceOfSystemReward = address(SYSTEM_REWARD_ADDR).balance;
if (balanceOfSystemReward > MAX_SYSTEM_REWARD_BALANCE) {
// when a slash happens, theres will no rewards in some epochs,
// when a slash happens, theres will no rewards in some finalityReward intervals,
Comment thread
zzzckck marked this conversation as resolved.
// it's tolerated because slash happens rarely
totalValue = balanceOfSystemReward.sub(MAX_SYSTEM_REWARD_BALANCE);
} else {
Expand Down Expand Up @@ -385,6 +384,7 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica
function getMiningValidators() external view override returns (address[] memory, bytes[] memory) {
uint256 _maxNumOfWorkingCandidates = maxNumOfWorkingCandidates;
uint256 _numOfCabinets = numOfCabinets > 0 ? numOfCabinets : INIT_NUM_OF_CABINETS;
uint256 _shuffleInterval = 200;
Comment thread
buddh0 marked this conversation as resolved.

address[] memory validators = getValidators();
bytes[] memory voteAddrs = getVoteAddresses(validators);
Expand All @@ -396,7 +396,7 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica
_maxNumOfWorkingCandidates = validators.length - _numOfCabinets;
}
if (_maxNumOfWorkingCandidates > 0) {
uint256 shuffleNumber = block.number / EPOCH;
uint256 shuffleNumber = block.number / _shuffleInterval;
shuffle(
validators,
voteAddrs,
Expand Down Expand Up @@ -671,8 +671,8 @@ contract BSCValidatorSet is IBSCValidatorSet, System, IParamSubscriber, IApplica
require(value.length == 32, "length of turnLength mismatch");
uint256 newTurnLength = BytesToTypes.bytesToUint256(32, value);
require(
newTurnLength >= 3 && newTurnLength <= 9 || newTurnLength == 1,
"the turnLength should be in [3,9] or equal to 1"
newTurnLength >= 3 && newTurnLength <= 64 || newTurnLength == 1,
"the turnLength should be in [3,64] or equal to 1"
);
turnLength = newTurnLength;
} else {
Expand Down
2 changes: 1 addition & 1 deletion genesis-testnet.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion genesis.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"lint:write": "forge fmt ./contracts/BSCTimelock.sol ./contracts/GovToken.sol ./contracts/BSCGovernor.sol ./contracts/TokenRecoverPortal.sol ./contracts/StakeCredit.sol ./contracts/StakeHub.sol ./contracts/SystemV2.sol ",
"generate:mainnet": "poetry run python -m scripts.generate mainnet",
"generate:testnet": "poetry run python -m scripts.generate testnet",
"generate:dev": "poetry run python -m scripts.generate dev --epoch \"200\" --init-felony-slash-scope \"60\" --breathe-block-interval \"10 minutes\" --block-interval \"3 seconds\" --stake-hub-protector \"0x04d63aBCd2b9b1baa327f2Dda0f873F197ccd186\" --unbond-period \"2 minutes\" --downtime-jail-time \"2 minutes\" --felony-jail-time \"3 minutes\" --init-voting-delay \"1 minutes / BLOCK_INTERVAL\" --init-voting-period \"2 minutes / BLOCK_INTERVAL\" --init-min-period-after-quorum \"uint64(1 minutes / BLOCK_INTERVAL)\" --governor-protector \"0x04d63aBCd2b9b1baa327f2Dda0f873F197ccd186\" --init-minimal-delay \"1 minutes\""
"generate:dev": "poetry run python -m scripts.generate dev --init-felony-slash-scope \"60\" --breathe-block-interval \"10 minutes\" --block-interval \"3 seconds\" --stake-hub-protector \"0x04d63aBCd2b9b1baa327f2Dda0f873F197ccd186\" --unbond-period \"2 minutes\" --downtime-jail-time \"2 minutes\" --felony-jail-time \"3 minutes\" --init-voting-delay \"1 minutes / BLOCK_INTERVAL\" --init-voting-period \"2 minutes / BLOCK_INTERVAL\" --init-min-period-after-quorum \"uint64(1 minutes / BLOCK_INTERVAL)\" --governor-protector \"0x04d63aBCd2b9b1baa327f2Dda0f873F197ccd186\" --init-minimal-delay \"1 minutes\""
},
"dependencies": {
"@openzeppelin/contracts": "^4.9.3",
Expand Down
12 changes: 4 additions & 8 deletions scripts/generate.py
Original file line number Diff line number Diff line change
Expand Up @@ -201,15 +201,14 @@ def generate_token_recover_portal(source_chain_id, token_recover_portal_protecto
)


def generate_validator_set(init_validator_set_bytes, init_burn_ratio, epoch):
Comment thread
buddh0 marked this conversation as resolved.
def generate_validator_set(init_validator_set_bytes, init_burn_ratio):
contract = "BSCValidatorSet.sol"
backup_file(
os.path.join(work_dir, "contracts", contract), os.path.join(work_dir, "contracts", contract[:-4] + ".bak")
)

replace_parameter(contract, "uint256 public constant INIT_BURN_RATIO", f"{init_burn_ratio}")
replace_parameter(contract, "bytes public constant INIT_VALIDATORSET_BYTES", f"hex\"{init_validator_set_bytes}\"")
replace_parameter(contract, "uint256 public constant EPOCH", f"{epoch}")

if network == "dev":
insert(
Expand Down Expand Up @@ -262,7 +261,6 @@ def mainnet():
init_validator_set_bytes = "f905ec80f905e8f846942a7cdd959bfe8d9487b2a43b33565295a698f7e294b6a7edd747c0554875d3fc531d19ba1497992c5e941ff80f3f7f110ffd8920a3ac38fdef318fe94a3f86048c27395000f846946488aa4d1955ee33403f8ccb1d4de5fb97c7ade294220f003d8bdfaadf52aa1e55ae4cc485e6794875941a87e90e440a39c99aa9cb5cea0ad6a3f0b2407b86048c27395000f846949ef9f4360c606c7ab4db26b016007d3ad0ab86a0946103af86a874b705854033438383c82575f25bc29418e2db06cbff3e3c5f856410a1838649e760175786048c27395000f84694ee01c3b1283aa067c58eab4709f85e99d46de5fe94ee4b9bfb1871c64e2bcabb1dc382dc8b7c4218a29415904ab26ab0e99d70b51c220ccdcccabee6e29786048c27395000f84694685b1ded8013785d6623cc18d214320b6bb6475994a20ef4e5e4e7e36258dbf51f4d905114cb1b34bc9413e39085dc88704f4394d35209a02b1a9520320c86048c27395000f8469478f3adfc719c99674c072166708589033e2d9afe9448a30d5eaa7b64492a160f139e2da2800ec3834e94055838358c29edf4dcc1ba1985ad58aedbb6be2b86048c27395000f84694c2be4ec20253b8642161bc3f444f53679c1f3d479466f50c616d737e60d7ca6311ff0d9c434197898a94d1d678a2506eeaa365056fe565df8bc8659f28b086048c27395000f846942f7be8361c80a4c1e7e9aaf001d0877f1cfde218945f93992ac37f3e61db2ef8a587a436a161fd210b94ecbc4fb1a97861344dad0867ca3cba2b860411f086048c27395000f84694ce2fd7544e0b2cc94692d4a704debef7bcb613289444abc67b4b2fba283c582387f54c9cba7c34bafa948acc2ab395ded08bb75ce85bf0f95ad2abc51ad586048c27395000f84694b8f7166496996a7da21cf1f1b04d9b3e26a3d077946770572763289aac606e4f327c2f6cc1aa3b3e3b94882d745ed97d4422ca8da1c22ec49d880c4c097286048c27395000f846942d4c407bbe49438ed859fe965b140dcf1aab71a9943ad0939e120f33518fbba04631afe7a3ed6327b194b2bbb170ca4e499a2b0f3cc85ebfa6e8c4dfcbea86048c27395000f846946bbad7cf34b5fa511d8e963dbba288b1960e75d694853b0f6c324d1f4e76c8266942337ac1b0af1a229442498946a51ca5924552ead6fc2af08b94fcba648601d1a94a2000f846944430b3230294d12c6ab2aac5c2cd68e80b16b581947b107f4976a252a6939b771202c28e64e03f52d694795811a7f214084116949fc4f53cedbf189eeab28601d1a94a2000f84694ea0a6e3c511bbd10f4519ece37dc24887e11b55d946811ca77acfb221a49393c193f3a22db829fcc8e9464feb7c04830dd9ace164fc5c52b3f5a29e5018a8601d1a94a2000f846947ae2f5b9e386cd1b50a4550696d957cb4900f03a94e83bcc5077e6b873995c24bac871b5ad856047e19464e48d4057a90b233e026c1041e6012ada897fe88601d1a94a2000f8469482012708dafc9e1b880fd083b32182b869be8e09948e5adc73a2d233a1b496ed3115464dd6c7b887509428b383d324bc9a37f4e276190796ba5a8947f5ed8601d1a94a2000f8469422b81f8e175ffde54d797fe11eb03f9e3bf75f1d94a1c3ef7ca38d8ba80cce3bfc53ebd2903ed21658942767f7447f7b9b70313d4147b795414aecea54718601d1a94a2000f8469468bf0b8b6fb4e317a0f9d6f03eaf8ce6675bc60d94675cfe570b7902623f47e7f59c9664b5f5065dcf94d84f0d2e50bcf00f2fc476e1c57f5ca2d57f625b8601d1a94a2000f846948c4d90829ce8f72d0163c1d5cf348a862d5506309485c42a7b34309bee2ed6a235f86d16f059deec5894cc2cedc53f0fa6d376336efb67e43d167169f3b78601d1a94a2000f8469435e7a025f4da968de7e4d7e4004197917f4070f194b1182abaeeb3b4d8eba7e6a4162eac7ace23d57394c4fd0d870da52e73de2dd8ded19fe3d26f43a1138601d1a94a2000f84694d6caa02bbebaebb5d7e581e4b66559e635f805ff94c07335cf083c1c46a487f0325769d88e163b653694efaff03b42e41f953a925fc43720e45fb61a19938601d1a94a2000"
source_chain_id = "Binance-Chain-Tigris"

epoch = "200"
block_interval = "3 seconds"
breathe_block_interval = "1 days"
max_elected_validators = "45"
Expand All @@ -289,7 +287,7 @@ def mainnet():
generate_system_reward()
generate_gov_hub()
generate_slash_indicator(misdemeanor_threshold, felony_threshold, init_felony_slash_scope)
generate_validator_set(init_validator_set_bytes, init_burn_ratio, epoch)
generate_validator_set(init_validator_set_bytes, init_burn_ratio)
generate_token_recover_portal(source_chain_id, token_recover_portal_protector)
generate_stake_hub(
breathe_block_interval, max_elected_validators, unbond_period, downtime_jail_time, felony_jail_time,
Expand Down Expand Up @@ -318,7 +316,6 @@ def testnet():
init_validator_set_bytes = "f901a880f901a4f844941284214b9b9c85549ab3d2b972df0deef66ac2c9946ddf42a51534fc98d0c0a3b42c963cace8441ddf946ddf42a51534fc98d0c0a3b42c963cace8441ddf8410000000f84494a2959d3f95eae5dc7d70144ce1b73b403b7eb6e0948081ef03f1d9e0bb4a5bf38f16285c879299f07f948081ef03f1d9e0bb4a5bf38f16285c879299f07f8410000000f8449435552c16704d214347f29fa77f77da6d75d7c75294dc4973e838e3949c77aced16ac2315dc2d7ab11194dc4973e838e3949c77aced16ac2315dc2d7ab1118410000000f84494980a75ecd1309ea12fa2ed87a8744fbfc9b863d594cc6ac05c95a99c1f7b5f88de0e3486c82293b27094cc6ac05c95a99c1f7b5f88de0e3486c82293b2708410000000f84494f474cf03cceff28abc65c9cbae594f725c80e12d94e61a183325a18a173319dd8e19c8d069459e217594e61a183325a18a173319dd8e19c8d069459e21758410000000f84494b71b214cb885500844365e95cd9942c7276e7fd894d22ca3ba2141d23adab65ce4940eb7665ea2b6a794d22ca3ba2141d23adab65ce4940eb7665ea2b6a78410000000"
source_chain_id = "Binance-Chain-Ganges"

epoch = "200"
block_interval = "3 seconds"
breathe_block_interval = "1 days"
max_elected_validators = "9"
Expand All @@ -345,7 +342,7 @@ def testnet():
generate_system_reward()
generate_gov_hub()
generate_slash_indicator(misdemeanor_threshold, felony_threshold, init_felony_slash_scope)
generate_validator_set(init_validator_set_bytes, init_burn_ratio, epoch)
generate_validator_set(init_validator_set_bytes, init_burn_ratio)
generate_token_recover_portal(source_chain_id, token_recover_portal_protector)
generate_stake_hub(
breathe_block_interval, max_elected_validators, unbond_period, downtime_jail_time, felony_jail_time,
Expand All @@ -372,7 +369,6 @@ def dev(
governor_protector: Annotated[str, typer.Option(help="governorProtector of BSCGovernor")] = "address(0xdEaD)",
token_recover_portal_protector: Annotated[str,
typer.Option(help="protector of TokenRecoverPortal")] = "address(0xdEaD)",
epoch: str = "200",
block_interval: Annotated[str, typer.Option(help="block interval of Parlia")] = "3 seconds",
breathe_block_interval: Annotated[str, typer.Option(help="breath block interval of Parlia")] = "1 days",
max_elected_validators: Annotated[str, typer.Option(help="maxElectedValidators of StakeHub")] = "45",
Expand Down Expand Up @@ -420,7 +416,7 @@ def dev(
generate_system_reward()
generate_gov_hub()
generate_slash_indicator(misdemeanor_threshold, felony_threshold, init_felony_slash_scope)
generate_validator_set(init_validator_set_bytes, init_burn_ratio, epoch)
generate_validator_set(init_validator_set_bytes, init_burn_ratio)
generate_token_recover_portal(source_chain_id, token_recover_portal_protector)
generate_stake_hub(
breathe_block_interval, max_elected_validators, unbond_period, downtime_jail_time, felony_jail_time,
Expand Down
1 change: 0 additions & 1 deletion test/utils/interface/IBSCValidatorSet.sol
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@ interface BSCValidatorSet {
function CROSS_CHAIN_CONTRACT_ADDR() external view returns (address);
function CROSS_STAKE_CHANNELID() external view returns (uint8);
function DUSTY_INCOMING() external view returns (uint256);
function EPOCH() external view returns (uint256);
function ERROR_FAIL_CHECK_VALIDATORS() external view returns (uint32);
function ERROR_FAIL_DECODE() external view returns (uint32);
function ERROR_LEN_OF_VAL_MISMATCH() external view returns (uint32);
Expand Down
Loading