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

Replace web30 and clarity with ethers-rs #297

Merged
merged 116 commits into from
Dec 1, 2021
Merged
Show file tree
Hide file tree
Changes from 105 commits
Commits
Show all changes
116 commits
Select commit Hold shift + click to select a range
43c47dc
Remove unused num256 references
EricBolten Nov 1, 2021
4bfc465
Add ethers to orchestrator
EricBolten Nov 2, 2021
1c08b91
Initial cargo fmt on orchestrator/orchestrator
EricBolten Nov 2, 2021
2243e52
Remove main.rs from orchestrator
EricBolten Nov 2, 2021
759f0d3
Add ethers dependency to gorc
EricBolten Nov 3, 2021
140ac48
Add ethers to other Cargo.toml that use clarity
EricBolten Nov 3, 2021
2151a72
WIP: replace clarity/web30
EricBolten Nov 3, 2021
61a08fd
Move old orchestrator doc comment to lib.rs
EricBolten Nov 4, 2021
aa32094
Make orchestrator main_loop.rs doc comment readable
EricBolten Nov 4, 2021
53aa2c2
WIP: rewrite find_latest_valset
EricBolten Nov 5, 2021
f8995eb
Use static strings for eth event prototypes
EricBolten Nov 5, 2021
9c42c2d
WIP: start migration of downcasting methodology
EricBolten Nov 5, 2021
b93222d
WIP: fixing up valset update filter logic
EricBolten Nov 5, 2021
db3dcd6
Dropping unnecessary type from GravityError
EricBolten Nov 5, 2021
20b674f
Leaving a TODO around use of abigen
EricBolten Nov 5, 2021
22a3952
Provider interval TODO, rustfmt
EricBolten Nov 6, 2021
1900c2c
Remove unnecessary ZERO const
EricBolten Nov 8, 2021
88b3efb
ABI JSON for Gravity.sol from Hardhat compile
EricBolten Nov 8, 2021
498e3a0
Add serde_json, call abigen! on Gravity.json
EricBolten Nov 8, 2021
3a0eacc
WIP: use Gravity.sol ABI directly
EricBolten Nov 8, 2021
edd4e37
Move downcast tests, small fixes
EricBolten Nov 8, 2021
0f236dd
Fix block height conversion, remove unused import
EricBolten Nov 9, 2021
8b37d8b
Complete conversion of ethereum_events.rs
EricBolten Nov 9, 2021
35cafea
Ensure powers can be downcast, fix up some errors
EricBolten Nov 9, 2021
4a82a28
Downcasting the powers in a simpler way
EricBolten Nov 9, 2021
d865983
Make sure powers is mutable, add a TODO
EricBolten Nov 9, 2021
d6d81c6
Move EthClient type and replace some uses of web3
EricBolten Nov 10, 2021
fbdeba0
Get the gravity_id using ethers contract
EricBolten Nov 10, 2021
7e2a23c
Make ethereum events DRY with traits, rustfmt
EricBolten Nov 10, 2021
7071604
Swap out abigen! for generated code from Gravity
EricBolten Nov 10, 2021
c7180c4
Add module for building the gravity.rs file
EricBolten Nov 10, 2021
fc4cfd5
WIP: Start converting relay_valsets
EricBolten Nov 10, 2021
f6a573d
WIP: message signature enconding, erc 20 token
EricBolten Nov 11, 2021
87700cb
Extract bytes_to_hex_str from clarity
EricBolten Nov 11, 2021
78510a0
Convert to using ethers signature type
EricBolten Nov 11, 2021
10d2ca7
WIP: convert all the contract "calls"
EricBolten Nov 11, 2021
74debb2
Add doc comment and change name for gas
EricBolten Nov 11, 2021
95647eb
Update GasCost struct
EricBolten Nov 11, 2021
bbe942a
Convert valset update transactions
EricBolten Nov 12, 2021
18a5158
Simplify and fix our contract eth_calls
EricBolten Nov 12, 2021
9bfb4bc
Misc fixes
EricBolten Nov 12, 2021
2bc566e
Merge the gas function into the builder
EricBolten Nov 12, 2021
1f36174
Finish conversion of valset_relaying.rs
EricBolten Nov 12, 2021
24ead91
WIP: Convert batch submission, contract call fixes
EricBolten Nov 12, 2021
f66ec6f
Remove dead power_diff code
EricBolten Nov 13, 2021
9596f2c
Move gravity ABI to its own package
EricBolten Nov 13, 2021
3e84d28
Fix gravity ABI reference in ethereum_events
EricBolten Nov 13, 2021
268a180
Fix EthersParseAddressError
EricBolten Nov 13, 2021
e2bc98f
Various fixes
EricBolten Nov 13, 2021
c3d5997
Add tokio to ethereum_gravity
EricBolten Nov 13, 2021
9d84ee7
More small fixes
EricBolten Nov 13, 2021
8782ffd
WIP: even more bugfixes
EricBolten Nov 16, 2021
316f718
WIP: even more bugfixes
EricBolten Nov 16, 2021
2e9c0aa
WIP: working on fixing handling of gas costs
EricBolten Nov 16, 2021
d3a2c25
WIP: gas fixes
EricBolten Nov 17, 2021
ef94b8f
WIP: fix gas price multiplier and downcast to f32
EricBolten Nov 17, 2021
d62e9cb
Convert logic call relaying
EricBolten Nov 17, 2021
5bada4e
WIP: convert deploy erc20
EricBolten Nov 17, 2021
b39174b
Finish converting deploy ERC-20 and gorc command
EricBolten Nov 18, 2021
a45620d
Downcast replacements
EricBolten Nov 18, 2021
7080fbb
Convert orchestrator main_loop
EricBolten Nov 18, 2021
f2778e9
Convert build.rs
EricBolten Nov 18, 2021
56f06c4
Convert metrics
EricBolten Nov 18, 2021
3d96849
WIP converting last parts of the orchestrator
EricBolten Nov 18, 2021
a527abd
Hash raw messages before signing them
EricBolten Nov 18, 2021
ee63317
WIP on converting send_to_cosmos
EricBolten Nov 18, 2021
55f1fa5
Finish converting send_to_cosmos
EricBolten Nov 18, 2021
db58e43
WIP: various fixes
EricBolten Nov 18, 2021
bf87d24
WIP: even more fixes
EricBolten Nov 18, 2021
7d2dd73
WIP: further fixes
EricBolten Nov 18, 2021
728cb4f
Convert oracle_resync and ethereum_event_watcher
EricBolten Nov 19, 2021
c714c96
Add some TODOs
EricBolten Nov 19, 2021
cdc87f2
Remove unnecessary capturing of our eth address
EricBolten Nov 19, 2021
7faebb3
Warning fixes
EricBolten Nov 19, 2021
ec8b828
WIP: gorc conversion
EricBolten Nov 19, 2021
c816ba1
Finish gorc conversion
EricBolten Nov 19, 2021
abbe345
Convert register_delegate_keys, small erc20 note
EricBolten Nov 19, 2021
dbae639
Import OpenZeppelin ERC20 contract
EricBolten Nov 19, 2021
9f7d87b
Remove warning in register_delegate_keys
EricBolten Nov 19, 2021
59807ab
Update message_signatures.rs unit tests
EricBolten Nov 19, 2021
d19ceb0
Remove downcast tests, port hex_str_to_bytes tests
EricBolten Nov 19, 2021
7b54baa
Move Eth types out of utils
EricBolten Nov 19, 2021
f0bcc3a
Don't assume ERC20 addresses come from the client
EricBolten Nov 20, 2021
4484196
Add a TODO around downcast tests
EricBolten Nov 20, 2021
0be8e7d
No reason to use "as EthProvider" in connections
EricBolten Nov 20, 2021
6939cc6
Re-order events to account for partial failure
EricBolten Nov 20, 2021
c72e123
fully compilable refactor
EricBolten Nov 20, 2021
6afba3a
cargo fmt
EricBolten Nov 20, 2021
9155c95
Merge branch 'main' into bolten/replace-num256
EricBolten Nov 20, 2021
8d5e6e4
Remove the unused erc20_transfer function
EricBolten Nov 20, 2021
cef865e
Some cleanup
EricBolten Nov 20, 2021
a1ec3ab
Add downcast tests to make sure overflows are safe
EricBolten Nov 20, 2021
6fcc182
Add a TODO around event ABI strings
EricBolten Nov 20, 2021
ac8e6ac
Fixing a bug another PR noticed in main
EricBolten Nov 22, 2021
9a33e2b
Fix eth address string formatting
EricBolten Nov 23, 2021
7e49276
Conversion of variable length u8s to fixed 32
EricBolten Nov 23, 2021
91cda00
Ran cargo fmt again, not sure why some changed
EricBolten Nov 23, 2021
69d4053
Update tests to how signature recover should work
EricBolten Nov 23, 2021
994ab47
Remove unnnecessary match in Cosmos send returns
EricBolten Nov 23, 2021
b8d4c03
Remove duplicated error type
EricBolten Nov 23, 2021
7fb8527
set the LocalWallet's chain ID
EricBolten Nov 24, 2021
a943a3c
No need to clone the provider twice
EricBolten Nov 24, 2021
bb0c9ef
ethers-rs -> master, update abigen, bump deps
EricBolten Nov 25, 2021
d9b36cb
Porting rust changes from mvid/contract-call
EricBolten Nov 25, 2021
8cbc5bb
Take allowance threshold as argument for erc20
EricBolten Nov 25, 2021
e6fbf1f
Update to ethers 0.6.1 instead of master
EricBolten Nov 29, 2021
50c384f
Update the Etherscan oracle for ethers 0.6.1
EricBolten Nov 29, 2021
7ff2d98
Fix eth address formatting instance I missed
EricBolten Nov 30, 2021
9bc5cc5
delete duplicated __send_messages for cosmos
EricBolten Nov 30, 2021
b48a8ee
Remove dead checkpoint abi encoding functions
EricBolten Nov 30, 2021
69ce9c8
use checked_add when aggregating fees
EricBolten Nov 30, 2021
ab58996
Use generated abi signatures when filtering events
EricBolten Dec 1, 2021
7db2978
sanity checking, comment fixes, remove dead code
EricBolten Dec 1, 2021
38376ca
Remove TODO, question answered
EricBolten Dec 1, 2021
234a62a
Fix U256 parse attempts from Strings
EricBolten Dec 1, 2021
8830a8b
Use the same method to calculate gas for call/send
EricBolten Dec 1, 2021
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
1,710 changes: 1,492 additions & 218 deletions orchestrator/Cargo.lock

