Skip to content

Commit

Permalink
added VM tests
Browse files Browse the repository at this point in the history
  • Loading branch information
lmittmann committed Jul 29, 2023
1 parent 7095aa3 commit 42c6cdd
Show file tree
Hide file tree
Showing 2 changed files with 165 additions and 2 deletions.
1 change: 1 addition & 0 deletions w3vm/testdata/weth9.bytecode
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0x6060604052600436106100af576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100b9578063095ea7b31461014757806318160ddd146101a157806323b872dd146101ca5780632e1a7d4d14610243578063313ce5671461026657806370a082311461029557806395d89b41146102e2578063a9059cbb14610370578063d0e30db0146103ca578063dd62ed3e146103d4575b6100b7610440565b005b34156100c457600080fd5b6100cc6104dd565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561010c5780820151818401526020810190506100f1565b50505050905090810190601f1680156101395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561015257600080fd5b610187600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061057b565b604051808215151515815260200191505060405180910390f35b34156101ac57600080fd5b6101b461066d565b6040518082815260200191505060405180910390f35b34156101d557600080fd5b610229600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061068c565b604051808215151515815260200191505060405180910390f35b341561024e57600080fd5b61026460048080359060200190919050506109d9565b005b341561027157600080fd5b610279610b05565b604051808260ff1660ff16815260200191505060405180910390f35b34156102a057600080fd5b6102cc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b18565b6040518082815260200191505060405180910390f35b34156102ed57600080fd5b6102f5610b30565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561033557808201518184015260208101905061031a565b50505050905090810190601f1680156103625780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561037b57600080fd5b6103b0600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610bce565b604051808215151515815260200191505060405180910390f35b6103d2610440565b005b34156103df57600080fd5b61042a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610be3565b6040518082815260200191505060405180910390f35b34600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a2565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105735780601f1061054857610100808354040283529160200191610573565b820191906000526020600020905b81548152906001019060200180831161055657829003601f168201915b505050505081565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b600081600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101515156106dc57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156107b457507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b156108cf5781600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015151561084457600080fd5b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b81600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515610a2757600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501515610ab457600080fd5b3373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65826040518082815260200191505060405180910390a250565b600260009054906101000a900460ff1681565b60036020528060005260406000206000915090505481565b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610bc65780601f10610b9b57610100808354040283529160200191610bc6565b820191906000526020600020905b815481529060010190602001808311610ba957829003601f168201915b505050505081565b6000610bdb33848461068c565b905092915050565b60046020528160005260406000206020528060005260406000206000915091505054815600a165627a7a72305820deb4c2ccab3c2fdca32ab3f46728389c2fe2c165d5fafa07661e4e004f6c344a0029
166 changes: 164 additions & 2 deletions w3vm/vm_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"fmt"
"math/big"
"strconv"
"strings"
"testing"

"github.com/ethereum/go-ethereum/common"
Expand All @@ -22,8 +23,16 @@ import (
)

