Skip to content

Commit

Permalink
Merge pull request #5 from elicbarbieri/master
Browse files Browse the repository at this point in the history
Returning res.result on Transaction Call
  • Loading branch information
gakonst authored Dec 13, 2023
2 parents 258c982 + 9c1def8 commit 8bee707
Show file tree
Hide file tree
Showing 6 changed files with 89 additions and 10 deletions.
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

0 comments on commit 8bee707

Please sign in to comment.