diff --git a/consensus/parlia/parlia.go b/consensus/parlia/parlia.go index fe6f0b066f..9072d3d92f 100644 --- a/consensus/parlia/parlia.go +++ b/consensus/parlia/parlia.go @@ -54,11 +54,14 @@ const ( systemRewardPercent = 4 // it means 1/2^4 = 1/16 percentage of gas fee incoming will be distributed to system // genesis contracts - ValidatorContract = "0x0000000000000000000000000000000000001000" - SlashContract = "0x0000000000000000000000000000000000001001" - SystemRewardContract = "0x0000000000000000000000000000000000001002" - LightClientContract = "0x0000000000000000000000000000000000001003" - RelayerHubContract = "0x0000000000000000000000000000000000001006" + ValidatorContract = "0x0000000000000000000000000000000000001000" + SlashContract = "0x0000000000000000000000000000000000001001" + SystemRewardContract = "0x0000000000000000000000000000000000001002" + LightClientContract = "0x0000000000000000000000000000000000001003" + TokenHubContract = "0x0000000000000000000000000000000000001004" + RelayerIncentivizeContract = "0x0000000000000000000000000000000000001005" + RelayerHubContract = "0x0000000000000000000000000000000000001006" + GovHubContract = "0x0000000000000000000000000000000000001007" ) var ( @@ -69,11 +72,14 @@ var ( maxSystemBalance = new(big.Int).Mul(big.NewInt(100), big.NewInt(params.Ether)) systemContracts = map[common.Address]bool{ - common.HexToAddress(ValidatorContract): true, - common.HexToAddress(SlashContract): true, - common.HexToAddress(SystemRewardContract): true, - common.HexToAddress(LightClientContract): true, - common.HexToAddress(RelayerHubContract): true, + common.HexToAddress(ValidatorContract): true, + common.HexToAddress(SlashContract): true, + common.HexToAddress(SystemRewardContract): true, + common.HexToAddress(LightClientContract): true, + common.HexToAddress(RelayerHubContract): true, + common.HexToAddress(GovHubContract): true, + common.HexToAddress(TokenHubContract): true, + common.HexToAddress(RelayerIncentivizeContract): true, } ) @@ -265,7 +271,7 @@ func (p *Parlia) IsSystemTransaction(tx *types.Transaction, header *types.Header if err != nil { return false, errors.New("UnAuthorized transaction") } - if sender == header.Coinbase && isToSystemContract(*tx.To()) { + if sender == header.Coinbase && isToSystemContract(*tx.To()) && tx.GasPrice().Cmp(big.NewInt(0)) == 0 { return true, nil } return false, nil @@ -975,7 +981,7 @@ func (p *Parlia) initContract(state *state.StateDB, header *types.Header, chain // method method := "init" // contracts - contracts := []string{ValidatorContract, SlashContract, LightClientContract, RelayerHubContract} + contracts := []string{ValidatorContract, SlashContract, LightClientContract, RelayerHubContract, GovHubContract, TokenHubContract, RelayerIncentivizeContract} // get packed data data, err := p.validatorSetABI.Pack(method) if err != nil { diff --git a/eth/api_tracer.go b/eth/api_tracer.go index a08406cb49..7db3327990 100644 --- a/eth/api_tracer.go +++ b/eth/api_tracer.go @@ -502,12 +502,13 @@ func (api *PrivateDebugAPI) traceBlock(ctx context.Context, block *types.Block, // Generate the next state snapshot fast without tracing msg, _ := tx.AsMessage(signer) vmctx := core.NewEVMContext(msg, block.Header(), api.eth.blockchain, nil) - if posa, ok := api.eth.engine.(consensus.PoSA); ok && msg.From() == block.Header().Coinbase && - posa.IsSystemContract(msg.To()) { - balance := statedb.GetBalance(consensus.SystemAddress) - if balance.Cmp(common.Big0) > 0 { - statedb.SetBalance(consensus.SystemAddress, big.NewInt(0)) - statedb.AddBalance(block.Header().Coinbase, balance) + if posa, ok := api.eth.engine.(consensus.PoSA); ok { + if isSystem, _ := posa.IsSystemTransaction(tx, block.Header()); isSystem { + balance := statedb.GetBalance(consensus.SystemAddress) + if balance.Cmp(common.Big0) > 0 { + statedb.SetBalance(consensus.SystemAddress, big.NewInt(0)) + statedb.AddBalance(block.Header().Coinbase, balance) + } } } vmenv := vm.NewEVM(vmctx, statedb, api.eth.blockchain.Config(), vm.Config{}) @@ -767,7 +768,7 @@ func (api *PrivateDebugAPI) traceTx(ctx context.Context, message core.Message, v // Run the transaction with tracing enabled. vmenv := vm.NewEVM(vmctx, statedb, api.eth.blockchain.Config(), vm.Config{Debug: true, Tracer: tracer}) if posa, ok := api.eth.engine.(consensus.PoSA); ok && message.From() == vmctx.Coinbase && - posa.IsSystemContract(message.To()) { + posa.IsSystemContract(message.To()) && message.GasPrice().Cmp(big.NewInt(0)) == 0 { balance := statedb.GetBalance(consensus.SystemAddress) if balance.Cmp(common.Big0) > 0 { statedb.SetBalance(consensus.SystemAddress, big.NewInt(0)) @@ -822,12 +823,13 @@ func (api *PrivateDebugAPI) computeTxEnv(blockHash common.Hash, txIndex int, ree for idx, tx := range block.Transactions() { // Assemble the transaction call message and return if the requested offset msg, _ := tx.AsMessage(signer) - if posa, ok := api.eth.engine.(consensus.PoSA); ok && msg.From() == block.Header().Coinbase && - posa.IsSystemContract(msg.To()) { - balance := statedb.GetBalance(consensus.SystemAddress) - if balance.Cmp(common.Big0) > 0 { - statedb.SetBalance(consensus.SystemAddress, big.NewInt(0)) - statedb.AddBalance(block.Header().Coinbase, balance) + if posa, ok := api.eth.engine.(consensus.PoSA); ok { + if isSystem, _ := posa.IsSystemTransaction(tx, block.Header()); isSystem { + balance := statedb.GetBalance(consensus.SystemAddress) + if balance.Cmp(common.Big0) > 0 { + statedb.SetBalance(consensus.SystemAddress, big.NewInt(0)) + statedb.AddBalance(block.Header().Coinbase, balance) + } } } context := core.NewEVMContext(msg, block.Header(), api.eth.blockchain, nil)