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

Add txpool RPC and impl new_pending_transaction_filter #1073

Merged
merged 18 commits into from
Jun 25, 2023
Merged
Show file tree
Hide file tree
Changes from 2 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: 2 additions & 2 deletions client/rpc-core/src/txpool.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@

//! tx pool rpc interface

// crates.io
// Crates.io
use ethereum_types::U256;
use jsonrpsee::{core::RpcResult, proc_macros::rpc};
// frontier
// Frontier
use crate::types::*;

/// TxPool rpc interface
Expand Down
4 changes: 2 additions & 2 deletions client/rpc-core/src/types/txpool.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>.

use std::collections::HashMap;
// crates.io
// Crates.io
use ethereum::{TransactionAction, TransactionV2 as EthereumTransaction};
use ethereum_types::{H160, H256, U256};
use serde::{Serialize, Serializer};
// frontier
// Frontier
use crate::types::Bytes;

pub type TransactionMap<T> = HashMap<H160, HashMap<U256, T>>;
Expand Down
19 changes: 11 additions & 8 deletions client/rpc/src/eth/filter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,14 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>.

use std::{collections::HashSet, marker::PhantomData, sync::Arc, time};

// Crates.io
use ethereum::BlockV2 as EthereumBlock;
use ethereum_types::{H256, U256};
use jsonrpsee::core::{async_trait, RpcResult};
// Frontier
use crate::{eth::cache::EthBlockDataCacheTask, frontier_backend_client, internal_err, TxPool};
use fc_rpc_core::{types::*, EthFilterApiServer};
use fp_rpc::{EthereumRuntimeRPCApi, TransactionStatus, TxPoolRuntimeApi};
// Substrate
use sc_client_api::backend::{Backend, StorageProvider};
use sc_transaction_pool::ChainApi;
Expand All @@ -31,11 +35,6 @@ use sp_runtime::{
generic::BlockId,
traits::{Block as BlockT, NumberFor, One, Saturating, UniqueSaturatedInto},
};
// Frontier
use fc_rpc_core::{types::*, EthFilterApiServer};
use fp_rpc::{EthereumRuntimeRPCApi, TransactionStatus, TxPoolRuntimeApi};

use crate::{eth::cache::EthBlockDataCacheTask, frontier_backend_client, internal_err, TxPool};
boundless-forest marked this conversation as resolved.
Show resolved Hide resolved