Large diffs are not rendered by default.

6 changes: 5 additions & 1 deletion orchestrator/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ members = [
"relayer",
"register_delegate_keys",
"gorc",
"abi_build",
"gravity_abi",
]

[dependencies]
Expand All @@ -36,4 +38,6 @@ test_runner = { path = "./test_runner" }
gravity_proto = { path = "./gravity_proto" }
register_delegate_keys = { path = "./register_delegate_keys" }
gorc = { path = "./gorc" }
relayer = { path = "./relayer" }
relayer = { path = "./relayer" }
abi_build = { path = "./abi_build" }
gravity_abi = { path = "./gravity_abi" }
12 changes: 12 additions & 0 deletions orchestrator/abi_build/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
[package]
name = "abi_build"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
ethers = { git = "https://github.com/gakonst/ethers-rs", branch = "master", features = ["abigen"] }
serde_derive = "1.0"
serde_json = "1.0.69"
serde = "1.0"
58 changes: 58 additions & 0 deletions orchestrator/abi_build/src/main.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
use ethers::contract::Abigen;
use std::process;

fn main() {
// Gravity contract

let abigen = match Abigen::new("Gravity", "../gravity_abi/Gravity.json") {
Ok(abigen) => abigen,
Err(e) => {
println!("Could not open Gravity.json: {}", e);
process::exit(1);
}
};

let abi = match abigen
.add_event_derive("serde::Deserialize")
.add_event_derive("serde::Serialize")
.generate()
{
Ok(abi) => abi,
Err(e) => {
println!("Could not generate abi from Gravity.json: {}", e);
process::exit(1);
}
};

match abi.write_to_file("../gravity_abi/src/gravity.rs") {
Ok(_) => (),
Err(e) => println!("Error writing gravity.rs: {}", e),
}

// OpenZeppelin ERC20 contract

let abigen = match Abigen::new("ERC20", "../gravity_abi/ERC20.json") {
Ok(abigen) => abigen,
Err(e) => {
println!("Could not open ERC20.json: {}", e);
process::exit(1);
}
};

let abi = match abigen
.add_event_derive("serde::Deserialize")
.add_event_derive("serde::Serialize")
.generate()
{
Ok(abi) => abi,
Err(e) => {
println!("Could not generate abi from ERC20.json: {}", e);
process::exit(1);
}
};

match abi.write_to_file("../gravity_abi/src/erc20.rs") {
Ok(_) => (),
Err(e) => println!("Error writing erc20.rs: {}", e),
}
}
4 changes: 2 additions & 2 deletions orchestrator/cosmos_gravity/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ ethereum_gravity = {path = "../ethereum_gravity"}
gravity_proto = {path = "../gravity_proto/"}

