From e5ae846de4f2e7e485f52934045fb5272937c7cd Mon Sep 17 00:00:00 2001 From: Dusan Stanivukovic Date: Mon, 28 Jun 2021 19:04:52 +0200 Subject: [PATCH] added effectiveGasPrice to eth_getTransactionReceipt return structure (#450) --- crates/ethcore/src/client/client.rs | 22 +++++++++++++++++++++- crates/ethcore/src/miner/miner.rs | 7 +++++++ crates/ethcore/types/src/receipt.rs | 4 ++++ crates/rpc/src/v1/tests/mocked/eth.rs | 2 ++ crates/rpc/src/v1/tests/mocked/parity.rs | 1 + crates/rpc/src/v1/types/receipt.rs | 7 +++++++ 6 files changed, 42 insertions(+), 1 deletion(-) diff --git a/crates/ethcore/src/client/client.rs b/crates/ethcore/src/client/client.rs index 04746cd59..c88f867b6 100644 --- a/crates/ethcore/src/client/client.rs +++ b/crates/ethcore/src/client/client.rs @@ -2392,6 +2392,7 @@ impl BlockChainClient for Client { let chain = self.chain.read(); let number = chain.block_number(&hash)?; let body = chain.block_body(&hash)?; + let header = chain.block_header_data(&hash)?; let mut receipts = chain.block_receipts(&hash)?.receipts; receipts.truncate(address.index + 1); @@ -2404,6 +2405,11 @@ impl BlockChainClient for Client { .into_iter() .map(|receipt| receipt.logs.len()) .sum::(); + let base_fee = if number >= self.engine().params().eip1559_transition { + Some(header.base_fee()) + } else { + None + }; let receipt = transaction_receipt( self.engine().machine(), @@ -2411,6 +2417,7 @@ impl BlockChainClient for Client { receipt, gas_used, no_of_logs, + base_fee, ); Some(receipt) } @@ -2422,7 +2429,13 @@ impl BlockChainClient for Client { let receipts = chain.block_receipts(&hash)?; let number = chain.block_number(&hash)?; let body = chain.block_body(&hash)?; + let header = chain.block_header_data(&hash)?; let engine = self.engine.clone(); + let base_fee = if number >= engine.params().eip1559_transition { + Some(header.base_fee()) + } else { + None + }; let mut gas_used = 0.into(); let mut no_of_logs = 0; @@ -2439,6 +2452,7 @@ impl BlockChainClient for Client { receipt, gas_used, no_of_logs, + base_fee, ); gas_used = result.cumulative_gas_used; no_of_logs += result.logs.len(); @@ -3264,6 +3278,7 @@ fn transaction_receipt( receipt: TypedReceipt, prior_gas_used: U256, prior_no_of_logs: usize, + base_fee: Option, ) -> LocalizedReceipt { let sender = tx.sender(); let transaction_hash = tx.hash(); @@ -3315,6 +3330,10 @@ fn transaction_receipt( .collect(), log_bloom: receipt.log_bloom, outcome: receipt.outcome.clone(), + effective_gas_price: match base_fee { + Some(_) => Some(tx.effective_gas_price(base_fee)), + None => None, + }, } } @@ -3643,7 +3662,7 @@ mod tests { }); // when - let receipt = transaction_receipt(&machine, transaction, receipt, 5.into(), 1); + let receipt = transaction_receipt(&machine, transaction, receipt, 5.into(), 1, None); // then assert_eq!( @@ -3684,6 +3703,7 @@ mod tests { ], log_bloom: Default::default(), outcome: TransactionOutcome::StateRoot(state_root), + effective_gas_price: None, } ); } diff --git a/crates/ethcore/src/miner/miner.rs b/crates/ethcore/src/miner/miner.rs index fc9c34664..f25c50412 100644 --- a/crates/ethcore/src/miner/miner.rs +++ b/crates/ethcore/src/miner/miner.rs @@ -1295,6 +1295,13 @@ impl miner::MinerService for Miner { logs: receipt.logs.clone(), log_bloom: receipt.log_bloom, outcome: receipt.outcome.clone(), + effective_gas_price: if pending.header.number() + >= self.engine.params().eip1559_transition + { + Some(tx.effective_gas_price(pending.header.base_fee())) + } else { + None + }, } }) .collect() diff --git a/crates/ethcore/types/src/receipt.rs b/crates/ethcore/types/src/receipt.rs index dd3eba9ef..cb2a8f5e5 100644 --- a/crates/ethcore/types/src/receipt.rs +++ b/crates/ethcore/types/src/receipt.rs @@ -279,6 +279,8 @@ pub struct RichReceipt { pub to: Option, /// Sender pub from: H160, + /// Effective gas price + pub effective_gas_price: Option, } /// Receipt with additional info. @@ -312,6 +314,8 @@ pub struct LocalizedReceipt { pub to: Option, /// Sender pub from: H160, + /// Effective gas price + pub effective_gas_price: Option, } #[cfg(test)] diff --git a/crates/rpc/src/v1/tests/mocked/eth.rs b/crates/rpc/src/v1/tests/mocked/eth.rs index 5b712054e..1fa89f89e 100644 --- a/crates/rpc/src/v1/tests/mocked/eth.rs +++ b/crates/rpc/src/v1/tests/mocked/eth.rs @@ -1184,6 +1184,7 @@ fn rpc_eth_transaction_receipt() { }], log_bloom: Bloom::zero(), outcome: TransactionOutcome::StateRoot(H256::zero()), + effective_gas_price: None, }; let hash = @@ -1242,6 +1243,7 @@ fn rpc_eth_pending_receipt() { logs: Vec::new(), log_bloom: Bloom::zero(), outcome: TransactionOutcome::Unknown, + effective_gas_price: None, }; let tester = EthTester::default(); diff --git a/crates/rpc/src/v1/tests/mocked/parity.rs b/crates/rpc/src/v1/tests/mocked/parity.rs index fae58a410..0d051899a 100644 --- a/crates/rpc/src/v1/tests/mocked/parity.rs +++ b/crates/rpc/src/v1/tests/mocked/parity.rs @@ -561,6 +561,7 @@ fn rpc_parity_block_receipts() { outcome: TransactionOutcome::Unknown, to: None, from: Address::from_low_u64_be(9), + effective_gas_price: None, }, ); let io = deps.default_client(); diff --git a/crates/rpc/src/v1/types/receipt.rs b/crates/rpc/src/v1/types/receipt.rs index 100a10482..c4a361db2 100644 --- a/crates/rpc/src/v1/types/receipt.rs +++ b/crates/rpc/src/v1/types/receipt.rs @@ -55,6 +55,9 @@ pub struct Receipt { // NOTE(niklasad1): Unknown after EIP98 rules, if it's missing then skip serializing it #[serde(skip_serializing_if = "Option::is_none", rename = "status")] pub status_code: Option, + /// Effective gas price + #[serde(skip_serializing_if = "Option::is_none")] + pub effective_gas_price: Option, } impl Receipt { @@ -90,6 +93,7 @@ impl From for Receipt { status_code: Self::outcome_to_status_code(&r.outcome), state_root: Self::outcome_to_state_root(r.outcome), logs_bloom: r.log_bloom, + effective_gas_price: r.effective_gas_price, } } } @@ -111,6 +115,7 @@ impl From for Receipt { status_code: Self::outcome_to_status_code(&r.outcome), state_root: Self::outcome_to_state_root(r.outcome), logs_bloom: r.log_bloom, + effective_gas_price: r.effective_gas_price, } } } @@ -134,6 +139,7 @@ impl From for Receipt { status_code: Self::outcome_to_status_code(&legacy_receipt.outcome), state_root: Self::outcome_to_state_root(legacy_receipt.outcome), logs_bloom: legacy_receipt.log_bloom, + effective_gas_price: None, } } } @@ -191,6 +197,7 @@ mod tests { logs_bloom: Bloom::from_low_u64_be(15), state_root: Some(H256::from_low_u64_be(10)), status_code: Some(1u64.into()), + effective_gas_price: None, }; let serialized = serde_json::to_string(&receipt).unwrap();