| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- package ethapi
- import (
- "fmt"
- "github.com/ethereum/go-ethereum/common"
- "github.com/ethereum/go-ethereum/common/hexutil"
- "github.com/ethereum/go-ethereum/core/state"
- "math/big"
- )
- // OverrideAccount indicates the overriding fields of account during the execution
- // of a message call.
- // Note, state and stateDiff can't be specified at the same time. If state is
- // set, message execution will only use the data in the given state. Otherwise
- // if statDiff is set, all diff will be applied first and then execute the call
- // message.
- type OverrideAccount struct {
- Nonce *hexutil.Uint64 `json:"nonce"`
- Code *hexutil.Bytes `json:"code"`
- Balance **hexutil.Big `json:"balance"`
- State *map[common.Hash]common.Hash `json:"state"`
- StateDiff *map[common.Hash]common.Hash `json:"stateDiff"`
- }
- // StateOverride is the collection of overridden accounts.
- type StateOverride map[common.Address]OverrideAccount
- // Apply overrides the fields of specified accounts into the given state.
- func (diff *StateOverride) Apply(state *state.StateDB) error {
- if diff == nil {
- return nil
- }
- for addr, account := range *diff {
- // Override account nonce.
- if account.Nonce != nil {
- state.SetNonce(addr, uint64(*account.Nonce))
- }
- // Override account(contract) code.
- if account.Code != nil {
- state.SetCode(addr, *account.Code)
- }
- // Override account balance.
- if account.Balance != nil {
- state.SetBalance(addr, (*big.Int)(*account.Balance))
- }
- if account.State != nil && account.StateDiff != nil {
- return fmt.Errorf("account %s has both 'state' and 'stateDiff'", addr.Hex())
- }
- // Replace entire state if caller requires.
- if account.State != nil {
- state.SetStorage(addr, *account.State)
- }
- // Apply state diff into specified accounts.
- if account.StateDiff != nil {
- for key, value := range *account.StateDiff {
- state.SetState(addr, key, value)
- }
- }
- }
- return nil
- }
|