Skip to content
This repository was archived by the owner on Sep 1, 2023. It is now read-only.

Commit b50e9d2

Browse files
committed
sync 0.0.229
Signed-off-by: Gyuho Lee <[email protected]>
1 parent 08be407 commit b50e9d2

17 files changed

+1022
-87
lines changed

Cargo.toml

+31-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "avalanche-types"
3-
version = "0.0.227" # https://crates.io/crates/avalanche-types
3+
version = "0.0.229" # https://crates.io/crates/avalanche-types
44
edition = "2021"
55
rust-version = "1.66"
66
publish = true
@@ -181,7 +181,7 @@ subnet_metrics = [
181181
]
182182

183183
[[example]]
184-
name = "evm_abi_calldata"
184+
name = "evm_contract_abi_calldata"
185185
required-features = ["evm"]
186186

187187
[[example]]
@@ -193,7 +193,35 @@ name = "evm_eip712_gsn_request_type_hash"
193193
required-features = ["evm"]
194194

195195
[[example]]
196-
name = "evm_eip712_gsn_send_relay_request"
196+
name = "evm_contract_counter_increment"
197+
required-features = ["jsonrpc_client", "evm"]
198+
199+
[[example]]
200+
name = "evm_contract_counter_increment_append_calldata"
201+
required-features = ["jsonrpc_client", "evm"]
202+
203+
[[example]]
204+
name = "evm_contract_forwarder_proxy_call_counter_increment"
205+
required-features = ["jsonrpc_client", "evm"]
206+
207+
[[example]]
208+
name = "evm_contract_forwarder_proxy_call_counter_increment_append_calldata"
209+
required-features = ["jsonrpc_client", "evm"]
210+
211+
[[example]]
212+
name = "evm_contract_forwarder_execute_counter_increment"
213+
required-features = ["jsonrpc_client", "evm"]
214+
215+
[[example]]
216+
name = "evm_contract_counter_relay_eip712"
217+
required-features = ["jsonrpc_client", "evm"]
218+
219+
[[example]]
220+
name = "evm_contract_registry"
221+
required-features = ["jsonrpc_client", "evm"]
222+
223+
[[example]]
224+
name = "evm_contract_registry_relay_eip712"
197225
required-features = ["jsonrpc_client", "evm"]
198226

199227
[[example]]

examples/evm_abi_calldata.rs renamed to examples/evm_contract_abi_calldata.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
#![allow(deprecated)]
2+
13
use std::{io, str::FromStr};
24

35
use avalanche_types::evm::abi;
@@ -6,7 +8,7 @@ use ethers_core::{
68
types::{H160, U256},
79
};
810

9-
/// cargo run --example evm_abi_calldata --features="evm"
11+
/// cargo run --example evm_contract_abi_calldata --features="evm"
1012
fn main() -> io::Result<()> {
1113
let _ = env_logger::builder()
1214
.filter_level(log::LevelFilter::Debug)
+82
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
#![allow(deprecated)]
2+
3+
use std::{env::args, io, str::FromStr};
4+
5+
use avalanche_types::{evm::abi, jsonrpc::client::evm as json_client_evm, key, wallet};
6+
use ethers_core::{
7+
abi::{Function, StateMutability},
8+
types::{H160, U256},
9+
};
10+
11+
/// cargo run --example evm_contract_counter_increment --features="jsonrpc_client evm" -- [HTTP RPC ENDPOINT] [PRIVATE KEY] [CONTRACT ADDRESS]
12+
/// cargo run --example evm_contract_counter_increment --features="jsonrpc_client evm" -- http://127.0.0.1:9650/ext/bc/C/rpc 56289e99c94b6912bfc12adc093c9b51124f0dc54ac7a766b2bc5ccf558d8027 0x41a24Bc2AE2eFF7CA3a2562374F339eAd168a5dB
13+
///
14+
/// cast send --gas-price 700000000000 --priority-gas-price 10000000000 --private-key=56289e99c94b6912bfc12adc093c9b51124f0dc54ac7a766b2bc5ccf558d8027 --rpc-url=http://127.0.0.1:9650/ext/bc/C/rpc 0x41a24Bc2AE2eFF7CA3a2562374F339eAd168a5dB "increment()"
15+
/// cast call --rpc-url=http://127.0.0.1:9650/ext/bc/C/rpc 0x41a24Bc2AE2eFF7CA3a2562374F339eAd168a5dB "getNumber()" | sed -r '/^\s*$/d' | tail -1
16+
/// cast call --rpc-url=http://127.0.0.1:9650/ext/bc/C/rpc 0x41a24Bc2AE2eFF7CA3a2562374F339eAd168a5dB "getLast()"
17+
///
18+
/// cast receipt --rpc-url=http://127.0.0.1:9650/ext/bc/C/rpc 0x31b977eff419b20c7f0e1c612530258e65cf51a38676b4c7930060ec3b9f10ee
19+
#[tokio::main]
20+
async fn main() -> io::Result<()> {
21+
// ref. https://github.com/env-logger-rs/env_logger/issues/47
22+
env_logger::init_from_env(
23+
env_logger::Env::default().filter_or(env_logger::DEFAULT_FILTER_ENV, "info"),
24+
);
25+
26+
let chain_rpc_url = args().nth(1).expect("no url given");
27+
let private_key = args().nth(2).expect("no private key given");
28+
let recipient_contract_addr = args().nth(3).expect("no contract address given");
29+
let recipient_contract_addr =
30+
H160::from_str(recipient_contract_addr.trim_start_matches("0x")).unwrap();
31+
32+
let chain_id = json_client_evm::chain_id(&chain_rpc_url).await.unwrap();
33+
log::info!(
34+
"running against {chain_rpc_url}, {chain_id} for contract {recipient_contract_addr}"
35+
);
36+
37+
let k = key::secp256k1::private_key::Key::from_hex(private_key).unwrap();
38+
let key_info = k.to_info(1).unwrap();
39+
log::info!("created hot key:\n\n{}\n", key_info);
40+
let signer: ethers_signers::LocalWallet = k.to_ethers_core_signing_key().into();
41+
42+
let w = wallet::Builder::new(&k)
43+
.base_http_url(chain_rpc_url.clone())
44+
.build()
45+
.await?;
46+
let evm_wallet = w.evm(&signer, chain_rpc_url.as_str(), U256::from(chain_id))?;
47+
48+
// parsed function of "increment()"
49+
let func = Function {
50+
name: "increment".to_string(),
51+
inputs: vec![],
52+
outputs: Vec::new(),
53+
constant: None,
54+
state_mutability: StateMutability::NonPayable,
55+
};
56+
let arg_tokens = vec![];
57+
let increment_calldata = abi::encode_calldata(func, &arg_tokens).unwrap();
58+
log::info!(
59+
"increment calldata: 0x{}",
60+
hex::encode(increment_calldata.clone())
61+
);
62+
63+
// as if forwarder appends the original EIP712 signer
64+
// this does not work because the msg.sender is not a trusted forwarder
65+
// let no_gas_key = key::secp256k1::private_key::Key::generate().unwrap();
66+
// let no_gas_key_info = no_gas_key.to_info(1).unwrap();
67+
// log::info!("created hot key:\n\n{}\n", no_gas_key_info);
68+
// let mut calldata = calldata.clone();
69+
// calldata.extend(no_gas_key_info.h160_address.to_fixed_bytes().to_vec());
70+
71+
let tx_id = evm_wallet
72+
.eip1559()
73+
.recipient(recipient_contract_addr) // contract address that this transaction will interact with
74+
.data(increment_calldata)
75+
.urgent()
76+
.check_acceptance(true)
77+
.submit()
78+
.await?;
79+
log::info!("evm ethers wallet SUCCESS with transaction id {}", tx_id);
80+
81+
Ok(())
82+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
#![allow(deprecated)]
2+
3+
use std::{env::args, io, str::FromStr};
4+
5+
use avalanche_types::{evm::abi, jsonrpc::client::evm as json_client_evm, key, wallet};
6+
use ethers_core::{
7+
abi::{encode as abi_encode, Function, StateMutability, Token},
8+
types::{H160, U256},
9+
};
10+
11+
/// cargo run --example evm_contract_counter_increment_append_calldata --features="jsonrpc_client evm" -- [HTTP RPC ENDPOINT] [PRIVATE KEY] [FORWARDER CONTRACT ADDRESS] [RECIPIENT CONTRACT ADDRESS]
12+
/// cargo run --example evm_contract_counter_increment_append_calldata --features="jsonrpc_client evm" -- http://127.0.0.1:9650/ext/bc/C/rpc 56289e99c94b6912bfc12adc093c9b51124f0dc54ac7a766b2bc5ccf558d8027 0x41a24Bc2AE2eFF7CA3a2562374F339eAd168a5dB
13+
///
14+
/// cast send --gas-price 700000000000 --priority-gas-price 10000000000 --private-key=56289e99c94b6912bfc12adc093c9b51124f0dc54ac7a766b2bc5ccf558d8027 --rpc-url=http://127.0.0.1:9650/ext/bc/C/rpc 0x41a24Bc2AE2eFF7CA3a2562374F339eAd168a5dB "increment()"
15+
/// cast call --rpc-url=http://127.0.0.1:9650/ext/bc/C/rpc 0x41a24Bc2AE2eFF7CA3a2562374F339eAd168a5dB "getNumber()" | sed -r '/^\s*$/d' | tail -1
16+
/// cast call --rpc-url=http://127.0.0.1:9650/ext/bc/C/rpc 0x41a24Bc2AE2eFF7CA3a2562374F339eAd168a5dB "getLast()"
17+
#[tokio::main]
18+
async fn main() -> io::Result<()> {
19+
// ref. https://github.com/env-logger-rs/env_logger/issues/47
20+
env_logger::init_from_env(
21+
env_logger::Env::default().filter_or(env_logger::DEFAULT_FILTER_ENV, "info"),
22+
);
23+
24+
let chain_rpc_url = args().nth(1).expect("no url given");
25+
let private_key = args().nth(2).expect("no private key given");
26+
27+
let recipient_contract_addr = args().nth(3).expect("no contract address given");
28+
let recipient_contract_addr =
29+
H160::from_str(recipient_contract_addr.trim_start_matches("0x")).unwrap();
30+
31+
let chain_id = json_client_evm::chain_id(&chain_rpc_url).await.unwrap();
32+
log::info!(
33+
"running against {chain_rpc_url}, {chain_id} for recipient contract {recipient_contract_addr}"
34+
);
35+
36+
let k = key::secp256k1::private_key::Key::from_hex(private_key).unwrap();
37+
let key_info = k.to_info(1).unwrap();
38+
log::info!("created hot key:\n\n{}\n", key_info);
39+
let signer: ethers_signers::LocalWallet = k.to_ethers_core_signing_key().into();
40+
41+
let w = wallet::Builder::new(&k)
42+
.base_http_url(chain_rpc_url.clone())
43+
.build()
44+
.await?;
45+
let evm_wallet = w.evm(&signer, chain_rpc_url.as_str(), U256::from(chain_id))?;
46+
47+
// parsed function of "increment()"
48+
let func = Function {
49+
name: "increment".to_string(),
50+
inputs: vec![],
51+
outputs: Vec::new(),
52+
constant: None,
53+
state_mutability: StateMutability::NonPayable,
54+
};
55+
let arg_tokens = vec![];
56+
let increment_calldata = abi::encode_calldata(func, &arg_tokens).unwrap();
57+
log::info!(
58+
"increment calldata: 0x{}",
59+
hex::encode(increment_calldata.clone())
60+
);
61+
62+
// parsed function of "increment()"
63+
let func = Function {
64+
name: "increment".to_string(),
65+
inputs: vec![],
66+
outputs: Vec::new(),
67+
constant: None,
68+
state_mutability: StateMutability::NonPayable,
69+
};
70+
let arg_tokens = vec![];
71+
let increment_calldata = abi::encode_calldata(func, &arg_tokens).unwrap();
72+
log::info!(
73+
"increment calldata: 0x{}",
74+
hex::encode(increment_calldata.clone())
75+
);
76+
77+
// as if forwarder appends the original EIP712 signer
78+
// this does not work because the msg.sender is not a trusted forwarder
79+
let no_gas_key = key::secp256k1::private_key::Key::generate().unwrap();
80+
let no_gas_key_info = no_gas_key.to_info(1).unwrap();
81+
log::info!("created hot key:\n\n{}\n", no_gas_key_info);
82+
let encoded = abi_encode(&[Token::Bytes(
83+
no_gas_key_info.h160_address.to_fixed_bytes().to_vec(),
84+
)]);
85+
let mut appended_calldata = increment_calldata.clone();
86+
appended_calldata.extend(encoded);
87+
log::info!(
88+
"appended calldata: 0x{}",
89+
hex::encode(appended_calldata.clone())
90+
);
91+
92+
let tx_id = evm_wallet
93+
.eip1559()
94+
.recipient(recipient_contract_addr) // contract address that this transaction will interact with
95+
.data(appended_calldata)
96+
.urgent()
97+
.check_acceptance(true)
98+
.submit()
99+
.await?;
100+
log::info!("evm ethers wallet SUCCESS with transaction id {}", tx_id);
101+
102+
Ok(())
103+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
#![allow(deprecated)]
2+
3+
use std::{convert::TryFrom, env::args, io, str::FromStr};
4+
5+
use avalanche_types::{
6+
evm::{abi, eip712::gsn::Tx},
7+
key,
8+
};
9+
use ethers_core::{
10+
abi::{Function, StateMutability},
11+
types::{H160, U256},
12+
};
13+
use ethers_providers::{Http, Middleware, Provider};
14+
15+
/// cargo run --example evm_contract_counter_relay_eip712 --features="jsonrpc_client evm" -- [HTTP RPC ENDPOINT]
16+
/// cargo run --example evm_contract_counter_relay_eip712 --features="jsonrpc_client evm" -- http://localhost:9876/rpc
17+
///
18+
/// cast send --gas-price 700000000000 --priority-gas-price 10000000000 --private-key=56289e99c94b6912bfc12adc093c9b51124f0dc54ac7a766b2bc5ccf558d8027 --rpc-url=http://127.0.0.1:9650/ext/bc/C/rpc 0x5DB9A7629912EBF95876228C24A848de0bfB43A9 "increment()"
19+
/// cast call --rpc-url=http://127.0.0.1:9650/ext/bc/C/rpc 0x5DB9A7629912EBF95876228C24A848de0bfB43A9 "getNumber()" | sed -r '/^\s*$/d' | tail -1
20+
#[tokio::main]
21+
async fn main() -> io::Result<()> {
22+
// ref. https://github.com/env-logger-rs/env_logger/issues/47
23+
env_logger::init_from_env(
24+
env_logger::Env::default().filter_or(env_logger::DEFAULT_FILTER_ENV, "info"),
25+
);
26+
27+
let k = key::secp256k1::private_key::Key::from_hex(
28+
"1af42b797a6bfbd3cf7554bed261e876db69190f5eb1b806acbd72046ee957c3",
29+
)
30+
.unwrap();
31+
let key_info = k.to_info(1).unwrap();
32+
log::info!("created hot key:\n\n{}\n", key_info);
33+
let signer: ethers_signers::LocalWallet = k.to_ethers_core_signing_key().into();
34+
35+
// parsed function of "increment()"
36+
let func = Function {
37+
name: "increment".to_string(),
38+
inputs: vec![],
39+
outputs: Vec::new(),
40+
constant: None,
41+
state_mutability: StateMutability::NonPayable,
42+
};
43+
let arg_tokens = vec![];
44+
let calldata = abi::encode_calldata(func, &arg_tokens).unwrap();
45+
log::info!("calldata: 0x{}", hex::encode(calldata.clone()));
46+
47+
let relay_tx_request = Tx::new()
48+
//
49+
// make sure this matches with "registerDomainSeparator" call
50+
.domain_name("my name")
51+
.domain_version("1")
52+
//
53+
// local network
54+
.domain_chain_id(U256::from(43112))
55+
//
56+
// trusted forwarder contract address
57+
.domain_verifying_contract(
58+
H160::from_str("0x52C84043CD9c865236f11d9Fc9F56aa003c1f922".trim_start_matches("0x"))
59+
.unwrap(),
60+
)
61+
.from(key_info.h160_address.clone())
62+
//
63+
// contract address that this gasless transaction will interact with
64+
.to(
65+
H160::from_str("0x5DB9A7629912EBF95876228C24A848de0bfB43A9".trim_start_matches("0x"))
66+
.unwrap(),
67+
)
68+
//
69+
// contract call needs no value
70+
.value(U256::zero())
71+
//
72+
// assume this is the first transaction
73+
.nonce(U256::from(1))
74+
//
75+
// calldata for contract calls
76+
.data(calldata)
77+
//
78+
//
79+
.valid_until_time(U256::MAX)
80+
//
81+
//
82+
.type_name("my name")
83+
//
84+
//
85+
.type_suffix_data("my suffix")
86+
//
87+
//
88+
.sign_to_request(signer)
89+
.await
90+
.unwrap();
91+
92+
log::info!("relay_tx_request: {:?}", relay_tx_request);
93+
94+
let signed_bytes: ethers_core::types::Bytes =
95+
serde_json::to_vec(&relay_tx_request).unwrap().into();
96+
97+
let url = args().nth(1).expect("no url given");
98+
log::info!("running against {url}");
99+
100+
let provider =
101+
Provider::<Http>::try_from(url.clone()).expect("could not instantiate HTTP Provider");
102+
log::info!("created provider for {url}");
103+
104+
let pending = provider.send_raw_transaction(signed_bytes).await.unwrap();
105+
log::info!("pending tx hash {}", pending.tx_hash());
106+
107+
Ok(())
108+
}

0 commit comments

Comments
 (0)