Skip to content

Commit

Permalink
Merge branch 'master' into gastonponti/merge-upstream-1.9.19
Browse files Browse the repository at this point in the history
  • Loading branch information
gastonponti committed Jul 6, 2021
2 parents de0925d + 76f5918 commit a2e75b7
Show file tree
Hide file tree
Showing 6 changed files with 36 additions and 8 deletions.
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -63,4 +63,4 @@ docs/_site
docs/.jekyll-metadata

# Ignore monorepo checkout
./monorepo
**/monorepo
2 changes: 1 addition & 1 deletion contracts/reserve/tobin_tax.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ func TobinTax(vmRunner vm.EVMRunner, sender common.Address) (tax Ratio, reserveA
return Ratio{}, common.ZeroAddress, err
}

ret, err := vmRunner.Execute(reserveAddress, params.TobinTaxFunctionSelector, params.MaxGasForGetOrComputeTobinTax, big.NewInt(0))
ret, err := vmRunner.ExecuteFrom(sender, reserveAddress, params.TobinTaxFunctionSelector, params.MaxGasForGetOrComputeTobinTax, big.NewInt(0))
if err != nil {
return Ratio{}, common.ZeroAddress, err
}
Expand Down
4 changes: 4 additions & 0 deletions contracts/testutil/fail_runner.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@ func (fvm FailingVmRunner) Execute(recipient common.Address, input []byte, gas u
return nil, ErrFailingRunner
}

func (fvm FailingVmRunner) ExecuteFrom(sender, recipient common.Address, input []byte, gas uint64, value *big.Int) (ret []byte, err error) {
return nil, ErrFailingRunner
}

func (fvm FailingVmRunner) Query(recipient common.Address, input []byte, gas uint64) (ret []byte, err error) {
return nil, ErrFailingRunner
}
Expand Down
5 changes: 5 additions & 0 deletions contracts/testutil/runner.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,11 @@ func (ev *MockEVMRunner) Execute(recipient common.Address, input []byte, gas uin
return mock.Call(input)
}

func (ev *MockEVMRunner) ExecuteFrom(sender, recipient common.Address, input []byte, gas uint64, value *big.Int) (ret []byte, err error) {
// No difference necessary for the mock runner between Execute() and ExecuteFrom()
return ev.Execute(recipient, input, gas, value)
}

func (ev *MockEVMRunner) Query(recipient common.Address, input []byte, gas uint64) (ret []byte, err error) {
mock, ok := ev.contracts[recipient]
if !ok {
Expand Down
5 changes: 5 additions & 0 deletions core/vm/interface.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,11 @@ type EVMRunner interface {
// It can be seen as a message (input,value) from sender to recipient that returns `ret`
Execute(recipient common.Address, input []byte, gas uint64, value *big.Int) (ret []byte, err error)

// ExecuteFrom is like Execute, but lets you specify the sender to use for the EVM call.
// It exists only for use in the Tobin tax calculation done as part of TobinTransfer, because that
// originally used the transaction's sender instead of the zero address.
ExecuteFrom(sender, recipient common.Address, input []byte, gas uint64, value *big.Int) (ret []byte, err error)

// Query performs a read operation over the runner's state
// It can be seen as a message (input,value) from sender to recipient that returns `ret`
Query(recipient common.Address, input []byte, gas uint64) (ret []byte, err error)
Expand Down
26 changes: 20 additions & 6 deletions core/vm/vmcontext/runner.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ type evmRunnerContext interface {
}

type evmRunner struct {
newEVM func() *vm.EVM
newEVM func(from common.Address) *vm.EVM
state vm.StateDB

dontMeterGas bool
Expand All @@ -35,26 +35,35 @@ func NewEVMRunner(chain evmRunnerContext, header *types.Header, state vm.StateDB

return &evmRunner{
state: state,
newEVM: func() *vm.EVM {
newEVM: func(from common.Address) *vm.EVM {
// The EVM Context requires a msg, but the actual field values don't really matter for this case.
// Putting in zero values.
context := New(VMAddress, common.Big0, header, chain, nil)
// Putting in zero values for gas price and tx fee recipient
context := New(from, common.Big0, header, chain, nil)
return vm.NewEVM(context, state, chain.Config(), *chain.GetVMConfig())
},
}
}

func (ev *evmRunner) Execute(recipient common.Address, input []byte, gas uint64, value *big.Int) (ret []byte, err error) {
evm := ev.newEVM()
evm := ev.newEVM(VMAddress)
if ev.dontMeterGas {
evm.StopGasMetering()
}
ret, _, err = evm.Call(vm.AccountRef(evm.Origin), recipient, input, gas, value)
return ret, err
}

func (ev *evmRunner) ExecuteFrom(sender, recipient common.Address, input []byte, gas uint64, value *big.Int) (ret []byte, err error) {
evm := ev.newEVM(sender)
if ev.dontMeterGas {
evm.StopGasMetering()
}
ret, _, err = evm.Call(vm.AccountRef(sender), recipient, input, gas, value)
return ret, err
}

func (ev *evmRunner) Query(recipient common.Address, input []byte, gas uint64) (ret []byte, err error) {
evm := ev.newEVM()
evm := ev.newEVM(VMAddress)
if ev.dontMeterGas {
evm.StopGasMetering()
}
Expand Down Expand Up @@ -85,6 +94,11 @@ func (sev *SharedEVMRunner) Execute(recipient common.Address, input []byte, gas
return ret, err
}

func (sev *SharedEVMRunner) ExecuteFrom(sender, recipient common.Address, input []byte, gas uint64, value *big.Int) (ret []byte, err error) {
ret, _, err = sev.Call(vm.AccountRef(sender), recipient, input, gas, value)
return ret, err
}

func (sev *SharedEVMRunner) Query(recipient common.Address, input []byte, gas uint64) (ret []byte, err error) {
ret, _, err = sev.StaticCall(vm.AccountRef(VMAddress), recipient, input, gas)
return ret, err
Expand Down

0 comments on commit a2e75b7

Please sign in to comment.