diff --git a/cluster/master/api_backend.go b/cluster/master/api_backend.go index b12f18896..c27a19b6c 100755 --- a/cluster/master/api_backend.go +++ b/cluster/master/api_backend.go @@ -52,9 +52,6 @@ func (s *QKCMasterBackend) GetPeerInfolist() []rpc.PeerInfoForDisPlay { func (s *QKCMasterBackend) AddTransaction(tx *types.Transaction) error { evmTx := tx.EvmTx - if evmTx.GasPrice().Cmp(s.clusterConfig.Quarkchain.MinTXPoolGasPrice) < 0 { - return errors.New(fmt.Sprintf("invalid gasprice: tx min gas price is %d", s.clusterConfig.Quarkchain.MinTXPoolGasPrice.Uint64())) - } fromShardSize, err := s.clusterConfig.Quarkchain.GetShardSizeByChainId(tx.EvmTx.FromChainID()) if err != nil { return err diff --git a/cluster/master/master_test.go b/cluster/master/master_test.go index 11e9f87fc..fd7e3db84 100644 --- a/cluster/master/master_test.go +++ b/cluster/master/master_test.go @@ -429,7 +429,7 @@ func TestAddTransaction(t *testing.T) { TxType: types.EvmTx, } err = master.AddTransaction(tx) - assert.Error(t, err) + assert.NoError(t, err) evmTx = types.NewEvmTransaction(0, id1.GetRecipient(), new(big.Int), 0, new(big.Int).SetUint64(1000000000), 2, 2, 1, 0, []byte{}, 0, 0) tx = &types.Transaction{ diff --git a/cluster/shard/api_backend.go b/cluster/shard/api_backend.go index 4fa18bb4c..e3da700f5 100755 --- a/cluster/shard/api_backend.go +++ b/cluster/shard/api_backend.go @@ -508,7 +508,8 @@ func (s *ShardBackend) CreateBlockToMine(addr *account.Address) (types.IBlock, * return nil, nil, 0, err } balance := balances.GetTokenBalance(s.MinorBlockChain.GetGenesisToken()) - adjustedDifficulty, err := s.posw.PoSWDiffAdjust(header, balance) + stakePreBlock := s.MinorBlockChain.DecayByHeight(minorBlock.NumberU64()) + adjustedDifficulty, err := s.posw.PoSWDiffAdjust(header, balance, stakePreBlock) if err != nil { log.Error("PoSW", "failed to compute PoSW difficulty", err) return nil, nil, 0, err diff --git a/cmd/cluster/config.go b/cmd/cluster/config.go index bc6ea9739..95cc6b61c 100755 --- a/cmd/cluster/config.go +++ b/cmd/cluster/config.go @@ -126,12 +126,19 @@ func makeConfigNode(ctx *cli.Context) (*service.Node, qkcConfig) { vm.PrecompiledContractsByzantium[v].SetEnableTime(cfg.Cluster.Quarkchain.EnableEvmTimeStamp) } } + if cfg.Cluster.Quarkchain.EnableNonReservedNativeTokenTimestamp == 0 && cfg.Cluster.Quarkchain.NetworkID == 1 { + cfg.Cluster.Quarkchain.EnableNonReservedNativeTokenTimestamp = params.MAINNET_ENABLE_NON_RESERVED_NATIVE_TOKEN_CONTRACT_TIMESTAMP + } + vm.SystemContracts[vm.NON_RESERVED_NATIVE_TOKEN].SetTimestamp(cfg.Cluster.Quarkchain.EnableNonReservedNativeTokenTimestamp) for _, v := range params.PrecompiledContractsMnt { if vm.PrecompiledContractsByzantium[v] != nil { vm.PrecompiledContractsByzantium[v].SetEnableTime(cfg.Cluster.Quarkchain.EnableNonReservedNativeTokenTimestamp) } } - vm.SystemContracts[vm.NON_RESERVED_NATIVE_TOKEN].SetTimestamp(cfg.Cluster.Quarkchain.EnableNonReservedNativeTokenTimestamp) + + if cfg.Cluster.Quarkchain.EnableGeneralNativeTokenTimestamp == 0 && cfg.Cluster.Quarkchain.NetworkID == 1 { + cfg.Cluster.Quarkchain.EnableGeneralNativeTokenTimestamp = params.MAINNET_ENABLE_GENERAL_NATIVE_TOKEN_CONTRACT_TIMESTAMP + } vm.SystemContracts[vm.GENERAL_NATIVE_TOKEN].SetTimestamp(cfg.Cluster.Quarkchain.EnableGeneralNativeTokenTimestamp) return stack, cfg diff --git a/common/utils.go b/common/utils.go index 22e989d68..306a63d31 100755 --- a/common/utils.go +++ b/common/utils.go @@ -4,6 +4,7 @@ import ( "bytes" "encoding/binary" "encoding/gob" + "math" "math/big" "math/bits" "net" @@ -22,9 +23,20 @@ const ( ) var ( - EmptyHash = ethCommon.Hash{} + EmptyHash = ethCommon.Hash{} + uint128Max = GetUint128Max() ) +func GetUint128Max() *big.Int { + pow2_64 := new(big.Int).Add(new(big.Int).SetUint64(math.MaxUint64), ethCommon.Big1) + pow2_128 := new(big.Int).Mul(pow2_64, pow2_64) + return new(big.Int).Sub(pow2_128, ethCommon.Big1) +} + +func BiggerThanUint128Max(data *big.Int) bool { + return data.Cmp(uint128Max) > 0 +} + /* 0b101, 0b11 -> True 0b101, 0b10 -> False diff --git a/consensus/interface.go b/consensus/interface.go index 2b3a52d5f..a0f87209c 100644 --- a/consensus/interface.go +++ b/consensus/interface.go @@ -101,7 +101,7 @@ type PoW interface { type PoSWCalculator interface { BuildSenderDisallowMap(headerHash common.Hash, recipient *account.Recipient) (map[account.Recipient]*big.Int, error) - PoSWDiffAdjust(header types.IHeader, balance *big.Int) (*big.Int, error) + PoSWDiffAdjust(header types.IHeader, balance *big.Int, stakePreBlock big.Int) (*big.Int, error) IsPoSWEnabled(time uint64, height uint64) bool - GetPoSWInfo(header types.IHeader, stakes *big.Int, address account.Recipient) (*big.Int, uint64, uint64, error) + GetPoSWInfo(header types.IHeader, stakes *big.Int, address account.Recipient, stakePreBlock big.Int) (*big.Int, uint64, uint64, error) } diff --git a/consensus/posw/posw.go b/consensus/posw/posw.go index d6b55279c..a8b8cb3b3 100644 --- a/consensus/posw/posw.go +++ b/consensus/posw/posw.go @@ -39,13 +39,14 @@ func NewPoSW(headReader headReader, config *config.POSWConfig) *PoSW { } /*PoSWDiffAdjust PoSW diff calc,already locked by insertChain*/ -func (p *PoSW) PoSWDiffAdjust(header types.IHeader, stakes *big.Int) (*big.Int, error) { +func (p *PoSW) PoSWDiffAdjust(header types.IHeader, stakes *big.Int, stakePerBlock big.Int) (*big.Int, error) { diff := header.GetDifficulty() if stakes == nil { return diff, nil } // Evaluate stakes before the to-be-added block - blockThreshold := new(big.Int).Div(stakes, p.config.TotalStakePerBlock).Uint64() + + blockThreshold := new(big.Int).Div(stakes, &stakePerBlock).Uint64() if blockThreshold == uint64(0) { return diff, nil } @@ -155,7 +156,7 @@ func (p *PoSW) getCoinbaseAddressUntilBlock(headerHash common.Hash) ([]account.R return addrs, nil } -func (p *PoSW) GetPoSWInfo(header types.IHeader, stakes *big.Int, address account.Recipient) (effectiveDiff *big.Int, mineable, mined uint64, err error) { +func (p *PoSW) GetPoSWInfo(header types.IHeader, stakes *big.Int, address account.Recipient, stakePreBlock big.Int) (effectiveDiff *big.Int, mineable, mined uint64, err error) { blockCnt, err := p.countCoinbaseBlockUntil(header.Hash(), address) if err != nil { return header.GetDifficulty(), 0, 0, err @@ -163,7 +164,7 @@ func (p *PoSW) GetPoSWInfo(header types.IHeader, stakes *big.Int, address accoun if !p.IsPoSWEnabled(header.GetTime(), header.NumberU64()) || stakes == nil { return header.GetDifficulty(), 0, blockCnt, nil } - blockThreshold := new(big.Int).Div(stakes, p.config.TotalStakePerBlock).Uint64() + blockThreshold := new(big.Int).Div(stakes, &stakePreBlock).Uint64() if blockThreshold > p.config.WindowSize { blockThreshold = p.config.WindowSize } diff --git a/consensus/posw/posw_test.go b/consensus/posw/posw_test.go index b688679d6..ca55255b7 100644 --- a/consensus/posw/posw_test.go +++ b/consensus/posw/posw_test.go @@ -28,8 +28,8 @@ func appendNewBlock(blockchain *core.MinorBlockChain, acc1 account.Address, t *t if balance, err := blockchain.GetBalance(newBlock.Coinbase().Recipient, nil); err != nil { t.Fatalf("failed to get balance: %v", err) } else { - - adjustedDiff, err := core.GetPoSW(blockchain).PoSWDiffAdjust(newBlock.Header(), balance.GetTokenBalance(testGenesisTokenID)) + stakePreBlock := blockchain.DecayByHeight(newBlock.NumberU64()) + adjustedDiff, err := core.GetPoSW(blockchain).PoSWDiffAdjust(newBlock.Header(), balance.GetTokenBalance(testGenesisTokenID), stakePreBlock) if err != nil { t.Fatalf("failed to adjust posw diff: %v", err) } diff --git a/core/minorblockchain.go b/core/minorblockchain.go index 09a357fda..85c172df8 100644 --- a/core/minorblockchain.go +++ b/core/minorblockchain.go @@ -68,6 +68,11 @@ type gasPriceSuggestionOracle struct { Percentile uint64 } +type CoinbaseAmountAboutHeight struct { + CoinbaseAmount *types.TokenBalances + StakePreBlock big.Int +} + // MinorBlockChain represents the canonical chain given a database with a genesis // block. The Blockchain manages chain imports, reverts, chain reorganisations. // @@ -113,7 +118,7 @@ type MinorBlockChain struct { crossShardTxListCache *lru.Cache rootBlockCache *lru.Cache lastConfirmCache *lru.Cache - coinbaseAmountCache map[uint64]*types.TokenBalances + coinbaseAmountCache map[uint64]CoinbaseAmountAboutHeight quit chan struct{} // blockchain quit channel running int32 // running must be called atomically @@ -193,7 +198,7 @@ func NewMinorBlockChain( crossShardTxListCache: crossShardCache, rootBlockCache: rootBlockCache, lastConfirmCache: lastConfimCache, - coinbaseAmountCache: make(map[uint64]*types.TokenBalances), + coinbaseAmountCache: make(map[uint64]CoinbaseAmountAboutHeight), engine: engine, vmConfig: vmConfig, heightToMinorBlockHashes: make(map[uint64]map[common.Hash]struct{}), @@ -423,7 +428,8 @@ func (m *MinorBlockChain) GetAdjustedDifficulty(header types.IHeader) (*big.Int, log.Error(m.logInfo, "PoSW: failed to get coinbase balance", err) return nil, 0, err } - poswAdjusted, err := m.posw.PoSWDiffAdjust(header, balance.GetTokenBalance(m.clusterConfig.Quarkchain.GetDefaultChainTokenID())) + stakePreBlock := m.DecayByHeight(header.NumberU64()) + poswAdjusted, err := m.posw.PoSWDiffAdjust(header, balance.GetTokenBalance(m.clusterConfig.Quarkchain.GetDefaultChainTokenID()), stakePreBlock) if err != nil { log.Error(m.logInfo, "PoSW: err", err) return nil, 0, err diff --git a/core/minorblockchain_addon.go b/core/minorblockchain_addon.go index 0bbc1fbf3..7ea078e45 100644 --- a/core/minorblockchain_addon.go +++ b/core/minorblockchain_addon.go @@ -70,19 +70,44 @@ func powerBigInt(data *big.Int, p uint64) *big.Int { func (m *MinorBlockChain) getCoinbaseAmount(height uint64) *types.TokenBalances { epoch := height / m.shardConfig.EpochInterval - balances, ok := m.coinbaseAmountCache[epoch] - if !ok { - decayNumerator := powerBigInt(m.clusterConfig.Quarkchain.BlockRewardDecayFactor.Num(), epoch) - decayDenominator := powerBigInt(new(big.Rat).Set(m.clusterConfig.Quarkchain.BlockRewardDecayFactor).Denom(), epoch) - coinbaseAmount := qkcCommon.BigIntMulBigRat(m.shardConfig.CoinbaseAmount, m.clusterConfig.Quarkchain.LocalFeeRate) - coinbaseAmount = new(big.Int).Mul(coinbaseAmount, decayNumerator) - coinbaseAmount = new(big.Int).Div(coinbaseAmount, decayDenominator) - data := make(map[uint64]*big.Int) - data[m.clusterConfig.Quarkchain.GetDefaultChainTokenID()] = coinbaseAmount - balances = types.NewTokenBalancesWithMap(data) - m.coinbaseAmountCache[epoch] = balances + cache, ok := m.coinbaseAmountCache[epoch] + if ok { + return cache.CoinbaseAmount.Copy() + } + m.calcCoinbaseAmountByHeight(epoch) + cache, _ = m.coinbaseAmountCache[epoch] + return cache.CoinbaseAmount.Copy() +} + +func (m *MinorBlockChain) DecayByHeight(height uint64) big.Int { + epoch := height / m.shardConfig.EpochInterval + cache, ok := m.coinbaseAmountCache[epoch] + if ok { + return cache.StakePreBlock + } + m.calcCoinbaseAmountByHeight(epoch) + cache, _ = m.coinbaseAmountCache[epoch] + return cache.StakePreBlock +} + +func (m *MinorBlockChain) calcCoinbaseAmountByHeight(epoch uint64) { + decayNumerator := powerBigInt(m.clusterConfig.Quarkchain.BlockRewardDecayFactor.Num(), epoch) + decayDenominator := powerBigInt(new(big.Rat).Set(m.clusterConfig.Quarkchain.BlockRewardDecayFactor).Denom(), epoch) + coinbaseAmount := qkcCommon.BigIntMulBigRat(m.shardConfig.CoinbaseAmount, m.clusterConfig.Quarkchain.LocalFeeRate) + coinbaseAmount = new(big.Int).Mul(coinbaseAmount, decayNumerator) + coinbaseAmount = new(big.Int).Div(coinbaseAmount, decayDenominator) + data := make(map[uint64]*big.Int) + data[m.clusterConfig.Quarkchain.GetDefaultChainTokenID()] = coinbaseAmount + balances := types.NewTokenBalancesWithMap(data) + + value := m.clusterConfig.Quarkchain.GetShardConfigByFullShardID(m.branch.Value).PoswConfig.TotalStakePerBlock + delayData := new(big.Int).Mul(value, decayNumerator) + delayData = new(big.Int).Div(delayData, decayDenominator) + + m.coinbaseAmountCache[epoch] = CoinbaseAmountAboutHeight{ + CoinbaseAmount: balances, + StakePreBlock: *delayData, } - return balances.Copy() } func (m *MinorBlockChain) putMinorBlock(mBlock *types.MinorBlock, xShardReceiveTxList []*types.CrossShardTransactionDeposit) error { @@ -783,7 +808,12 @@ func (m *MinorBlockChain) checkTxBeforeApply(stateT *state.StateDB, tx *types.Tr if tx.EvmTx.Gas() > diff.Uint64() { return ErrorTxContinue } - if tx.EvmTx.GasPrice().Cmp(m.clusterConfig.Quarkchain.MinMiningGasPrice) < 0 { + + defaultGasPrice, err := ConvertToDefaultChainTokenGasPrice(stateT, m.ChainConfig(), tx.EvmTx.GasTokenID(), tx.EvmTx.GasPrice()) + if err != nil { + return ErrorTxContinue + } + if defaultGasPrice.Cmp(m.clusterConfig.Quarkchain.MinMiningGasPrice) < 0 { return ErrorTxContinue } if header.Time < m.clusterConfig.Quarkchain.EnableEvmTimeStamp { @@ -1725,7 +1755,8 @@ func (m *MinorBlockChain) PoswInfo(mBlock *types.MinorBlock) (*rpc.PoSWInfo, err return nil, err } stakes := evmState.GetBalance(header.Coinbase.Recipient, m.clusterConfig.Quarkchain.GetDefaultChainTokenID()) - diff, minable, mined, _ := m.posw.GetPoSWInfo(header, stakes, header.Coinbase.Recipient) + stakePreBlock := m.DecayByHeight(mBlock.NumberU64()) + diff, minable, mined, _ := m.posw.GetPoSWInfo(header, stakes, header.Coinbase.Recipient, stakePreBlock) return &rpc.PoSWInfo{ EffectiveDifficulty: diff, PoswMineableBlocks: minable, @@ -1749,7 +1780,8 @@ func (m *MinorBlockChain) CommitMinorBlockByHash(h common.Hash) { } func (m *MinorBlockChain) GetMiningInfo(address account.Recipient, stake *types.TokenBalances) (mineable, mined uint64, err error) { - _, mineable, mined, err = m.posw.GetPoSWInfo(m.CurrentBlock().Header(), stake.GetTokenBalance(m.Config().GetDefaultChainTokenID()), address) + stakePreBlock := m.DecayByHeight(m.CurrentBlock().NumberU64()) + _, mineable, mined, err = m.posw.GetPoSWInfo(m.CurrentBlock().Header(), stake.GetTokenBalance(m.Config().GetDefaultChainTokenID()), address, stakePreBlock) return } diff --git a/core/native_test.go b/core/native_test.go index c6cef9570..10b984099 100644 --- a/core/native_test.go +++ b/core/native_test.go @@ -1,14 +1,15 @@ package core import ( - "bou.ke/monkey" - "github.com/QuarkChain/goquarkchain/params" - ethParams "github.com/ethereum/go-ethereum/params" "io/ioutil" "math/big" "os" "testing" + "bou.ke/monkey" + "github.com/QuarkChain/goquarkchain/params" + ethParams "github.com/ethereum/go-ethereum/params" + "github.com/QuarkChain/goquarkchain/account" "github.com/QuarkChain/goquarkchain/common" "github.com/QuarkChain/goquarkchain/core/types" @@ -122,6 +123,9 @@ func TestNativeTokenGas(t *testing.T) { monkey.Patch(PayNativeTokenAsGas, func(a vm.StateDB, b *ethParams.ChainConfig, c uint64, d uint64, gasPrice *big.Int) (uint8, *big.Int, error) { return 100, gasPrice, nil }) + monkey.Patch(GetGasUtilityInfo, func(a vm.StateDB, b *ethParams.ChainConfig, c uint64, gasPrice *big.Int) (uint8, *big.Int, error) { + return 100, gasPrice, nil + }) defer monkey.UnpatchAll() dirname, err := ioutil.TempDir(os.TempDir(), "qkcdb_test_") if err != nil { @@ -297,6 +301,9 @@ func TestXshardNativeTokenGasSent(t *testing.T) { monkey.Patch(PayNativeTokenAsGas, func(a vm.StateDB, b *ethParams.ChainConfig, c uint64, d uint64, gasPrice *big.Int) (uint8, *big.Int, error) { return 100, gasPrice, nil }) + monkey.Patch(GetGasUtilityInfo, func(a vm.StateDB, b *ethParams.ChainConfig, c uint64, gasPrice *big.Int) (uint8, *big.Int, error) { + return 100, gasPrice, nil + }) defer monkey.UnpatchAll() qeth := common.TokenIDEncode("QETHXX") qkc := common.TokenIDEncode("QKC") diff --git a/core/rootblockchain.go b/core/rootblockchain.go index e83774a55..92771a852 100644 --- a/core/rootblockchain.go +++ b/core/rootblockchain.go @@ -1068,7 +1068,7 @@ func (bc *RootBlockChain) GetAdjustedDifficultyToMine(header types.IHeader) (*bi if err != nil { log.Debug("get PoSW stakes", "err", err, "coinbase", header.GetCoinbase().ToHex()) } - poswAdjusted, err := bc.posw.PoSWDiffAdjust(header, stakes) + poswAdjusted, err := bc.posw.PoSWDiffAdjust(header, stakes, *bc.chainConfig.Root.PoSWConfig.TotalStakePerBlock) if err != nil { log.Debug("PoSW diff adjust", "err", err, "coinbase", header.GetCoinbase().ToHex()) } @@ -1120,7 +1120,7 @@ func (bc *RootBlockChain) getPoSWAdjustedDiff(header types.IHeader) (*big.Int, e if err != nil { return nil, err } - return bc.posw.PoSWDiffAdjust(header, stakes) + return bc.posw.PoSWDiffAdjust(header, stakes, *bc.chainConfig.Root.PoSWConfig.TotalStakePerBlock) } func (bc *RootBlockChain) getSignedPoSWStakes(header types.IHeader) (*big.Int, error) { @@ -1424,7 +1424,7 @@ func (bc *RootBlockChain) PoSWInfo(header *types.RootBlockHeader) (*rpc.PoSWInfo return nil, nil } stakes, _ := bc.getSignedPoSWStakes(header) - diff, mineable, mined, _ := bc.posw.GetPoSWInfo(header, stakes, header.Coinbase.Recipient) + diff, mineable, mined, _ := bc.posw.GetPoSWInfo(header, stakes, header.Coinbase.Recipient, *bc.chainConfig.Root.PoSWConfig.TotalStakePerBlock) return &rpc.PoSWInfo{ EffectiveDifficulty: diff, PoswMinedBlocks: mined + 1, diff --git a/core/shardstate_test.go b/core/shardstate_test.go index 152c27877..c421beae4 100644 --- a/core/shardstate_test.go +++ b/core/shardstate_test.go @@ -93,6 +93,9 @@ func TestGasPrice(t *testing.T) { monkey.Patch(PayNativeTokenAsGas, func(a vm.StateDB, b *ethParams.ChainConfig, c uint64, d uint64, gasPrice *big.Int) (uint8, *big.Int, error) { return 100, gasPrice, nil }) + monkey.Patch(GetGasUtilityInfo, func(a vm.StateDB, b *ethParams.ChainConfig, c uint64, gasPrice *big.Int) (uint8, *big.Int, error) { + return 100, gasPrice, nil + }) defer monkey.UnpatchAll() addContractAddrBalance = true defer func() { @@ -3024,6 +3027,11 @@ func TestPayNativeTokenAsGasContractAPI(t *testing.T) { refundPercentage, gasPrice, err = GetGasUtilityInfo(evmState, shardState.ethChainConfig, tokenID, gasPriceInNativeToken) assert.Equal(t, uint8(60), refundPercentage) assert.Equal(t, big.NewInt(2), gasPrice) + + data, err := ConvertToDefaultChainTokenGasPrice(evmState, shardState.ethChainConfig, tokenID, new(big.Int).SetInt64(60000)) + assert.NoError(t, err) + assert.Equal(t, data.Uint64(), uint64(2)) + //# exchange the Qkc with the native token refundPercentage, gasPrice, err = PayNativeTokenAsGas(evmState, shardState.ethChainConfig, tokenID, 3, gasPriceInNativeToken) assert.Equal(t, uint8(60), refundPercentage) diff --git a/core/state_processor.go b/core/state_processor.go index d5233d56f..9d7533d50 100755 --- a/core/state_processor.go +++ b/core/state_processor.go @@ -111,6 +111,11 @@ func ValidateTransaction(state vm.StateDB, chainConfig *params.ChainConfig, tx * from = &fromAddress.Recipient } + // not need to check gas(uint64) + if qkcCmn.BiggerThanUint128Max(tx.EvmTx.GasPrice()) || tx.EvmTx.GasTokenID() > qkcCmn.TOKENIDMAX || + tx.EvmTx.TransferTokenID() > qkcCmn.TOKENIDMAX { + return fmt.Errorf("startgas, gasprice, and token_id must <= UINT128_MAX") + } reqNonce := state.GetNonce(*from) if bytes.Equal(from.Bytes(), account.Recipient{}.Bytes()) { reqNonce = 0 @@ -317,6 +322,10 @@ func ApplyCrossShardDeposit(config *params.ChainConfig, bc ChainContext, header func PayNativeTokenAsGas(evmState vm.StateDB, config *params.ChainConfig, tokenID, gas uint64, gasPriceInNativeToken *big.Int) (uint8, *big.Int, error) { + // not need to check gas(uint64) + if tokenID > qkcCmn.TOKENIDMAX || qkcCmn.BiggerThanUint128Max(gasPriceInNativeToken) { + return 0, nil, fmt.Errorf("PayNativeTokenAsGas : tokenid %v > TOKENIDMAX %v gasPriceInNativeToken %v > Uint128Max ", tokenID, qkcCmn.TOKENIDMAX, gasPriceInNativeToken) + } //# Call the `payAsGas` function data := common.Hex2Bytes("5ae8f7f1") @@ -359,3 +368,13 @@ func callGeneralNativeTokenManager(evmState vm.StateDB, config *params.ChainConf convertedGasPrice := new(big.Int).SetBytes(ret[32:64]) return uint8(refundRate), convertedGasPrice, nil } + +func ConvertToDefaultChainTokenGasPrice(state vm.StateDB, paramConfig *params.ChainConfig, tokenID uint64, gasprice *big.Int) (*big.Int, error) { + if tokenID == state.GetQuarkChainConfig().GetDefaultChainTokenID() { + return gasprice, nil + } + snapshot := state.Snapshot() + _, data, err := GetGasUtilityInfo(state, paramConfig, tokenID, gasprice) + state.RevertToSnapshot(snapshot) + return data, err +} diff --git a/core/tx_pool.go b/core/tx_pool.go index 4cd3c7a57..770a31e2a 100644 --- a/core/tx_pool.go +++ b/core/tx_pool.go @@ -469,6 +469,13 @@ func (pool *TxPool) add(tx *types.Transaction, local bool) (replaced bool, err e log.Trace("Discarding invalid transaction", "hash", hash, "err", err) return false, err } + defaultGasPrice, err := ConvertToDefaultChainTokenGasPrice(pool.currentState, pool.chain.ChainConfig(), tx.EvmTx.GasTokenID(), tx.EvmTx.GasPrice()) + if err != nil { + return false, err + } + if defaultGasPrice.Cmp(pool.chain.Config().MinTXPoolGasPrice) < 0 { + return false, fmt.Errorf("defaultGasPrice %v is small than minTxPoolGasPrice %v", defaultGasPrice, pool.chain.Config().MinTXPoolGasPrice) + } // If the transaction pool is full, discard underpriced transactions if uint64(pool.all.Count()) >= pool.config.GlobalSlots+pool.config.GlobalQueue { // If the new transaction is underpriced, don't accept it diff --git a/core/vm/contract.go b/core/vm/contract.go index 3cf52312d..535467614 100644 --- a/core/vm/contract.go +++ b/core/vm/contract.go @@ -60,6 +60,7 @@ type Contract struct { Gas uint64 value *big.Int TokenIDQueried bool + IsStaticCall bool // transferMnt not support static call } // NewContract returns a new contract environment for the execution of EVM. @@ -183,3 +184,7 @@ func (c *Contract) SetCodeOptionalHash(addr *common.Address, codeAndHash *codeAn c.CodeHash = codeAndHash.hash c.CodeAddr = addr } + +func (c *Contract) SetIsStaticCall(isStaticCall bool) { + c.IsStaticCall = isStaticCall +} diff --git a/core/vm/contracts.go b/core/vm/contracts.go index e39385ff0..c6843512f 100644 --- a/core/vm/contracts.go +++ b/core/vm/contracts.go @@ -21,9 +21,11 @@ import ( "crypto/sha256" "encoding/binary" "errors" + "fmt" math2 "math" "math/big" + qCommon "github.com/QuarkChain/goquarkchain/common" qkcParams "github.com/QuarkChain/goquarkchain/params" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/math" @@ -38,16 +40,16 @@ var ( rootChainPoSWContractAddr = "514b430000000000000000000000000000000001" RootChainPoSWContractBytecode = `608060405234801561001057600080fd5b50610700806100206000396000f3fe60806040526004361061007b5760003560e01c8063853828b61161004e578063853828b6146101b5578063a69df4b5146101ca578063f83d08ba146101df578063fd8c4646146101e75761007b565b806316934fc4146100d85780632e1a7d4d1461013c578063485d3834146101685780636c19e7831461018f575b336000908152602081905260409020805460ff16156100cb5760405162461bcd60e51b815260040180806020018281038252602681526020018061062e6026913960400191505060405180910390fd5b6100d5813461023b565b50005b3480156100e457600080fd5b5061010b600480360360208110156100fb57600080fd5b50356001600160a01b031661029b565b6040805194151585526020850193909352838301919091526001600160a01b03166060830152519081900360800190f35b34801561014857600080fd5b506101666004803603602081101561015f57600080fd5b50356102cf565b005b34801561017457600080fd5b5061017d61034a565b60408051918252519081900360200190f35b610166600480360360208110156101a557600080fd5b50356001600160a01b0316610351565b3480156101c157600080fd5b506101666103c8565b3480156101d657600080fd5b50610166610436565b6101666104f7565b3480156101f357600080fd5b5061021a6004803603602081101561020a57600080fd5b50356001600160a01b0316610558565b604080519283526001600160a01b0390911660208301528051918290030190f35b8015610297576002820154808201908111610291576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b60028301555b5050565b600060208190529081526040902080546001820154600283015460039093015460ff9092169290916001600160a01b031684565b336000908152602081905260409020805460ff1680156102f3575080600101544210155b6102fc57600080fd5b806002015482111561030d57600080fd5b6002810180548390039055604051339083156108fc029084906000818181858888f19350505050158015610345573d6000803e3d6000fd5b505050565b6203f48081565b336000908152602081905260409020805460ff16156103a15760405162461bcd60e51b81526004018080602001828103825260268152602001806106546026913960400191505060405180910390fd5b6003810180546001600160a01b0319166001600160a01b038416179055610297813461023b565b6103d06105fa565b5033600090815260208181526040918290208251608081018452815460ff16151581526001820154928101929092526002810154928201839052600301546001600160a01b031660608201529061042657600080fd5b61043381604001516102cf565b50565b336000908152602081905260409020805460ff16156104865760405162461bcd60e51b815260040180806020018281038252602b8152602001806106a1602b913960400191505060405180910390fd5b60008160020154116104df576040805162461bcd60e51b815260206004820152601b60248201527f73686f756c642068617665206578697374696e67207374616b65730000000000604482015290519081900360640190fd5b805460ff191660019081178255426203f48001910155565b336000908152602081905260409020805460ff166105465760405162461bcd60e51b815260040180806020018281038252602781526020018061067a6027913960400191505060405180910390fd5b805460ff19168155610433813461023b565b6000806105636105fa565b506001600160a01b03808416600090815260208181526040918290208251608081018452815460ff161580158252600183015493820193909352600282015493810193909352600301549092166060820152906105c75750600091508190506105f5565b60608101516000906001600160a01b03166105e35750836105ea565b5060608101515b604090910151925090505b915091565b6040518060800160405280600015158152602001600081526020016000815260200160006001600160a01b03168152509056fe73686f756c64206f6e6c7920616464207374616b657320696e206c6f636b656420737461746573686f756c64206f6e6c7920736574207369676e657220696e206c6f636b656420737461746573686f756c64206e6f74206c6f636b20616c72656164792d6c6f636b6564206163636f756e747373686f756c64206e6f7420756e6c6f636b20616c72656164792d756e6c6f636b6564206163636f756e7473a265627a7a72315820f2c044ad50ee08e7e49c575b49e8de27cac8322afdb97780b779aa1af44e40d364736f6c634300050b0032` NonReservedNativeTokenContractAddr = "514b430000000000000000000000000000000002" - NonReservedNativeTokenContractBytecode = `608060405234801561001057600080fd5b506040516115e93803806115e98339818101604052602081101561003357600080fd5b5051600080546001600160a01b039092166001600160a01b03199092169190911790556001805460ff191681179055611578806100716000396000f3fe6080604052600436106101095760003560e01c806356e4b68b116100955780639ea41be7116100645780639ea41be714610430578063b187bd2614610463578063b9ae736414610478578063bc1fc2091461048d578063fe67a54b146104c057610109565b806356e4b68b146103275780635fc81df1146103585780636aecd9d7146103bb5780638556fed2146103fb57610109565b80633c69e3d2116100dc5780633c69e3d2146102045780633ccfd60b1461024957806344637c8d1461025e5780635254298a14610299578063568f02f8146102e057610109565b806308bfc3001461010e5780630f2dc31a1461016f57806327e235e3146101aa57806332353fbd146101ef575b600080fd5b34801561011a57600080fd5b506101236104d5565b604080516001600160801b03968716815294861660208601526001600160a01b03909316848401526001600160401b039091166060840152909216608082015290519081900360a00190f35b34801561017b57600080fd5b506101a86004803603604081101561019257600080fd5b506001600160801b038135169060200135610535565b005b3480156101b657600080fd5b506101dd600480360360208110156101cd57600080fd5b50356001600160a01b031661069f565b60408051918252519081900360200190f35b3480156101fb57600080fd5b506101a86106b1565b34801561021057600080fd5b506101a86004803603606081101561022757600080fd5b506001600160401b03813581169160208101358216916040909101351661071f565b34801561025557600080fd5b506101a8610857565b34801561026a57600080fd5b506101a86004803603604081101561028157600080fd5b506001600160801b038135169060200135151561092c565b3480156102a557600080fd5b506102cc600480360360208110156102bc57600080fd5b50356001600160801b03166109a4565b604080519115158252519081900360200190f35b3480156102ec57600080fd5b506102f56109b9565b604080516001600160801b0390941684526001600160401b039283166020850152911682820152519081900360600190f35b34801561033357600080fd5b5061033c6109e4565b604080516001600160a01b039092168252519081900360200190f35b34801561036457600080fd5b5061038b6004803603602081101561037b57600080fd5b50356001600160801b03166109f3565b604080516001600160401b0390941684526001600160a01b03909216602084015282820152519081900360600190f35b6101a8600480360360608110156103d157600080fd5b5080356001600160801b0390811691602081013590911690604001356001600160401b0316610a28565b6101a86004803603604081101561041157600080fd5b5080356001600160801b031690602001356001600160a01b0316610e6c565b34801561043c57600080fd5b5061038b6004803603602081101561045357600080fd5b50356001600160801b0316610f15565b34801561046f57600080fd5b506102cc610f53565b34801561048457600080fd5b506101a8610f5c565b34801561049957600080fd5b506101a8600480360360208110156104b057600080fd5b50356001600160a01b0316610fb7565b3480156104cc57600080fd5b506101a8611026565b60025460035460015460009283928392839283926001600160801b0380831693600160801b90930416916001600160a01b0390911690610100900463ffffffff1661051e6111d3565b939992985090965063ffffffff1694509092509050565b6001600160801b038216600090815260056020526040902080546001600160401b03166105a9576040805162461bcd60e51b815260206004820152601760248201527f546f6b656e20494420646f65736e27742065786973742e000000000000000000604482015290519081900360640190fd5b8054600160401b90046001600160a01b031633146105f85760405162461bcd60e51b81526004018080602001828103825260228152602001806114026022913960400191505060405180910390fd5b60018101805483019081905582111561064d576040805162461bcd60e51b815260206004820152601260248201527120b23234ba34b7b71037bb32b9333637bb9760711b604482015290519081900360640190fd5b610655611304565b8154600160401b90046001600160a01b031681526001600160801b0384166020820152604081018390526000806060838264514b430004600019f161069957600080fd5b50505050565b60066020526000908152604090205481565b6000546001600160a01b031633146106fe576040805162461bcd60e51b815260206004820152601b60248201526000805160206113e2833981519152604482015290519081900360640190fd5b610706611208565b1561071357610713611249565b6001805460ff19169055565b6000546001600160a01b0316331461076c576040805162461bcd60e51b815260206004820152601b60248201526000805160206113e2833981519152604482015290519081900360640190fd5b600154600160681b90046001600160801b0316156107bb5760405162461bcd60e51b81526004018080602001828103825260368152602001806113696036913960400191505060405180910390fd5b61012c6001600160401b038216116108045760405162461bcd60e51b81526004018080602001828103825260298152602001806114d76029913960400191505060405180910390fd5b600480546001600160801b03196001600160401b03948516600160801b0267ffffffffffffffff60801b19968616600160c01b026001600160c01b03909316929092179590951617939093169116179055565b6003546001600160a01b03163314156108a15760405162461bcd60e51b81526004018080602001828103825260448152602001806115006044913960600191505060405180910390fd5b33600090815260066020526040902054806108ed5760405162461bcd60e51b81526004018080602001828103825260218152602001806114846021913960400191505060405180910390fd5b336000818152600660205260408082208290555183156108fc0291849190818181858888f19350505050158015610928573d6000803e3d6000fd5b5050565b6000546001600160a01b03163314610979576040805162461bcd60e51b815260206004820152601b60248201526000805160206113e2833981519152604482015290519081900360640190fd5b6001600160801b03919091166000908152600760205260409020805460ff1916911515919091179055565b60076020526000908152604090205460ff1681565b6004546001600160801b038116906001600160401b03600160801b8204811691600160c01b90041683565b6000546001600160a01b031681565b600560205260009081526040902080546001909101546001600160401b03821691600160401b90046001600160a01b03169083565b60015460ff1615610a75576040805162461bcd60e51b815260206004820152601260248201527120bab1ba34b7b71034b9903830bab9b2b21760711b604482015290519081900360640190fd5b610a7d611208565b15610aa457610a8a611026565b600154600160681b90046001600160801b031615610aa457fe5b600154600160681b90046001600160801b0316610ae957600180546fffffffffffffffffffffffffffffffff60681b1916600160681b426001600160801b0316021790555b610af283611297565b6001600160801b0383166000908152600560205260409020546001600160401b031615610b66576040805162461bcd60e51b815260206004820152601760248201527f546f6b656e20496420616c726561647920657869737473000000000000000000604482015290519081900360640190fd5b600154610100900463ffffffff166001600160401b03821614610bba5760405162461bcd60e51b81526004018080602001828103825260318152602001806114246031913960400191505060405180910390fd5b600454670de0b6b3a76400006001600160401b03600160c01b909204821602166001600160801b0383161015610c215760405162461bcd60e51b81526004018080602001828103825260328152602001806114a56032913960400191505060405180910390fd5b60045460025460646001600160801b03600160801b9283900481166001600160401b039390940492909216830282160490910181169083161015610c965760405162461bcd60e51b815260040180806020018281038252604381526020018061139f6043913960600191505060405180910390fd5b33610c9f611322565b50604080516060810182526001600160801b03808716825285166020808301919091526001600160a01b0384168284018190526000908152600690915291909120543490810190811015610d2f576040805162461bcd60e51b815260206004820152601260248201527120b23234ba34b7b71037bb32b9333637bb9760711b604482015290519081900360640190fd5b6001600160a01b03831660009081526006602090815260409091208290558201516001600160801b0316811015610dad576040805162461bcd60e51b815260206004820152601a60248201527f4e6f7420656e6f7567682062616c616e636520746f206269642e000000000000604482015290519081900360640190fd5b81516002805460208501516001600160801b03908116600160801b029381166001600160801b031990921691909117169190911790556040820151600380546001600160a01b039092166001600160a01b0319909216919091179055600042610e146111d3565b03905061012c6001600160801b0382161015610e6357600180546001600160401b0365010000000000808304821661012c86900301909116026cffffffffffffffff0000000000199091161790555b50505050505050565b6001600160801b038216600090815260056020526040902054600160401b90046001600160a01b03163314610ed25760405162461bcd60e51b81526004018080602001828103825260268152602001806113436026913960400191505060405180910390fd5b6001600160801b03909116600090815260056020526040902080546001600160a01b03909216600160401b02600160401b600160e01b0319909216919091179055565b6001600160801b0316600090815260056020526040902080546001909101546001600160401b03821692600160401b9092046001600160a01b031691565b60015460ff1690565b6000546001600160a01b03163314610fa9576040805162461bcd60e51b815260206004820152601b60248201526000805160206113e2833981519152604482015290519081900360640190fd5b6001805460ff191681179055565b6000546001600160a01b03163314611004576040805162461bcd60e51b815260206004820152601b60248201526000805160206113e2833981519152604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b60015460ff1615611073576040805162461bcd60e51b815260206004820152601260248201527120bab1ba34b7b71034b9903830bab9b2b21760711b604482015290519081900360640190fd5b61107b611208565b6110c5576040805162461bcd60e51b815260206004820152601660248201527520bab1ba34b7b7103430b9903737ba1032b73232b21760511b604482015290519081900360640190fd5b6002546003546001600160a01b0316600090815260066020526040902054600160801b9091046001600160801b031611156110fc57fe5b60028054600380546001600160a01b0390811660009081526006602090815260408083208054600160801b9097046001600160801b0390811690970390558454875487168452600583528184208054600160401b600160e01b031916918616600160401b0291909117905586548616835291829020805467ffffffffffffffff1916426001600160401b031617905592549454815195909216855292169083015280517f64bb607a8887443bda664340203d98f768ced2874cab4af7c0f6d913aabcf1559281900390910190a16111d1611249565b565b600154600454600160681b82046001600160801b039081169116016001600160401b0365010000000000909204919091160190565b60006112126111d3565b6001600160801b0316426001600160801b0316101580156112445750600154600160681b90046001600160801b031615155b905090565b6000600255600380546001600160a01b03191690556001805463ffffffff61010065010000000000600160e81b031983168190048216840190911602610100600160e81b0319909116179055565b6001600160801b03811660009081526007602052604090205460ff1661130157621a5c73816001600160801b0316116113015760405162461bcd60e51b815260040180806020018281038252602f815260200180611455602f913960400191505060405180910390fd5b50565b60405180606001604052806003906020820280388339509192915050565b60408051606081018252600080825260208201819052918101919091529056fe4f6e6c7920746865206f776e65722063616e207472616e73666572206f776e6572736869702e41756374696f6e2073657474696e672063616e6e6f74206265206d6f646966696564207768656e206974206973206f6e676f696e672e4269642070726963652073686f756c64206265206c6172676572207468616e2063757272656e74206869676865737420626964207769746820696e6372656d656e742e4f6e6c792073757065727669736f7220697320616c6c6f7765642e00000000004f6e6c7920746865206f776e65722063616e206d696e74206e657720746f6b656e2e54617267657420726f756e64206f662061756374696f6e2068617320656e646564206f72206e6f7420737461727465642e546865206c656e677468206f6620746f6b656e206e616d65204d555354206265206c6172676572207468616e20342e4e6f2062616c616e636520617661696c61626c6520746f2077697468647261772e4269642070726963652073686f756c64206265206c6172676572207468616e206d696e696d756d206269642070726963652e4475726174696f6e2073686f756c64206265206c6f6e676572207468616e2035206d696e757465732e48696768657374206269646465722063616e6e6f742077697468647261772062616c616e63652074696c6c2074686520656e64206f6620746869732061756374696f6e2ea265627a7a72315820d90713a7d1cc1fd4e10ac9956481d00cf5c5f7d98dac1c84c3700ab4ef671efb64736f6c634300050c0032000000000000000000000000d50f23e410711c1391f5ef88fc11245e564c7684` + NonReservedNativeTokenContractBytecode = `60e060405261012c6080819052600160a052606460c052600480547001000000000000000000000000000000006001600160801b0319909116909217600160801b600160c01b031916919091176001600160c01b0316786400000000000000000000000000000000000000000000000017905534801561007e57600080fd5b50604051611682380380611682833981810160405260208110156100a157600080fd5b5051600080546001600160a01b039092166001600160a01b03199092169190911790556001805460ff1916811790556115a3806100df6000396000f3fe6080604052600436106101095760003560e01c806356e4b68b116100955780639ea41be7116100645780639ea41be71461043d578063b187bd2614610470578063b9ae736414610485578063bc1fc2091461049a578063fe67a54b146104cd57610109565b806356e4b68b146103275780635fc81df1146103585780636aecd9d7146103bb5780638556fed2146103fb57610109565b80633c69e3d2116100dc5780633c69e3d2146102045780633ccfd60b1461024957806344637c8d1461025e5780635254298a14610299578063568f02f8146102e057610109565b806308bfc3001461010e5780630f2dc31a1461016f57806327e235e3146101aa57806332353fbd146101ef575b600080fd5b34801561011a57600080fd5b506101236104e2565b604080516001600160801b03968716815294861660208601526001600160a01b03909316848401526001600160401b039091166060840152909216608082015290519081900360a00190f35b34801561017b57600080fd5b506101a86004803603604081101561019257600080fd5b506001600160801b038135169060200135610542565b005b3480156101b657600080fd5b506101dd600480360360208110156101cd57600080fd5b50356001600160a01b03166106ac565b60408051918252519081900360200190f35b3480156101fb57600080fd5b506101a86106be565b34801561021057600080fd5b506101a86004803603606081101561022757600080fd5b506001600160401b03813581169160208101358216916040909101351661072c565b34801561025557600080fd5b506101a8610864565b34801561026a57600080fd5b506101a86004803603604081101561028157600080fd5b506001600160801b0381351690602001351515610939565b3480156102a557600080fd5b506102cc600480360360208110156102bc57600080fd5b50356001600160801b03166109b1565b604080519115158252519081900360200190f35b3480156102ec57600080fd5b506102f56109c6565b604080516001600160801b0390941684526001600160401b039283166020850152911682820152519081900360600190f35b34801561033357600080fd5b5061033c6109f1565b604080516001600160a01b039092168252519081900360200190f35b34801561036457600080fd5b5061038b6004803603602081101561037b57600080fd5b50356001600160801b0316610a00565b604080516001600160401b0390941684526001600160a01b03909216602084015282820152519081900360600190f35b6101a8600480360360608110156103d157600080fd5b5080356001600160801b0390811691602081013590911690604001356001600160401b0316610a35565b34801561040757600080fd5b506101a86004803603604081101561041e57600080fd5b5080356001600160801b031690602001356001600160a01b0316610e79565b34801561044957600080fd5b5061038b6004803603602081101561046057600080fd5b50356001600160801b0316610f22565b34801561047c57600080fd5b506102cc610f60565b34801561049157600080fd5b506101a8610f69565b3480156104a657600080fd5b506101a8600480360360208110156104bd57600080fd5b50356001600160a01b0316610fc4565b3480156104d957600080fd5b506101a8611033565b60025460035460015460009283928392839283926001600160801b0380831693600160801b90930416916001600160a01b0390911690610100900463ffffffff1661052b6111e0565b939992985090965063ffffffff1694509092509050565b6001600160801b038216600090815260056020526040902080546001600160401b03166105b6576040805162461bcd60e51b815260206004820152601760248201527f546f6b656e20494420646f65736e27742065786973742e000000000000000000604482015290519081900360640190fd5b8054600160401b90046001600160a01b031633146106055760405162461bcd60e51b815260040180806020018281038252602281526020018061142d6022913960400191505060405180910390fd5b60018101805483019081905582111561065a576040805162461bcd60e51b815260206004820152601260248201527120b23234ba34b7b71037bb32b9333637bb9760711b604482015290519081900360640190fd5b61066261132f565b8154600160401b90046001600160a01b031681526001600160801b0384166020820152604081018390526000806060838264514b430004600019f16106a657600080fd5b50505050565b60066020526000908152604090205481565b6000546001600160a01b0316331461070b576040805162461bcd60e51b815260206004820152601b602482015260008051602061140d833981519152604482015290519081900360640190fd5b610713611215565b1561072057610720611256565b6001805460ff19169055565b6000546001600160a01b03163314610779576040805162461bcd60e51b815260206004820152601b602482015260008051602061140d833981519152604482015290519081900360640190fd5b600154600160681b90046001600160801b0316156107c85760405162461bcd60e51b81526004018080602001828103825260368152602001806113946036913960400191505060405180910390fd5b61012c6001600160401b038216116108115760405162461bcd60e51b81526004018080602001828103825260298152602001806115026029913960400191505060405180910390fd5b600480546001600160801b03196001600160401b03948516600160801b0267ffffffffffffffff60801b19968616600160c01b026001600160c01b03909316929092179590951617939093169116179055565b6003546001600160a01b03163314156108ae5760405162461bcd60e51b815260040180806020018281038252604481526020018061152b6044913960600191505060405180910390fd5b33600090815260066020526040902054806108fa5760405162461bcd60e51b81526004018080602001828103825260218152602001806114af6021913960400191505060405180910390fd5b336000818152600660205260408082208290555183156108fc0291849190818181858888f19350505050158015610935573d6000803e3d6000fd5b5050565b6000546001600160a01b03163314610986576040805162461bcd60e51b815260206004820152601b602482015260008051602061140d833981519152604482015290519081900360640190fd5b6001600160801b03919091166000908152600760205260409020805460ff1916911515919091179055565b60076020526000908152604090205460ff1681565b6004546001600160801b038116906001600160401b03600160801b8204811691600160c01b90041683565b6000546001600160a01b031681565b600560205260009081526040902080546001909101546001600160401b03821691600160401b90046001600160a01b03169083565b60015460ff1615610a82576040805162461bcd60e51b815260206004820152601260248201527120bab1ba34b7b71034b9903830bab9b2b21760711b604482015290519081900360640190fd5b610a8a611215565b15610ab157610a97611033565b600154600160681b90046001600160801b031615610ab157fe5b600154600160681b90046001600160801b0316610af657600180546fffffffffffffffffffffffffffffffff60681b1916600160681b426001600160801b0316021790555b610aff836112a4565b6001600160801b0383166000908152600560205260409020546001600160401b031615610b73576040805162461bcd60e51b815260206004820152601760248201527f546f6b656e20496420616c726561647920657869737473000000000000000000604482015290519081900360640190fd5b600154610100900463ffffffff166001600160401b03821614610bc75760405162461bcd60e51b815260040180806020018281038252603181526020018061144f6031913960400191505060405180910390fd5b600454670de0b6b3a76400006001600160401b03600160c01b909204821602166001600160801b0383161015610c2e5760405162461bcd60e51b81526004018080602001828103825260328152602001806114d06032913960400191505060405180910390fd5b60045460025460646001600160801b03600160801b9283900481166001600160401b039390940492909216830282160490910181169083161015610ca35760405162461bcd60e51b81526004018080602001828103825260438152602001806113ca6043913960600191505060405180910390fd5b33610cac61134d565b50604080516060810182526001600160801b03808716825285166020808301919091526001600160a01b0384168284018190526000908152600690915291909120543490810190811015610d3c576040805162461bcd60e51b815260206004820152601260248201527120b23234ba34b7b71037bb32b9333637bb9760711b604482015290519081900360640190fd5b6001600160a01b03831660009081526006602090815260409091208290558201516001600160801b0316811015610dba576040805162461bcd60e51b815260206004820152601a60248201527f4e6f7420656e6f7567682062616c616e636520746f206269642e000000000000604482015290519081900360640190fd5b81516002805460208501516001600160801b03908116600160801b029381166001600160801b031990921691909117169190911790556040820151600380546001600160a01b039092166001600160a01b0319909216919091179055600042610e216111e0565b03905061012c6001600160801b0382161015610e7057600180546001600160401b0365010000000000808304821661012c86900301909116026cffffffffffffffff0000000000199091161790555b50505050505050565b6001600160801b038216600090815260056020526040902054600160401b90046001600160a01b03163314610edf5760405162461bcd60e51b815260040180806020018281038252602681526020018061136e6026913960400191505060405180910390fd5b6001600160801b03909116600090815260056020526040902080546001600160a01b03909216600160401b02600160401b600160e01b0319909216919091179055565b6001600160801b0316600090815260056020526040902080546001909101546001600160401b03821692600160401b9092046001600160a01b031691565b60015460ff1690565b6000546001600160a01b03163314610fb6576040805162461bcd60e51b815260206004820152601b602482015260008051602061140d833981519152604482015290519081900360640190fd5b6001805460ff191681179055565b6000546001600160a01b03163314611011576040805162461bcd60e51b815260206004820152601b602482015260008051602061140d833981519152604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b60015460ff1615611080576040805162461bcd60e51b815260206004820152601260248201527120bab1ba34b7b71034b9903830bab9b2b21760711b604482015290519081900360640190fd5b611088611215565b6110d2576040805162461bcd60e51b815260206004820152601660248201527520bab1ba34b7b7103430b9903737ba1032b73232b21760511b604482015290519081900360640190fd5b6002546003546001600160a01b0316600090815260066020526040902054600160801b9091046001600160801b0316111561110957fe5b60028054600380546001600160a01b0390811660009081526006602090815260408083208054600160801b9097046001600160801b0390811690970390558454875487168452600583528184208054600160401b600160e01b031916918616600160401b0291909117905586548616835291829020805467ffffffffffffffff1916426001600160401b031617905592549454815195909216855292169083015280517f64bb607a8887443bda664340203d98f768ced2874cab4af7c0f6d913aabcf1559281900390910190a16111de611256565b565b600154600454600160681b82046001600160801b039081169116016001600160401b0365010000000000909204919091160190565b600061121f6111e0565b6001600160801b0316426001600160801b0316101580156112515750600154600160681b90046001600160801b031615155b905090565b6000600255600380546001600160a01b03191690556001805463ffffffff61010065010000000000600160e81b031983168190048216840190911602610100600160e81b0319909116179055565b6001600160801b03811660009081526007602052604090205460ff1661130e57621a5c73816001600160801b03161161130e5760405162461bcd60e51b815260040180806020018281038252602f815260200180611480602f913960400191505060405180910390fd5b6743a3163a81075073816001600160801b0316111561132c57600080fd5b50565b60405180606001604052806003906020820280388339509192915050565b60408051606081018252600080825260208201819052918101919091529056fe4f6e6c7920746865206f776e65722063616e207472616e73666572206f776e6572736869702e41756374696f6e2073657474696e672063616e6e6f74206265206d6f646966696564207768656e206974206973206f6e676f696e672e4269642070726963652073686f756c64206265206c6172676572207468616e2063757272656e74206869676865737420626964207769746820696e6372656d656e742e4f6e6c792073757065727669736f7220697320616c6c6f7765642e00000000004f6e6c7920746865206f776e65722063616e206d696e74206e657720746f6b656e2e54617267657420726f756e64206f662061756374696f6e2068617320656e646564206f72206e6f7420737461727465642e546865206c656e677468206f6620746f6b656e206e616d65204d555354206265206c6172676572207468616e20342e4e6f2062616c616e636520617661696c61626c6520746f2077697468647261772e4269642070726963652073686f756c64206265206c6172676572207468616e206d696e696d756d206269642070726963652e4475726174696f6e2073686f756c64206265206c6f6e676572207468616e2035206d696e757465732e48696768657374206269646465722063616e6e6f742077697468647261772062616c616e63652074696c6c2074686520656e64206f6620746869732061756374696f6e2ea265627a7a723158202077e40d0d75c50db5c1d2b7e82ea010f5bf274471a736844abc9e67a1ecdfba64736f6c63430005110032000000000000000000000000c4fba3740f95d25b2196c9437fdb005359296d36` generalNativeTokenContractAddr = "514b430000000000000000000000000000000003" - GeneralNativeTokenContractBytecode = `6080604052600080546001600160a01b031916301790553480156200002357600080fd5b50604051620019603803806200196083398101604081905262000046916200008c565b600180546001600160a01b0319166001600160a01b03929092169190911781556004805460ff19169091179055620000e1565b80516200008681620000c7565b92915050565b6000602082840312156200009f57600080fd5b6000620000ad848462000079565b949350505050565b60006001600160a01b03821662000086565b620000d281620000b5565b8114620000de57600080fd5b50565b61186f80620000f16000396000f3fe60806040526004361061012a5760003560e01c80639447e58c116100ab578063bf03314a1161006f578063bf03314a14610330578063bffa8bd014610338578063ce9e8c471461035a578063ceca031814610389578063dc68f0a01461039c578063f9c94eb7146103b15761012a565b80639447e58c146102815780639ed2c7ef146102b0578063bb928854146102d0578063bc1fc209146102f0578063beb92f55146103105761012a565b80636d27af8c116100f25780636d27af8c146101f7578063735e0e1914610219578063764a27ef1461022c5780637e0812701461024c57806382e1521d146102615761012a565b8063041e6c091461012f57806313dee2151461015a57806321a2b36e1461018757806356e4b68b146101a75780635ae8f7f1146101c9575b600080fd5b34801561013b57600080fd5b506101446103d1565b6040516101519190611615565b60405180910390f35b34801561016657600080fd5b5061017a610175366004610ff8565b6103da565b6040516101519190611761565b34801561019357600080fd5b5061017a6101a2366004610ff8565b6103f7565b3480156101b357600080fd5b506101bc610414565b60405161015191906115df565b3480156101d557600080fd5b506101e96101e4366004611062565b610423565b60405161015192919061176f565b34801561020357600080fd5b506102176102123660046110af565b6105f6565b005b610217610227366004611062565b6106bd565b34801561023857600080fd5b50610217610247366004610fbc565b610923565b34801561025857600080fd5b506101bc610960565b34801561026d57600080fd5b5061014461027c366004610fda565b61096f565b34801561028d57600080fd5b506102a161029c366004610fda565b610984565b604051610151939291906115ed565b3480156102bc57600080fd5b506102176102cb366004610fda565b6109e4565b3480156102dc57600080fd5b506102176102eb366004611032565b610abb565b3480156102fc57600080fd5b5061021761030b366004610f9e565b610b15565b34801561031c57600080fd5b5061021761032b366004610f9e565b610b61565b610217610bad565b34801561034457600080fd5b5061034d610c44565b6040516101519190611753565b34801561036657600080fd5b5061037a610375366004611032565b610c53565b60405161015193929190611791565b610217610397366004610fda565b610d5e565b3480156103a857600080fd5b5061034d610e0d565b3480156103bd57600080fd5b506102176103cc366004610fda565b610e23565b60045460ff1681565b600560209081526000928352604080842090915290825290205481565b600660209081526000928352604080842090915290825290205481565b6001546001600160a01b031681565b6000805481906001600160a01b031633146104595760405162461bcd60e51b815260040161045090611693565b60405180910390fd5b60008060006104688887610c53565b919450925090506001600160801b03878116908716810290808402908490828161048e57fe5b04146104ac5760405162461bcd60e51b815260040161045090611663565b6001600160801b03808b1660009081526005602090815260408083206001600160a01b038816845290915290205460035490911611156104fe5760405162461bcd60e51b8152600401610450906116d3565b6001600160801b038a1660009081526005602090815260408083206001600160a01b038716845290915290205481111561054a5760405162461bcd60e51b8152600401610450906116e3565b6001600160801b038a1660009081526006602090815260408083206001600160a01b03871684529091529020548281019081101561059a5760405162461bcd60e51b815260040161045090611623565b6001600160801b038b1660008181526005602090815260408083206001600160a01b0390981680845297825280832080549690960390955591815260068252838120958152949052922091909155509092509050935093915050565b6001600160801b0382166000908152600260205260409020546001600160a01b031633146106365760405162461bcd60e51b815260040161045090611713565b8067ffffffffffffffff16600a1115801561065c575060648167ffffffffffffffff1611155b6106785760405162461bcd60e51b815260040161045090611723565b6001600160801b039091166000908152600260205260409020805467ffffffffffffffff909216600160a01b0267ffffffffffffffff60a01b19909216919091179055565b60045460ff1615610700576001600160801b03831660009081526007602052604090205460ff166107005760405162461bcd60e51b815260040161045090611733565b816001600160801b03166000106107295760405162461bcd60e51b815260040161045090611703565b806001600160801b03166000106107525760405162461bcd60e51b815260040161045090611703565b6003546001600160801b03908116818316026152088402909116106107895760405162461bcd60e51b8152600401610450906116f3565b610791610ef5565b6001600160801b03838116825282811660208084019190915260035486831660009081526005835260408082203383529093529190912054600160801b9091049091163490910110156107f65760405162461bcd60e51b8152600401610450906116d3565b6001600160801b0380851660009081526002602090815260408083206005835281842060035482546001600160a01b03168652938190529190932054929390929116118061086357506001820154610863906001600160801b0380821691600160801b9004168787610e95565b61087f5760405162461bcd60e51b815260040161045090611653565b3360009081526020829052604090205434908101908110156108b35760405162461bcd60e51b815260040161045090611633565b33600081815260209390935260409092205581546001830180546001600160801b0319166001600160801b03978816178716600160801b9690971695909502959095179093556001600160a01b031990931690911767ffffffffffffffff60a01b1916601960a11b179091555050565b6001546001600160a01b0316331461094d5760405162461bcd60e51b815260040161045090611643565b6004805460ff1916911515919091179055565b6000546001600160a01b031681565b60076020526000908152604090205460ff1681565b600260209081526000918252604091829020805483518085019094526001909101546001600160801b038082168552600160801b90910416918301919091526001600160a01b03811691600160a01b90910467ffffffffffffffff169083565b6001600160801b0381166000908152600260205260409020546001600160a01b0316331415610a255760405162461bcd60e51b8152600401610450906116c3565b6001600160801b038116600090815260056020908152604080832033845290915290205480610a665760405162461bcd60e51b815260040161045090611743565b6001600160801b038216600090815260056020908152604080832033808552925280832083905551909183156108fc02918491818181858888f19350505050158015610ab6573d6000803e3d6000fd5b505050565b6001546001600160a01b03163314610ae55760405162461bcd60e51b815260040161045090611643565b600380546001600160801b03928316600160801b029383166001600160801b031990911617909116919091179055565b6001546001600160a01b03163314610b3f5760405162461bcd60e51b815260040161045090611643565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03163314610b8b5760405162461bcd60e51b815260040161045090611643565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b610bb5610f0c565b6020816000808064514b430001600019f1610bcf57600080fd5b80516001600160801b03811660009081526007602052604090205460ff1615610c0a5760405162461bcd60e51b8152600401610450906116a3565b6001600160801b03166000908152600760209081526040808320805460ff1916600117905560068252808320338452909152902034905550565b6003546001600160801b031681565b6000806000610c60610f2a565b506001600160801b03858116600090815260026020908152604091829020825160608101845281546001600160a01b038082168352600160a01b90910467ffffffffffffffff1682850152845180860186526001909301548087168452600160801b900490951692820192909252918101919091528051909116610cf65760405162461bcd60e51b815260040161045090611683565b610cfe610ef5565b506040810151805160208201516001600160801b039182168289160291168181610d2457fe5b04905060008111610d475760405162461bcd60e51b815260040161045090611743565b602083015192519295509350909150509250925092565b6001600160801b0381166000908152600560209081526040808320338452909152902054610d9e5760405162461bcd60e51b815260040161045090611673565b6001600160801b03811660009081526005602090815260408083203384529091529020543490810190811015610de65760405162461bcd60e51b8152600401610450906116b3565b6001600160801b039091166000908152600560209081526040808320338452909152902055565b600354600160801b90046001600160801b031681565b6001600160801b038116600090815260066020908152604080832033845290915290205480610e645760405162461bcd60e51b815260040161045090611743565b6001600160801b0382166000818152600660209081526040808320338085529252822091909155610ab69183610eb8565b6001600160801b038281168482160285821691831691909102105b949350505050565b6000610ec2610f4e565b84815260208082018590526040820184905282606083600064514b430002600019f1610eed57600080fd5b509392505050565b604080518082019091526000808252602082015290565b60405180602001604052806001906020820280388339509192915050565b6040805160608101825260008082526020820152908101610f49610ef5565b905290565b60405180606001604052806003906020820280388339509192915050565b8035610f77816117fa565b92915050565b8035610f7781611811565b8035610f778161181a565b8035610f7781611823565b600060208284031215610fb057600080fd5b6000610eb08484610f6c565b600060208284031215610fce57600080fd5b6000610eb08484610f7d565b600060208284031215610fec57600080fd5b6000610eb08484610f88565b6000806040838503121561100b57600080fd5b60006110178585610f88565b925050602061102885828601610f6c565b9150509250929050565b6000806040838503121561104557600080fd5b60006110518585610f88565b925050602061102885828601610f88565b60008060006060848603121561107757600080fd5b60006110838686610f88565b935050602061109486828701610f88565b92505060406110a586828701610f88565b9150509250925092565b600080604083850312156110c257600080fd5b60006110ce8585610f88565b925050602061102885828601610f93565b6110e8816117c2565b82525050565b6110e8816117cd565b60006111046018836117b9565b7f41766f6964206164646974696f6e206f766572666c6f772e0000000000000000815260200192915050565b600061113d6012836117b9565b7120b23234ba34b7b71037bb32b9333637bb9760711b815260200192915050565b600061116b601b836117b9565b7f4f6e6c792073757065727669736f7220697320616c6c6f7765642e0000000000815260200192915050565b60006111a46023836117b9565b7f496e76616c6964206e65772065786368616e676520726174652070726f706f7381526230b61760e91b602082015260400192915050565b60006111e96017836117b9565b7f41766f69642075696e74323536206f766572666c6f772e000000000000000000815260200192915050565b6000611222601a836117b9565b7f73686f756c6420626520616e206578697374656420746f6b656e000000000000815260200192915050565b600061125b600e836117b9565b6d24b73b30b634b2103a37b5b2b71760911b815260200192915050565b60006112856025836117b9565b7f4f6e6c792063616c6c65722063616e20696e766f6b6520746869732066756e638152643a34b7b71760d91b602082015260400192915050565b60006112cc6019836117b9565b7f546f6b656e20616c726561647920726567697374657265642e00000000000000815260200192915050565b60006113056016836117b9565b7573686f756c6420626520612076616c6964207465726d60501b815260200192915050565b60006113376023836117b9565b7f4e6f7420616c6c6f77656420666f72206e617469766520746f6b656e2061646d81526234b71760e91b602082015260400192915050565b600061137c6030836117b9565b7f53686f756c642068617665207265736572766520616d6f756e7420677265617481526f32b9103a3430b71036b4b734b6bab69760811b602082015260400192915050565b60006113ce6023836117b9565b7f53686f756c64206861766520656e6f75676820726573657276657320746f207081526230bc9760e91b602082015260400192915050565b60006114136037836117b9565b7f52657175697265732065786368616e67652072617465202a203231303030203c81527f206d696e476173526573657276654d61696e7461696e2e000000000000000000602082015260400192915050565b60006114726019836117b9565b7f56616c75652073686f756c64206265206e6f6e2d7a65726f2e00000000000000815260200192915050565b60006114ab601f836117b9565b7f4f6e6c792061646d696e2063616e2073657420726566756e6420726174652e00815260200192915050565b60006114e4602f836117b9565b7f526566756e642070657274656e746167652073686f756c64206265206265747781526e32b2b71018981030b732101898181760891b602082015260400192915050565b60006115356018836117b9565b7f546f6b656e20494420646f6573206e6f742065786973742e0000000000000000815260200192915050565b600061156e601b836117b9565b7f53686f756c642068617665206e6f6e2d7a65726f2076616c75652e0000000000815260200192915050565b805160408301906115ab84826115c4565b5060208201516115be60208501826115c4565b50505050565b6110e8816117d2565b6110e8816117ea565b6110e8816117ed565b60208101610f7782846110df565b608081016115fb82866110df565b61160860208301856115d6565b610eb0604083018461159a565b60208101610f7782846110ee565b60208082528101610f77816110f7565b60208082528101610f7781611130565b60208082528101610f778161115e565b60208082528101610f7781611197565b60208082528101610f77816111dc565b60208082528101610f7781611215565b60208082528101610f778161124e565b60208082528101610f7781611278565b60208082528101610f77816112bf565b60208082528101610f77816112f8565b60208082528101610f778161132a565b60208082528101610f778161136f565b60208082528101610f77816113c1565b60208082528101610f7781611406565b60208082528101610f7781611465565b60208082528101610f778161149e565b60208082528101610f77816114d7565b60208082528101610f7781611528565b60208082528101610f7781611561565b60208101610f7782846115c4565b60208101610f7782846115cd565b6040810161177d82856115d6565b61178a60208301846115cd565b9392505050565b6060810161179f82866115d6565b6117ac60208301856115cd565b610eb060408301846110df565b90815260200190565b6000610f77826117de565b151590565b6001600160801b031690565b6001600160a01b031690565b90565b67ffffffffffffffff1690565b611803816117c2565b811461180e57600080fd5b50565b611803816117cd565b611803816117d2565b611803816117ed56fea365627a7a72315820e0f086b9bc2f38bdfbecb87aa5aecdc2574cfb85a1167097fefaee8e62acaf4a6c6578706572696d656e74616cf564736f6c634300050c0040000000000000000000000000d50f23e410711c1391f5ef88fc11245e564c7684` + GeneralNativeTokenContractBytecode = `6080604052600080546001600160a01b0319163017905534801561002257600080fd5b506040516117093803806117098339818101604052602081101561004557600080fd5b5051600180546001600160a01b0319166001600160a01b039092169190911781556004805460ff19169091179055611687806100826000396000f3fe60806040526004361061012a5760003560e01c80639447e58c116100ab578063bf03314a1161006f578063bf03314a146104c2578063bffa8bd0146104ca578063ce9e8c47146104fb578063ceca031814610568578063dc68f0a01461058e578063f9c94eb7146105a35761012a565b80639447e58c146103795780639ed2c7ef146103ee578063bb92885414610421578063bc1fc2091461045c578063beb92f551461048f5761012a565b80636d27af8c116100f25780636d27af8c14610288578063735e0e19146102cd578063764a27ef146103055780637e0812701461033157806382e1521d146103465761012a565b8063041e6c091461012f57806313dee2151461015857806321a2b36e146101ac57806356e4b68b146101ee5780635ae8f7f11461021f575b600080fd5b34801561013b57600080fd5b506101446105d6565b604080519115158252519081900360200190f35b34801561016457600080fd5b5061019a6004803603604081101561017b57600080fd5b5080356001600160801b031690602001356001600160a01b03166105df565b60408051918252519081900360200190f35b3480156101b857600080fd5b5061019a600480360360408110156101cf57600080fd5b5080356001600160801b031690602001356001600160a01b03166105fc565b3480156101fa57600080fd5b50610203610619565b604080516001600160a01b039092168252519081900360200190f35b34801561022b57600080fd5b506102646004803603606081101561024257600080fd5b506001600160801b038135811691602081013582169160409091013516610628565b6040805167ffffffffffffffff909316835260208301919091528051918290030190f35b34801561029457600080fd5b506102cb600480360360408110156102ab57600080fd5b5080356001600160801b0316906020013567ffffffffffffffff16610848565b005b6102cb600480360360608110156102e357600080fd5b506001600160801b038135811691602081013582169160409091013516610963565b34801561031157600080fd5b506102cb6004803603602081101561032857600080fd5b50351515610cff565b34801561033d57600080fd5b50610203610d5f565b34801561035257600080fd5b506101446004803603602081101561036957600080fd5b50356001600160801b0316610d6e565b34801561038557600080fd5b506103ac6004803603602081101561039c57600080fd5b50356001600160801b0316610d83565b604080516001600160a01b03909516855267ffffffffffffffff90931660208501526001600160801b0391821684840152166060830152519081900360800190f35b3480156103fa57600080fd5b506102cb6004803603602081101561041157600080fd5b50356001600160801b0316610dcd565b34801561042d57600080fd5b506102cb6004803603604081101561044457600080fd5b506001600160801b0381358116916020013516610ef8565b34801561046857600080fd5b506102cb6004803603602081101561047f57600080fd5b50356001600160a01b0316610f75565b34801561049b57600080fd5b506102cb600480360360208110156104b257600080fd5b50356001600160a01b0316610fe4565b6102cb611053565b3480156104d657600080fd5b506104df61111f565b604080516001600160801b039092168252519081900360200190f35b34801561050757600080fd5b506105366004803603604081101561051e57600080fd5b506001600160801b038135811691602001351661112e565b6040805167ffffffffffffffff909416845260208401929092526001600160a01b031682820152519081900360600190f35b6102cb6004803603602081101561057e57600080fd5b50356001600160801b031661127c565b34801561059a57600080fd5b506104df611395565b3480156105af57600080fd5b506102cb600480360360208110156105c657600080fd5b50356001600160801b03166113ab565b60045460ff1681565b600560209081526000928352604080842090915290825290205481565b600660209081526000928352604080842090915290825290205481565b6001546001600160a01b031681565b6000805481906001600160a01b031633146106745760405162461bcd60e51b81526004018080602001828103825260258152602001806115326025913960400191505060405180910390fd5b6000806000610683888761112e565b919450925090506001600160801b0387811690871681029080840290849082816106a957fe5b04146106fc576040805162461bcd60e51b815260206004820152601760248201527f41766f69642075696e74323536206f766572666c6f772e000000000000000000604482015290519081900360640190fd5b6001600160801b038a1660009081526005602090815260408083206001600160a01b03871684529091529020548111156107675760405162461bcd60e51b81526004018080602001828103825260238152602001806115ca6023913960400191505060405180910390fd5b6001600160801b038a1660009081526006602090815260408083206001600160a01b0387168452909152902054828101908110156107ec576040805162461bcd60e51b815260206004820152601860248201527f41766f6964206164646974696f6e206f766572666c6f772e0000000000000000604482015290519081900360640190fd5b6001600160801b038b1660008181526005602090815260408083206001600160a01b0390981680845297825280832080549690960390955591815260068252838120958152949052922091909155509092509050935093915050565b6001600160801b0382166000908152600260205260409020546001600160a01b031633146108bd576040805162461bcd60e51b815260206004820152601f60248201527f4f6e6c792061646d696e2063616e2073657420726566756e6420726174652e00604482015290519081900360640190fd5b8067ffffffffffffffff16600a111580156108e3575060648167ffffffffffffffff1611155b61091e5760405162461bcd60e51b815260040180806020018281038252602f815260200180611624602f913960400191505060405180910390fd5b6001600160801b039091166000908152600260205260409020805467ffffffffffffffff909216600160a01b0267ffffffffffffffff60a01b19909216919091179055565b60045460ff16156109db576001600160801b03831660009081526007602052604090205460ff166109db576040805162461bcd60e51b815260206004820152601860248201527f546f6b656e20494420646f6573206e6f742065786973742e0000000000000000604482015290519081900360640190fd5b6743a3163a81075073836001600160801b031611156109f957600080fd5b826001600160801b0316618bb01415610a1157600080fd5b816001600160801b0316600010610a6b576040805162461bcd60e51b81526020600482015260196024820152782b30b63ab29039b437bab632103132903737b716bd32b9379760391b604482015290519081900360640190fd5b806001600160801b0316600010610ac5576040805162461bcd60e51b81526020600482015260196024820152782b30b63ab29039b437bab632103132903737b716bd32b9379760391b604482015290519081900360640190fd5b6003546001600160801b0390811681831602615208840290911610610b1b5760405162461bcd60e51b81526004018080602001828103825260378152602001806115ed6037913960400191505060405180910390fd5b6003546001600160801b038481166000908152600560209081526040808320338452909152902054600160801b90920416349091011015610b8d5760405162461bcd60e51b815260040180806020018281038252603081526020018061159a6030913960400191505060405180910390fd5b6001600160801b0380841660009081526002602090815260408083206005835281842060035482546001600160a01b031686529381905291909320549293909291161180610bfa57506001820154610bfa906001600160801b0380821691600160801b9004168686611452565b610c355760405162461bcd60e51b815260040180806020018281038252602381526020018061150f6023913960400191505060405180910390fd5b336000908152602082905260409020543490810190811015610c93576040805162461bcd60e51b815260206004820152601260248201527120b23234ba34b7b71037bb32b9333637bb9760711b604482015290519081900360640190fd5b33600081815260209390935260409092205581546001830180546001600160801b0319166001600160801b03968716178616600160801b9590961694909402949094179092556001600160a01b03199092161767ffffffffffffffff60a01b1916601960a11b17905550565b6001546001600160a01b03163314610d4c576040805162461bcd60e51b815260206004820152601b6024820152600080516020611557833981519152604482015290519081900360640190fd5b6004805460ff1916911515919091179055565b6000546001600160a01b031681565b60076020526000908152604090205460ff1681565b600260205260009081526040902080546001909101546001600160a01b03821691600160a01b900467ffffffffffffffff16906001600160801b0380821691600160801b90041684565b6001600160801b0381166000908152600260205260409020546001600160a01b0316331415610e2d5760405162461bcd60e51b81526004018080602001828103825260238152602001806115776023913960400191505060405180910390fd5b6001600160801b038116600090815260056020908152604080832033845290915290205480610ea3576040805162461bcd60e51b815260206004820152601b60248201527f53686f756c642068617665206e6f6e2d7a65726f2076616c75652e0000000000604482015290519081900360640190fd5b6001600160801b038216600090815260056020908152604080832033808552925280832083905551909183156108fc02918491818181858888f19350505050158015610ef3573d6000803e3d6000fd5b505050565b6001546001600160a01b03163314610f45576040805162461bcd60e51b815260206004820152601b6024820152600080516020611557833981519152604482015290519081900360640190fd5b600380546001600160801b03928316600160801b029383166001600160801b031990911617909116919091179055565b6001546001600160a01b03163314610fc2576040805162461bcd60e51b815260206004820152601b6024820152600080516020611557833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03163314611031576040805162461bcd60e51b815260206004820152601b6024820152600080516020611557833981519152604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b61105b6114ab565b6020816000808064514b430001600019f161107557600080fd5b80516001600160801b03811660009081526007602052604090205460ff16156110e5576040805162461bcd60e51b815260206004820152601960248201527f546f6b656e20616c726561647920726567697374657265642e00000000000000604482015290519081900360640190fd5b6001600160801b03166000908152600760209081526040808320805460ff1916600117905560068252808320338452909152902034905550565b6003546001600160801b031681565b600080600061113b6114c9565b506001600160801b03858116600090815260026020908152604091829020825160808101845281546001600160a01b038116808352600160a01b90910467ffffffffffffffff169382019390935260019091015480851693820193909352600160801b9092049092166060820152906111ec576040805162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b2103a37b5b2b71760911b604482015290519081900360640190fd5b604081015160608201516001600160801b03918216828816029116818161120f57fe5b04905060008111611267576040805162461bcd60e51b815260206004820152601b60248201527f53686f756c642068617665206e6f6e2d7a65726f2076616c75652e0000000000604482015290519081900360640190fd5b60208201519151919450925090509250925092565b6001600160801b03811660009081526005602090815260408083203384529091529020546112f1576040805162461bcd60e51b815260206004820152601a60248201527f53686f756c6420626520616e206578697374656420746f6b656e000000000000604482015290519081900360640190fd5b6001600160801b0381166000908152600560209081526040808320338452909152902054349081019081101561136e576040805162461bcd60e51b815260206004820152601960248201527f52657365727665642062616c616e6365206f766572666c6f7700000000000000604482015290519081900360640190fd5b6001600160801b039091166000908152600560209081526040808320338452909152902055565b600354600160801b90046001600160801b031681565b6001600160801b038116600090815260066020908152604080832033845290915290205480611421576040805162461bcd60e51b815260206004820152601b60248201527f53686f756c642068617665206e6f6e2d7a65726f2076616c75652e0000000000604482015290519081900360640190fd5b6001600160801b0382166000818152600660209081526040808320338085529252822091909155610ef3918361146e565b6001600160801b03918216928216929092029281169116021090565b60006114786114f0565b84815260208082018590526040820184905282606083600064514b430002600019f16114a357600080fd5b509392505050565b60405180602001604052806001906020820280388339509192915050565b60408051608081018252600080825260208201819052918101829052606081019190915290565b6040518060600160405280600390602082028038833950919291505056fe496e76616c6964206e65772065786368616e676520726174652070726f706f73616c2e4f6e6c792063616c6c65722063616e20696e766f6b6520746869732066756e6374696f6e2e4f6e6c792073757065727669736f7220697320616c6c6f7765642e00000000004e6f7420616c6c6f77656420666f72206e617469766520746f6b656e2061646d696e2e53686f756c642068617665207265736572766520616d6f756e742067726561746572207468616e206d696e696d756d2e53686f756c64206861766520656e6f75676820726573657276657320746f207061792e52657175697265732065786368616e67652072617465202a203231303030203c206d696e476173526573657276654d61696e7461696e2e526566756e642070657274656e746167652073686f756c64206265206265747765656e20313020616e64203130302ea265627a7a723158200ffc29b7c89bd90d616540383b56cfb994f966e5aa997c6e5c1e72ae4a688e0064736f6c63430005110032000000000000000000000000c4fba3740f95d25b2196c9437fdb005359296d36` currentMntIDAddr = "000000000000000000000000000000514b430001" transferMntAddr = "000000000000000000000000000000514b430002" deploySystemContractAddr = "000000000000000000000000000000514b430003" MintMNTAddr = "000000000000000000000000000000514b430004" BalanceMNTAddr = "000000000000000000000000000000514b430005" currentMntIDGas = uint64(3) - transferMntGas = uint64(3) + transferMntGas = uint64(0) deployRootChainPoSWStakingContractGas = uint64(3) balanceMNTGas = uint64(400) mintMNTSuccess = common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001") @@ -537,41 +539,70 @@ func (c *transferMnt) RequiredGas(input []byte) uint64 { } func (c *transferMnt) Run(input []byte, evm *EVM, contract *Contract) ([]byte, error) { if len(input) < 96 { + contract.Gas = 0 return nil, errors.New("should 96") } + if contract.IsStaticCall { + contract.Gas = 0 + return nil, errors.New("transferMnt Run: static call not allowed ") + } + toBytes := getData(input, 0, 32) toAddr := common.BytesToAddress(toBytes) mntBytes := getData(input, 32, 32) - mnt := new(big.Int).SetBytes(mntBytes) + tokenID := new(big.Int).SetBytes(mntBytes) valueBytes := getData(input, 64, 32) value := new(big.Int).SetBytes(valueBytes) - if !evm.StateDB.Exist(toAddr) && big.NewInt(0).Cmp(value) < 0 { - if !contract.UseGas(params.CallNewAccountGas) { - contract.Gas = 0 - return nil, ErrOutOfGas - } + data := getData(input, 96, uint64(len(input)-96)) + + // Token ID should be within range + if tokenID.Uint64() > qCommon.TOKENIDMAX { + contract.Gas = 0 + return nil, fmt.Errorf("tokenid %v > TOKENIDMAX %v", tokenID, qCommon.TOKENIDMAX) } - if big.NewInt(0).Cmp(value) < 0 { - if !contract.UseGas(params.CallValueTransferGas) { - contract.Gas = 0 - return nil, ErrOutOfGas + + // Doesn't allow target address to be this precompiled contract itself + if toAddr.String() == common.HexToAddress(transferMntAddr).String() { + contract.Gas = 0 + return nil, fmt.Errorf("re call toAddr %v", toAddr.String()) + } + + gasCost := uint64(0) + if value.Cmp(new(big.Int)) > 0 { + gasCost += params.CallValueTransferGas + if !evm.StateDB.Exist(toAddr) { + gasCost += params.CallNewAccountGas } } - data := getData(input, 96, uint64(len(input)-96)) + //Out of gas + if contract.Gas < gasCost { + contract.Gas = 0 + return nil, fmt.Errorf("run transferMnt failed contracr.gas %v < gasCost %v", contract.Gas, gasCost) + } + + //Handle insufficient balance or exceeding max call depth + if evm.StateDB.GetBalance(contract.Caller(), tokenID.Uint64()).Cmp(value) < 0 || evm.depth >= int(params.CallCreateDepth) { + contract.UseGas(gasCost) + return nil, errExecutionReverted + } + t := evm.TransferTokenID - evm.TransferTokenID = mnt.Uint64() - ret, remainedGas, err := evm.Call(contract.caller, toAddr, data, contract.Gas, value) + evm.TransferTokenID = tokenID.Uint64() + gasToCall := contract.Gas - gasCost + if value.Sign() > 0 { + gasToCall += params.CallStipend + } + contract.UseGas(gasCost) + ret, remainedGas, err := evm.Call(contract.caller, toAddr, data, gasToCall, value) err = checkTokenIDQueried(err, contract, evm.TransferTokenID, evm.StateDB.GetQuarkChainConfig().GetDefaultChainTokenID()) evm.TransferTokenID = t - gasUsed := contract.Gas - remainedGas - if ok := contract.UseGas(gasUsed); !ok { - return nil, ErrOutOfGas - } + + contract.Gas = remainedGas return ret, err } @@ -644,6 +675,12 @@ func (m *mintMNT) Run(input []byte, evm *EVM, contract *Contract) ([]byte, error contract.Gas = 0 return nil, ErrMintZeroAmountMNT } + + // Token ID should be within range + if mnt.Uint64() > qCommon.TOKENIDMAX { + return nil, fmt.Errorf("tokenid %v > TOKENIDMAX %v", mnt, qCommon.TOKENIDMAX) + } + if !evm.StateDB.Exist(minter) && !contract.UseGas(params.CallNewAccountGas) { contract.Gas = 0 return nil, ErrOutOfGas @@ -677,6 +714,11 @@ func (m *balanceMNT) Run(input []byte, evm *EVM, contract *Contract) ([]byte, er addr := common.BytesToAddress(addrBytes) mntBytes := getData(input, 32, 32) mnt := new(big.Int).SetBytes(mntBytes) + // Token ID should be within range + if mnt.Uint64() > qCommon.TOKENIDMAX { + return nil, fmt.Errorf("tokenid %v > TOKENIDMAX %v", mnt, qCommon.TOKENIDMAX) + } + balance := evm.StateDB.GetBalance(addr, mnt.Uint64()) return balance.Bytes(), nil } diff --git a/core/vm/evm.go b/core/vm/evm.go index cf3603057..e46bea140 100644 --- a/core/vm/evm.go +++ b/core/vm/evm.go @@ -364,6 +364,7 @@ func (evm *EVM) StaticCall(caller ContractRef, addr common.Address, input []byte // only. contract := NewContract(caller, to, new(big.Int), gas) contract.SetCallCode(&addr, evm.StateDB.GetCodeHash(addr), evm.StateDB.GetCode(addr)) + contract.SetIsStaticCall(true) if evm.Context.TransferFailureByPoswBalanceCheck(evm.StateDB, caller.Address(), contract.value) { return nil, 0, ErrPoSWSenderNotAllowed } diff --git a/mainnet/singularity/cluster_config_bootnodes.json b/mainnet/singularity/cluster_config_bootnodes.json index c547ba174..54f7c2668 100644 --- a/mainnet/singularity/cluster_config_bootnodes.json +++ b/mainnet/singularity/cluster_config_bootnodes.json @@ -28,6 +28,8 @@ "ENABLE_TX_TIMESTAMP": 1561791600, "ENABLE_EVM_TIMESTAMP": 1569567600, "ENABLE_QKCHASHX_HEIGHT": 1480000, + "ENABLE_NON_RESERVED_NATIVE_TOKEN_TIMESTAMP": 1588291200, + "ENABLE_GENERAL_NATIVE_TOKEN_TIMESTAMP": 1588291200, "TX_WHITELIST_SENDERS": [ "b8C082828F51343299c9A4deEb2503AaC3bA074f", "3391A1796cB98D79A2Fde326F375DF900C959Ed0", diff --git a/mainnet/singularity/cluster_config_template.json b/mainnet/singularity/cluster_config_template.json index 7ebcd2d01..10bbac197 100644 --- a/mainnet/singularity/cluster_config_template.json +++ b/mainnet/singularity/cluster_config_template.json @@ -26,6 +26,8 @@ "ENABLE_TX_TIMESTAMP": 1561791600, "ENABLE_EVM_TIMESTAMP": 1569567600, "ENABLE_QKCHASHX_HEIGHT": 1480000, + "ENABLE_NON_RESERVED_NATIVE_TOKEN_TIMESTAMP": 1588291200, + "ENABLE_GENERAL_NATIVE_TOKEN_TIMESTAMP": 1588291200, "TX_WHITELIST_SENDERS": [ "b8C082828F51343299c9A4deEb2503AaC3bA074f", "3391A1796cB98D79A2Fde326F375DF900C959Ed0", diff --git a/mainnet/singularity/cluster_config_template_8nodes.json b/mainnet/singularity/cluster_config_template_8nodes.json index 336cc6374..011258149 100644 --- a/mainnet/singularity/cluster_config_template_8nodes.json +++ b/mainnet/singularity/cluster_config_template_8nodes.json @@ -26,6 +26,8 @@ "ENABLE_TX_TIMESTAMP": 1561791600, "ENABLE_EVM_TIMESTAMP": 1569567600, "ENABLE_QKCHASHX_HEIGHT": 1480000, + "ENABLE_NON_RESERVED_NATIVE_TOKEN_TIMESTAMP": 1588291200, + "ENABLE_GENERAL_NATIVE_TOKEN_TIMESTAMP": 1588291200, "TX_WHITELIST_SENDERS": [ "b8C082828F51343299c9A4deEb2503AaC3bA074f", "3391A1796cB98D79A2Fde326F375DF900C959Ed0", diff --git a/params/evm_params.go b/params/evm_params.go index d51af690d..b179b3353 100644 --- a/params/evm_params.go +++ b/params/evm_params.go @@ -59,3 +59,8 @@ var ( common.HexToAddress("000000000000000000000000000000514b430005"), } ) + +var ( + MAINNET_ENABLE_NON_RESERVED_NATIVE_TOKEN_CONTRACT_TIMESTAMP = uint64(1588291200) + MAINNET_ENABLE_GENERAL_NATIVE_TOKEN_CONTRACT_TIMESTAMP = uint64(1588291200) +) diff --git a/tests/testdata/QuarkChainStateTests/stContractCallMnt/contractTransferMntNotEnoughBalance.json b/tests/testdata/QuarkChainStateTests/stContractCallMnt/contractTransferMntNotEnoughBalance.json index 19cefce61..c38d407df 100644 --- a/tests/testdata/QuarkChainStateTests/stContractCallMnt/contractTransferMntNotEnoughBalance.json +++ b/tests/testdata/QuarkChainStateTests/stContractCallMnt/contractTransferMntNotEnoughBalance.json @@ -18,7 +18,7 @@ "post": { "ConstantinopleFix": [ { - "hash": "0xf5811632e06923cfbbd8b8d2fc8dcd13dd0c583f96d385f203d423fd73bee80c", + "hash": "0x242e94c635c64aee46c426997dd10eef7847579f49e1be79f8464264bcb49960", "indexes": { "data": 0, "gas": 0, diff --git a/tests/testdata/QuarkChainStateTests/stContractCallMnt/contractTransferMntQKCOnly.json b/tests/testdata/QuarkChainStateTests/stContractCallMnt/contractTransferMntQKCOnly.json index f0f196967..ebd3769de 100644 --- a/tests/testdata/QuarkChainStateTests/stContractCallMnt/contractTransferMntQKCOnly.json +++ b/tests/testdata/QuarkChainStateTests/stContractCallMnt/contractTransferMntQKCOnly.json @@ -1,7 +1,7 @@ { "contractTransferMntQKCOnly": { "_info": { - "comment": "deployed contract: https://gist.github.com/hanyunxu/4c1e33b59c6f67bb9c6d0ebed9e6b0d1", + "comment": "deployed contract: https://gist.github.com/hanyunx/4c1e33b59c6f67bb9c6d0ebed9e6b0d1", "filledwith": "byhand", "lllcversion": "byhand", "source": "NA", @@ -18,7 +18,7 @@ "post": { "ConstantinopleFix": [ { - "hash": "0xabf468d4bca4c3001c4f7258c7bbbaa983a338faaee4b1476d0f3018edfceb5e", + "hash": "0x6109d00252c64beeb52ea7e311c4685f9808997e6c5d53d356738e3ae4328a8a", "indexes": { "data": 0, "gas": 0, @@ -28,7 +28,7 @@ "logs": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" }, { - "hash": "0xdd8530318f5679896952b84389d4a12d346c01194b9793b5e78c93d3a1893601", + "hash": "0x26f9ea5e4183796a6b6b15c0c97264e8c12a7c76fc1f0a4d79f2346a48414ace", "indexes": { "data": 1, "gas": 0, diff --git a/tests/testdata/QuarkChainStateTests/stContractCallMnt/contractTransferMntWithData.json b/tests/testdata/QuarkChainStateTests/stContractCallMnt/contractTransferMntWithData.json index 3fc5d8851..9041b4002 100644 --- a/tests/testdata/QuarkChainStateTests/stContractCallMnt/contractTransferMntWithData.json +++ b/tests/testdata/QuarkChainStateTests/stContractCallMnt/contractTransferMntWithData.json @@ -18,7 +18,7 @@ "post": { "ConstantinopleFix": [ { - "hash": "0x6500cf11eb67c2ecf2c724f2d790c598691027a0646fd8260647940f11b4e192", + "hash": "0x6bfb634605adcbdc3f843980d190c0569674d5265f5a51e90dd67fc6475cf4d1", "indexes": { "data": 0, "gas": 0, @@ -28,7 +28,7 @@ "logs": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347" }, { - "hash": "0x35aec68a725e48094a15e777ef7dd55bb53de572188e9b41fdd093c9aea652b2", + "hash": "0x7920ff3aeafb50fd5eb3e18d93c69830ca1dbe494bd1ab949fd709e3973f4e3a", "indexes": { "data": 1, "gas": 0, diff --git a/tests/testdata/QuarkChainStateTests/stContractCallMnt/currentMntId.json b/tests/testdata/QuarkChainStateTests/stContractCallMnt/currentMntId.json index fdb2482d0..3a3bfdf0a 100644 --- a/tests/testdata/QuarkChainStateTests/stContractCallMnt/currentMntId.json +++ b/tests/testdata/QuarkChainStateTests/stContractCallMnt/currentMntId.json @@ -1,7 +1,7 @@ { "currentMntId": { "_info": { - "comment": "deployed contract: https://gist.github.com/hanyunxu/2288b72872721a4901d6bf7768c5fb88", + "comment": "deployed contract: https://gist.github.com/hanyunx/2288b72872721a4901d6bf7768c5fb88", "filledwith": "byhand", "lllcversion": "byhand", "source": "NA",