fix: serialize eth_getStorageAt position param as quantity (#1281)
* fix: serialize eth_getStorageAt position param as quantity * test: add quantity test
This commit is contained in:
parent
d77f92519c
commit
7509e42d3b
|
@ -728,12 +728,15 @@ impl<P: JsonRpcClient> Middleware for Provider<P> {
|
||||||
NameOrAddress::Address(addr) => addr,
|
NameOrAddress::Address(addr) => addr,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// position is a QUANTITY according to the [spec](https://eth.wiki/json-rpc/API#eth_getstorageat): integer of the position in the storage, converting this to a U256
|
||||||
|
// will make sure the number is formatted correctly as [quantity](https://eips.ethereum.org/EIPS/eip-1474#quantity)
|
||||||
|
let position = U256::from_big_endian(location.as_bytes());
|
||||||
|
let position = utils::serialize(&position);
|
||||||
let from = utils::serialize(&from);
|
let from = utils::serialize(&from);
|
||||||
let location = utils::serialize(&location);
|
|
||||||
let block = utils::serialize(&block.unwrap_or_else(|| BlockNumber::Latest.into()));
|
let block = utils::serialize(&block.unwrap_or_else(|| BlockNumber::Latest.into()));
|
||||||
|
|
||||||
// get the hex encoded value.
|
// get the hex encoded value.
|
||||||
let value: String = self.request("eth_getStorageAt", [from, location, block]).await?;
|
let value: String = self.request("eth_getStorageAt", [from, position, block]).await?;
|
||||||
// get rid of the 0x prefix and left pad it with zeroes.
|
// get rid of the 0x prefix and left pad it with zeroes.
|
||||||
let value = format!("{:0>64}", value.replace("0x", ""));
|
let value = format!("{:0>64}", value.replace("0x", ""));
|
||||||
Ok(H256::from_slice(&Vec::from_hex(value)?))
|
Ok(H256::from_slice(&Vec::from_hex(value)?))
|
||||||
|
@ -1526,6 +1529,22 @@ mod tests {
|
||||||
};
|
};
|
||||||
use futures_util::StreamExt;
|
use futures_util::StreamExt;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn convert_h256_u256_quantity() {
|
||||||
|
let hash: H256 = H256::zero();
|
||||||
|
let quantity = U256::from_big_endian(hash.as_bytes());
|
||||||
|
assert_eq!(format!("{quantity:#x}"), "0x0");
|
||||||
|
assert_eq!(utils::serialize(&quantity).to_string(), "\"0x0\"");
|
||||||
|
|
||||||
|
let address: Address = "0x295a70b2de5e3953354a6a8344e616ed314d7251".parse().unwrap();
|
||||||
|
let block = BlockNumber::Latest;
|
||||||
|
let params =
|
||||||
|
[utils::serialize(&address), utils::serialize(&quantity), utils::serialize(&block)];
|
||||||
|
|
||||||
|
let params = serde_json::to_string(¶ms).unwrap();
|
||||||
|
assert_eq!(params, r#"["0x295a70b2de5e3953354a6a8344e616ed314d7251","0x0","latest"]"#);
|
||||||
|
}
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
// Test vector from: https://docs.ethers.io/ethers.js/v5-beta/api-providers.html#id2
|
// Test vector from: https://docs.ethers.io/ethers.js/v5-beta/api-providers.html#id2
|
||||||
async fn mainnet_resolve_name() {
|
async fn mainnet_resolve_name() {
|
||||||
|
|
Loading…
Reference in New Issue