deep_space ={git="https://github.com/iqlusioninc/deep_space/", branch="master"}
ethers = { git = "https://github.com/gakonst/ethers-rs", branch = "master", features = ["abigen"] }
clarity = "0.4.11"
serde = "1.0"
num256 = "0.3"
log = "0.4"
sha3 = "0.9"
tokio = "1.4"
Expand All @@ -28,4 +28,4 @@ bytes = "1"
[dev-dependencies]
env_logger = "0.8"
rand = "0.8"
actix = "0.11"
actix = "0.12"
99 changes: 52 additions & 47 deletions orchestrator/cosmos_gravity/src/build.rs
Original file line number Diff line number Diff line change
@@ -1,36 +1,38 @@
use std::collections::BTreeMap;

use clarity::PrivateKey as EthPrivateKey;
use deep_space::private_key::PrivateKey as CosmosPrivateKey;
use deep_space::utils::bytes_to_hex_str;
use deep_space::Contact;
use deep_space::Msg;
use ethereum_gravity::utils::downcast_uint256;
use ethereum_gravity::types::EthClient;
use ethers::prelude::*;
use ethers::utils::keccak256;
use gravity_proto::gravity as proto;
use gravity_proto::ToAny;
use gravity_utils::ethereum::{downcast_to_u64, format_eth_address};
use gravity_utils::message_signatures::{
encode_logic_call_confirm, encode_tx_batch_confirm, encode_valset_confirm,
};
use gravity_utils::types::*;
use std::collections::BTreeMap;

pub fn signer_set_tx_confirmation_messages(
pub async fn signer_set_tx_confirmation_messages(
contact: &Contact,
ethereum_key: EthPrivateKey,
eth_client: EthClient,
valsets: Vec<Valset>,
cosmos_key: CosmosPrivateKey,
gravity_id: String,
) -> Vec<Msg> {
let cosmos_address = cosmos_key.to_address(&contact.get_prefix()).unwrap();
let ethereum_address = ethereum_key.to_public_key().unwrap();
let ethereum_address = eth_client.address();

let mut msgs = Vec::new();
for valset in valsets {
let data = encode_valset_confirm(gravity_id.clone(), valset.clone());
let signature = ethereum_key.sign_ethereum_msg(&data);
let data = keccak256(encode_valset_confirm(gravity_id.clone(), valset.clone()).as_slice());
// Signer trait responds with a Result, but we use a LocalWallet and it
// will never throw an error
let signature = eth_client.signer().sign_message(data).await.unwrap();
let confirmation = proto::SignerSetTxConfirmation {
ethereum_signer: ethereum_address.to_string(),
ethereum_signer: format_eth_address(ethereum_address),
signer_set_nonce: valset.nonce,
signature: signature.to_bytes().to_vec(),
signature: signature.into(),
};
let msg = proto::MsgSubmitEthereumTxConfirmation {
signer: cosmos_address.to_string(),
Expand All @@ -42,25 +44,27 @@ pub fn signer_set_tx_confirmation_messages(
msgs
}

pub fn batch_tx_confirmation_messages(
pub async fn batch_tx_confirmation_messages(
contact: &Contact,
ethereum_key: EthPrivateKey,
eth_client: EthClient,
batches: Vec<TransactionBatch>,
cosmos_key: CosmosPrivateKey,
gravity_id: String,
) -> Vec<Msg> {
let cosmos_address = cosmos_key.to_address(&contact.get_prefix()).unwrap();
let ethereum_address = ethereum_key.to_public_key().unwrap();
let ethereum_address = eth_client.address();

let mut msgs = Vec::new();
for batch in batches {
let data = encode_tx_batch_confirm(gravity_id.clone(), batch.clone());
let signature = ethereum_key.sign_ethereum_msg(&data);
let data = keccak256(encode_tx_batch_confirm(gravity_id.clone(), batch.clone()).as_slice());
// Signer trait responds with a Result, but we use a LocalWallet and it
// will never throw an error
let signature = eth_client.signer().sign_message(data).await.unwrap();
let confirmation = proto::BatchTxConfirmation {
token_contract: batch.token_contract.to_string(),
token_contract: format_eth_address(batch.token_contract),
batch_nonce: batch.nonce,
ethereum_signer: ethereum_address.to_string(),
signature: signature.to_bytes().to_vec(),
ethereum_signer: format_eth_address(ethereum_address),
signature: signature.into(),
};
let msg = proto::MsgSubmitEthereumEvent {
signer: cosmos_address.to_string(),
Expand All @@ -72,26 +76,27 @@ pub fn batch_tx_confirmation_messages(
msgs
}

pub fn contract_call_tx_confirmation_messages(
pub async fn contract_call_tx_confirmation_messages(
contact: &Contact,
ethereum_key: EthPrivateKey,
eth_client: EthClient,
logic_calls: Vec<LogicCall>,
cosmos_key: CosmosPrivateKey,
gravity_id: String,
) -> Vec<Msg> {
let cosmos_address = cosmos_key.to_address(&contact.get_prefix()).unwrap();
let ethereum_address = ethereum_key.to_public_key().unwrap();
let ethereum_address = eth_client.address();

let mut msgs = Vec::new();
for logic_call in logic_calls {
let data = encode_logic_call_confirm(gravity_id.clone(), logic_call.clone());
let signature = ethereum_key.sign_ethereum_msg(&data);
let data =
keccak256(encode_logic_call_confirm(gravity_id.clone(), logic_call.clone()).as_slice());
// Signer trait responds with a Result, but we use a LocalWallet and it
// will never throw an error
let signature = eth_client.signer().sign_message(data).await.unwrap();
let confirmation = proto::ContractCallTxConfirmation {
ethereum_signer: ethereum_address.to_string(),
signature: signature.to_bytes().to_vec(),
invalidation_scope: bytes_to_hex_str(&logic_call.invalidation_id)
.as_bytes()
.to_vec(),
ethereum_signer: format_eth_address(ethereum_address),
signature: signature.into(),
invalidation_scope: logic_call.invalidation_id,
invalidation_nonce: logic_call.invalidation_nonce,
};
let msg = proto::MsgSubmitEthereumTxConfirmation {
Expand Down Expand Up @@ -126,12 +131,12 @@ pub fn ethereum_event_messages(
let mut unordered_msgs = BTreeMap::new();
for deposit in deposits {
let event = proto::SendToCosmosEvent {
event_nonce: downcast_uint256(deposit.event_nonce.clone()).unwrap(),
ethereum_height: downcast_uint256(deposit.block_height).unwrap(),
token_contract: deposit.erc20.to_string(),
event_nonce: downcast_to_u64(deposit.event_nonce.clone()).unwrap(),
ethereum_height: downcast_to_u64(deposit.block_height).unwrap(),
token_contract: format_eth_address(deposit.erc20),
amount: deposit.amount.to_string(),
cosmos_receiver: deposit.destination.to_string(),
ethereum_sender: deposit.sender.to_string(),
ethereum_sender: format_eth_address(deposit.sender),
};
let msg = proto::MsgSubmitEthereumEvent {
signer: cosmos_address.to_string(),
Expand All @@ -142,10 +147,10 @@ pub fn ethereum_event_messages(
}
for batch in batches {
let event = proto::BatchExecutedEvent {
event_nonce: downcast_uint256(batch.event_nonce.clone()).unwrap(),
batch_nonce: downcast_uint256(batch.batch_nonce.clone()).unwrap(),
ethereum_height: downcast_uint256(batch.block_height).unwrap(),
token_contract: batch.erc20.to_string(),
event_nonce: downcast_to_u64(batch.event_nonce.clone()).unwrap(),
batch_nonce: downcast_to_u64(batch.batch_nonce.clone()).unwrap(),
ethereum_height: downcast_to_u64(batch.block_height).unwrap(),
token_contract: format_eth_address(batch.erc20),
};
let msg = proto::MsgSubmitEthereumEvent {
signer: cosmos_address.to_string(),
Expand All @@ -156,10 +161,10 @@ pub fn ethereum_event_messages(
}
for deploy in erc20_deploys {
let event = proto::Erc20DeployedEvent {
event_nonce: downcast_uint256(deploy.event_nonce.clone()).unwrap(),
ethereum_height: downcast_uint256(deploy.block_height).unwrap(),
event_nonce: downcast_to_u64(deploy.event_nonce.clone()).unwrap(),
ethereum_height: downcast_to_u64(deploy.block_height).unwrap(),
cosmos_denom: deploy.cosmos_denom,
token_contract: deploy.erc20_address.to_string(),
token_contract: format_eth_address(deploy.erc20_address),
erc20_name: deploy.name,
erc20_symbol: deploy.symbol,
erc20_decimals: deploy.decimals as u64,
Expand All @@ -173,10 +178,10 @@ pub fn ethereum_event_messages(
}
for logic_call in logic_calls {
let event = proto::ContractCallExecutedEvent {
event_nonce: downcast_uint256(logic_call.event_nonce.clone()).unwrap(),
ethereum_height: downcast_uint256(logic_call.block_height).unwrap(),
event_nonce: downcast_to_u64(logic_call.event_nonce.clone()).unwrap(),
ethereum_height: downcast_to_u64(logic_call.block_height).unwrap(),
invalidation_id: logic_call.invalidation_id,
invalidation_nonce: downcast_uint256(logic_call.invalidation_nonce).unwrap(),
invalidation_nonce: downcast_to_u64(logic_call.invalidation_nonce).unwrap(),
};
let msg = proto::MsgSubmitEthereumEvent {
signer: cosmos_address.to_string(),
Expand All @@ -187,9 +192,9 @@ pub fn ethereum_event_messages(
}
for valset in valsets {
let event = proto::SignerSetTxExecutedEvent {
event_nonce: downcast_uint256(valset.event_nonce.clone()).unwrap(),
signer_set_tx_nonce: downcast_uint256(valset.valset_nonce.clone()).unwrap(),
ethereum_height: downcast_uint256(valset.block_height).unwrap(),
event_nonce: downcast_to_u64(valset.event_nonce.clone()).unwrap(),
signer_set_tx_nonce: downcast_to_u64(valset.valset_nonce.clone()).unwrap(),
ethereum_height: downcast_to_u64(valset.block_height).unwrap(),
members: valset.members.iter().map(|v| v.into()).collect(),
};
let msg = proto::MsgSubmitEthereumEvent {
Expand Down
5 changes: 3 additions & 2 deletions orchestrator/cosmos_gravity/src/query.rs
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
use clarity::Address as EthAddress;
use deep_space::address::Address;
use ethers::types::Address as EthAddress;
use gravity_proto::gravity::query_client::QueryClient as GravityQueryClient;
use gravity_proto::gravity::*;
use gravity_utils::error::GravityError;
use gravity_utils::ethereum::format_eth_address;
use gravity_utils::types::*;
use tonic::transport::Channel;

Expand Down Expand Up @@ -109,7 +110,7 @@ pub async fn get_transaction_batch_signatures(
let request = client
.batch_tx_confirmations(BatchTxConfirmationsRequest {
batch_nonce: nonce,
token_contract: contract_address.to_string(),
token_contract: format_eth_address(contract_address),
})
.await?;
let batch_confirms = request.into_inner().signatures;
Expand Down
Loading