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

RFC: Add rpc method eth_callMany #4070

Merged
merged 6 commits into from
Aug 5, 2023

Conversation

libevm
Copy link
Contributor

@libevm libevm commented Aug 4, 2023

This PR adds in the eth_callMany RPC call.

The PR adheres to the eth_callMany API outlined in erigon (erigontech/erigon#4471) but instead of Bundles (Vec<Bundle>) it will only be a Bundle for simplicity


Note: Not sure how to add tests, am not really familiar with Rust. Some guidance would be appreciated

How I manually tested it:

./target/release/reth node --dev --http --http.api=eth
const { ethers } = require("ethers");

const abi = `[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"tokens","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokens","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenOwner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"drip","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"tokens","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"tokens","type":"uint256"},{"name":"data","type":"bytes"}],"name":"approveAndCall","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"newOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tokenAddress","type":"address"},{"name":"tokens","type":"uint256"}],"name":"transferAnyERC20Token","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"tokenOwner","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"tokens","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tokenOwner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"tokens","type":"uint256"}],"name":"Approval","type":"event"}]`;
const deployedBytecode = `6080604052600436106100f35760003560e01c806395d89b411161008a578063d4ee1d9011610059578063d4ee1d9014610650578063dc39d06d146106a7578063dd62ed3e1461071a578063f2fde38b1461079f576100f3565b806395d89b41146104185780639f678cca146104a8578063a9059cbb146104d3578063cae9ca5114610546576100f3565b8063313ce567116100c6578063313ce5671461031457806370a082311461034557806379ba5097146103aa5780638da5cb5b146103c1576100f3565b806306fdde0314610153578063095ea7b3146101e357806318160ddd1461025657806323b872dd14610281575b6100ff336006546107f0565b506000341115610151573373ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f1935050505015801561014f573d6000803e3d6000fd5b505b005b34801561015f57600080fd5b50610168610912565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101a857808201518184015260208101905061018d565b50505050905090810190601f1680156101d55780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156101ef57600080fd5b5061023c6004803603604081101561020657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506109b0565b604051808215151515815260200191505060405180910390f35b34801561026257600080fd5b5061026b610aa2565b6040518082815260200191505060405180910390f35b34801561028d57600080fd5b506102fa600480360360608110156102a457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610afd565b604051808215151515815260200191505060405180910390f35b34801561032057600080fd5b50610329610da8565b604051808260ff1660ff16815260200191505060405180910390f35b34801561035157600080fd5b506103946004803603602081101561036857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610dbb565b6040518082815260200191505060405180910390f35b3480156103b657600080fd5b506103bf610e04565b005b3480156103cd57600080fd5b506103d6610fa1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561042457600080fd5b5061042d610fc6565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561046d578082015181840152602081019050610452565b50505050905090810190601f16801561049a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156104b457600080fd5b506104bd611064565b6040518082815260200191505060405180910390f35b3480156104df57600080fd5b5061052c600480360360408110156104f657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061107b565b604051808215151515815260200191505060405180910390f35b34801561055257600080fd5b506106366004803603606081101561056957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156105b057600080fd5b8201836020820111156105c257600080fd5b803590602001918460018302840111640100000000831117156105e457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611216565b604051808215151515815260200191505060405180910390f35b34801561065c57600080fd5b50610665611449565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156106b357600080fd5b50610700600480360360408110156106ca57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061146f565b604051808215151515815260200191505060405180910390f35b34801561072657600080fd5b506107896004803603604081101561073d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506115b5565b6040518082815260200191505060405180910390f35b3480156107ab57600080fd5b506107ee600480360360208110156107c257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061163c565b005b600061084482600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116d990919063ffffffff16565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061089c826005546116d990919063ffffffff16565b6005819055508273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156109a85780601f1061097d576101008083540402835291602001916109a8565b820191906000526020600020905b81548152906001019060200180831161098b57829003601f168201915b505050505081565b600081600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6000610af8600760008073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546005546116f390919063ffffffff16565b905090565b6000610b5182600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116f390919063ffffffff16565b600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610c2382600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116f390919063ffffffff16565b600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610cf582600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116d990919063ffffffff16565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b600460009054906101000a900460ff1681565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e5e57600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60028054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561105c5780601f106110315761010080835404028352916020019161105c565b820191906000526020600020905b81548152906001019060200180831161103f57829003601f168201915b505050505081565b6000611072336006546107f0565b50600654905090565b60006110cf82600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116f390919063ffffffff16565b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061116482600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546116d990919063ffffffff16565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b600082600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040518082815260200191505060405180910390a38373ffffffffffffffffffffffffffffffffffffffff16638f4ffcb1338530866040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b838110156113d75780820151818401526020810190506113bc565b50505050905090810190601f1680156114045780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b15801561142657600080fd5b505af115801561143a573d6000803e3d6000fd5b50505050600190509392505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114ca57600080fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561157257600080fd5b505af1158015611586573d6000803e3d6000fd5b505050506040513d602081101561159c57600080fd5b8101908080519060200190929190505050905092915050565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461169557600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008183019050828110156116ed57600080fd5b92915050565b60008282111561170257600080fd5b81830390509291505056fea165627a7a72305820f19add0447f4eb0ef7f1b5422781d23d651147458ea3a3bf2303a0004487d1900029`;

const provider = new ethers.providers.JsonRpcProvider();

const main = async () => {
  const user1Address = await ethers.Wallet.createRandom().getAddress();
  const user2Address = await ethers.Wallet.createRandom().getAddress();
  const contractAddress = await ethers.Wallet.createRandom().getAddress();

  const blockNumber = await provider.getBlockNumber();

  const erc20 = new ethers.Contract(contractAddress, abi, provider);
  const dripPayload = await erc20.populateTransaction.drip();

  const user1ToUser2Allowance = await erc20.populateTransaction.allowance(
    user1Address,
    user2Address
  );
  const user1ApproveUser2 = await erc20.populateTransaction.approve(
    user2Address,
    ethers.constants.MaxUint256
  );
  const user2TransferFromUser1 = await erc20.populateTransaction.transferFrom(
    user1Address,
    user2Address,
    ethers.utils.parseUnits("1")
  );
  const user1Balance = await erc20.populateTransaction.balanceOf(user1Address);

  const errorPayload = await erc20.populateTransaction.transferFrom(user2Address, user1Address, ethers.utils.parseUnits('1'));

  console.log("eth_callMany");
  const resp = await provider.send("eth_callMany", [
    {
      transactions: [
        {
          from: user1Address,
          to: contractAddress,
          data: user1ToUser2Allowance.data,
        },
        {
          from: user1Address,
          to: contractAddress,
          data: user1ApproveUser2.data,
        },
        {
          from: user1Address,
          to: contractAddress,
          data: user1ToUser2Allowance.data,
        },
        {
          from: user1Address,
          to: contractAddress,
          data: dripPayload.data,
        },
        {
          from: user1Address,
          to: contractAddress,
          data: user1Balance.data,
        },
        {
          from: user2Address,
          to: contractAddress,
          data: user2TransferFromUser1.data,
        },
        {
          from: user1Address,
          to: contractAddress,
          data: user1Balance.data,
        },
        {
          from: user2Address,
          to: contractAddress,
          data: errorPayload.data,
        },
      ],
    },
    {
      blockNumber: "0x" + blockNumber.toString(16),
    },
    {
      [contractAddress]: {
        code: deployedBytecode,
        stateDiff: {
          // Slot for drip amount
          ["0x0000000000000000000000000000000000000000000000000000000000000006"]:
            "0x00000000000000000000000000000000000000000000003635c9adc5dea00000",
        },
      },
    },
  ]);

  console.log("response", resp);
};

main();

Output

eth_callMany
response [
  {
    output: '0x0000000000000000000000000000000000000000000000000000000000000000'
  },
  {
    output: '0x0000000000000000000000000000000000000000000000000000000000000001'
  },
  {
    output: '0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'
  },
  {
    output: '0x00000000000000000000000000000000000000000000003635c9adc5dea00000'
  },
  {
    output: '0x00000000000000000000000000000000000000000000003635c9adc5dea00000'
  },
  {
    output: '0x0000000000000000000000000000000000000000000000000000000000000001'
  },
  {
    output: '0x00000000000000000000000000000000000000000000003627e8f712373c0000'
  },
  { error: '0x' }
]

@mattsse mattsse added the A-rpc Related to the RPC implementation label Aug 4, 2023
@codecov
Copy link

codecov bot commented Aug 4, 2023

Codecov Report

Merging #4070 (17ff054) into main (443383b) will decrease coverage by 0.05%.
Report is 5 commits behind head on main.
The diff coverage is 0.00%.

Impacted file tree graph

Files Changed Coverage Δ
crates/rpc/rpc-api/src/eth.rs 100.00% <ø> (ø)
crates/rpc/rpc-types/src/eth/call.rs 58.88% <0.00%> (-0.67%) ⬇️
crates/rpc/rpc/src/eth/api/call.rs 45.68% <0.00%> (-16.27%) ⬇️
crates/rpc/rpc/src/eth/api/server.rs 91.89% <0.00%> (-1.96%) ⬇️

... and 18 files with indirect coverage changes

Flag Coverage Δ
integration-tests 16.53% <0.00%> (+0.08%) ⬆️
unit-tests 64.00% <0.00%> (-0.08%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

Components Coverage Δ
reth binary 25.67% <ø> (+0.02%) ⬆️
blockchain tree 83.04% <ø> (ø)
pipeline 90.07% <ø> (ø)
storage (db) 74.41% <ø> (ø)
trie 94.70% <ø> (ø)
txpool 48.36% <ø> (+0.65%) ⬆️
networking 77.45% <ø> (+0.03%) ⬆️
rpc 57.43% <0.00%> (-0.42%) ⬇️
consensus 64.08% <ø> (ø)
revm 32.59% <ø> (ø)
payload builder 6.58% <ø> (ø)
primitives 87.99% <ø> (-0.02%) ⬇️

Copy link
Collaborator

@mattsse mattsse left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is great, 1 question re error format and a few suggestions.

I pushed linting fixes to make the reviewing process easier

Comment on lines 32 to 34
pub output: Option<Bytes>,
/// eth_call error output
pub error: Option<Bytes>,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this should match eth_call?

is the error field also supposed to represent the error output of eth_call? if so then this should be a String?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah okay! I can always do a err.to_string()

One question I do have is how does the RPC API handle the conversion from Error to String? E.g. specifically for the eth_call method, the output is Result<Bytes, EthApiError>, where and when does the program know to convert the EthApiError to a String?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

like this:

https://github.com/paradigmxyz/reth/blob/main/crates/rpc/rpc/src/eth/error.rs#L537-L547

which wraps the output in an error which formats it on .to_string

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where does the error get formatted into a string? or is that handled by serde?

crates/rpc/rpc/src/eth/api/call.rs Outdated Show resolved Hide resolved
Comment on lines 257 to 263
let res = self
.on_blocking_task(|this| async move {
this.call_many(bundle, state_context, state_override).await
})
.await?;

Ok(res)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

call_many already spawns on the tracing pool and only does non-blocking async work otherwise, so we can call it directly and don't need to spawn a new blocking task here.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm referencing the call function which also spawns on the tracing pool via transact_call_at -> spawn_with_call_at. Is that intentional?

crates/rpc/rpc/src/eth/api/call.rs Show resolved Hide resolved
Copy link
Collaborator

@mattsse mattsse left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nice, last style nits, and 1 question

crates/rpc/rpc-types/src/eth/call.rs Show resolved Hide resolved
crates/rpc/rpc/src/eth/api/call.rs Outdated Show resolved Hide resolved
crates/rpc/rpc/src/eth/api/call.rs Outdated Show resolved Hide resolved
Copy link
Collaborator

@mattsse mattsse left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nice, lgtm

I only made one change re how the task is spawned

@mattsse mattsse enabled auto-merge August 5, 2023 15:39
@mattsse mattsse added this pull request to the merge queue Aug 5, 2023
Merged via the queue into paradigmxyz:main with commit 5298868 Aug 5, 2023
23 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-rpc Related to the RPC implementation
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants