Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Returning res.result on Transaction Call #5

Merged
merged 4 commits into from
Dec 13, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions bench/snailtracer/snailtracer.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
from typing import Final

import cProfile
import pathlib
import pstats
from typing import Final

import pyrevm


CONTRACT_DATA_FILE_PATH: Final[pathlib.Path] = (
pathlib.Path(__file__).absolute().parent / "./snailtracer.evm"
)
Expand Down
4 changes: 2 additions & 2 deletions pyrevm.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -82,14 +82,14 @@ class EVM:
to: str,
value: Optional[int] = None,
data: Optional[list[int]] = None,
) -> None: ...
) -> list[int]: ...
def call_raw(
self: "EVM",
caller: str,
to: str,
value: Optional[int] = None,
data: Optional[list[int]] = None,
) -> None: ...
) -> list[int]: ...
def deploy(
self: "EVM",
deployer: str,
Expand Down
1 change: 1 addition & 0 deletions pytest/contracts/full_math.bin
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
608060405234801561001057600080fd5b50600436106100365760003560e01c80630af8b27f1461003b578063aa9a091214610091575b600080fd5b61007b6004803603606081101561005157600080fd5b810190808035906020019092919080359060200190929190803590602001909291905050506100e7565b6040518082815260200191505060405180910390f35b6100d1600480360360608110156100a757600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050610145565b6040518082815260200191505060405180910390f35b60006100f4848484610145565b90506000828061010057fe5b848609111561013e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811061013557600080fd5b80806001019150505b9392505050565b600080600080198587098587029250828110838203039150506000811415610180576000841161017457600080fd5b83820492505050610218565b80841161018c57600080fd5b600084868809905082811182039150808303925060008586600003169050808604955080840493506001818260000304019050808302841793506000600287600302189050808702600203810290508087026002038102905080870260020381029050808702600203810290508087026002038102905080870260020381029050808502955050505050505b939250505056fea2646970667358221220b256a7bccd674ce18ce412dab2791542b912a007f39cfeb8c76e0e5e1e6f7bf864736f6c63430007060033
1 change: 1 addition & 0 deletions pytest/contracts/weth_9.bin
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
6060604052600436106100af576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100b9578063095ea7b31461014757806318160ddd146101a157806323b872dd146101ca5780632e1a7d4d14610243578063313ce5671461026657806370a082311461029557806395d89b41146102e2578063a9059cbb14610370578063d0e30db0146103ca578063dd62ed3e146103d4575b6100b7610440565b005b34156100c457600080fd5b6100cc6104dd565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561010c5780820151818401526020810190506100f1565b50505050905090810190601f1680156101395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561015257600080fd5b610187600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061057b565b604051808215151515815260200191505060405180910390f35b34156101ac57600080fd5b6101b461066d565b6040518082815260200191505060405180910390f35b34156101d557600080fd5b610229600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061068c565b604051808215151515815260200191505060405180910390f35b341561024e57600080fd5b61026460048080359060200190919050506109d9565b005b341561027157600080fd5b610279610b05565b604051808260ff1660ff16815260200191505060405180910390f35b34156102a057600080fd5b6102cc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b18565b6040518082815260200191505060405180910390f35b34156102ed57600080fd5b6102f5610b30565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561033557808201518184015260208101905061031a565b50505050905090810190601f1680156103625780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561037b57600080fd5b6103b0600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610bce565b604051808215151515815260200191505060405180910390f35b6103d2610440565b005b34156103df57600080fd5b61042a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610be3565b6040518082815260200191505060405180910390f35b34600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a2565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105735780601f1061054857610100808354040283529160200191610573565b820191906000526020600020905b81548152906001019060200180831161055657829003601f168201915b505050505081565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b600081600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101515156106dc57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156107b457507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b156108cf5781600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015151561084457600080fd5b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b81600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515610a2757600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501515610ab457600080fd5b3373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65826040518082815260200191505060405180910390a250565b600260009054906101000a900460ff1681565b60036020528060005260406000206000915090505481565b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610bc65780601f10610b9b57610100808354040283529160200191610bc6565b820191906000526020600020905b815481529060010190602001808311610ba957829003601f168201915b505050505081565b6000610bdb33848461068c565b905092915050565b60046020528160005260406000206020528060005260406000206000915091505054815600a165627a7a72305820deb4c2ccab3c2fdca32ab3f46728389c2fe2c165d5fafa07661e4e004f6c344a0029
81 changes: 80 additions & 1 deletion pytest/test.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,30 @@
from pyrevm import EVM, Env, BlockEnv
import os.path

from pyrevm import EVM, Env, BlockEnv, AccountInfo

address = "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045" # vitalik.eth
address2 = "0xBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"

fork_url = "https://mainnet.infura.io/v3/c60b0bb42f8a4c6481ecd229eddaca27"


def load_contract_bin(contract_name: str) -> bytes:
with open(
f"{os.path.dirname(__file__)}/contracts/{contract_name}", "r"
) as readfile:
hexstring = readfile.readline()
return bytes.fromhex(hexstring)


def encode_uint(num: int) -> str:
encoded = hex(num)[2:]
return ("0" * (64 - len(encoded))) + encoded


def encode_address(address: str) -> str:
return f'{"0" * 24}{address[2:]}'


def test_revm():
# set up an evm
evm = EVM(
Expand Down Expand Up @@ -64,3 +83,63 @@ def test_balances():

assert evm.get_balance(address) == AMT
assert evm.basic(address).balance == AMT


def test_call_raw():
evm = EVM()
evm.insert_account_info(
address, AccountInfo(code=load_contract_bin("full_math.bin"))
)

# mulDiv() -> 64 * 8 / 2
result = evm.call_raw(
caller=address2,
to=address,
data=bytes.fromhex(
f"aa9a0912{encode_uint(64)}{encode_uint(8)}{encode_uint(2)}"
),
)

assert int.from_bytes(result, "big") == 256


def test_call_committing():
evm = EVM()
evm.insert_account_info(
address, AccountInfo(code=load_contract_bin("full_math.bin"))
)

# mulDivRoundingUp() -> 64 * 8 / 3
result = evm.call_raw_committing(
caller=address2,
to=address,
data=bytes.fromhex(
f"0af8b27f{encode_uint(64)}{encode_uint(8)}{encode_uint(3)}"
),
)

assert int.from_bytes(result, "big") == 171


def test_call_empty_result():
evm = EVM()
evm.insert_account_info(address, AccountInfo(code=load_contract_bin("weth_9.bin")))

evm.set_balance(address2, 10000)

deposit = evm.call_raw_committing(
caller=address2,
to=address,
value=10000,
data=bytes.fromhex("d0e30db0"),
)

assert deposit == []

balance = evm.call_raw(
caller=address2,
to=address,
data=bytes.fromhex("70a08231" + encode_address(address2)),
)

assert int.from_bytes(balance, "big") == 10000
8 changes: 4 additions & 4 deletions src/evm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ impl EVM {
to: &str,
value: Option<U256>,
data: Option<Vec<u8>>,
) -> PyResult<()> {
) -> PyResult<Vec<u8>> {
let res = _self
.0
.call_raw_committing(
Expand All @@ -129,7 +129,7 @@ impl EVM {

// TODO: Return the traces back to the user.
dbg!(&res.traces);
Ok(())
Ok(res.result.to_vec())
}

fn call_raw(
Expand All @@ -138,7 +138,7 @@ impl EVM {
to: &str,
value: Option<U256>,
data: Option<Vec<u8>>,
) -> PyResult<()> {
) -> PyResult<Vec<u8>> {
let res = _self
.0
.call_raw(
Expand All @@ -154,7 +154,7 @@ impl EVM {
}

dbg!(&res.traces);
Ok(())
Ok(res.result.to_vec())
}

/// Deploy a contract with the given code.
Expand Down