From 81ad724344e51f3e70ea951b9e366f826a5b9adc Mon Sep 17 00:00:00 2001 From: Huy Ngo Date: Tue, 15 Aug 2023 14:58:41 +0700 Subject: [PATCH 1/9] evm: add whitelist deployer v2 --- common/types.go | 2 ++ core/state/statedb.go | 4 ++++ core/state/statedb_utils.go | 34 ++++++++++++++++++++++++++++++++++ core/vm/evm.go | 15 +++++++++++---- core/vm/interface.go | 1 + params/config.go | 9 ++++++++- 6 files changed, 60 insertions(+), 5 deletions(-) diff --git a/common/types.go b/common/types.go index d6a206a6d2..4461b9a7bd 100644 --- a/common/types.go +++ b/common/types.go @@ -44,6 +44,8 @@ const ( AcknowledgementSC = "0x0000000000000000000000000000000000000022" // WhitelistDeployerSC is the address of whitelisted deployer WhitelistDeployerSC = "0x0000000000000000000000000000000000000033" + // WhitelistDeployerSCV2 is the address of whitelisted deployer V2, should replace + WhitelistDeployerSCV2 = "0x0000000000000000000000000000000000000033" ) var ( diff --git a/core/state/statedb.go b/core/state/statedb.go index 8dbddd3282..686289af2c 100644 --- a/core/state/statedb.go +++ b/core/state/statedb.go @@ -646,6 +646,10 @@ func (s *StateDB) ValidDeployer(addr common.Address) bool { return IsWhitelistedDeployer(s, addr) } +func (s *StateDB) ValidDeployerv2(addr common.Address, blockTime uint64) bool { + return IsWhitelistedDeployerV2(s, addr, blockTime) +} + func (s *StateDB) Blacklisted(contractAddr *common.Address, addr *common.Address) bool { return IsAddressBlacklisted(s, contractAddr, addr) } diff --git a/core/state/statedb_utils.go b/core/state/statedb_utils.go index 87535b5798..c35f4e005a 100644 --- a/core/state/statedb_utils.go +++ b/core/state/statedb_utils.go @@ -20,6 +20,10 @@ var ( WHITELISTED: 1, WHITELIST_ALL: 2, } + slotWhitelistDeployerMappingV2 = map[string]uint64{ + WHITELISTED: 53, + WHITELIST_ALL: 58, + } // Contract Infinity slotBlacklistContractMapping = map[string]uint64{ BLACKLISTED: 1, DISABLED: 2, @@ -32,11 +36,41 @@ var ( } ) +// IsWhitelistedDeployer reads the contract storage to check if an address is allow to deploy +func IsWhitelistedDeployerV2(statedb *StateDB, address common.Address, blockTime uint64) bool { + contract := common.HexToAddress(common.WhitelistDeployerSCV2) + whitelistAllSlot := slotWhitelistDeployerMappingV2[WHITELIST_ALL] + whitelistAll := statedb.GetState(contract, GetLocSimpleVariable(whitelistAllSlot)) + + if whitelistAll.Big().Cmp(big.NewInt(1)) == 0 { + return true + } + + whitelistedSlot := slotWhitelistDeployerMapping[WHITELISTED] + // whiteListed Have 2 fields, so we need to plus 1 + expiredLoc := GetLocMappingAtKey(address.Hash(), whitelistedSlot) + activatedLoc := common.BigToHash(expiredLoc.Big().Add(expiredLoc.Big(), common.Big1)) + expiredHash := statedb.GetState(contract, expiredLoc) + + activatedHash := statedb.GetState(contract, activatedLoc) + + // (whiteListInfo.activated && block.timestamp < whiteListInfo.expiryTimestamp) + // Compare expiredHash with Blockheader Timestamp + if activatedHash.Big().Cmp(big.NewInt(1)) == 0 { + if expiredHash.Big().Cmp(new(big.Int).SetUint64(blockTime)) > 0 { + // Block time still is in expiredTime + return true + } + } + return false +} + // IsWhitelistedDeployer reads the contract storage to check if an address is allow to deploy func IsWhitelistedDeployer(statedb *StateDB, address common.Address) bool { contract := common.HexToAddress(common.WhitelistDeployerSC) whitelistAllSlot := slotWhitelistDeployerMapping[WHITELIST_ALL] whitelistAll := statedb.GetState(contract, GetLocSimpleVariable(whitelistAllSlot)) + if whitelistAll.Big().Cmp(big.NewInt(1)) == 0 { return true } diff --git a/core/vm/evm.go b/core/vm/evm.go index e28a68c0a0..7cff090dd5 100644 --- a/core/vm/evm.go +++ b/core/vm/evm.go @@ -500,10 +500,17 @@ func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64, } } } - - if evm.chainRules.IsOdysseusFork && !evm.StateDB.ValidDeployer(caller.Address()) { - captureTraceEarly(ErrExecutionReverted) - return nil, common.Address{}, gas, ErrExecutionReverted + // Handle Latest Hardfork Firstly + if evm.chainRules.IsComingFork { + if !evm.StateDB.ValidDeployerv2(caller.Address(), evm.Context.Time) { + captureTraceEarly(ErrExecutionReverted) + return nil, common.Address{}, gas, ErrExecutionReverted + } + } else if evm.chainRules.IsOdysseusFork { + if !evm.StateDB.ValidDeployer(caller.Address()) { + captureTraceEarly(ErrExecutionReverted) + return nil, common.Address{}, gas, ErrExecutionReverted + } } // Depth check execution. Fail if we're trying to execute above the diff --git a/core/vm/interface.go b/core/vm/interface.go index a643e0bd05..a1ab809124 100644 --- a/core/vm/interface.go +++ b/core/vm/interface.go @@ -76,6 +76,7 @@ type StateDB interface { ForEachStorage(common.Address, func(common.Hash, common.Hash) bool) error ValidDeployer(common.Address) bool + ValidDeployerv2(common.Address, uint64) bool Blacklisted(*common.Address, *common.Address) bool } diff --git a/params/config.go b/params/config.go index 7f30af65f3..dc618d82f4 100644 --- a/params/config.go +++ b/params/config.go @@ -465,6 +465,7 @@ type ChainConfig struct { // Olek hardfork reduces the delay in block time of out of turn miner OlekBlock *big.Int `json:"olekBlock,omitempty"` // Olek switch block (nil = no fork, 0 = already on activated) + ComingForkBlock *big.Int `json:"comingForkBlock,omitempty"` // ComingForkBlock switch block (nil = no fork, 0 = already on activated) BlacklistContractAddress *common.Address `json:"blacklistContractAddress,omitempty"` // Address of Blacklist Contract (nil = no blacklist) FenixValidatorContractAddress *common.Address `json:"fenixValidatorContractAddress,omitempty"` // Address of Ronin Contract in the Fenix hardfork (nil = no blacklist) @@ -701,6 +702,11 @@ func (c *ChainConfig) IsOlek(num *big.Int) bool { return isForked(c.OlekBlock, num) } +// IsConsortiumV2 returns whether the num is equals to or larger than the consortiumV2 fork block. +func (c *ChainConfig) IsComingFork(num *big.Int) bool { + return isForked(c.ComingForkBlock, num) +} + // CheckCompatible checks whether scheduled fork transitions have been imported // with a mismatching chain configuration. func (c *ChainConfig) CheckCompatible(newcfg *ChainConfig, height uint64) *ConfigCompatError { @@ -888,7 +894,7 @@ type Rules struct { IsHomestead, IsEIP150, IsEIP155, IsEIP158 bool IsByzantium, IsConstantinople, IsPetersburg, IsIstanbul bool IsBerlin, IsLondon bool - IsOdysseusFork, IsFenix, IsConsortiumV2 bool + IsOdysseusFork, IsFenix, IsConsortiumV2, IsComingFork bool } // Rules ensures c's ChainID is not nil. @@ -912,5 +918,6 @@ func (c *ChainConfig) Rules(num *big.Int) Rules { IsOdysseusFork: c.IsOdysseus(num), IsFenix: c.IsFenix(num), IsConsortiumV2: c.IsConsortiumV2(num), + IsComingFork: c.IsComingFork(num), } } From 00a40c47e6ac11da6e5b229619ea7488d9ba99e6 Mon Sep 17 00:00:00 2001 From: Huy Ngo Date: Thu, 17 Aug 2023 13:45:00 +0700 Subject: [PATCH 2/9] statedb-utils: Add unit testing --- common/types.go | 3 + core/state/statedb_utils.go | 10 ++- core/vm/evm.go | 3 +- core/vm/statedb_utils_test.go | 125 ++++++++++++++++++++++++++++++++++ 4 files changed, 137 insertions(+), 4 deletions(-) create mode 100644 core/vm/statedb_utils_test.go diff --git a/common/types.go b/common/types.go index 4461b9a7bd..31bee90b0f 100644 --- a/common/types.go +++ b/common/types.go @@ -44,6 +44,9 @@ const ( AcknowledgementSC = "0x0000000000000000000000000000000000000022" // WhitelistDeployerSC is the address of whitelisted deployer WhitelistDeployerSC = "0x0000000000000000000000000000000000000033" +) + +var ( // WhitelistDeployerSCV2 is the address of whitelisted deployer V2, should replace WhitelistDeployerSCV2 = "0x0000000000000000000000000000000000000033" ) diff --git a/core/state/statedb_utils.go b/core/state/statedb_utils.go index c35f4e005a..145ceb63f8 100644 --- a/core/state/statedb_utils.go +++ b/core/state/statedb_utils.go @@ -46,8 +46,12 @@ func IsWhitelistedDeployerV2(statedb *StateDB, address common.Address, blockTime return true } - whitelistedSlot := slotWhitelistDeployerMapping[WHITELISTED] - // whiteListed Have 2 fields, so we need to plus 1 + whitelistedSlot := slotWhitelistDeployerMappingV2[WHITELISTED] + // WhiteListInfo have 2 fields, so we need to plus 1. + // struct WhiteListInfo { + // uint256 expiryTimestamp; + // bool activated; + // } expiredLoc := GetLocMappingAtKey(address.Hash(), whitelistedSlot) activatedLoc := common.BigToHash(expiredLoc.Big().Add(expiredLoc.Big(), common.Big1)) expiredHash := statedb.GetState(contract, expiredLoc) @@ -55,7 +59,7 @@ func IsWhitelistedDeployerV2(statedb *StateDB, address common.Address, blockTime activatedHash := statedb.GetState(contract, activatedLoc) // (whiteListInfo.activated && block.timestamp < whiteListInfo.expiryTimestamp) - // Compare expiredHash with Blockheader Timestamp + // Compare expiredHash with Blockheader timestamp. if activatedHash.Big().Cmp(big.NewInt(1)) == 0 { if expiredHash.Big().Cmp(new(big.Int).SetUint64(blockTime)) > 0 { // Block time still is in expiredTime diff --git a/core/vm/evm.go b/core/vm/evm.go index 7cff090dd5..ee25137dd6 100644 --- a/core/vm/evm.go +++ b/core/vm/evm.go @@ -500,7 +500,7 @@ func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64, } } } - // Handle Latest Hardfork Firstly + // Handle latest hardfork firstly. if evm.chainRules.IsComingFork { if !evm.StateDB.ValidDeployerv2(caller.Address(), evm.Context.Time) { captureTraceEarly(ErrExecutionReverted) @@ -524,6 +524,7 @@ func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64, return nil, common.Address{}, gas, ErrInsufficientBalance } nonce := evm.StateDB.GetNonce(caller.Address()) + if nonce+1 < nonce { captureTraceEarly(ErrNonceUintOverflow) return nil, common.Address{}, gas, ErrNonceUintOverflow diff --git a/core/vm/statedb_utils_test.go b/core/vm/statedb_utils_test.go new file mode 100644 index 0000000000..1ff66998a9 --- /dev/null +++ b/core/vm/statedb_utils_test.go @@ -0,0 +1,125 @@ +package vm + +import ( + "strings" + "testing" + "time" + + "math/big" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" +) + +const ( + constructor = "constructor" + initialize = "initialize" + whitelist = "whitelist" +) + +var ( + logicAbi = `[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ErrInvalidExpirationTime","type":"error"},{"inputs":[],"name":"ErrSentryAttemptsToWhitelistABlacklistUser","type":"error"},{"inputs":[],"name":"ErrSentryAttemptsToWhitelistNewComer","type":"error"},{"inputs":[],"name":"ErrUnwhitelistANewcomer","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"whitelistee","type":"address"}],"name":"DeployerUnwhitelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"deployer","type":"address"},{"indexed":true,"internalType":"uint256","name":"expireTime","type":"uint256"}],"name":"DeployerWhitelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"WhitelistAllChanged","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SENTRY_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllWhitelistedAddresses","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"deployer","type":"address"}],"name":"getWhitelistInfo","outputs":[{"components":[{"internalType":"uint256","name":"expiryTimestamp","type":"uint256"},{"internalType":"bool","name":"activated","type":"bool"}],"internalType":"struct IWhitelistDeployerV2.WhiteListInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address[]","name":"sentries","type":"address[]"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isWhitelistAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"deployer","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"whitelistee","type":"address"}],"name":"unwhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"deployer","type":"address"},{"internalType":"uint256","name":"expiryTimestamp","type":"uint256"}],"name":"whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"whitelistAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]` + proxyAbi = `[{"inputs":[{"internalType":"address","name":"_logic","type":"address"},{"internalType":"address","name":"admin_","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"admin_","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"changeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"implementation_","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]` +) +var ( + proxyAdminCaller = common.BytesToAddress([]byte("proxy_admin")) + adminCaller = common.BytesToAddress([]byte("admin")) + whitelistedCaller = common.BytesToAddress([]byte("whitelisted")) + whitelistDeployerV2 = `0x608060405234801561001057600080fd5b5061001961001e565b6100de565b600054610100900460ff161561008a5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811610156100dc576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b61129c806100ed6000396000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c806391d14854116100a2578063a217fddf11610071578063a217fddf1461025a578063a2b21fbe14610262578063b56eebfb146102d9578063ca15c873146102ee578063d547741f1461030157600080fd5b806391d148541461020e578063946d92041461022157806398fc55d8146102345780639a5904271461024757600080fd5b806336568abe116100e957806336568abe1461019d5780633af32abf146101b057806358881877146101c35780637a9ad019146101ce5780639010d07c146101e357600080fd5b806301ffc9a71461011b5780630c9a347114610143578063248a9ca3146101585780632f2ff15d1461018a575b600080fd5b61012e610129366004610e78565b610314565b60405190151581526020015b60405180910390f35b610156610151366004610ea2565b61033f565b005b61017c610166366004610ec4565b6000908152600160208190526040909120015490565b60405190815260200161013a565b610156610198366004610ef9565b610388565b6101566101ab366004610ef9565b6103b3565b61012e6101be366004610f25565b610436565b603a5460ff1661012e565b61017c60008051602061124783398151915281565b6101f66101f1366004610f40565b610493565b6040516001600160a01b03909116815260200161013a565b61012e61021c366004610ef9565b6104ab565b61015661022f366004610f78565b6104d6565b610156610242366004611050565b61064e565b610156610255366004610f25565b6107b8565b61017c600081565b6102bc610270366004610f25565b6040805180820190915260008082526020820152506001600160a01b03166000908152603560209081526040918290208251808401909352805483526001015460ff1615159082015290565b60408051825181526020928301511515928101929092520161013a565b6102e161088a565b60405161013a919061107a565b61017c6102fc366004610ec4565b61089b565b61015661030f366004610ef9565b6108b2565b60006001600160e01b03198216635a05180f60e01b14806103395750610339826108d8565b92915050565b600061034a8161090d565b603a805460ff19168315159081179091556040517ff00cf1f0ddd6809f07fa6905b1b604c167671d7164140306bba41f906a637ff190600090a25050565b600082815260016020819052604090912001546103a48161090d565b6103ae838361091a565b505050565b6001600160a01b03811633146104285760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b610432828261093c565b5050565b6001600160a01b03811660009081526035602090815260408083208151808301909252805482526001015460ff908116151592820192909252603a549091168061048c57508060200151801561048c5750805142105b9392505050565b600082815260026020526040812061048c908361095e565b60009182526001602090815260408084206001600160a01b0393909316845291905290205460ff1690565b600054610100900460ff16158080156104f65750600054600160ff909116105b806105105750303b158015610510575060005460ff166001145b6105735760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161041f565b6000805460ff191660011790558015610596576000805461ff0019166101001790555b6105a160008461096a565b6105b96000805160206112478339815191528461096a565b815160005b81811015610602576105fa60008051602061124783398151915260001b8583815181106105ed576105ed6110c7565b602002602001015161096a565b6001016105be565b505080156103ae576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b6000805160206112478339815191526106668161090d565b4282101561068757604051635e39e99160e01b815260040160405180910390fd5b600061069381336104ab565b9050801580156106b957506001600160a01b038416600090815260356020526040902054155b156106d75760405163c582584160e01b815260040160405180910390fd5b801580156106eb57506106eb603885610974565b1561070957604051635fe23e4760e11b815260040160405180910390fd5b801561071c5761071a603885610996565b505b604080518082018252848152600160208083018281526001600160a01b038916600090815260359092529390209151825591519101805460ff191691151591909117905561076b603685610974565b61077c5761077a6036856109ab565b505b60405183906001600160a01b038616907f22531653f928681e9a83363bb12d972f8786e8c347e11701a49bbb9f271e8b8f90600090a350505050565b6000805160206112478339815191526107d08161090d565b6001600160a01b03821660009081526035602052604090205461080657604051630c991be760e41b815260040160405180910390fd5b6108116000336104ab565b15610823576108216038836109ab565b505b6001600160a01b0382166000908152603560205260409020600101805460ff19169055610851603683610996565b506040516001600160a01b038316907ff59a1a5f5e0d0f307930cd1547cff18d2a34715a97cbd8c0dc7a3b122c5e8cfc90600090a25050565b606061089660366109c0565b905090565b6000818152600260205260408120610339906109cd565b600082815260016020819052604090912001546108ce8161090d565b6103ae838361093c565b60006001600160e01b03198216637965db0b60e01b148061033957506301ffc9a760e01b6001600160e01b0319831614610339565b61091781336109d7565b50565b6109248282610a30565b60008281526002602052604090206103ae90826109ab565b6109468282610a9b565b60008281526002602052604090206103ae9082610996565b600061048c8383610b02565b610432828261091a565b6001600160a01b0381166000908152600183016020526040812054151561048c565b600061048c836001600160a01b038416610b2c565b600061048c836001600160a01b038416610c1f565b6060600061048c83610c6e565b6000610339825490565b6109e182826104ab565b610432576109ee81610cca565b6109f9836020610cdc565b604051602001610a0a92919061110d565b60408051601f198184030181529082905262461bcd60e51b825261041f91600401611182565b610a3a82826104ab565b6104325760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b610aa582826104ab565b156104325760008281526001602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000826000018281548110610b1957610b196110c7565b9060005260206000200154905092915050565b60008181526001830160205260408120548015610c15576000610b506001836111cb565b8554909150600090610b64906001906111cb565b9050818114610bc9576000866000018281548110610b8457610b846110c7565b9060005260206000200154905080876000018481548110610ba757610ba76110c7565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610bda57610bda6111e2565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610339565b6000915050610339565b6000818152600183016020526040812054610c6657508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610339565b506000610339565b606081600001805480602002602001604051908101604052809291908181526020018280548015610cbe57602002820191906000526020600020905b815481526020019060010190808311610caa575b50505050509050919050565b60606103396001600160a01b03831660145b60606000610ceb8360026111f8565b610cf6906002611217565b67ffffffffffffffff811115610d0e57610d0e610f62565b6040519080825280601f01601f191660200182016040528015610d38576020820181803683370190505b509050600360fc1b81600081518110610d5357610d536110c7565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610d8257610d826110c7565b60200101906001600160f81b031916908160001a9053506000610da68460026111f8565b610db1906001611217565b90505b6001811115610e29576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610de557610de56110c7565b1a60f81b828281518110610dfb57610dfb6110c7565b60200101906001600160f81b031916908160001a90535060049490941c93610e228161122f565b9050610db4565b50831561048c5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161041f565b600060208284031215610e8a57600080fd5b81356001600160e01b03198116811461048c57600080fd5b600060208284031215610eb457600080fd5b8135801515811461048c57600080fd5b600060208284031215610ed657600080fd5b5035919050565b80356001600160a01b0381168114610ef457600080fd5b919050565b60008060408385031215610f0c57600080fd5b82359150610f1c60208401610edd565b90509250929050565b600060208284031215610f3757600080fd5b61048c82610edd565b60008060408385031215610f5357600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215610f8b57600080fd5b610f9483610edd565b915060208084013567ffffffffffffffff80821115610fb257600080fd5b818601915086601f830112610fc657600080fd5b813581811115610fd857610fd8610f62565b8060051b604051601f19603f83011681018181108582111715610ffd57610ffd610f62565b60405291825284820192508381018501918983111561101b57600080fd5b938501935b828510156110405761103185610edd565b84529385019392850192611020565b8096505050505050509250929050565b6000806040838503121561106357600080fd5b61106c83610edd565b946020939093013593505050565b6020808252825182820181905260009190848201906040850190845b818110156110bb5783516001600160a01b031683529284019291840191600101611096565b50909695505050505050565b634e487b7160e01b600052603260045260246000fd5b60005b838110156110f85781810151838201526020016110e0565b83811115611107576000848401525b50505050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516111458160178501602088016110dd565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516111768160288401602088016110dd565b01602801949350505050565b60208152600082518060208401526111a18160408501602087016110dd565b601f01601f19169190910160400192915050565b634e487b7160e01b600052601160045260246000fd5b6000828210156111dd576111dd6111b5565b500390565b634e487b7160e01b600052603160045260246000fd5b6000816000190483118215151615611212576112126111b5565b500290565b6000821982111561122a5761122a6111b5565b500190565b60008161123e5761123e6111b5565b50600019019056fe5bea60102f2a7acc9e82b1af0e3bd4069661102bb5dd143a6051cd1980dded1ca2646970667358221220b4d9959f15bc892573e6f71b852604f5081ee3b420ea1c54a21fd40b7186e45864736f6c63430008090033` + proxy = `0x608060405260405162000e9838038062000e9883398101604081905262000026916200049d565b828162000036828260006200004d565b50620000449050826200008a565b505050620005d0565b6200005883620000e5565b600082511180620000665750805b1562000085576200008383836200012760201b620002601760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620000b562000156565b604080516001600160a01b03928316815291841660208301520160405180910390a1620000e2816200018f565b50565b620000f08162000244565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606200014f838360405180606001604052806027815260200162000e7160279139620002f8565b9392505050565b60006200018060008051602062000e5183398151915260001b6200037760201b620002081760201c565b546001600160a01b0316919050565b6001600160a01b038116620001fa5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b806200022360008051602062000e5183398151915260001b6200037760201b620002081760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b6200025a816200037a60201b6200028c1760201c565b620002be5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401620001f1565b80620002237f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6200037760201b620002081760201c565b6060600080856001600160a01b0316856040516200031791906200057d565b600060405180830381855af49150503d806000811462000354576040519150601f19603f3d011682016040523d82523d6000602084013e62000359565b606091505b5090925090506200036d8683838762000389565b9695505050505050565b90565b6001600160a01b03163b151590565b60608315620003fa578251620003f2576001600160a01b0385163b620003f25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620001f1565b508162000406565b6200040683836200040e565b949350505050565b8151156200041f5781518083602001fd5b8060405162461bcd60e51b8152600401620001f191906200059b565b80516001600160a01b03811681146200045357600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200048b57818101518382015260200162000471565b83811115620000835750506000910152565b600080600060608486031215620004b357600080fd5b620004be846200043b565b9250620004ce602085016200043b565b60408501519092506001600160401b0380821115620004ec57600080fd5b818601915086601f8301126200050157600080fd5b81518181111562000516576200051662000458565b604051601f8201601f19908116603f0116810190838211818310171562000541576200054162000458565b816040528281528960208487010111156200055b57600080fd5b6200056e8360208301602088016200046e565b80955050505050509250925092565b60008251620005918184602087016200046e565b9190910192915050565b6020815260008251806020840152620005bc8160408501602087016200046e565b601f01601f19169190910160400192915050565b61087180620005e06000396000f3fe60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106fb565b610118565b61005b610093366004610716565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106fb565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b606061028583836040518060600160405280602781526020016108156027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb610492565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a4836104ba565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a1610154816104fa565b6060600080856001600160a01b03168560405161043791906107c5565b600060405180830381855af49150503d8060008114610472576040519150601f19603f3d011682016040523d82523d6000602084013e610477565b606091505b5091509150610488868383876105a3565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b6104c381610621565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b03811661055f5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060831561060f578251610608576001600160a01b0385163b6106085760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610331565b5081610619565b61061983836106b5565b949350505050565b6001600160a01b0381163b61068e5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610582565b8151156106c55781518083602001fd5b8060405162461bcd60e51b815260040161033191906107e1565b80356001600160a01b03811681146106f657600080fd5b919050565b60006020828403121561070d57600080fd5b610285826106df565b60008060006040848603121561072b57600080fd5b610734846106df565b9250602084013567ffffffffffffffff8082111561075157600080fd5b818601915086601f83011261076557600080fd5b81358181111561077457600080fd5b87602082850101111561078657600080fd5b6020830194508093505050509250925092565b60005b838110156107b457818101518382015260200161079c565b838111156103c05750506000910152565b600082516107d7818460208701610799565b9190910192915050565b6020815260008251806020840152610800816040850160208701610799565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220dfbb6eecea80a23ea461c16e5f8a63f5102b824e0a1a1588bae31fe9b473de3264736f6c63430008090033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564` + mockSC = `60806040523480156200001157600080fd5b506040518060200160405280600081525062000033816200005a60201b60201c565b5062000054620000486200006f60201b60201c565b6200007760201b60201c565b6200049e565b80600290816200006b9190620003b7565b5050565b600033905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620001bf57607f821691505b602082108103620001d557620001d462000177565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200023f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000200565b6200024b868362000200565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000298620002926200028c8462000263565b6200026d565b62000263565b9050919050565b6000819050919050565b620002b48362000277565b620002cc620002c3826200029f565b8484546200020d565b825550505050565b600090565b620002e3620002d4565b620002f0818484620002a9565b505050565b5b8181101562000318576200030c600082620002d9565b600181019050620002f6565b5050565b601f82111562000367576200033181620001db565b6200033c84620001f0565b810160208510156200034c578190505b620003646200035b85620001f0565b830182620002f5565b50505b505050565b600082821c905092915050565b60006200038c600019846008026200036c565b1980831691505092915050565b6000620003a7838362000379565b9150826002028217905092915050565b620003c2826200013d565b67ffffffffffffffff811115620003de57620003dd62000148565b5b620003ea8254620001a6565b620003f78282856200031c565b600060209050601f8311600181146200042f57600084156200041a578287015190505b62000426858262000399565b86555062000496565b601f1984166200043f86620001db565b60005b82811015620004695784890151825560018201915060208501945060208101905062000442565b8683101562000489578489015162000485601f89168262000379565b8355505b6001600288020188555050505b505050505050565b6132ab80620004ae6000396000f3fe608060405234801561001057600080fd5b50600436106100e95760003560e01c8063715018a61161008c578063a22cb46511610066578063a22cb46514610246578063e985e9c514610262578063f242432a14610292578063f2fde38b146102ae576100e9565b8063715018a614610202578063731133e91461020c5780638da5cb5b14610228576100e9565b80630e89341c116100c85780630e89341c1461016a5780631f7fdffa1461019a5780632eb2c2d6146101b65780634e1273f4146101d2576100e9565b8062fdd58e146100ee57806301ffc9a71461011e57806302fe53051461014e575b600080fd5b61010860048036038101906101039190611ae6565b6102ca565b6040516101159190611b35565b60405180910390f35b61013860048036038101906101339190611ba8565b610392565b6040516101459190611bf0565b60405180910390f35b61016860048036038101906101639190611d51565b610474565b005b610184600480360381019061017f9190611d9a565b610488565b6040516101919190611e46565b60405180910390f35b6101b460048036038101906101af9190611fd1565b61051c565b005b6101d060048036038101906101cb919061208c565b610536565b005b6101ec60048036038101906101e7919061221e565b6105d7565b6040516101f99190612354565b60405180910390f35b61020a6106f0565b005b61022660048036038101906102219190612376565b610704565b005b61023061071e565b60405161023d9190612408565b60405180910390f35b610260600480360381019061025b919061244f565b610748565b005b61027c6004803603810190610277919061248f565b61075e565b6040516102899190611bf0565b60405180910390f35b6102ac60048036038101906102a791906124cf565b6107f2565b005b6102c860048036038101906102c39190612566565b610893565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361033a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033190612605565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061045d57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061046d575061046c82610916565b5b9050919050565b61047c610980565b610485816109fe565b50565b60606002805461049790612654565b80601f01602080910402602001604051908101604052809291908181526020018280546104c390612654565b80156105105780601f106104e557610100808354040283529160200191610510565b820191906000526020600020905b8154815290600101906020018083116104f357829003601f168201915b50505050509050919050565b610524610980565b61053084848484610a11565b50505050565b61053e610c3d565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061058457506105838561057e610c3d565b61075e565b5b6105c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ba906126f7565b60405180910390fd5b6105d08585858585610c45565b5050505050565b6060815183511461061d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061490612789565b60405180910390fd5b6000835167ffffffffffffffff81111561063a57610639611c26565b5b6040519080825280602002602001820160405280156106685781602001602082028036833780820191505090505b50905060005b84518110156106e5576106b585828151811061068d5761068c6127a9565b5b60200260200101518583815181106106a8576106a76127a9565b5b60200260200101516102ca565b8282815181106106c8576106c76127a9565b5b602002602001018181525050806106de90612807565b905061066e565b508091505092915050565b6106f8610980565b6107026000610f66565b565b61070c610980565b6107188484848461102c565b50505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61075a610753610c3d565b83836111dc565b5050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6107fa610c3d565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610840575061083f8561083a610c3d565b61075e565b5b61087f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610876906126f7565b60405180910390fd5b61088c8585858585611348565b5050505050565b61089b610980565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361090a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610901906128c1565b60405180910390fd5b61091381610f66565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610988610c3d565b73ffffffffffffffffffffffffffffffffffffffff166109a661071e565b73ffffffffffffffffffffffffffffffffffffffff16146109fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f39061292d565b60405180910390fd5b565b8060029081610a0d9190612af9565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7790612c3d565b60405180910390fd5b8151835114610ac4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abb90612ccf565b60405180910390fd5b6000610ace610c3d565b9050610adf816000878787876115e3565b60005b8451811015610b9857838181518110610afe57610afd6127a9565b5b6020026020010151600080878481518110610b1c57610b1b6127a9565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b7e9190612cef565b925050819055508080610b9090612807565b915050610ae2565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610c10929190612d23565b60405180910390a4610c27816000878787876115eb565b610c36816000878787876115f3565b5050505050565b600033905090565b8151835114610c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8090612ccf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610cf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cef90612dcc565b60405180910390fd5b6000610d02610c3d565b9050610d128187878787876115e3565b60005b8451811015610ec3576000858281518110610d3357610d326127a9565b5b602002602001015190506000858381518110610d5257610d516127a9565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dea90612e5e565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610ea89190612cef565b9250508190555050505080610ebc90612807565b9050610d15565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610f3a929190612d23565b60405180910390a4610f508187878787876115eb565b610f5e8187878787876115f3565b505050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361109b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109290612c3d565b60405180910390fd5b60006110a5610c3d565b905060006110b2856117ca565b905060006110bf856117ca565b90506110d0836000898585896115e3565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461112f9190612cef565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516111ad929190612e7e565b60405180910390a46111c4836000898585896115eb565b6111d383600089898989611844565b50505050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361124a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124190612f19565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161133b9190611bf0565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036113b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ae90612dcc565b60405180910390fd5b60006113c1610c3d565b905060006113ce856117ca565b905060006113db856117ca565b90506113eb8389898585896115e3565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015611482576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147990612e5e565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115379190612cef565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a6040516115b4929190612e7e565b60405180910390a46115ca848a8a86868a6115eb565b6115d8848a8a8a8a8a611844565b505050505050505050565b505050505050565b505050505050565b6116128473ffffffffffffffffffffffffffffffffffffffff16611a1b565b156117c2578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401611658959493929190612f8e565b6020604051808303816000875af192505050801561169457506040513d601f19601f82011682018060405250810190611691919061300b565b60015b611739576116a0613045565b806308c379a0036116fc57506116b4613067565b806116bf57506116fe565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f39190611e46565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173090613169565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146117c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b7906131fb565b60405180910390fd5b505b505050505050565b60606000600167ffffffffffffffff8111156117e9576117e8611c26565b5b6040519080825280602002602001820160405280156118175781602001602082028036833780820191505090505b509050828160008151811061182f5761182e6127a9565b5b60200260200101818152505080915050919050565b6118638473ffffffffffffffffffffffffffffffffffffffff16611a1b565b15611a13578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016118a995949392919061321b565b6020604051808303816000875af19250505080156118e557506040513d601f19601f820116820180604052508101906118e2919061300b565b60015b61198a576118f1613045565b806308c379a00361194d5750611905613067565b80611910575061194f565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119449190611e46565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198190613169565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611a11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a08906131fb565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611a7d82611a52565b9050919050565b611a8d81611a72565b8114611a9857600080fd5b50565b600081359050611aaa81611a84565b92915050565b6000819050919050565b611ac381611ab0565b8114611ace57600080fd5b50565b600081359050611ae081611aba565b92915050565b60008060408385031215611afd57611afc611a48565b5b6000611b0b85828601611a9b565b9250506020611b1c85828601611ad1565b9150509250929050565b611b2f81611ab0565b82525050565b6000602082019050611b4a6000830184611b26565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611b8581611b50565b8114611b9057600080fd5b50565b600081359050611ba281611b7c565b92915050565b600060208284031215611bbe57611bbd611a48565b5b6000611bcc84828501611b93565b91505092915050565b60008115159050919050565b611bea81611bd5565b82525050565b6000602082019050611c056000830184611be1565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611c5e82611c15565b810181811067ffffffffffffffff82111715611c7d57611c7c611c26565b5b80604052505050565b6000611c90611a3e565b9050611c9c8282611c55565b919050565b600067ffffffffffffffff821115611cbc57611cbb611c26565b5b611cc582611c15565b9050602081019050919050565b82818337600083830152505050565b6000611cf4611cef84611ca1565b611c86565b905082815260208101848484011115611d1057611d0f611c10565b5b611d1b848285611cd2565b509392505050565b600082601f830112611d3857611d37611c0b565b5b8135611d48848260208601611ce1565b91505092915050565b600060208284031215611d6757611d66611a48565b5b600082013567ffffffffffffffff811115611d8557611d84611a4d565b5b611d9184828501611d23565b91505092915050565b600060208284031215611db057611daf611a48565b5b6000611dbe84828501611ad1565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611e01578082015181840152602081019050611de6565b60008484015250505050565b6000611e1882611dc7565b611e228185611dd2565b9350611e32818560208601611de3565b611e3b81611c15565b840191505092915050565b60006020820190508181036000830152611e608184611e0d565b905092915050565b600067ffffffffffffffff821115611e8357611e82611c26565b5b602082029050602081019050919050565b600080fd5b6000611eac611ea784611e68565b611c86565b90508083825260208201905060208402830185811115611ecf57611ece611e94565b5b835b81811015611ef85780611ee48882611ad1565b845260208401935050602081019050611ed1565b5050509392505050565b600082601f830112611f1757611f16611c0b565b5b8135611f27848260208601611e99565b91505092915050565b600067ffffffffffffffff821115611f4b57611f4a611c26565b5b611f5482611c15565b9050602081019050919050565b6000611f74611f6f84611f30565b611c86565b905082815260208101848484011115611f9057611f8f611c10565b5b611f9b848285611cd2565b509392505050565b600082601f830112611fb857611fb7611c0b565b5b8135611fc8848260208601611f61565b91505092915050565b60008060008060808587031215611feb57611fea611a48565b5b6000611ff987828801611a9b565b945050602085013567ffffffffffffffff81111561201a57612019611a4d565b5b61202687828801611f02565b935050604085013567ffffffffffffffff81111561204757612046611a4d565b5b61205387828801611f02565b925050606085013567ffffffffffffffff81111561207457612073611a4d565b5b61208087828801611fa3565b91505092959194509250565b600080600080600060a086880312156120a8576120a7611a48565b5b60006120b688828901611a9b565b95505060206120c788828901611a9b565b945050604086013567ffffffffffffffff8111156120e8576120e7611a4d565b5b6120f488828901611f02565b935050606086013567ffffffffffffffff81111561211557612114611a4d565b5b61212188828901611f02565b925050608086013567ffffffffffffffff81111561214257612141611a4d565b5b61214e88828901611fa3565b9150509295509295909350565b600067ffffffffffffffff82111561217657612175611c26565b5b602082029050602081019050919050565b600061219a6121958461215b565b611c86565b905080838252602082019050602084028301858111156121bd576121bc611e94565b5b835b818110156121e657806121d28882611a9b565b8452602084019350506020810190506121bf565b5050509392505050565b600082601f83011261220557612204611c0b565b5b8135612215848260208601612187565b91505092915050565b6000806040838503121561223557612234611a48565b5b600083013567ffffffffffffffff81111561225357612252611a4d565b5b61225f858286016121f0565b925050602083013567ffffffffffffffff8111156122805761227f611a4d565b5b61228c85828601611f02565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6122cb81611ab0565b82525050565b60006122dd83836122c2565b60208301905092915050565b6000602082019050919050565b600061230182612296565b61230b81856122a1565b9350612316836122b2565b8060005b8381101561234757815161232e88826122d1565b9750612339836122e9565b92505060018101905061231a565b5085935050505092915050565b6000602082019050818103600083015261236e81846122f6565b905092915050565b600080600080608085870312156123905761238f611a48565b5b600061239e87828801611a9b565b94505060206123af87828801611ad1565b93505060406123c087828801611ad1565b925050606085013567ffffffffffffffff8111156123e1576123e0611a4d565b5b6123ed87828801611fa3565b91505092959194509250565b61240281611a72565b82525050565b600060208201905061241d60008301846123f9565b92915050565b61242c81611bd5565b811461243757600080fd5b50565b60008135905061244981612423565b92915050565b6000806040838503121561246657612465611a48565b5b600061247485828601611a9b565b92505060206124858582860161243a565b9150509250929050565b600080604083850312156124a6576124a5611a48565b5b60006124b485828601611a9b565b92505060206124c585828601611a9b565b9150509250929050565b600080600080600060a086880312156124eb576124ea611a48565b5b60006124f988828901611a9b565b955050602061250a88828901611a9b565b945050604061251b88828901611ad1565b935050606061252c88828901611ad1565b925050608086013567ffffffffffffffff81111561254d5761254c611a4d565b5b61255988828901611fa3565b9150509295509295909350565b60006020828403121561257c5761257b611a48565b5b600061258a84828501611a9b565b91505092915050565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b60006125ef602a83611dd2565b91506125fa82612593565b604082019050919050565b6000602082019050818103600083015261261e816125e2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061266c57607f821691505b60208210810361267f5761267e612625565b5b50919050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b60006126e1602e83611dd2565b91506126ec82612685565b604082019050919050565b60006020820190508181036000830152612710816126d4565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b6000612773602983611dd2565b915061277e82612717565b604082019050919050565b600060208201905081810360008301526127a281612766565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061281282611ab0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612844576128436127d8565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006128ab602683611dd2565b91506128b68261284f565b604082019050919050565b600060208201905081810360008301526128da8161289e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612917602083611dd2565b9150612922826128e1565b602082019050919050565b600060208201905081810360008301526129468161290a565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026129af7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612972565b6129b98683612972565b95508019841693508086168417925050509392505050565b6000819050919050565b60006129f66129f16129ec84611ab0565b6129d1565b611ab0565b9050919050565b6000819050919050565b612a10836129db565b612a24612a1c826129fd565b84845461297f565b825550505050565b600090565b612a39612a2c565b612a44818484612a07565b505050565b5b81811015612a6857612a5d600082612a31565b600181019050612a4a565b5050565b601f821115612aad57612a7e8161294d565b612a8784612962565b81016020851015612a96578190505b612aaa612aa285612962565b830182612a49565b50505b505050565b600082821c905092915050565b6000612ad060001984600802612ab2565b1980831691505092915050565b6000612ae98383612abf565b9150826002028217905092915050565b612b0282611dc7565b67ffffffffffffffff811115612b1b57612b1a611c26565b5b612b258254612654565b612b30828285612a6c565b600060209050601f831160018114612b635760008415612b51578287015190505b612b5b8582612add565b865550612bc3565b601f198416612b718661294d565b60005b82811015612b9957848901518255600182019150602085019450602081019050612b74565b86831015612bb65784890151612bb2601f891682612abf565b8355505b6001600288020188555050505b505050505050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000612c27602183611dd2565b9150612c3282612bcb565b604082019050919050565b60006020820190508181036000830152612c5681612c1a565b9050919050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000612cb9602883611dd2565b9150612cc482612c5d565b604082019050919050565b60006020820190508181036000830152612ce881612cac565b9050919050565b6000612cfa82611ab0565b9150612d0583611ab0565b9250828201905080821115612d1d57612d1c6127d8565b5b92915050565b60006040820190508181036000830152612d3d81856122f6565b90508181036020830152612d5181846122f6565b90509392505050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612db6602583611dd2565b9150612dc182612d5a565b604082019050919050565b60006020820190508181036000830152612de581612da9565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000612e48602a83611dd2565b9150612e5382612dec565b604082019050919050565b60006020820190508181036000830152612e7781612e3b565b9050919050565b6000604082019050612e936000830185611b26565b612ea06020830184611b26565b9392505050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000612f03602983611dd2565b9150612f0e82612ea7565b604082019050919050565b60006020820190508181036000830152612f3281612ef6565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000612f6082612f39565b612f6a8185612f44565b9350612f7a818560208601611de3565b612f8381611c15565b840191505092915050565b600060a082019050612fa360008301886123f9565b612fb060208301876123f9565b8181036040830152612fc281866122f6565b90508181036060830152612fd681856122f6565b90508181036080830152612fea8184612f55565b90509695505050505050565b60008151905061300581611b7c565b92915050565b60006020828403121561302157613020611a48565b5b600061302f84828501612ff6565b91505092915050565b60008160e01c9050919050565b600060033d11156130645760046000803e613061600051613038565b90505b90565b600060443d106130f457613079611a3e565b60043d036004823e80513d602482011167ffffffffffffffff821117156130a15750506130f4565b808201805167ffffffffffffffff8111156130bf57505050506130f4565b80602083010160043d0385018111156130dc5750505050506130f4565b6130eb82602001850186611c55565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000613153603483611dd2565b915061315e826130f7565b604082019050919050565b6000602082019050818103600083015261318281613146565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b60006131e5602883611dd2565b91506131f082613189565b604082019050919050565b60006020820190508181036000830152613214816131d8565b9050919050565b600060a08201905061323060008301886123f9565b61323d60208301876123f9565b61324a6040830186611b26565b6132576060830185611b26565b81810360808301526132698184612f55565b9050969550505050505056fea2646970667358221220ffa06f36e5b8b295bd34b370bfbab486876a892926fb6dde98a449f3a880d6aa64736f6c63430008120033` +) + +func TestValidDeployerv2AfterHardFork(t *testing.T) { + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + + evm, err := newEVM(proxyAdminCaller, statedb) + if err != nil { + t.Fatal(err) + } + evm.Context.Time = uint64(time.Now().Unix()) + _, logicContractWhitelist, _, err := evm.Create(AccountRef(proxyAdminCaller), common.FromHex(whitelistDeployerV2), math.MaxUint64/2, big0) + if (logicContractWhitelist == common.Address{}) { + t.Fatal("Failed For deploying logic Contract") + } + + if err != nil { + t.Fatal(err) + } + + smcAbi, err := abi.JSON(strings.NewReader(proxyAbi)) + if err != nil { + t.Fatal(err) + } + logicSmcAbi, err := abi.JSON(strings.NewReader(logicAbi)) + + if err != nil { + t.Fatal(err) + } + + initialisedData, _ := logicSmcAbi.Pack(initialize, adminCaller, []common.Address{common.BytesToAddress([]byte("sentry"))}) + // "" will go constructor + constructorData, _ := smcAbi.Pack("", logicContractWhitelist, proxyAdminCaller, initialisedData) + + if constructorData == nil { + t.Fatal("Failed for pack contructor data") + } + byteCode := append(common.FromHex(proxy), constructorData...) + _, contractProxyWhiteList, _, err := evm.Create(AccountRef(proxyAdminCaller), byteCode, math.MaxUint64/2, big0) + + if (contractProxyWhiteList == common.Address{}) { + t.Fatal("Failed For deploying Proxy") + } + + if err != nil { + t.Fatal(err) + } + + evm.chainRules.IsComingFork = true + + _, failedMockContract, _, _ := evm.Create(AccountRef(whitelistedCaller), common.FromHex(mockSC), math.MaxUint64/2, big0) + if (failedMockContract != common.Address{}) { + t.Fatal("It should not be able for deploying") + } + // Whitelist + + expiredTime := time.Now() + expiredTime = expiredTime.Add(time.Hour * 7) + whiteListedData, err := logicSmcAbi.Pack("whitelist", whitelistedCaller, new(big.Int).SetInt64(expiredTime.Unix())) + if err != nil { + t.Fatal(err) + } + + ret, _, err := evm.Call(AccountRef(adminCaller), contractProxyWhiteList, whiteListedData, math.MaxUint64/2, big0) + + if ret != nil { + t.Fatal("Failed when calling to whitelist") + } + if err != nil { + t.Fatal(err) + } + + // Check isWhitelist succesfully + iswhiteListedData, err := logicSmcAbi.Pack("isWhitelisted", whitelistedCaller) + + if err != nil { + t.Fatal(err) + } + + ret, _, _ = evm.StaticCall(AccountRef(adminCaller), contractProxyWhiteList, iswhiteListedData, 1000000) + + if ret == nil { + t.Fatal("The whitelist function doesn't work") + } + + common.WhitelistDeployerSCV2 = contractProxyWhiteList.Hex() + _, _, _, err = evm.Create(AccountRef(whitelistedCaller), common.FromHex(mockSC), math.MaxUint64/2, big0) + + if err != nil { + t.Fatal(err) + } + +} From 8267dd6e627571f67162aab4765a9c45abda3c19 Mon Sep 17 00:00:00 2001 From: Huy Ngo Date: Fri, 18 Aug 2023 11:57:44 +0700 Subject: [PATCH 3/9] chore: covert to common bigint, remove unused mockSc, and fix naming --- core/state/statedb.go | 2 +- core/state/statedb_utils.go | 6 +++--- core/vm/evm.go | 2 +- core/vm/interface.go | 2 +- core/vm/statedb_utils_test.go | 19 ++++++------------- 5 files changed, 12 insertions(+), 19 deletions(-) diff --git a/core/state/statedb.go b/core/state/statedb.go index 686289af2c..347f7906e3 100644 --- a/core/state/statedb.go +++ b/core/state/statedb.go @@ -646,7 +646,7 @@ func (s *StateDB) ValidDeployer(addr common.Address) bool { return IsWhitelistedDeployer(s, addr) } -func (s *StateDB) ValidDeployerv2(addr common.Address, blockTime uint64) bool { +func (s *StateDB) ValidDeployerV2(addr common.Address, blockTime uint64) bool { return IsWhitelistedDeployerV2(s, addr, blockTime) } diff --git a/core/state/statedb_utils.go b/core/state/statedb_utils.go index 145ceb63f8..64e79bb0d6 100644 --- a/core/state/statedb_utils.go +++ b/core/state/statedb_utils.go @@ -42,7 +42,7 @@ func IsWhitelistedDeployerV2(statedb *StateDB, address common.Address, blockTime whitelistAllSlot := slotWhitelistDeployerMappingV2[WHITELIST_ALL] whitelistAll := statedb.GetState(contract, GetLocSimpleVariable(whitelistAllSlot)) - if whitelistAll.Big().Cmp(big.NewInt(1)) == 0 { + if whitelistAll.Big().Cmp(common.Big1) == 0 { return true } @@ -60,8 +60,8 @@ func IsWhitelistedDeployerV2(statedb *StateDB, address common.Address, blockTime // (whiteListInfo.activated && block.timestamp < whiteListInfo.expiryTimestamp) // Compare expiredHash with Blockheader timestamp. - if activatedHash.Big().Cmp(big.NewInt(1)) == 0 { - if expiredHash.Big().Cmp(new(big.Int).SetUint64(blockTime)) > 0 { + if activatedHash.Big().Cmp(common.Big1) == 0 { + if expiredHash.Big().Cmp(big.NewInt(int64(blockTime))) > 0 { // Block time still is in expiredTime return true } diff --git a/core/vm/evm.go b/core/vm/evm.go index ee25137dd6..e63f3f7a10 100644 --- a/core/vm/evm.go +++ b/core/vm/evm.go @@ -502,7 +502,7 @@ func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64, } // Handle latest hardfork firstly. if evm.chainRules.IsComingFork { - if !evm.StateDB.ValidDeployerv2(caller.Address(), evm.Context.Time) { + if !evm.StateDB.ValidDeployerV2(caller.Address(), evm.Context.Time) { captureTraceEarly(ErrExecutionReverted) return nil, common.Address{}, gas, ErrExecutionReverted } diff --git a/core/vm/interface.go b/core/vm/interface.go index a1ab809124..006c8d1b32 100644 --- a/core/vm/interface.go +++ b/core/vm/interface.go @@ -76,7 +76,7 @@ type StateDB interface { ForEachStorage(common.Address, func(common.Hash, common.Hash) bool) error ValidDeployer(common.Address) bool - ValidDeployerv2(common.Address, uint64) bool + ValidDeployerV2(common.Address, uint64) bool Blacklisted(*common.Address, *common.Address) bool } diff --git a/core/vm/statedb_utils_test.go b/core/vm/statedb_utils_test.go index 1ff66998a9..3b0c140e5f 100644 --- a/core/vm/statedb_utils_test.go +++ b/core/vm/statedb_utils_test.go @@ -29,11 +29,10 @@ var ( adminCaller = common.BytesToAddress([]byte("admin")) whitelistedCaller = common.BytesToAddress([]byte("whitelisted")) whitelistDeployerV2 = `0x608060405234801561001057600080fd5b5061001961001e565b6100de565b600054610100900460ff161561008a5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811610156100dc576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b61129c806100ed6000396000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c806391d14854116100a2578063a217fddf11610071578063a217fddf1461025a578063a2b21fbe14610262578063b56eebfb146102d9578063ca15c873146102ee578063d547741f1461030157600080fd5b806391d148541461020e578063946d92041461022157806398fc55d8146102345780639a5904271461024757600080fd5b806336568abe116100e957806336568abe1461019d5780633af32abf146101b057806358881877146101c35780637a9ad019146101ce5780639010d07c146101e357600080fd5b806301ffc9a71461011b5780630c9a347114610143578063248a9ca3146101585780632f2ff15d1461018a575b600080fd5b61012e610129366004610e78565b610314565b60405190151581526020015b60405180910390f35b610156610151366004610ea2565b61033f565b005b61017c610166366004610ec4565b6000908152600160208190526040909120015490565b60405190815260200161013a565b610156610198366004610ef9565b610388565b6101566101ab366004610ef9565b6103b3565b61012e6101be366004610f25565b610436565b603a5460ff1661012e565b61017c60008051602061124783398151915281565b6101f66101f1366004610f40565b610493565b6040516001600160a01b03909116815260200161013a565b61012e61021c366004610ef9565b6104ab565b61015661022f366004610f78565b6104d6565b610156610242366004611050565b61064e565b610156610255366004610f25565b6107b8565b61017c600081565b6102bc610270366004610f25565b6040805180820190915260008082526020820152506001600160a01b03166000908152603560209081526040918290208251808401909352805483526001015460ff1615159082015290565b60408051825181526020928301511515928101929092520161013a565b6102e161088a565b60405161013a919061107a565b61017c6102fc366004610ec4565b61089b565b61015661030f366004610ef9565b6108b2565b60006001600160e01b03198216635a05180f60e01b14806103395750610339826108d8565b92915050565b600061034a8161090d565b603a805460ff19168315159081179091556040517ff00cf1f0ddd6809f07fa6905b1b604c167671d7164140306bba41f906a637ff190600090a25050565b600082815260016020819052604090912001546103a48161090d565b6103ae838361091a565b505050565b6001600160a01b03811633146104285760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b610432828261093c565b5050565b6001600160a01b03811660009081526035602090815260408083208151808301909252805482526001015460ff908116151592820192909252603a549091168061048c57508060200151801561048c5750805142105b9392505050565b600082815260026020526040812061048c908361095e565b60009182526001602090815260408084206001600160a01b0393909316845291905290205460ff1690565b600054610100900460ff16158080156104f65750600054600160ff909116105b806105105750303b158015610510575060005460ff166001145b6105735760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161041f565b6000805460ff191660011790558015610596576000805461ff0019166101001790555b6105a160008461096a565b6105b96000805160206112478339815191528461096a565b815160005b81811015610602576105fa60008051602061124783398151915260001b8583815181106105ed576105ed6110c7565b602002602001015161096a565b6001016105be565b505080156103ae576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b6000805160206112478339815191526106668161090d565b4282101561068757604051635e39e99160e01b815260040160405180910390fd5b600061069381336104ab565b9050801580156106b957506001600160a01b038416600090815260356020526040902054155b156106d75760405163c582584160e01b815260040160405180910390fd5b801580156106eb57506106eb603885610974565b1561070957604051635fe23e4760e11b815260040160405180910390fd5b801561071c5761071a603885610996565b505b604080518082018252848152600160208083018281526001600160a01b038916600090815260359092529390209151825591519101805460ff191691151591909117905561076b603685610974565b61077c5761077a6036856109ab565b505b60405183906001600160a01b038616907f22531653f928681e9a83363bb12d972f8786e8c347e11701a49bbb9f271e8b8f90600090a350505050565b6000805160206112478339815191526107d08161090d565b6001600160a01b03821660009081526035602052604090205461080657604051630c991be760e41b815260040160405180910390fd5b6108116000336104ab565b15610823576108216038836109ab565b505b6001600160a01b0382166000908152603560205260409020600101805460ff19169055610851603683610996565b506040516001600160a01b038316907ff59a1a5f5e0d0f307930cd1547cff18d2a34715a97cbd8c0dc7a3b122c5e8cfc90600090a25050565b606061089660366109c0565b905090565b6000818152600260205260408120610339906109cd565b600082815260016020819052604090912001546108ce8161090d565b6103ae838361093c565b60006001600160e01b03198216637965db0b60e01b148061033957506301ffc9a760e01b6001600160e01b0319831614610339565b61091781336109d7565b50565b6109248282610a30565b60008281526002602052604090206103ae90826109ab565b6109468282610a9b565b60008281526002602052604090206103ae9082610996565b600061048c8383610b02565b610432828261091a565b6001600160a01b0381166000908152600183016020526040812054151561048c565b600061048c836001600160a01b038416610b2c565b600061048c836001600160a01b038416610c1f565b6060600061048c83610c6e565b6000610339825490565b6109e182826104ab565b610432576109ee81610cca565b6109f9836020610cdc565b604051602001610a0a92919061110d565b60408051601f198184030181529082905262461bcd60e51b825261041f91600401611182565b610a3a82826104ab565b6104325760008281526001602081815260408084206001600160a01b0386168086529252808420805460ff19169093179092559051339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b610aa582826104ab565b156104325760008281526001602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000826000018281548110610b1957610b196110c7565b9060005260206000200154905092915050565b60008181526001830160205260408120548015610c15576000610b506001836111cb565b8554909150600090610b64906001906111cb565b9050818114610bc9576000866000018281548110610b8457610b846110c7565b9060005260206000200154905080876000018481548110610ba757610ba76110c7565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610bda57610bda6111e2565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610339565b6000915050610339565b6000818152600183016020526040812054610c6657508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610339565b506000610339565b606081600001805480602002602001604051908101604052809291908181526020018280548015610cbe57602002820191906000526020600020905b815481526020019060010190808311610caa575b50505050509050919050565b60606103396001600160a01b03831660145b60606000610ceb8360026111f8565b610cf6906002611217565b67ffffffffffffffff811115610d0e57610d0e610f62565b6040519080825280601f01601f191660200182016040528015610d38576020820181803683370190505b509050600360fc1b81600081518110610d5357610d536110c7565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610d8257610d826110c7565b60200101906001600160f81b031916908160001a9053506000610da68460026111f8565b610db1906001611217565b90505b6001811115610e29576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110610de557610de56110c7565b1a60f81b828281518110610dfb57610dfb6110c7565b60200101906001600160f81b031916908160001a90535060049490941c93610e228161122f565b9050610db4565b50831561048c5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161041f565b600060208284031215610e8a57600080fd5b81356001600160e01b03198116811461048c57600080fd5b600060208284031215610eb457600080fd5b8135801515811461048c57600080fd5b600060208284031215610ed657600080fd5b5035919050565b80356001600160a01b0381168114610ef457600080fd5b919050565b60008060408385031215610f0c57600080fd5b82359150610f1c60208401610edd565b90509250929050565b600060208284031215610f3757600080fd5b61048c82610edd565b60008060408385031215610f5357600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215610f8b57600080fd5b610f9483610edd565b915060208084013567ffffffffffffffff80821115610fb257600080fd5b818601915086601f830112610fc657600080fd5b813581811115610fd857610fd8610f62565b8060051b604051601f19603f83011681018181108582111715610ffd57610ffd610f62565b60405291825284820192508381018501918983111561101b57600080fd5b938501935b828510156110405761103185610edd565b84529385019392850192611020565b8096505050505050509250929050565b6000806040838503121561106357600080fd5b61106c83610edd565b946020939093013593505050565b6020808252825182820181905260009190848201906040850190845b818110156110bb5783516001600160a01b031683529284019291840191600101611096565b50909695505050505050565b634e487b7160e01b600052603260045260246000fd5b60005b838110156110f85781810151838201526020016110e0565b83811115611107576000848401525b50505050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516111458160178501602088016110dd565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516111768160288401602088016110dd565b01602801949350505050565b60208152600082518060208401526111a18160408501602087016110dd565b601f01601f19169190910160400192915050565b634e487b7160e01b600052601160045260246000fd5b6000828210156111dd576111dd6111b5565b500390565b634e487b7160e01b600052603160045260246000fd5b6000816000190483118215151615611212576112126111b5565b500290565b6000821982111561122a5761122a6111b5565b500190565b60008161123e5761123e6111b5565b50600019019056fe5bea60102f2a7acc9e82b1af0e3bd4069661102bb5dd143a6051cd1980dded1ca2646970667358221220b4d9959f15bc892573e6f71b852604f5081ee3b420ea1c54a21fd40b7186e45864736f6c63430008090033` - proxy = `0x608060405260405162000e9838038062000e9883398101604081905262000026916200049d565b828162000036828260006200004d565b50620000449050826200008a565b505050620005d0565b6200005883620000e5565b600082511180620000665750805b1562000085576200008383836200012760201b620002601760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620000b562000156565b604080516001600160a01b03928316815291841660208301520160405180910390a1620000e2816200018f565b50565b620000f08162000244565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606200014f838360405180606001604052806027815260200162000e7160279139620002f8565b9392505050565b60006200018060008051602062000e5183398151915260001b6200037760201b620002081760201c565b546001600160a01b0316919050565b6001600160a01b038116620001fa5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b806200022360008051602062000e5183398151915260001b6200037760201b620002081760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b6200025a816200037a60201b6200028c1760201c565b620002be5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401620001f1565b80620002237f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6200037760201b620002081760201c565b6060600080856001600160a01b0316856040516200031791906200057d565b600060405180830381855af49150503d806000811462000354576040519150601f19603f3d011682016040523d82523d6000602084013e62000359565b606091505b5090925090506200036d8683838762000389565b9695505050505050565b90565b6001600160a01b03163b151590565b60608315620003fa578251620003f2576001600160a01b0385163b620003f25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620001f1565b508162000406565b6200040683836200040e565b949350505050565b8151156200041f5781518083602001fd5b8060405162461bcd60e51b8152600401620001f191906200059b565b80516001600160a01b03811681146200045357600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200048b57818101518382015260200162000471565b83811115620000835750506000910152565b600080600060608486031215620004b357600080fd5b620004be846200043b565b9250620004ce602085016200043b565b60408501519092506001600160401b0380821115620004ec57600080fd5b818601915086601f8301126200050157600080fd5b81518181111562000516576200051662000458565b604051601f8201601f19908116603f0116810190838211818310171562000541576200054162000458565b816040528281528960208487010111156200055b57600080fd5b6200056e8360208301602088016200046e565b80955050505050509250925092565b60008251620005918184602087016200046e565b9190910192915050565b6020815260008251806020840152620005bc8160408501602087016200046e565b601f01601f19169190910160400192915050565b61087180620005e06000396000f3fe60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106fb565b610118565b61005b610093366004610716565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106fb565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b606061028583836040518060600160405280602781526020016108156027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb610492565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a4836104ba565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a1610154816104fa565b6060600080856001600160a01b03168560405161043791906107c5565b600060405180830381855af49150503d8060008114610472576040519150601f19603f3d011682016040523d82523d6000602084013e610477565b606091505b5091509150610488868383876105a3565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b6104c381610621565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b03811661055f5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060831561060f578251610608576001600160a01b0385163b6106085760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610331565b5081610619565b61061983836106b5565b949350505050565b6001600160a01b0381163b61068e5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610582565b8151156106c55781518083602001fd5b8060405162461bcd60e51b815260040161033191906107e1565b80356001600160a01b03811681146106f657600080fd5b919050565b60006020828403121561070d57600080fd5b610285826106df565b60008060006040848603121561072b57600080fd5b610734846106df565b9250602084013567ffffffffffffffff8082111561075157600080fd5b818601915086601f83011261076557600080fd5b81358181111561077457600080fd5b87602082850101111561078657600080fd5b6020830194508093505050509250925092565b60005b838110156107b457818101518382015260200161079c565b838111156103c05750506000910152565b600082516107d7818460208701610799565b9190910192915050565b6020815260008251806020840152610800816040850160208701610799565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220dfbb6eecea80a23ea461c16e5f8a63f5102b824e0a1a1588bae31fe9b473de3264736f6c63430008090033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564` - mockSC = `60806040523480156200001157600080fd5b506040518060200160405280600081525062000033816200005a60201b60201c565b5062000054620000486200006f60201b60201c565b6200007760201b60201c565b6200049e565b80600290816200006b9190620003b7565b5050565b600033905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620001bf57607f821691505b602082108103620001d557620001d462000177565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200023f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000200565b6200024b868362000200565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000298620002926200028c8462000263565b6200026d565b62000263565b9050919050565b6000819050919050565b620002b48362000277565b620002cc620002c3826200029f565b8484546200020d565b825550505050565b600090565b620002e3620002d4565b620002f0818484620002a9565b505050565b5b8181101562000318576200030c600082620002d9565b600181019050620002f6565b5050565b601f82111562000367576200033181620001db565b6200033c84620001f0565b810160208510156200034c578190505b620003646200035b85620001f0565b830182620002f5565b50505b505050565b600082821c905092915050565b60006200038c600019846008026200036c565b1980831691505092915050565b6000620003a7838362000379565b9150826002028217905092915050565b620003c2826200013d565b67ffffffffffffffff811115620003de57620003dd62000148565b5b620003ea8254620001a6565b620003f78282856200031c565b600060209050601f8311600181146200042f57600084156200041a578287015190505b62000426858262000399565b86555062000496565b601f1984166200043f86620001db565b60005b82811015620004695784890151825560018201915060208501945060208101905062000442565b8683101562000489578489015162000485601f89168262000379565b8355505b6001600288020188555050505b505050505050565b6132ab80620004ae6000396000f3fe608060405234801561001057600080fd5b50600436106100e95760003560e01c8063715018a61161008c578063a22cb46511610066578063a22cb46514610246578063e985e9c514610262578063f242432a14610292578063f2fde38b146102ae576100e9565b8063715018a614610202578063731133e91461020c5780638da5cb5b14610228576100e9565b80630e89341c116100c85780630e89341c1461016a5780631f7fdffa1461019a5780632eb2c2d6146101b65780634e1273f4146101d2576100e9565b8062fdd58e146100ee57806301ffc9a71461011e57806302fe53051461014e575b600080fd5b61010860048036038101906101039190611ae6565b6102ca565b6040516101159190611b35565b60405180910390f35b61013860048036038101906101339190611ba8565b610392565b6040516101459190611bf0565b60405180910390f35b61016860048036038101906101639190611d51565b610474565b005b610184600480360381019061017f9190611d9a565b610488565b6040516101919190611e46565b60405180910390f35b6101b460048036038101906101af9190611fd1565b61051c565b005b6101d060048036038101906101cb919061208c565b610536565b005b6101ec60048036038101906101e7919061221e565b6105d7565b6040516101f99190612354565b60405180910390f35b61020a6106f0565b005b61022660048036038101906102219190612376565b610704565b005b61023061071e565b60405161023d9190612408565b60405180910390f35b610260600480360381019061025b919061244f565b610748565b005b61027c6004803603810190610277919061248f565b61075e565b6040516102899190611bf0565b60405180910390f35b6102ac60048036038101906102a791906124cf565b6107f2565b005b6102c860048036038101906102c39190612566565b610893565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361033a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033190612605565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061045d57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061046d575061046c82610916565b5b9050919050565b61047c610980565b610485816109fe565b50565b60606002805461049790612654565b80601f01602080910402602001604051908101604052809291908181526020018280546104c390612654565b80156105105780601f106104e557610100808354040283529160200191610510565b820191906000526020600020905b8154815290600101906020018083116104f357829003601f168201915b50505050509050919050565b610524610980565b61053084848484610a11565b50505050565b61053e610c3d565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061058457506105838561057e610c3d565b61075e565b5b6105c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ba906126f7565b60405180910390fd5b6105d08585858585610c45565b5050505050565b6060815183511461061d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161061490612789565b60405180910390fd5b6000835167ffffffffffffffff81111561063a57610639611c26565b5b6040519080825280602002602001820160405280156106685781602001602082028036833780820191505090505b50905060005b84518110156106e5576106b585828151811061068d5761068c6127a9565b5b60200260200101518583815181106106a8576106a76127a9565b5b60200260200101516102ca565b8282815181106106c8576106c76127a9565b5b602002602001018181525050806106de90612807565b905061066e565b508091505092915050565b6106f8610980565b6107026000610f66565b565b61070c610980565b6107188484848461102c565b50505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61075a610753610c3d565b83836111dc565b5050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6107fa610c3d565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610840575061083f8561083a610c3d565b61075e565b5b61087f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610876906126f7565b60405180910390fd5b61088c8585858585611348565b5050505050565b61089b610980565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361090a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610901906128c1565b60405180910390fd5b61091381610f66565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b610988610c3d565b73ffffffffffffffffffffffffffffffffffffffff166109a661071e565b73ffffffffffffffffffffffffffffffffffffffff16146109fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f39061292d565b60405180910390fd5b565b8060029081610a0d9190612af9565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7790612c3d565b60405180910390fd5b8151835114610ac4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abb90612ccf565b60405180910390fd5b6000610ace610c3d565b9050610adf816000878787876115e3565b60005b8451811015610b9857838181518110610afe57610afd6127a9565b5b6020026020010151600080878481518110610b1c57610b1b6127a9565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b7e9190612cef565b925050819055508080610b9090612807565b915050610ae2565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610c10929190612d23565b60405180910390a4610c27816000878787876115eb565b610c36816000878787876115f3565b5050505050565b600033905090565b8151835114610c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8090612ccf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610cf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cef90612dcc565b60405180910390fd5b6000610d02610c3d565b9050610d128187878787876115e3565b60005b8451811015610ec3576000858281518110610d3357610d326127a9565b5b602002602001015190506000858381518110610d5257610d516127a9565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610df3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dea90612e5e565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610ea89190612cef565b9250508190555050505080610ebc90612807565b9050610d15565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610f3a929190612d23565b60405180910390a4610f508187878787876115eb565b610f5e8187878787876115f3565b505050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361109b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109290612c3d565b60405180910390fd5b60006110a5610c3d565b905060006110b2856117ca565b905060006110bf856117ca565b90506110d0836000898585896115e3565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461112f9190612cef565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516111ad929190612e7e565b60405180910390a46111c4836000898585896115eb565b6111d383600089898989611844565b50505050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361124a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124190612f19565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161133b9190611bf0565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036113b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ae90612dcc565b60405180910390fd5b60006113c1610c3d565b905060006113ce856117ca565b905060006113db856117ca565b90506113eb8389898585896115e3565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015611482576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147990612e5e565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115379190612cef565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a6040516115b4929190612e7e565b60405180910390a46115ca848a8a86868a6115eb565b6115d8848a8a8a8a8a611844565b505050505050505050565b505050505050565b505050505050565b6116128473ffffffffffffffffffffffffffffffffffffffff16611a1b565b156117c2578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401611658959493929190612f8e565b6020604051808303816000875af192505050801561169457506040513d601f19601f82011682018060405250810190611691919061300b565b60015b611739576116a0613045565b806308c379a0036116fc57506116b4613067565b806116bf57506116fe565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f39190611e46565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173090613169565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146117c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b7906131fb565b60405180910390fd5b505b505050505050565b60606000600167ffffffffffffffff8111156117e9576117e8611c26565b5b6040519080825280602002602001820160405280156118175781602001602082028036833780820191505090505b509050828160008151811061182f5761182e6127a9565b5b60200260200101818152505080915050919050565b6118638473ffffffffffffffffffffffffffffffffffffffff16611a1b565b15611a13578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016118a995949392919061321b565b6020604051808303816000875af19250505080156118e557506040513d601f19601f820116820180604052508101906118e2919061300b565b60015b61198a576118f1613045565b806308c379a00361194d5750611905613067565b80611910575061194f565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119449190611e46565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198190613169565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611a11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a08906131fb565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611a7d82611a52565b9050919050565b611a8d81611a72565b8114611a9857600080fd5b50565b600081359050611aaa81611a84565b92915050565b6000819050919050565b611ac381611ab0565b8114611ace57600080fd5b50565b600081359050611ae081611aba565b92915050565b60008060408385031215611afd57611afc611a48565b5b6000611b0b85828601611a9b565b9250506020611b1c85828601611ad1565b9150509250929050565b611b2f81611ab0565b82525050565b6000602082019050611b4a6000830184611b26565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611b8581611b50565b8114611b9057600080fd5b50565b600081359050611ba281611b7c565b92915050565b600060208284031215611bbe57611bbd611a48565b5b6000611bcc84828501611b93565b91505092915050565b60008115159050919050565b611bea81611bd5565b82525050565b6000602082019050611c056000830184611be1565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611c5e82611c15565b810181811067ffffffffffffffff82111715611c7d57611c7c611c26565b5b80604052505050565b6000611c90611a3e565b9050611c9c8282611c55565b919050565b600067ffffffffffffffff821115611cbc57611cbb611c26565b5b611cc582611c15565b9050602081019050919050565b82818337600083830152505050565b6000611cf4611cef84611ca1565b611c86565b905082815260208101848484011115611d1057611d0f611c10565b5b611d1b848285611cd2565b509392505050565b600082601f830112611d3857611d37611c0b565b5b8135611d48848260208601611ce1565b91505092915050565b600060208284031215611d6757611d66611a48565b5b600082013567ffffffffffffffff811115611d8557611d84611a4d565b5b611d9184828501611d23565b91505092915050565b600060208284031215611db057611daf611a48565b5b6000611dbe84828501611ad1565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611e01578082015181840152602081019050611de6565b60008484015250505050565b6000611e1882611dc7565b611e228185611dd2565b9350611e32818560208601611de3565b611e3b81611c15565b840191505092915050565b60006020820190508181036000830152611e608184611e0d565b905092915050565b600067ffffffffffffffff821115611e8357611e82611c26565b5b602082029050602081019050919050565b600080fd5b6000611eac611ea784611e68565b611c86565b90508083825260208201905060208402830185811115611ecf57611ece611e94565b5b835b81811015611ef85780611ee48882611ad1565b845260208401935050602081019050611ed1565b5050509392505050565b600082601f830112611f1757611f16611c0b565b5b8135611f27848260208601611e99565b91505092915050565b600067ffffffffffffffff821115611f4b57611f4a611c26565b5b611f5482611c15565b9050602081019050919050565b6000611f74611f6f84611f30565b611c86565b905082815260208101848484011115611f9057611f8f611c10565b5b611f9b848285611cd2565b509392505050565b600082601f830112611fb857611fb7611c0b565b5b8135611fc8848260208601611f61565b91505092915050565b60008060008060808587031215611feb57611fea611a48565b5b6000611ff987828801611a9b565b945050602085013567ffffffffffffffff81111561201a57612019611a4d565b5b61202687828801611f02565b935050604085013567ffffffffffffffff81111561204757612046611a4d565b5b61205387828801611f02565b925050606085013567ffffffffffffffff81111561207457612073611a4d565b5b61208087828801611fa3565b91505092959194509250565b600080600080600060a086880312156120a8576120a7611a48565b5b60006120b688828901611a9b565b95505060206120c788828901611a9b565b945050604086013567ffffffffffffffff8111156120e8576120e7611a4d565b5b6120f488828901611f02565b935050606086013567ffffffffffffffff81111561211557612114611a4d565b5b61212188828901611f02565b925050608086013567ffffffffffffffff81111561214257612141611a4d565b5b61214e88828901611fa3565b9150509295509295909350565b600067ffffffffffffffff82111561217657612175611c26565b5b602082029050602081019050919050565b600061219a6121958461215b565b611c86565b905080838252602082019050602084028301858111156121bd576121bc611e94565b5b835b818110156121e657806121d28882611a9b565b8452602084019350506020810190506121bf565b5050509392505050565b600082601f83011261220557612204611c0b565b5b8135612215848260208601612187565b91505092915050565b6000806040838503121561223557612234611a48565b5b600083013567ffffffffffffffff81111561225357612252611a4d565b5b61225f858286016121f0565b925050602083013567ffffffffffffffff8111156122805761227f611a4d565b5b61228c85828601611f02565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6122cb81611ab0565b82525050565b60006122dd83836122c2565b60208301905092915050565b6000602082019050919050565b600061230182612296565b61230b81856122a1565b9350612316836122b2565b8060005b8381101561234757815161232e88826122d1565b9750612339836122e9565b92505060018101905061231a565b5085935050505092915050565b6000602082019050818103600083015261236e81846122f6565b905092915050565b600080600080608085870312156123905761238f611a48565b5b600061239e87828801611a9b565b94505060206123af87828801611ad1565b93505060406123c087828801611ad1565b925050606085013567ffffffffffffffff8111156123e1576123e0611a4d565b5b6123ed87828801611fa3565b91505092959194509250565b61240281611a72565b82525050565b600060208201905061241d60008301846123f9565b92915050565b61242c81611bd5565b811461243757600080fd5b50565b60008135905061244981612423565b92915050565b6000806040838503121561246657612465611a48565b5b600061247485828601611a9b565b92505060206124858582860161243a565b9150509250929050565b600080604083850312156124a6576124a5611a48565b5b60006124b485828601611a9b565b92505060206124c585828601611a9b565b9150509250929050565b600080600080600060a086880312156124eb576124ea611a48565b5b60006124f988828901611a9b565b955050602061250a88828901611a9b565b945050604061251b88828901611ad1565b935050606061252c88828901611ad1565b925050608086013567ffffffffffffffff81111561254d5761254c611a4d565b5b61255988828901611fa3565b9150509295509295909350565b60006020828403121561257c5761257b611a48565b5b600061258a84828501611a9b565b91505092915050565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b60006125ef602a83611dd2565b91506125fa82612593565b604082019050919050565b6000602082019050818103600083015261261e816125e2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061266c57607f821691505b60208210810361267f5761267e612625565b5b50919050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206f7220617070726f766564000000000000000000000000000000000000602082015250565b60006126e1602e83611dd2565b91506126ec82612685565b604082019050919050565b60006020820190508181036000830152612710816126d4565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b6000612773602983611dd2565b915061277e82612717565b604082019050919050565b600060208201905081810360008301526127a281612766565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061281282611ab0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612844576128436127d8565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006128ab602683611dd2565b91506128b68261284f565b604082019050919050565b600060208201905081810360008301526128da8161289e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612917602083611dd2565b9150612922826128e1565b602082019050919050565b600060208201905081810360008301526129468161290a565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026129af7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612972565b6129b98683612972565b95508019841693508086168417925050509392505050565b6000819050919050565b60006129f66129f16129ec84611ab0565b6129d1565b611ab0565b9050919050565b6000819050919050565b612a10836129db565b612a24612a1c826129fd565b84845461297f565b825550505050565b600090565b612a39612a2c565b612a44818484612a07565b505050565b5b81811015612a6857612a5d600082612a31565b600181019050612a4a565b5050565b601f821115612aad57612a7e8161294d565b612a8784612962565b81016020851015612a96578190505b612aaa612aa285612962565b830182612a49565b50505b505050565b600082821c905092915050565b6000612ad060001984600802612ab2565b1980831691505092915050565b6000612ae98383612abf565b9150826002028217905092915050565b612b0282611dc7565b67ffffffffffffffff811115612b1b57612b1a611c26565b5b612b258254612654565b612b30828285612a6c565b600060209050601f831160018114612b635760008415612b51578287015190505b612b5b8582612add565b865550612bc3565b601f198416612b718661294d565b60005b82811015612b9957848901518255600182019150602085019450602081019050612b74565b86831015612bb65784890151612bb2601f891682612abf565b8355505b6001600288020188555050505b505050505050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000612c27602183611dd2565b9150612c3282612bcb565b604082019050919050565b60006020820190508181036000830152612c5681612c1a565b9050919050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000612cb9602883611dd2565b9150612cc482612c5d565b604082019050919050565b60006020820190508181036000830152612ce881612cac565b9050919050565b6000612cfa82611ab0565b9150612d0583611ab0565b9250828201905080821115612d1d57612d1c6127d8565b5b92915050565b60006040820190508181036000830152612d3d81856122f6565b90508181036020830152612d5181846122f6565b90509392505050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612db6602583611dd2565b9150612dc182612d5a565b604082019050919050565b60006020820190508181036000830152612de581612da9565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000612e48602a83611dd2565b9150612e5382612dec565b604082019050919050565b60006020820190508181036000830152612e7781612e3b565b9050919050565b6000604082019050612e936000830185611b26565b612ea06020830184611b26565b9392505050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000612f03602983611dd2565b9150612f0e82612ea7565b604082019050919050565b60006020820190508181036000830152612f3281612ef6565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000612f6082612f39565b612f6a8185612f44565b9350612f7a818560208601611de3565b612f8381611c15565b840191505092915050565b600060a082019050612fa360008301886123f9565b612fb060208301876123f9565b8181036040830152612fc281866122f6565b90508181036060830152612fd681856122f6565b90508181036080830152612fea8184612f55565b90509695505050505050565b60008151905061300581611b7c565b92915050565b60006020828403121561302157613020611a48565b5b600061302f84828501612ff6565b91505092915050565b60008160e01c9050919050565b600060033d11156130645760046000803e613061600051613038565b90505b90565b600060443d106130f457613079611a3e565b60043d036004823e80513d602482011167ffffffffffffffff821117156130a15750506130f4565b808201805167ffffffffffffffff8111156130bf57505050506130f4565b80602083010160043d0385018111156130dc5750505050506130f4565b6130eb82602001850186611c55565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e2d4552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000613153603483611dd2565b915061315e826130f7565b604082019050919050565b6000602082019050818103600083015261318281613146565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b60006131e5602883611dd2565b91506131f082613189565b604082019050919050565b60006020820190508181036000830152613214816131d8565b9050919050565b600060a08201905061323060008301886123f9565b61323d60208301876123f9565b61324a6040830186611b26565b6132576060830185611b26565b81810360808301526132698184612f55565b9050969550505050505056fea2646970667358221220ffa06f36e5b8b295bd34b370bfbab486876a892926fb6dde98a449f3a880d6aa64736f6c63430008120033` + proxyByteCode = `0x608060405260405162000e9838038062000e9883398101604081905262000026916200049d565b828162000036828260006200004d565b50620000449050826200008a565b505050620005d0565b6200005883620000e5565b600082511180620000665750805b1562000085576200008383836200012760201b620002601760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620000b562000156565b604080516001600160a01b03928316815291841660208301520160405180910390a1620000e2816200018f565b50565b620000f08162000244565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606200014f838360405180606001604052806027815260200162000e7160279139620002f8565b9392505050565b60006200018060008051602062000e5183398151915260001b6200037760201b620002081760201c565b546001600160a01b0316919050565b6001600160a01b038116620001fa5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b806200022360008051602062000e5183398151915260001b6200037760201b620002081760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b6200025a816200037a60201b6200028c1760201c565b620002be5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401620001f1565b80620002237f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6200037760201b620002081760201c565b6060600080856001600160a01b0316856040516200031791906200057d565b600060405180830381855af49150503d806000811462000354576040519150601f19603f3d011682016040523d82523d6000602084013e62000359565b606091505b5090925090506200036d8683838762000389565b9695505050505050565b90565b6001600160a01b03163b151590565b60608315620003fa578251620003f2576001600160a01b0385163b620003f25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620001f1565b508162000406565b6200040683836200040e565b949350505050565b8151156200041f5781518083602001fd5b8060405162461bcd60e51b8152600401620001f191906200059b565b80516001600160a01b03811681146200045357600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200048b57818101518382015260200162000471565b83811115620000835750506000910152565b600080600060608486031215620004b357600080fd5b620004be846200043b565b9250620004ce602085016200043b565b60408501519092506001600160401b0380821115620004ec57600080fd5b818601915086601f8301126200050157600080fd5b81518181111562000516576200051662000458565b604051601f8201601f19908116603f0116810190838211818310171562000541576200054162000458565b816040528281528960208487010111156200055b57600080fd5b6200056e8360208301602088016200046e565b80955050505050509250925092565b60008251620005918184602087016200046e565b9190910192915050565b6020815260008251806020840152620005bc8160408501602087016200046e565b601f01601f19169190910160400192915050565b61087180620005e06000396000f3fe60806040526004361061004e5760003560e01c80633659cfe6146100655780634f1ef286146100855780635c60da1b146100985780638f283970146100c9578063f851a440146100e95761005d565b3661005d5761005b6100fe565b005b61005b6100fe565b34801561007157600080fd5b5061005b6100803660046106fb565b610118565b61005b610093366004610716565b61015f565b3480156100a457600080fd5b506100ad6101d0565b6040516001600160a01b03909116815260200160405180910390f35b3480156100d557600080fd5b5061005b6100e43660046106fb565b61020b565b3480156100f557600080fd5b506100ad610235565b61010661029b565b61011661011161033a565b610344565b565b610120610368565b6001600160a01b0316336001600160a01b03161415610157576101548160405180602001604052806000815250600061039b565b50565b6101546100fe565b610167610368565b6001600160a01b0316336001600160a01b031614156101c8576101c38383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506001925061039b915050565b505050565b6101c36100fe565b60006101da610368565b6001600160a01b0316336001600160a01b03161415610200576101fb61033a565b905090565b6102086100fe565b90565b610213610368565b6001600160a01b0316336001600160a01b0316141561015757610154816103c6565b600061023f610368565b6001600160a01b0316336001600160a01b03161415610200576101fb610368565b606061028583836040518060600160405280602781526020016108156027913961041a565b9392505050565b6001600160a01b03163b151590565b6102a3610368565b6001600160a01b0316336001600160a01b031614156101165760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b60006101fb610492565b3660008037600080366000845af43d6000803e808015610363573d6000f35b3d6000fd5b60007fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b546001600160a01b0316919050565b6103a4836104ba565b6000825111806103b15750805b156101c3576103c08383610260565b50505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6103ef610368565b604080516001600160a01b03928316815291841660208301520160405180910390a1610154816104fa565b6060600080856001600160a01b03168560405161043791906107c5565b600060405180830381855af49150503d8060008114610472576040519150601f19603f3d011682016040523d82523d6000602084013e610477565b606091505b5091509150610488868383876105a3565b9695505050505050565b60007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61038c565b6104c381610621565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6001600160a01b03811661055f5760405162461bcd60e51b815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201526564647265737360d01b6064820152608401610331565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80546001600160a01b0319166001600160a01b039290921691909117905550565b6060831561060f578251610608576001600160a01b0385163b6106085760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610331565b5081610619565b61061983836106b5565b949350505050565b6001600160a01b0381163b61068e5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610331565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610582565b8151156106c55781518083602001fd5b8060405162461bcd60e51b815260040161033191906107e1565b80356001600160a01b03811681146106f657600080fd5b919050565b60006020828403121561070d57600080fd5b610285826106df565b60008060006040848603121561072b57600080fd5b610734846106df565b9250602084013567ffffffffffffffff8082111561075157600080fd5b818601915086601f83011261076557600080fd5b81358181111561077457600080fd5b87602082850101111561078657600080fd5b6020830194508093505050509250925092565b60005b838110156107b457818101518382015260200161079c565b838111156103c05750506000910152565b600082516107d7818460208701610799565b9190910192915050565b6020815260008251806020840152610800816040850160208701610799565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220dfbb6eecea80a23ea461c16e5f8a63f5102b824e0a1a1588bae31fe9b473de3264736f6c63430008090033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564` ) -func TestValidDeployerv2AfterHardFork(t *testing.T) { +func TestValidDeployerV2AfterHardFork(t *testing.T) { statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) evm, err := newEVM(proxyAdminCaller, statedb) @@ -67,20 +66,16 @@ func TestValidDeployerv2AfterHardFork(t *testing.T) { if constructorData == nil { t.Fatal("Failed for pack contructor data") } - byteCode := append(common.FromHex(proxy), constructorData...) + byteCode := append(common.FromHex(proxyByteCode), constructorData...) _, contractProxyWhiteList, _, err := evm.Create(AccountRef(proxyAdminCaller), byteCode, math.MaxUint64/2, big0) - if (contractProxyWhiteList == common.Address{}) { - t.Fatal("Failed For deploying Proxy") - } - if err != nil { t.Fatal(err) } evm.chainRules.IsComingFork = true - _, failedMockContract, _, _ := evm.Create(AccountRef(whitelistedCaller), common.FromHex(mockSC), math.MaxUint64/2, big0) + _, failedMockContract, _, _ := evm.Create(AccountRef(whitelistedCaller), byteCode, math.MaxUint64/2, big0) if (failedMockContract != common.Address{}) { t.Fatal("It should not be able for deploying") } @@ -89,15 +84,13 @@ func TestValidDeployerv2AfterHardFork(t *testing.T) { expiredTime := time.Now() expiredTime = expiredTime.Add(time.Hour * 7) whiteListedData, err := logicSmcAbi.Pack("whitelist", whitelistedCaller, new(big.Int).SetInt64(expiredTime.Unix())) + if err != nil { t.Fatal(err) } ret, _, err := evm.Call(AccountRef(adminCaller), contractProxyWhiteList, whiteListedData, math.MaxUint64/2, big0) - if ret != nil { - t.Fatal("Failed when calling to whitelist") - } if err != nil { t.Fatal(err) } @@ -116,7 +109,7 @@ func TestValidDeployerv2AfterHardFork(t *testing.T) { } common.WhitelistDeployerSCV2 = contractProxyWhiteList.Hex() - _, _, _, err = evm.Create(AccountRef(whitelistedCaller), common.FromHex(mockSC), math.MaxUint64/2, big0) + _, _, _, err = evm.Create(AccountRef(whitelistedCaller), byteCode, math.MaxUint64/2, big0) if err != nil { t.Fatal(err) From a3245d1780f3c6889655965c9b2456c14f8c1496 Mon Sep 17 00:00:00 2001 From: Huy Ngo Date: Fri, 18 Aug 2023 12:30:34 +0700 Subject: [PATCH 4/9] chore: moving whitelistDeployerV2 to chainconfig --- common/types.go | 5 ----- core/state/statedb.go | 4 ++-- core/state/statedb_utils.go | 4 ++-- core/vm/evm.go | 2 +- core/vm/interface.go | 2 +- core/vm/statedb_utils_test.go | 27 +++++++++------------------ params/config.go | 8 ++++---- 7 files changed, 19 insertions(+), 33 deletions(-) diff --git a/common/types.go b/common/types.go index 31bee90b0f..d6a206a6d2 100644 --- a/common/types.go +++ b/common/types.go @@ -46,11 +46,6 @@ const ( WhitelistDeployerSC = "0x0000000000000000000000000000000000000033" ) -var ( - // WhitelistDeployerSCV2 is the address of whitelisted deployer V2, should replace - WhitelistDeployerSCV2 = "0x0000000000000000000000000000000000000033" -) - var ( hashT = reflect.TypeOf(Hash{}) addressT = reflect.TypeOf(Address{}) diff --git a/core/state/statedb.go b/core/state/statedb.go index 347f7906e3..014e8a0891 100644 --- a/core/state/statedb.go +++ b/core/state/statedb.go @@ -646,8 +646,8 @@ func (s *StateDB) ValidDeployer(addr common.Address) bool { return IsWhitelistedDeployer(s, addr) } -func (s *StateDB) ValidDeployerV2(addr common.Address, blockTime uint64) bool { - return IsWhitelistedDeployerV2(s, addr, blockTime) +func (s *StateDB) ValidDeployerV2(addr common.Address, blockTime uint64, whiteListContract *common.Address) bool { + return IsWhitelistedDeployerV2(s, addr, blockTime, whiteListContract) } func (s *StateDB) Blacklisted(contractAddr *common.Address, addr *common.Address) bool { diff --git a/core/state/statedb_utils.go b/core/state/statedb_utils.go index 64e79bb0d6..e74bef9786 100644 --- a/core/state/statedb_utils.go +++ b/core/state/statedb_utils.go @@ -37,8 +37,8 @@ var ( ) // IsWhitelistedDeployer reads the contract storage to check if an address is allow to deploy -func IsWhitelistedDeployerV2(statedb *StateDB, address common.Address, blockTime uint64) bool { - contract := common.HexToAddress(common.WhitelistDeployerSCV2) +func IsWhitelistedDeployerV2(statedb *StateDB, address common.Address, blockTime uint64, whiteListContract *common.Address) bool { + contract := *whiteListContract whitelistAllSlot := slotWhitelistDeployerMappingV2[WHITELIST_ALL] whitelistAll := statedb.GetState(contract, GetLocSimpleVariable(whitelistAllSlot)) diff --git a/core/vm/evm.go b/core/vm/evm.go index e63f3f7a10..7eaee1155b 100644 --- a/core/vm/evm.go +++ b/core/vm/evm.go @@ -502,7 +502,7 @@ func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64, } // Handle latest hardfork firstly. if evm.chainRules.IsComingFork { - if !evm.StateDB.ValidDeployerV2(caller.Address(), evm.Context.Time) { + if !evm.StateDB.ValidDeployerV2(caller.Address(), evm.Context.Time, evm.ChainConfig().WhiteListDeployerContractV2Address) { captureTraceEarly(ErrExecutionReverted) return nil, common.Address{}, gas, ErrExecutionReverted } diff --git a/core/vm/interface.go b/core/vm/interface.go index 006c8d1b32..c03c5fe93b 100644 --- a/core/vm/interface.go +++ b/core/vm/interface.go @@ -76,7 +76,7 @@ type StateDB interface { ForEachStorage(common.Address, func(common.Hash, common.Hash) bool) error ValidDeployer(common.Address) bool - ValidDeployerV2(common.Address, uint64) bool + ValidDeployerV2(common.Address, uint64, *common.Address) bool Blacklisted(*common.Address, *common.Address) bool } diff --git a/core/vm/statedb_utils_test.go b/core/vm/statedb_utils_test.go index 3b0c140e5f..f68ddda617 100644 --- a/core/vm/statedb_utils_test.go +++ b/core/vm/statedb_utils_test.go @@ -33,18 +33,18 @@ var ( ) func TestValidDeployerV2AfterHardFork(t *testing.T) { + // Init stage statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) - evm, err := newEVM(proxyAdminCaller, statedb) if err != nil { t.Fatal(err) } evm.Context.Time = uint64(time.Now().Unix()) + // Deploy logic and proxy SC. _, logicContractWhitelist, _, err := evm.Create(AccountRef(proxyAdminCaller), common.FromHex(whitelistDeployerV2), math.MaxUint64/2, big0) if (logicContractWhitelist == common.Address{}) { - t.Fatal("Failed For deploying logic Contract") + t.Fatal("Failed for deploying logic Contract") } - if err != nil { t.Fatal(err) } @@ -53,66 +53,57 @@ func TestValidDeployerV2AfterHardFork(t *testing.T) { if err != nil { t.Fatal(err) } - logicSmcAbi, err := abi.JSON(strings.NewReader(logicAbi)) + logicSmcAbi, err := abi.JSON(strings.NewReader(logicAbi)) if err != nil { t.Fatal(err) } initialisedData, _ := logicSmcAbi.Pack(initialize, adminCaller, []common.Address{common.BytesToAddress([]byte("sentry"))}) - // "" will go constructor constructorData, _ := smcAbi.Pack("", logicContractWhitelist, proxyAdminCaller, initialisedData) - if constructorData == nil { t.Fatal("Failed for pack contructor data") } + byteCode := append(common.FromHex(proxyByteCode), constructorData...) _, contractProxyWhiteList, _, err := evm.Create(AccountRef(proxyAdminCaller), byteCode, math.MaxUint64/2, big0) - if err != nil { t.Fatal(err) } + // Test deploying without adding whitelist yet. evm.chainRules.IsComingFork = true + evm.chainConfig.WhiteListDeployerContractV2Address = &contractProxyWhiteList _, failedMockContract, _, _ := evm.Create(AccountRef(whitelistedCaller), byteCode, math.MaxUint64/2, big0) if (failedMockContract != common.Address{}) { t.Fatal("It should not be able for deploying") } - // Whitelist + // Whitelist and redeploying again. expiredTime := time.Now() expiredTime = expiredTime.Add(time.Hour * 7) whiteListedData, err := logicSmcAbi.Pack("whitelist", whitelistedCaller, new(big.Int).SetInt64(expiredTime.Unix())) - if err != nil { t.Fatal(err) } ret, _, err := evm.Call(AccountRef(adminCaller), contractProxyWhiteList, whiteListedData, math.MaxUint64/2, big0) - if err != nil { t.Fatal(err) } - // Check isWhitelist succesfully iswhiteListedData, err := logicSmcAbi.Pack("isWhitelisted", whitelistedCaller) - if err != nil { t.Fatal(err) } ret, _, _ = evm.StaticCall(AccountRef(adminCaller), contractProxyWhiteList, iswhiteListedData, 1000000) - if ret == nil { - t.Fatal("The whitelist function doesn't work") + t.Fatal("The caller is not whitelisted succesfully.") } - - common.WhitelistDeployerSCV2 = contractProxyWhiteList.Hex() _, _, _, err = evm.Create(AccountRef(whitelistedCaller), byteCode, math.MaxUint64/2, big0) - if err != nil { t.Fatal(err) } - } diff --git a/params/config.go b/params/config.go index dc618d82f4..12c45d35af 100644 --- a/params/config.go +++ b/params/config.go @@ -465,10 +465,10 @@ type ChainConfig struct { // Olek hardfork reduces the delay in block time of out of turn miner OlekBlock *big.Int `json:"olekBlock,omitempty"` // Olek switch block (nil = no fork, 0 = already on activated) - ComingForkBlock *big.Int `json:"comingForkBlock,omitempty"` // ComingForkBlock switch block (nil = no fork, 0 = already on activated) - BlacklistContractAddress *common.Address `json:"blacklistContractAddress,omitempty"` // Address of Blacklist Contract (nil = no blacklist) - FenixValidatorContractAddress *common.Address `json:"fenixValidatorContractAddress,omitempty"` // Address of Ronin Contract in the Fenix hardfork (nil = no blacklist) - + ComingForkBlock *big.Int `json:"comingForkBlock,omitempty"` // ComingForkBlock switch block (nil = no fork, 0 = already on activated) + BlacklistContractAddress *common.Address `json:"blacklistContractAddress,omitempty"` // Address of Blacklist Contract (nil = no blacklist) + FenixValidatorContractAddress *common.Address `json:"fenixValidatorContractAddress,omitempty"` // Address of Ronin Contract in the Fenix hardfork (nil = no blacklist) + WhiteListDeployerContractV2Address *common.Address `json:"whiteListDeployerContractV2Address,omitempty"` // Address of Whitelist Ronin Contract V2 (nil = no blacklist) // TerminalTotalDifficulty is the amount of total difficulty reached by // the network that triggers the consensus upgrade. TerminalTotalDifficulty *big.Int `json:"terminalTotalDifficulty,omitempty"` From fb7d09573d2c39e8fa05915158fb94d46f8356a5 Mon Sep 17 00:00:00 2001 From: Huy Ngo Date: Fri, 18 Aug 2023 13:31:20 +0700 Subject: [PATCH 5/9] chore: add expired case in unittest --- core/vm/statedb_utils_test.go | 82 ++++++++++++++++++++++++++++++++++- 1 file changed, 80 insertions(+), 2 deletions(-) diff --git a/core/vm/statedb_utils_test.go b/core/vm/statedb_utils_test.go index f68ddda617..ead64685e4 100644 --- a/core/vm/statedb_utils_test.go +++ b/core/vm/statedb_utils_test.go @@ -75,8 +75,8 @@ func TestValidDeployerV2AfterHardFork(t *testing.T) { evm.chainRules.IsComingFork = true evm.chainConfig.WhiteListDeployerContractV2Address = &contractProxyWhiteList - _, failedMockContract, _, _ := evm.Create(AccountRef(whitelistedCaller), byteCode, math.MaxUint64/2, big0) - if (failedMockContract != common.Address{}) { + _, _, _, err = evm.Create(AccountRef(whitelistedCaller), byteCode, math.MaxUint64/2, big0) + if err == nil { t.Fatal("It should not be able for deploying") } @@ -107,3 +107,81 @@ func TestValidDeployerV2AfterHardFork(t *testing.T) { t.Fatal(err) } } + +func TestValidDeployerV2Expiration(t *testing.T) { + // Init stage + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase()), nil) + evm, err := newEVM(proxyAdminCaller, statedb) + if err != nil { + t.Fatal(err) + } + evm.Context.Time = uint64(time.Now().Unix()) + // Deploy logic and proxy SC. + _, logicContractWhitelist, _, err := evm.Create(AccountRef(proxyAdminCaller), common.FromHex(whitelistDeployerV2), math.MaxUint64/2, big0) + if (logicContractWhitelist == common.Address{}) { + t.Fatal("Failed for deploying logic Contract") + } + if err != nil { + t.Fatal(err) + } + + smcAbi, err := abi.JSON(strings.NewReader(proxyAbi)) + if err != nil { + t.Fatal(err) + } + + logicSmcAbi, err := abi.JSON(strings.NewReader(logicAbi)) + if err != nil { + t.Fatal(err) + } + + initialisedData, _ := logicSmcAbi.Pack(initialize, adminCaller, []common.Address{common.BytesToAddress([]byte("sentry"))}) + constructorData, _ := smcAbi.Pack("", logicContractWhitelist, proxyAdminCaller, initialisedData) + if constructorData == nil { + t.Fatal("Failed for pack contructor data") + } + + byteCode := append(common.FromHex(proxyByteCode), constructorData...) + _, contractProxyWhiteList, _, err := evm.Create(AccountRef(proxyAdminCaller), byteCode, math.MaxUint64/2, big0) + if err != nil { + t.Fatal(err) + } + + // Test deploying without adding whitelist yet. + evm.chainRules.IsComingFork = true + evm.chainConfig.WhiteListDeployerContractV2Address = &contractProxyWhiteList + + // Whitelist + expiredTime := time.Now() + expiredTime = expiredTime.Add(time.Hour * 7) + whiteListedData, err := logicSmcAbi.Pack("whitelist", whitelistedCaller, new(big.Int).SetInt64(expiredTime.Unix())) + if err != nil { + t.Fatal(err) + } + + ret, _, err := evm.Call(AccountRef(adminCaller), contractProxyWhiteList, whiteListedData, math.MaxUint64/2, big0) + if err != nil { + t.Fatal(err) + } + + iswhiteListedData, err := logicSmcAbi.Pack("isWhitelisted", whitelistedCaller) + if err != nil { + t.Fatal(err) + } + + ret, _, _ = evm.StaticCall(AccountRef(adminCaller), contractProxyWhiteList, iswhiteListedData, 1000000) + if ret == nil { + t.Fatal("The caller is not whitelisted succesfully.") + } + _, _, _, err = evm.Create(AccountRef(whitelistedCaller), byteCode, math.MaxUint64/2, big0) + if err != nil { + t.Fatal(err) + } + + evm.Context.Time = uint64(time.Now().Add(time.Hour * 14).Unix()) + // Deploy with expire time, expected failed + _, _, _, err = evm.Create(AccountRef(whitelistedCaller), byteCode, math.MaxUint64/2, big0) + if err == nil { + t.Fatal("It should be failed when expiring") + } +} From c961eeb0492f788cbddb863ea98261b54f5bad76 Mon Sep 17 00:00:00 2001 From: Huy Ngo Date: Mon, 25 Sep 2023 13:13:18 +0700 Subject: [PATCH 6/9] Update Antennablock for testnet --- core/vm/evm.go | 2 +- core/vm/statedb_utils_test.go | 4 ++-- genesis/testnet.json | 4 +++- params/config.go | 11 ++++++----- 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/core/vm/evm.go b/core/vm/evm.go index 7eaee1155b..3d4d312c08 100644 --- a/core/vm/evm.go +++ b/core/vm/evm.go @@ -501,7 +501,7 @@ func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64, } } // Handle latest hardfork firstly. - if evm.chainRules.IsComingFork { + if evm.chainRules.IsAntenna { if !evm.StateDB.ValidDeployerV2(caller.Address(), evm.Context.Time, evm.ChainConfig().WhiteListDeployerContractV2Address) { captureTraceEarly(ErrExecutionReverted) return nil, common.Address{}, gas, ErrExecutionReverted diff --git a/core/vm/statedb_utils_test.go b/core/vm/statedb_utils_test.go index ead64685e4..fadafa8bc0 100644 --- a/core/vm/statedb_utils_test.go +++ b/core/vm/statedb_utils_test.go @@ -72,7 +72,7 @@ func TestValidDeployerV2AfterHardFork(t *testing.T) { } // Test deploying without adding whitelist yet. - evm.chainRules.IsComingFork = true + evm.chainRules.IsAntenna = true evm.chainConfig.WhiteListDeployerContractV2Address = &contractProxyWhiteList _, _, _, err = evm.Create(AccountRef(whitelistedCaller), byteCode, math.MaxUint64/2, big0) @@ -148,7 +148,7 @@ func TestValidDeployerV2Expiration(t *testing.T) { } // Test deploying without adding whitelist yet. - evm.chainRules.IsComingFork = true + evm.chainRules.IsAntenna = true evm.chainConfig.WhiteListDeployerContractV2Address = &contractProxyWhiteList // Whitelist diff --git a/genesis/testnet.json b/genesis/testnet.json index cb0455e6c5..fc24b70b16 100644 --- a/genesis/testnet.json +++ b/genesis/testnet.json @@ -29,7 +29,9 @@ "puffyBlock": 12254000, "bubaBlock": 14260600, "olekBlock": 16849000, - "shillinBlock": 20268000 + "shillinBlock": 20268000, + "antennaBlock": 20756058, + "whiteListDeployerContractV2Address": "0x50a7e07Aa75eB9C04281713224f50403cA79851F" }, "alloc": { "0x0000000000000000000000000000000000000011": { diff --git a/params/config.go b/params/config.go index 08d35149ea..21b91ed3c4 100644 --- a/params/config.go +++ b/params/config.go @@ -528,7 +528,7 @@ type ChainConfig struct { // Shillin hardfork introduces fast finality ShillinBlock *big.Int `json:"shillinBlock,omitempty"` // Shillin switch block (nil = no fork, 0 = already on activated) - ComingForkBlock *big.Int `json:"comingForkBlock,omitempty"` // ComingForkBlock switch block (nil = no fork, 0 = already on activated) + AntennaBlock *big.Int `json:"antennaBlock,omitempty"` // AntennaBlock switch block (nil = no fork, 0 = already on activated) BlacklistContractAddress *common.Address `json:"blacklistContractAddress,omitempty"` // Address of Blacklist Contract (nil = no blacklist) FenixValidatorContractAddress *common.Address `json:"fenixValidatorContractAddress,omitempty"` // Address of Ronin Contract in the Fenix hardfork (nil = no blacklist) WhiteListDeployerContractV2Address *common.Address `json:"whiteListDeployerContractV2Address,omitempty"` // Address of Whitelist Ronin Contract V2 (nil = no blacklist) @@ -782,8 +782,9 @@ func (c *ChainConfig) IsOlek(num *big.Int) bool { } // IsConsortiumV2 returns whether the num is equals to or larger than the consortiumV2 fork block. -func (c *ChainConfig) IsComingFork(num *big.Int) bool { - return isForked(c.ComingForkBlock, num) +func (c *ChainConfig) IsAntenna(num *big.Int) bool { + return isForked(c.AntennaBlock, num) +} // IsShillin returns whether the num is equals to or larger than the shillin fork block. func (c *ChainConfig) IsShillin(num *big.Int) bool { @@ -992,7 +993,7 @@ type Rules struct { IsHomestead, IsEIP150, IsEIP155, IsEIP158 bool IsByzantium, IsConstantinople, IsPetersburg, IsIstanbul bool IsBerlin, IsLondon bool - IsOdysseusFork, IsFenix, IsConsortiumV2, IsComingFork bool + IsOdysseusFork, IsFenix, IsConsortiumV2, IsAntenna bool } // Rules ensures c's ChainID is not nil. @@ -1016,6 +1017,6 @@ func (c *ChainConfig) Rules(num *big.Int) Rules { IsOdysseusFork: c.IsOdysseus(num), IsFenix: c.IsFenix(num), IsConsortiumV2: c.IsConsortiumV2(num), - IsComingFork: c.IsComingFork(num), + IsAntenna: c.IsAntenna(num), } } From 76d38565fc49b89f089e6460691fe6415916c1e0 Mon Sep 17 00:00:00 2001 From: Huy Ngo Date: Tue, 26 Sep 2023 10:53:04 +0700 Subject: [PATCH 7/9] Add params and update block in genesis --- genesis/testnet.json | 2 +- params/config.go | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/genesis/testnet.json b/genesis/testnet.json index fc24b70b16..66e88bee80 100644 --- a/genesis/testnet.json +++ b/genesis/testnet.json @@ -30,7 +30,7 @@ "bubaBlock": 14260600, "olekBlock": 16849000, "shillinBlock": 20268000, - "antennaBlock": 20756058, + "antennaBlock": 20737258, "whiteListDeployerContractV2Address": "0x50a7e07Aa75eB9C04281713224f50403cA79851F" }, "alloc": { diff --git a/params/config.go b/params/config.go index 21b91ed3c4..636e9ad8b2 100644 --- a/params/config.go +++ b/params/config.go @@ -634,7 +634,7 @@ func (c *ChainConfig) String() string { chainConfigFmt := "{ChainID: %v Homestead: %v DAO: %v DAOSupport: %v EIP150: %v EIP155: %v EIP158: %v Byzantium: %v Constantinople: %v " chainConfigFmt += "Petersburg: %v Istanbul: %v, Odysseus: %v, Fenix: %v, Muir Glacier: %v, Berlin: %v, London: %v, Arrow Glacier: %v, " chainConfigFmt += "Engine: %v, Blacklist Contract: %v, Fenix Validator Contract: %v, ConsortiumV2: %v, ConsortiumV2.RoninValidatorSet: %v, " - chainConfigFmt += "ConsortiumV2.SlashIndicator: %v, ConsortiumV2.StakingContract: %v, Puffy: %v, Buba: %v, Olek: %v, Shillin: %v, " + chainConfigFmt += "ConsortiumV2.SlashIndicator: %v, ConsortiumV2.StakingContract: %v, Puffy: %v, Buba: %v, Olek: %v, Shillin: %v, Antenna: %v, " chainConfigFmt += "ConsortiumV2.ProfileContract: %v, ConsortiumV2.FinalityTracking: %v}" return fmt.Sprintf(chainConfigFmt, @@ -666,6 +666,7 @@ func (c *ChainConfig) String() string { c.BubaBlock, c.OlekBlock, c.ShillinBlock, + c.AntennaBlock, profileContract.Hex(), finalityTrackingContract.Hex(), ) @@ -781,7 +782,7 @@ func (c *ChainConfig) IsOlek(num *big.Int) bool { return isForked(c.OlekBlock, num) } -// IsConsortiumV2 returns whether the num is equals to or larger than the consortiumV2 fork block. +// IsAntenna returns whether the num is equals to or larger than the consortiumV2 fork block. func (c *ChainConfig) IsAntenna(num *big.Int) bool { return isForked(c.AntennaBlock, num) } From 2e867961936e5d7bad863003bc272b475bfd6b2e Mon Sep 17 00:00:00 2001 From: Huy Ngo Date: Tue, 26 Sep 2023 11:38:46 +0700 Subject: [PATCH 8/9] Update check compatibility and params config --- params/config.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/params/config.go b/params/config.go index 636e9ad8b2..6ab029bb4d 100644 --- a/params/config.go +++ b/params/config.go @@ -315,6 +315,7 @@ var ( BubaBlock: big.NewInt(14260600), OlekBlock: big.NewInt(16849000), ShillinBlock: big.NewInt(20268000), + AntennaBlock: big.NewInt(20737258), } // GoerliTrustedCheckpoint contains the light client trusted checkpoint for the Görli test network. @@ -635,7 +636,7 @@ func (c *ChainConfig) String() string { chainConfigFmt += "Petersburg: %v Istanbul: %v, Odysseus: %v, Fenix: %v, Muir Glacier: %v, Berlin: %v, London: %v, Arrow Glacier: %v, " chainConfigFmt += "Engine: %v, Blacklist Contract: %v, Fenix Validator Contract: %v, ConsortiumV2: %v, ConsortiumV2.RoninValidatorSet: %v, " chainConfigFmt += "ConsortiumV2.SlashIndicator: %v, ConsortiumV2.StakingContract: %v, Puffy: %v, Buba: %v, Olek: %v, Shillin: %v, Antenna: %v, " - chainConfigFmt += "ConsortiumV2.ProfileContract: %v, ConsortiumV2.FinalityTracking: %v}" + chainConfigFmt += "ConsortiumV2.ProfileContract: %v, ConsortiumV2.FinalityTracking: %v, whiteListDeployerContractV2Address: %v}" return fmt.Sprintf(chainConfigFmt, c.ChainID, @@ -669,6 +670,7 @@ func (c *ChainConfig) String() string { c.AntennaBlock, profileContract.Hex(), finalityTrackingContract.Hex(), + c.WhiteListDeployerContractV2Address.Hex(), ) } @@ -782,7 +784,7 @@ func (c *ChainConfig) IsOlek(num *big.Int) bool { return isForked(c.OlekBlock, num) } -// IsAntenna returns whether the num is equals to or larger than the consortiumV2 fork block. +// IsAntenna returns whether the num is equals to or larger than the Antenna fork block. func (c *ChainConfig) IsAntenna(num *big.Int) bool { return isForked(c.AntennaBlock, num) } @@ -926,6 +928,9 @@ func (c *ChainConfig) checkCompatible(newcfg *ChainConfig, head *big.Int) *Confi if isForkIncompatible(c.ShillinBlock, newcfg.ShillinBlock, head) { return newCompatError("Shillin fork block", c.ShillinBlock, newcfg.ShillinBlock) } + if isForkIncompatible(c.AntennaBlock, newcfg.AntennaBlock, head) { + return newCompatError("Antenna fork block", c.AntennaBlock, newcfg.AntennaBlock) + } return nil } From 0521a34f3f348994fdffb7a084566cd3d05e53e6 Mon Sep 17 00:00:00 2001 From: Huy Ngo Date: Tue, 26 Sep 2023 12:33:41 +0700 Subject: [PATCH 9/9] Fix test --- params/config.go | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/params/config.go b/params/config.go index 6ab029bb4d..42c8b7ab4f 100644 --- a/params/config.go +++ b/params/config.go @@ -283,21 +283,23 @@ var ( RoninTestnetStakingContractAddress = common.HexToAddress("0x9C245671791834daf3885533D24dce516B763B28") RoninTestnetProfileContractAddress = common.HexToAddress("0x3b67c8D22a91572a6AB18acC9F70787Af04A4043") RoninTestnetFinalityTrackingAddress = common.HexToAddress("0x41aCDFe786171824a037f2Cd6224c5916A58969a") + RoninWhiteListDeployerContractV2Address = common.HexToAddress("0x50a7e07Aa75eB9C04281713224f50403cA79851F") RoninTestnetChainConfig = &ChainConfig{ - ChainID: big.NewInt(2021), - HomesteadBlock: big.NewInt(0), - EIP150Block: big.NewInt(0), - EIP155Block: big.NewInt(0), - EIP158Block: big.NewInt(0), - ByzantiumBlock: big.NewInt(0), - ConstantinopleBlock: big.NewInt(0), - PetersburgBlock: big.NewInt(0), - IstanbulBlock: big.NewInt(0), - OdysseusBlock: big.NewInt(3315095), - FenixBlock: big.NewInt(6770400), - BlacklistContractAddress: &RoninTestnetBlacklistContract, - FenixValidatorContractAddress: &RoninTestnetFenixValidatorContractAddress, + ChainID: big.NewInt(2021), + HomesteadBlock: big.NewInt(0), + EIP150Block: big.NewInt(0), + EIP155Block: big.NewInt(0), + EIP158Block: big.NewInt(0), + ByzantiumBlock: big.NewInt(0), + ConstantinopleBlock: big.NewInt(0), + PetersburgBlock: big.NewInt(0), + IstanbulBlock: big.NewInt(0), + OdysseusBlock: big.NewInt(3315095), + FenixBlock: big.NewInt(6770400), + BlacklistContractAddress: &RoninTestnetBlacklistContract, + FenixValidatorContractAddress: &RoninTestnetFenixValidatorContractAddress, + WhiteListDeployerContractV2Address: &RoninWhiteListDeployerContractV2Address, Consortium: &ConsortiumConfig{ Period: 3, Epoch: 30, @@ -631,6 +633,10 @@ func (c *ChainConfig) String() string { if c.ConsortiumV2Contracts != nil { finalityTrackingContract = c.ConsortiumV2Contracts.FinalityTracking } + whiteListDeployerContractV2Address := common.HexToAddress("") + if c.WhiteListDeployerContractV2Address != nil { + whiteListDeployerContractV2Address = *c.WhiteListDeployerContractV2Address + } chainConfigFmt := "{ChainID: %v Homestead: %v DAO: %v DAOSupport: %v EIP150: %v EIP155: %v EIP158: %v Byzantium: %v Constantinople: %v " chainConfigFmt += "Petersburg: %v Istanbul: %v, Odysseus: %v, Fenix: %v, Muir Glacier: %v, Berlin: %v, London: %v, Arrow Glacier: %v, " @@ -670,7 +676,7 @@ func (c *ChainConfig) String() string { c.AntennaBlock, profileContract.Hex(), finalityTrackingContract.Hex(), - c.WhiteListDeployerContractV2Address.Hex(), + whiteListDeployerContractV2Address.Hex(), ) }