var (
addr0 common.Address
addr1 = common.Address{0x1}
addr0 = common.Address{0x0}
addr1 = common.Address{0x1}
addrWETH = w3.A("0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2")

//go:embed testdata/weth9.bytecode
hexCodeWETH string
codeWETH = w3.B(strings.TrimSpace(hexCodeWETH))

funcBalanceOf = w3.MustNewFunc("balanceOf(address)", "uint256")
funcTransfer = w3.MustNewFunc("transfer(address,uint256)", "bool")

client = w3.MustDial("https://eth.llamarpc.com")
)
Expand Down Expand Up @@ -71,6 +80,79 @@ func TestVMApply(t *testing.T) {
GasLimit: 21_000,
},
},
{ // WETH transfer
PreState: w3types.State{
addr0: {Balance: w3.I("1 ether")},
addrWETH: {
Code: codeWETH,
Storage: map[common.Hash]common.Hash{
w3vm.WETHBalanceSlot(addr0): common.BigToHash(w3.I("1 ether")),
},
},
},
Message: &w3types.Message{
From: addr0,
To: &addrWETH,
Input: must(funcTransfer.EncodeArgs(addr1, w3.I("1 ether"))),
Gas: 100_000,
},
WantReceipt: &w3vm.Receipt{
GasUsed: 38_853,
GasLimit: 58_753,
Logs: []*types.Log{
{
Address: addrWETH,
Topics: []common.Hash{
w3.H("0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"),
w3.H("0x0000000000000000000000000000000000000000000000000000000000000000"),
w3.H("0x0000000000000000000000000100000000000000000000000000000000000000"),
},
Data: w3.B("0x0000000000000000000000000000000000000000000000000de0b6b3a7640000"),
},
},
Output: w3.B("0x0000000000000000000000000000000000000000000000000000000000000001"),
},
},
{ // WETH transfer with insufficient balance
PreState: w3types.State{
addr0: {Balance: w3.I("1 ether")},
addrWETH: {
Code: codeWETH,
Storage: map[common.Hash]common.Hash{
w3vm.WETHBalanceSlot(addr0): common.BigToHash(w3.I("1 ether")),
},
},
},
Message: &w3types.Message{
From: addr0,
To: &addrWETH,
Input: must(funcTransfer.EncodeArgs(addr1, w3.I("10 ether"))),
Gas: 100_000,
},
WantReceipt: &w3vm.Receipt{
GasUsed: 24_019,
GasLimit: 24_019,
Err: errors.New("execution reverted"),
},
WantErr: errors.New("execution reverted"),
},
{ // revert with output
PreState: w3types.State{
addr0: {Balance: w3.I("1 ether")},
addr1: {Code: w3.B("0x60015ffd")}, // PUSH1 0x1, PUSH0, REVERT
},
Message: &w3types.Message{
From: addr0,
To: &addr1,
},
WantReceipt: &w3vm.Receipt{
GasUsed: 21_008,
GasLimit: 21_008,
Output: w3.B("0x00"),
Err: errors.New("execution reverted"),
},
WantErr: errors.New("execution reverted"),
},
}

for i, test := range tests {
Expand All @@ -94,6 +176,79 @@ func TestVMApply(t *testing.T) {
}
}

func TestVMCall(t *testing.T) {
tests := []struct {
PreState w3types.State
Message *w3types.Message
WantReceipt *w3vm.Receipt
WantErr error
}{
{
PreState: w3types.State{
addrWETH: {
Code: codeWETH,
Storage: map[common.Hash]common.Hash{
w3vm.WETHBalanceSlot(addr0): common.BigToHash(w3.I("1 ether")),
},
},
},
Message: &w3types.Message{
From: addr0,
To: &addrWETH,
Input: must(funcBalanceOf.EncodeArgs(addr0)),
},
WantReceipt: &w3vm.Receipt{
GasUsed: 23_726,
GasLimit: 23_726,
Output: w3.B("0x0000000000000000000000000000000000000000000000000de0b6b3a7640000"),
},
},
}

for i, test := range tests {
t.Run(strconv.Itoa(i), func(t *testing.T) {
vm := w3vm.New(
w3vm.WithState(test.PreState),
)
gotReceipt, gotErr := vm.Call(test.Message)
if diff := cmp.Diff(test.WantErr, gotErr,
internal.EquateErrors(),
); diff != "" {
t.Fatalf("(-want +got)\n%s", diff)
}
if diff := cmp.Diff(test.WantReceipt, gotReceipt,
internal.EquateErrors(),
cmpopts.IgnoreUnexported(w3vm.Receipt{}),
); diff != "" {
t.Fatalf("(-want +got)\n%s", diff)
}
})
}
}

func TestVMCallFunc(t *testing.T) {
vm := w3vm.New(
w3vm.WithState(w3types.State{
addrWETH: {
Code: codeWETH,
Storage: map[common.Hash]common.Hash{
w3vm.WETHBalanceSlot(addr0): common.BigToHash(w3.I("1 ether")),
},
},
}),
)

var gotBalance *big.Int
if err := vm.CallFunc(addrWETH, funcBalanceOf, addr0).Returns(&gotBalance); err != nil {
t.Fatalf("Failed to call balanceOf: %v", err)
}

wantBalance := w3.I("1 ether")
if wantBalance.Cmp(gotBalance) != 0 {
t.Fatalf("Balance: want %s, got %s", wantBalance, gotBalance)
}
}

func TestVMApply_Integration(t *testing.T) {
blocks := []*big.Int{
big.NewInt(15_054_998),
Expand Down Expand Up @@ -191,3 +346,10 @@ func min(a, b int) int {
}
return b
}

func must[T any](t T, err error) T {
if err != nil {
panic(err)
}
return t
}

0 comments on commit 42c6cdd

Please sign in to comment.