pub struct EthFilter<A: ChainApi, B: BlockT, C, BE> {
client: Arc<C>,
Expand Down Expand Up @@ -98,8 +97,12 @@ where
None => U256::zero(),
};
let pending_transaction_hashes = if let FilterType::PendingTransaction = filter_type {
let ethereum_txs = self.tx_pool.tx_pool_response()?;
ethereum_txs.ready.into_iter().map(|tx| tx.hash()).collect()
self.tx_pool
.tx_pool_response()?
.ready
.into_iter()
.map(|tx| tx.hash())
.collect()
} else {
HashSet::new()
};
Expand Down
2 changes: 1 addition & 1 deletion client/rpc/src/txpool.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ use ethereum::TransactionV2;
use ethereum_types::{H160, H256, U256};
use jsonrpsee::core::RpcResult;
use serde::Serialize;
// frontier
// Frontier
use crate::{internal_err, public_key};
use fc_rpc_core::{
types::{Get, Summary, TransactionMap, TxPoolResult, TxPoolTransaction},
Expand Down
2 changes: 1 addition & 1 deletion template/runtime/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -774,7 +774,7 @@ impl_runtime_apis! {
xts_ready: Vec<<Block as sp_runtime::traits::Block>::Extrinsic>,
xts_future: Vec<<Block as sp_runtime::traits::Block>::Extrinsic>,
) -> fp_rpc::TxPoolResponse {
// frontier
// Frontier
use pallet_ethereum::Call::transact;

fp_rpc::TxPoolResponse {
Expand Down
39 changes: 32 additions & 7 deletions ts-tests/tests/test-filter-api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ describeWithFrontier("Frontier RPC (EthFilterApi)", (context) => {
const TEST_CONTRACT_BYTECODE =
"0x608060405234801561001057600080fd5b50610041337fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61004660201b60201c565b610291565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156100e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b6101028160025461020960201b610c7c1790919060201c565b60028190555061015d816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461020960201b610c7c1790919060201c565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600080828401905083811015610287576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b610e3a806102a06000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c806370a082311161005b57806370a08231146101fd578063a457c2d714610255578063a9059cbb146102bb578063dd62ed3e1461032157610088565b8063095ea7b31461008d57806318160ddd146100f357806323b872dd146101115780633950935114610197575b600080fd5b6100d9600480360360408110156100a357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610399565b604051808215151515815260200191505060405180910390f35b6100fb6103b7565b6040518082815260200191505060405180910390f35b61017d6004803603606081101561012757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506103c1565b604051808215151515815260200191505060405180910390f35b6101e3600480360360408110156101ad57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061049a565b604051808215151515815260200191505060405180910390f35b61023f6004803603602081101561021357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061054d565b6040518082815260200191505060405180910390f35b6102a16004803603604081101561026b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610595565b604051808215151515815260200191505060405180910390f35b610307600480360360408110156102d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610662565b604051808215151515815260200191505060405180910390f35b6103836004803603604081101561033757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610680565b6040518082815260200191505060405180910390f35b60006103ad6103a6610707565b848461070f565b6001905092915050565b6000600254905090565b60006103ce848484610906565b61048f846103da610707565b61048a85604051806060016040528060288152602001610d7060289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610440610707565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610bbc9092919063ffffffff16565b61070f565b600190509392505050565b60006105436104a7610707565b8461053e85600160006104b8610707565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c7c90919063ffffffff16565b61070f565b6001905092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006106586105a2610707565b8461065385604051806060016040528060258152602001610de160259139600160006105cc610707565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610bbc9092919063ffffffff16565b61070f565b6001905092915050565b600061067661066f610707565b8484610906565b6001905092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610795576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180610dbd6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561081b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180610d286022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561098c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180610d986025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180610d056023913960400191505060405180910390fd5b610a7d81604051806060016040528060268152602001610d4a602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610bbc9092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610b10816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c7c90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000838311158290610c69576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610c2e578082015181840152602081019050610c13565b50505050905090810190601f168015610c5b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080828401905083811015610cfa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b809150509291505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a72315820c7a5ffabf642bda14700b2de42f8c57b36621af020441df825de45fd2b3e1c5c64736f6c63430005100032";

var nonce = 0;
async function sendTransaction(context) {
const tx = await context.web3.eth.accounts.signTransaction(
{
Expand All @@ -16,10 +17,11 @@ describeWithFrontier("Frontier RPC (EthFilterApi)", (context) => {
value: "0x00",
gasPrice: "0x3B9ACA00",
gas: "0x100000",
nonce: nonce,
},
GENESIS_ACCOUNT_PRIVATE_KEY
);

nonce = nonce + 1;
await customRequest(context.web3, "eth_sendRawTransaction", [tx.rawTransaction]);
return tx;
}
Expand Down Expand Up @@ -54,10 +56,8 @@ describeWithFrontier("Frontier RPC (EthFilterApi)", (context) => {
});

step("should return unsupported error for Pending Transaction filter creation", async function () {
let r = await customRequest(context.web3, "eth_newPendingTransactionFilter", []);
expect(r.error).to.include({
message: "Method not available.",
});
let createFilter = await customRequest(context.web3, "eth_newPendingTransactionFilter", []);
expect(createFilter.result).to.be.eq("0x4");
});

step("should return responses for Block filter polling.", async function () {
Expand Down Expand Up @@ -87,6 +87,31 @@ describeWithFrontier("Frontier RPC (EthFilterApi)", (context) => {
expect(poll.result[1]).to.be.eq(block_b.hash);
});

step("should return responses for pending transaction polling.", async function () {
let poll = await customRequest(context.web3, "eth_getFilterChanges", ["0x4"]);
expect(poll.result.length).to.be.eq(0);

// fist polling
let tx = await sendTransaction(context);
poll = await customRequest(context.web3, "eth_getFilterChanges", ["0x4"]);
expect(poll.result.length).to.be.eq(1);
expect(poll.result).contains(tx.transactionHash);

// second polling
let tx1 = await sendTransaction(context);
let tx2 = await sendTransaction(context);
poll = await customRequest(context.web3, "eth_getFilterChanges", ["0x4"]);
expect(poll.result.length).to.be.eq(2);
expect(poll.result).contains(tx1.transactionHash);
expect(poll.result).contains(tx2.transactionHash);

await createAndFinalizeBlock(context.web3);

// the last polling after finalized block
poll = await customRequest(context.web3, "eth_getFilterChanges", ["0x4"]);
expect(poll.result.length).to.be.eq(0);
});

step("should return responses for Log filter polling.", async function () {
// Create contract.
let tx = await sendTransaction(context);
Expand Down Expand Up @@ -157,7 +182,7 @@ describeWithFrontier("Frontier RPC (EthFilterApi)", (context) => {
// Should return error if does not exist.
let r = await customRequest(context.web3, "eth_uninstallFilter", [filterId]);
expect(r.error).to.include({
message: "Filter id 6 does not exist.",
message: "Filter id 7 does not exist.",
});
});

Expand All @@ -174,7 +199,7 @@ describeWithFrontier("Frontier RPC (EthFilterApi)", (context) => {

let r = await customRequest(context.web3, "eth_getFilterChanges", [filterId]);
expect(r.error).to.include({
message: "Filter id 6 does not exist.",
message: "Filter id 7 does not exist.",
});
});

Expand Down