Deploy eclipse testnet (#3172)
### Description <!-- What's included in this PR? --> ### Drive-by changes <!-- Are there any minor or drive-by changes also included? --> ### Related issues <!-- - Fixes #[issue number here] --> ### Backward compatibility <!-- Are these changes backward compatible? Are there any infrastructure implications, e.g. changes that would prohibit deploying older commits using this infra tooling? Yes/No --> ### Testing <!-- What kind of testing have these changes undergone? None/Manual/Unit Tests --> --------- Co-authored-by: Trevor Porter <trkporter@ucdavis.edu>pull/3180/head
parent
5b4af6bf1d
commit
528a19022b
@ -1,2 +1,3 @@ |
|||||||
/target |
/target |
||||||
environments/**/deploy-logs.txt |
environments/**/deploy-logs.txt |
||||||
|
**/**/keys |
@ -0,0 +1,610 @@ |
|||||||
|
use serde::{Deserialize, Serialize}; |
||||||
|
use std::collections::HashMap; |
||||||
|
|
||||||
|
use crate::{ |
||||||
|
artifacts::{read_json, try_read_json, write_json, SingularProgramIdArtifact}, |
||||||
|
cmd_utils::{create_and_write_keypair, create_new_directory, deploy_program}, |
||||||
|
read_core_program_ids, |
||||||
|
router::ChainMetadata, |
||||||
|
Context, GasOverheadSubCmd, GetSetCmd, IgpCmd, IgpSubCmd, |
||||||
|
}; |
||||||
|
|
||||||
|
use std::{ |
||||||
|
fs::File, |
||||||
|
path::{Path, PathBuf}, |
||||||
|
str::FromStr, |
||||||
|
}; |
||||||
|
|
||||||
|
use solana_sdk::{ |
||||||
|
pubkey::Pubkey, |
||||||
|
signature::{Keypair, Signer as _}, |
||||||
|
}; |
||||||
|
|
||||||
|
use hyperlane_core::H256; |
||||||
|
|
||||||
|
use hyperlane_sealevel_igp::{ |
||||||
|
accounts::{ |
||||||
|
GasOracle, GasPaymentAccount, IgpAccount, InterchainGasPaymasterType, OverheadIgpAccount, |
||||||
|
ProgramDataAccount as IgpProgramDataAccount, RemoteGasData, |
||||||
|
}, |
||||||
|
igp_program_data_pda_seeds, |
||||||
|
instruction::{GasOracleConfig, GasOverheadConfig}, |
||||||
|
}; |
||||||
|
|
||||||
|
#[derive(Debug, Serialize, Deserialize, Default)] |
||||||
|
struct IgpAccountsArtifacts { |
||||||
|
salt: H256, |
||||||
|
#[serde(default)] |
||||||
|
#[serde(with = "crate::serde::serde_option_pubkey")] |
||||||
|
igp_account: Option<Pubkey>, |
||||||
|
#[serde(default)] |
||||||
|
#[serde(with = "crate::serde::serde_option_pubkey")] |
||||||
|
overhead_igp_account: Option<Pubkey>, |
||||||
|
} |
||||||
|
|
||||||
|
fn get_context_salt(context: Option<&String>) -> H256 { |
||||||
|
context |
||||||
|
.map(|c| { |
||||||
|
if c == "default" { |
||||||
|
H256::zero() |
||||||
|
} else { |
||||||
|
ethers::utils::keccak256(c.as_bytes()).into() |
||||||
|
} |
||||||
|
}) |
||||||
|
.unwrap_or_else(H256::zero) |
||||||
|
} |
||||||
|
|
||||||
|
fn get_context_dir_name(context: Option<&String>) -> &str { |
||||||
|
context.map(|c| c.as_str()).unwrap_or("default") |
||||||
|
} |
||||||
|
|
||||||
|
pub(crate) fn process_igp_cmd(mut ctx: Context, cmd: IgpCmd) { |
||||||
|
match cmd.cmd { |
||||||
|
IgpSubCmd::DeployProgram(deploy) => { |
||||||
|
let environments_dir = create_new_directory( |
||||||
|
&deploy.env_args.environments_dir, |
||||||
|
&deploy.env_args.environment, |
||||||
|
); |
||||||
|
let ism_dir = create_new_directory(&environments_dir, "igp"); |
||||||
|
let chain_dir = create_new_directory(&ism_dir, &deploy.chain); |
||||||
|
let key_dir = create_new_directory(&chain_dir, "keys"); |
||||||
|
|
||||||
|
let program_id = deploy_igp_program(&mut ctx, &deploy.built_so_dir, true, &key_dir); |
||||||
|
|
||||||
|
write_json::<SingularProgramIdArtifact>( |
||||||
|
&chain_dir.join("program-ids.json"), |
||||||
|
program_id.into(), |
||||||
|
); |
||||||
|
} |
||||||
|
IgpSubCmd::InitIgpAccount(init) => { |
||||||
|
let environments_dir = |
||||||
|
create_new_directory(&init.env_args.environments_dir, &init.env_args.environment); |
||||||
|
let ism_dir = create_new_directory(&environments_dir, "igp"); |
||||||
|
let chain_dir = create_new_directory(&ism_dir, &init.chain); |
||||||
|
let context_dir = |
||||||
|
create_new_directory(&chain_dir, get_context_dir_name(init.context.as_ref())); |
||||||
|
|
||||||
|
let artifacts_path = context_dir.join("igp-accounts.json"); |
||||||
|
|
||||||
|
let existing_artifacts = try_read_json::<IgpAccountsArtifacts>(&artifacts_path).ok(); |
||||||
|
|
||||||
|
let salt = get_context_salt(init.context.as_ref()); |
||||||
|
|
||||||
|
let chain_configs = |
||||||
|
read_json::<HashMap<String, ChainMetadata>>(&init.chain_config_file); |
||||||
|
|
||||||
|
let igp_account = init_and_configure_igp_account( |
||||||
|
&mut ctx, |
||||||
|
init.program_id, |
||||||
|
chain_configs.get(&init.chain).unwrap().domain_id(), |
||||||
|
salt, |
||||||
|
init.gas_oracle_config_file, |
||||||
|
); |
||||||
|
|
||||||
|
let artifacts = IgpAccountsArtifacts { |
||||||
|
salt, |
||||||
|
igp_account: Some(igp_account), |
||||||
|
overhead_igp_account: existing_artifacts.and_then(|a| a.overhead_igp_account), |
||||||
|
}; |
||||||
|
|
||||||
|
write_json(&artifacts_path, artifacts); |
||||||
|
} |
||||||
|
IgpSubCmd::InitOverheadIgpAccount(init) => { |
||||||
|
let environments_dir = |
||||||
|
create_new_directory(&init.env_args.environments_dir, &init.env_args.environment); |
||||||
|
let ism_dir = create_new_directory(&environments_dir, "igp"); |
||||||
|
let chain_dir = create_new_directory(&ism_dir, &init.chain); |
||||||
|
let context_dir = |
||||||
|
create_new_directory(&chain_dir, get_context_dir_name(init.context.as_ref())); |
||||||
|
|
||||||
|
let artifacts_path = context_dir.join("igp-accounts.json"); |
||||||
|
|
||||||
|
let existing_artifacts = try_read_json::<IgpAccountsArtifacts>(&artifacts_path).ok(); |
||||||
|
|
||||||
|
let salt = get_context_salt(init.context.as_ref()); |
||||||
|
|
||||||
|
let chain_configs = |
||||||
|
read_json::<HashMap<String, ChainMetadata>>(&init.chain_config_file); |
||||||
|
|
||||||
|
let overhead_igp_account = init_and_configure_overhead_igp_account( |
||||||
|
&mut ctx, |
||||||
|
init.program_id, |
||||||
|
init.inner_igp_account, |
||||||
|
chain_configs.get(&init.chain).unwrap().domain_id(), |
||||||
|
salt, |
||||||
|
init.overhead_config_file, |
||||||
|
); |
||||||
|
|
||||||
|
let artifacts = IgpAccountsArtifacts { |
||||||
|
salt, |
||||||
|
igp_account: existing_artifacts.and_then(|a| a.igp_account), |
||||||
|
overhead_igp_account: Some(overhead_igp_account), |
||||||
|
}; |
||||||
|
|
||||||
|
write_json(&artifacts_path, artifacts); |
||||||
|
} |
||||||
|
IgpSubCmd::Query(query) => { |
||||||
|
let (program_data_account_pda, _program_data_account_bump) = |
||||||
|
Pubkey::find_program_address(igp_program_data_pda_seeds!(), &query.program_id); |
||||||
|
|
||||||
|
let accounts = ctx |
||||||
|
.client |
||||||
|
.get_multiple_accounts_with_commitment( |
||||||
|
&[program_data_account_pda, query.igp_account], |
||||||
|
ctx.commitment, |
||||||
|
) |
||||||
|
.unwrap() |
||||||
|
.value; |
||||||
|
|
||||||
|
let igp_program_data = |
||||||
|
IgpProgramDataAccount::fetch(&mut &accounts[0].as_ref().unwrap().data[..]) |
||||||
|
.unwrap() |
||||||
|
.into_inner(); |
||||||
|
|
||||||
|
println!("IGP program data: {:?}", igp_program_data); |
||||||
|
|
||||||
|
let igp = IgpAccount::fetch(&mut &accounts[1].as_ref().unwrap().data[..]) |
||||||
|
.unwrap() |
||||||
|
.into_inner(); |
||||||
|
|
||||||
|
println!("IGP account: {:?}", igp); |
||||||
|
|
||||||
|
if let Some(gas_payment_account_pubkey) = query.gas_payment_account { |
||||||
|
let account = ctx |
||||||
|
.client |
||||||
|
.get_account_with_commitment(&gas_payment_account_pubkey, ctx.commitment) |
||||||
|
.unwrap() |
||||||
|
.value |
||||||
|
.unwrap(); |
||||||
|
let gas_payment_account = GasPaymentAccount::fetch(&mut &account.data[..]) |
||||||
|
.unwrap() |
||||||
|
.into_inner(); |
||||||
|
println!("Gas payment account: {:?}", gas_payment_account); |
||||||
|
} |
||||||
|
} |
||||||
|
IgpSubCmd::PayForGas(payment_details) => { |
||||||
|
let unique_gas_payment_keypair = Keypair::new(); |
||||||
|
let salt = H256::zero(); |
||||||
|
let (igp_account, _igp_account_bump) = Pubkey::find_program_address( |
||||||
|
hyperlane_sealevel_igp::igp_pda_seeds!(salt), |
||||||
|
&payment_details.program_id, |
||||||
|
); |
||||||
|
|
||||||
|
let (overhead_igp_account, _) = Pubkey::find_program_address( |
||||||
|
hyperlane_sealevel_igp::overhead_igp_pda_seeds!(salt), |
||||||
|
&payment_details.program_id, |
||||||
|
); |
||||||
|
let (ixn, gas_payment_data_account) = |
||||||
|
hyperlane_sealevel_igp::instruction::pay_for_gas_instruction( |
||||||
|
payment_details.program_id, |
||||||
|
ctx.payer_pubkey, |
||||||
|
igp_account, |
||||||
|
Some(overhead_igp_account), |
||||||
|
unique_gas_payment_keypair.pubkey(), |
||||||
|
H256::from_str(&payment_details.message_id).unwrap(), |
||||||
|
payment_details.destination_domain, |
||||||
|
payment_details.gas, |
||||||
|
) |
||||||
|
.unwrap(); |
||||||
|
|
||||||
|
ctx.new_txn() |
||||||
|
.add(ixn) |
||||||
|
.send(&[&*ctx.payer_signer(), &unique_gas_payment_keypair]); |
||||||
|
|
||||||
|
println!( |
||||||
|
"Made a payment for message {} with gas payment data account {}", |
||||||
|
payment_details.message_id, gas_payment_data_account |
||||||
|
); |
||||||
|
} |
||||||
|
IgpSubCmd::Claim(claim) => { |
||||||
|
let igp_account = ctx |
||||||
|
.client |
||||||
|
.get_account_with_commitment(&claim.igp_account, ctx.commitment) |
||||||
|
.unwrap() |
||||||
|
.value |
||||||
|
.unwrap(); |
||||||
|
let igp_account = IgpAccount::fetch(&mut &igp_account.data[..]) |
||||||
|
.unwrap() |
||||||
|
.into_inner(); |
||||||
|
|
||||||
|
let ixn = hyperlane_sealevel_igp::instruction::claim_instruction( |
||||||
|
claim.program_id, |
||||||
|
claim.igp_account, |
||||||
|
igp_account.beneficiary, |
||||||
|
) |
||||||
|
.unwrap(); |
||||||
|
|
||||||
|
ctx.new_txn() |
||||||
|
.add_with_description( |
||||||
|
ixn, |
||||||
|
format!( |
||||||
|
"Claiming from IGP account {} to beneficiary {}", |
||||||
|
claim.igp_account, igp_account.beneficiary |
||||||
|
), |
||||||
|
) |
||||||
|
.send_with_payer(); |
||||||
|
} |
||||||
|
IgpSubCmd::SetIgpBeneficiary(set_beneficiary) => { |
||||||
|
let igp_account = ctx |
||||||
|
.client |
||||||
|
.get_account_with_commitment(&set_beneficiary.igp_account, ctx.commitment) |
||||||
|
.unwrap() |
||||||
|
.value |
||||||
|
.unwrap(); |
||||||
|
let igp_account = IgpAccount::fetch(&mut &igp_account.data[..]) |
||||||
|
.unwrap() |
||||||
|
.into_inner(); |
||||||
|
|
||||||
|
let ixn = hyperlane_sealevel_igp::instruction::set_beneficiary_instruction( |
||||||
|
set_beneficiary.program_id, |
||||||
|
set_beneficiary.igp_account, |
||||||
|
igp_account.owner.unwrap(), |
||||||
|
set_beneficiary.new_beneficiary, |
||||||
|
) |
||||||
|
.unwrap(); |
||||||
|
|
||||||
|
ctx.new_txn() |
||||||
|
.add_with_description( |
||||||
|
ixn, |
||||||
|
format!( |
||||||
|
"Change beneficiary of IGP account {} to beneficiary {}", |
||||||
|
set_beneficiary.igp_account, set_beneficiary.new_beneficiary |
||||||
|
), |
||||||
|
) |
||||||
|
.send_with_payer(); |
||||||
|
} |
||||||
|
IgpSubCmd::GasOracleConfig(args) => { |
||||||
|
let core_program_ids = read_core_program_ids( |
||||||
|
&args.env_args.environments_dir, |
||||||
|
&args.env_args.environment, |
||||||
|
&args.chain_name, |
||||||
|
); |
||||||
|
match args.cmd { |
||||||
|
GetSetCmd::Set(set_args) => { |
||||||
|
let remote_gas_data = RemoteGasData { |
||||||
|
token_exchange_rate: set_args.token_exchange_rate, |
||||||
|
gas_price: set_args.gas_price, |
||||||
|
token_decimals: set_args.token_decimals, |
||||||
|
}; |
||||||
|
let gas_oracle_config = GasOracleConfig { |
||||||
|
domain: args.remote_domain, |
||||||
|
gas_oracle: Some(GasOracle::RemoteGasData(remote_gas_data)), |
||||||
|
}; |
||||||
|
let instruction = |
||||||
|
hyperlane_sealevel_igp::instruction::set_gas_oracle_configs_instruction( |
||||||
|
core_program_ids.igp_program_id, |
||||||
|
core_program_ids.igp_account, |
||||||
|
ctx.payer_pubkey, |
||||||
|
vec![gas_oracle_config], |
||||||
|
) |
||||||
|
.unwrap(); |
||||||
|
ctx.new_txn().add(instruction).send_with_payer(); |
||||||
|
println!("Set gas oracle for remote domain {:?}", args.remote_domain); |
||||||
|
} |
||||||
|
GetSetCmd::Get(_) => { |
||||||
|
let igp_account = ctx |
||||||
|
.client |
||||||
|
.get_account_with_commitment(&core_program_ids.igp_account, ctx.commitment) |
||||||
|
.unwrap() |
||||||
|
.value |
||||||
|
.expect( |
||||||
|
"IGP account not found. Make sure you are connected to the right RPC.", |
||||||
|
); |
||||||
|
|
||||||
|
let igp_account = IgpAccount::fetch(&mut &igp_account.data[..]) |
||||||
|
.unwrap() |
||||||
|
.into_inner(); |
||||||
|
|
||||||
|
println!( |
||||||
|
"IGP account gas oracle: {:#?}", |
||||||
|
igp_account.gas_oracles.get(&args.remote_domain) |
||||||
|
); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
IgpSubCmd::DestinationGasOverhead(args) => { |
||||||
|
let core_program_ids = read_core_program_ids( |
||||||
|
&args.env_args.environments_dir, |
||||||
|
&args.env_args.environment, |
||||||
|
&args.chain_name, |
||||||
|
); |
||||||
|
match args.cmd { |
||||||
|
GasOverheadSubCmd::Get => { |
||||||
|
// Read the gas overhead config
|
||||||
|
let overhead_igp_account = ctx |
||||||
|
.client |
||||||
|
.get_account_with_commitment( |
||||||
|
&core_program_ids.overhead_igp_account, |
||||||
|
ctx.commitment, |
||||||
|
) |
||||||
|
.unwrap() |
||||||
|
.value |
||||||
|
.expect("Overhead IGP account not found. Make sure you are connected to the right RPC."); |
||||||
|
let overhead_igp_account = |
||||||
|
OverheadIgpAccount::fetch(&mut &overhead_igp_account.data[..]) |
||||||
|
.unwrap() |
||||||
|
.into_inner(); |
||||||
|
println!( |
||||||
|
"Overhead IGP account gas oracle: {:#?}", |
||||||
|
overhead_igp_account.gas_overheads.get(&args.remote_domain) |
||||||
|
); |
||||||
|
} |
||||||
|
GasOverheadSubCmd::Set(set_args) => { |
||||||
|
let overhead_config = GasOverheadConfig { |
||||||
|
destination_domain: args.remote_domain, |
||||||
|
gas_overhead: Some(set_args.gas_overhead), |
||||||
|
}; |
||||||
|
// Set the gas overhead config
|
||||||
|
let instruction = |
||||||
|
hyperlane_sealevel_igp::instruction::set_destination_gas_overheads( |
||||||
|
core_program_ids.igp_program_id, |
||||||
|
core_program_ids.overhead_igp_account, |
||||||
|
ctx.payer_pubkey, |
||||||
|
vec![overhead_config], |
||||||
|
) |
||||||
|
.unwrap(); |
||||||
|
ctx.new_txn().add(instruction).send_with_payer(); |
||||||
|
println!( |
||||||
|
"Set gas overheads for remote domain {:?}", |
||||||
|
args.remote_domain |
||||||
|
) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
IgpSubCmd::TransferIgpOwnership(ref transfer_ownership) |
||||||
|
| IgpSubCmd::TransferOverheadIgpOwnership(ref transfer_ownership) => { |
||||||
|
let igp_account_type = match cmd.cmd { |
||||||
|
IgpSubCmd::TransferIgpOwnership(_) => { |
||||||
|
InterchainGasPaymasterType::Igp(transfer_ownership.igp_account) |
||||||
|
} |
||||||
|
IgpSubCmd::TransferOverheadIgpOwnership(_) => { |
||||||
|
InterchainGasPaymasterType::OverheadIgp(transfer_ownership.igp_account) |
||||||
|
} |
||||||
|
_ => unreachable!(), |
||||||
|
}; |
||||||
|
let instruction = |
||||||
|
hyperlane_sealevel_igp::instruction::transfer_igp_account_ownership_instruction( |
||||||
|
transfer_ownership.program_id, |
||||||
|
igp_account_type.clone(), |
||||||
|
ctx.payer_pubkey, |
||||||
|
Some(transfer_ownership.new_owner), |
||||||
|
) |
||||||
|
.unwrap(); |
||||||
|
ctx.new_txn() |
||||||
|
.add_with_description( |
||||||
|
instruction, |
||||||
|
format!( |
||||||
|
"Transfer ownership of {:?} to {}", |
||||||
|
igp_account_type, transfer_ownership.new_owner |
||||||
|
), |
||||||
|
) |
||||||
|
.send_with_payer(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
#[allow(clippy::too_many_arguments)] |
||||||
|
fn deploy_igp_program( |
||||||
|
ctx: &mut Context, |
||||||
|
built_so_dir: &Path, |
||||||
|
use_existing_keys: bool, |
||||||
|
key_dir: &Path, |
||||||
|
) -> Pubkey { |
||||||
|
let (keypair, keypair_path) = create_and_write_keypair( |
||||||
|
key_dir, |
||||||
|
"hyperlane_sealevel_igp-keypair.json", |
||||||
|
use_existing_keys, |
||||||
|
); |
||||||
|
let program_id = keypair.pubkey(); |
||||||
|
|
||||||
|
deploy_program( |
||||||
|
ctx.payer_keypair_path(), |
||||||
|
keypair_path.to_str().unwrap(), |
||||||
|
built_so_dir |
||||||
|
.join("hyperlane_sealevel_igp.so") |
||||||
|
.to_str() |
||||||
|
.unwrap(), |
||||||
|
&ctx.client.url(), |
||||||
|
); |
||||||
|
|
||||||
|
println!("Deployed IGP at program ID {}", program_id); |
||||||
|
|
||||||
|
let (program_data_account, _program_data_bump) = Pubkey::find_program_address( |
||||||
|
hyperlane_sealevel_igp::igp_program_data_pda_seeds!(), |
||||||
|
&program_id, |
||||||
|
); |
||||||
|
|
||||||
|
// Initialize the program data
|
||||||
|
let instruction = |
||||||
|
hyperlane_sealevel_igp::instruction::init_instruction(program_id, ctx.payer_pubkey) |
||||||
|
.unwrap(); |
||||||
|
|
||||||
|
ctx.new_txn() |
||||||
|
.add_with_description( |
||||||
|
instruction, |
||||||
|
format!("Initializing IGP program data {}", program_data_account), |
||||||
|
) |
||||||
|
.send_with_payer(); |
||||||
|
|
||||||
|
program_id |
||||||
|
} |
||||||
|
|
||||||
|
fn init_and_configure_igp_account( |
||||||
|
ctx: &mut Context, |
||||||
|
program_id: Pubkey, |
||||||
|
local_domain: u32, |
||||||
|
salt: H256, |
||||||
|
gas_oracle_config_file: Option<PathBuf>, |
||||||
|
) -> Pubkey { |
||||||
|
let gas_oracle_configs = gas_oracle_config_file |
||||||
|
.as_deref() |
||||||
|
.map(|p| { |
||||||
|
let file = File::open(p).expect("Failed to open oracle config file"); |
||||||
|
serde_json::from_reader::<_, Vec<GasOracleConfig>>(file) |
||||||
|
.expect("Failed to parse oracle config file") |
||||||
|
}) |
||||||
|
.unwrap_or_default() |
||||||
|
.into_iter() |
||||||
|
.filter(|c| c.domain != local_domain) |
||||||
|
.collect::<Vec<_>>(); |
||||||
|
|
||||||
|
// Initialize IGP with the given salt
|
||||||
|
let (igp_account_pda, _igp_account_bump) = |
||||||
|
Pubkey::find_program_address(hyperlane_sealevel_igp::igp_pda_seeds!(salt), &program_id); |
||||||
|
|
||||||
|
if ctx |
||||||
|
.client |
||||||
|
.get_account_with_commitment(&igp_account_pda, ctx.commitment) |
||||||
|
.unwrap() |
||||||
|
.value |
||||||
|
.is_none() |
||||||
|
{ |
||||||
|
let instruction = hyperlane_sealevel_igp::instruction::init_igp_instruction( |
||||||
|
program_id, |
||||||
|
ctx.payer_pubkey, |
||||||
|
salt, |
||||||
|
Some(ctx.payer_pubkey), |
||||||
|
ctx.payer_pubkey, |
||||||
|
) |
||||||
|
.unwrap(); |
||||||
|
|
||||||
|
ctx.new_txn() |
||||||
|
.add_with_description( |
||||||
|
instruction, |
||||||
|
format!("Initializing IGP account {}", igp_account_pda), |
||||||
|
) |
||||||
|
.send_with_payer(); |
||||||
|
} else { |
||||||
|
println!( |
||||||
|
"IGP account {} already exists, not creating", |
||||||
|
igp_account_pda |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
if !gas_oracle_configs.is_empty() { |
||||||
|
// TODO: idempotency
|
||||||
|
|
||||||
|
let domains = gas_oracle_configs |
||||||
|
.iter() |
||||||
|
.map(|c| c.domain) |
||||||
|
.collect::<Vec<_>>(); |
||||||
|
let instruction = hyperlane_sealevel_igp::instruction::set_gas_oracle_configs_instruction( |
||||||
|
program_id, |
||||||
|
igp_account_pda, |
||||||
|
ctx.payer_pubkey, |
||||||
|
gas_oracle_configs, |
||||||
|
) |
||||||
|
.unwrap(); |
||||||
|
|
||||||
|
ctx.new_txn().add(instruction).send_with_payer(); |
||||||
|
|
||||||
|
println!("Set gas oracle for remote domains {domains:?}",); |
||||||
|
} else { |
||||||
|
println!("Skipping settings gas oracle config"); |
||||||
|
} |
||||||
|
|
||||||
|
igp_account_pda |
||||||
|
} |
||||||
|
|
||||||
|
fn init_and_configure_overhead_igp_account( |
||||||
|
ctx: &mut Context, |
||||||
|
program_id: Pubkey, |
||||||
|
inner_igp_account: Pubkey, |
||||||
|
local_domain: u32, |
||||||
|
salt: H256, |
||||||
|
overhead_config_file: Option<PathBuf>, |
||||||
|
) -> Pubkey { |
||||||
|
let overhead_configs = overhead_config_file |
||||||
|
.as_deref() |
||||||
|
.map(|p| { |
||||||
|
let file = File::open(p).expect("Failed to open overhead config file"); |
||||||
|
serde_json::from_reader::<_, Vec<GasOverheadConfig>>(file) |
||||||
|
.expect("Failed to parse overhead config file") |
||||||
|
}) |
||||||
|
.unwrap_or_default() |
||||||
|
.into_iter() |
||||||
|
.filter(|c| c.destination_domain != local_domain) |
||||||
|
.map(|c| (c.destination_domain, c)) |
||||||
|
.collect::<HashMap<_, _>>() // dedup
|
||||||
|
.into_values() |
||||||
|
.collect::<Vec<_>>(); |
||||||
|
|
||||||
|
let (overhead_igp_account, _) = Pubkey::find_program_address( |
||||||
|
hyperlane_sealevel_igp::overhead_igp_pda_seeds!(salt), |
||||||
|
&program_id, |
||||||
|
); |
||||||
|
|
||||||
|
if ctx |
||||||
|
.client |
||||||
|
.get_account_with_commitment(&overhead_igp_account, ctx.commitment) |
||||||
|
.unwrap() |
||||||
|
.value |
||||||
|
.is_none() |
||||||
|
{ |
||||||
|
let instruction = hyperlane_sealevel_igp::instruction::init_overhead_igp_instruction( |
||||||
|
program_id, |
||||||
|
ctx.payer_pubkey, |
||||||
|
salt, |
||||||
|
Some(ctx.payer_pubkey), |
||||||
|
inner_igp_account, |
||||||
|
) |
||||||
|
.unwrap(); |
||||||
|
|
||||||
|
ctx.new_txn() |
||||||
|
.add_with_description( |
||||||
|
instruction, |
||||||
|
format!("Initializing overhead IGP account {}", overhead_igp_account), |
||||||
|
) |
||||||
|
.send_with_payer(); |
||||||
|
} else { |
||||||
|
println!( |
||||||
|
"Overhead IGP account {} already exists, not creating", |
||||||
|
overhead_igp_account |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
if !overhead_configs.is_empty() { |
||||||
|
// TODO: idempotency
|
||||||
|
|
||||||
|
let domains = overhead_configs |
||||||
|
.iter() |
||||||
|
.map(|c| c.destination_domain) |
||||||
|
.collect::<Vec<_>>(); |
||||||
|
|
||||||
|
let instruction = hyperlane_sealevel_igp::instruction::set_destination_gas_overheads( |
||||||
|
program_id, |
||||||
|
overhead_igp_account, |
||||||
|
ctx.payer_pubkey, |
||||||
|
overhead_configs, |
||||||
|
) |
||||||
|
.unwrap(); |
||||||
|
|
||||||
|
ctx.new_txn().add(instruction).send_with_payer(); |
||||||
|
|
||||||
|
println!("Set gas overheads for remote domains {domains:?}",) |
||||||
|
} else { |
||||||
|
println!("Skipping setting gas overheads"); |
||||||
|
} |
||||||
|
|
||||||
|
overhead_igp_account |
||||||
|
} |
@ -0,0 +1,465 @@ |
|||||||
|
{ |
||||||
|
"alfajores": { |
||||||
|
"blockExplorers": [ |
||||||
|
{ |
||||||
|
"apiUrl": "https://api-alfajores.celoscan.io/api", |
||||||
|
"family": "etherscan", |
||||||
|
"name": "CeloScan", |
||||||
|
"url": "https://alfajores.celoscan.io" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"apiUrl": "https://explorer.celo.org/alfajores/api", |
||||||
|
"family": "blockscout", |
||||||
|
"name": "Blockscout", |
||||||
|
"url": "https://explorer.celo.org/alfajores" |
||||||
|
} |
||||||
|
], |
||||||
|
"blocks": { |
||||||
|
"confirmations": 1, |
||||||
|
"estimateBlockTime": 5, |
||||||
|
"reorgPeriod": 0 |
||||||
|
}, |
||||||
|
"chainId": 44787, |
||||||
|
"displayName": "Alfajores", |
||||||
|
"domainId": 44787, |
||||||
|
"isTestnet": true, |
||||||
|
"name": "alfajores", |
||||||
|
"nativeToken": { |
||||||
|
"decimals": 18, |
||||||
|
"name": "CELO", |
||||||
|
"symbol": "CELO" |
||||||
|
}, |
||||||
|
"protocol": "ethereum", |
||||||
|
"rpcUrls": [ |
||||||
|
{ |
||||||
|
"http": "https://alfajores-forno.celo-testnet.org" |
||||||
|
} |
||||||
|
] |
||||||
|
}, |
||||||
|
"basegoerli": { |
||||||
|
"blockExplorers": [ |
||||||
|
{ |
||||||
|
"apiUrl": "https://api-goerli.basescan.org/api", |
||||||
|
"family": "etherscan", |
||||||
|
"name": "BaseScan", |
||||||
|
"url": "https://goerli.basescan.org" |
||||||
|
} |
||||||
|
], |
||||||
|
"blocks": { |
||||||
|
"confirmations": 1, |
||||||
|
"estimateBlockTime": 3, |
||||||
|
"reorgPeriod": 1 |
||||||
|
}, |
||||||
|
"chainId": 84531, |
||||||
|
"displayName": "Base Goerli", |
||||||
|
"domainId": 84531, |
||||||
|
"isTestnet": true, |
||||||
|
"name": "basegoerli", |
||||||
|
"nativeToken": { |
||||||
|
"decimals": 18, |
||||||
|
"name": "Ether", |
||||||
|
"symbol": "ETH" |
||||||
|
}, |
||||||
|
"protocol": "ethereum", |
||||||
|
"rpcUrls": [ |
||||||
|
{ |
||||||
|
"http": "https://base-goerli.publicnode.com" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"http": "https://goerli.base.org" |
||||||
|
} |
||||||
|
] |
||||||
|
}, |
||||||
|
"fuji": { |
||||||
|
"blockExplorers": [ |
||||||
|
{ |
||||||
|
"apiUrl": "https://api-testnet.snowtrace.io/api", |
||||||
|
"family": "etherscan", |
||||||
|
"name": "SnowTrace", |
||||||
|
"url": "https://testnet.snowtrace.io" |
||||||
|
} |
||||||
|
], |
||||||
|
"blocks": { |
||||||
|
"confirmations": 3, |
||||||
|
"estimateBlockTime": 2, |
||||||
|
"reorgPeriod": 3 |
||||||
|
}, |
||||||
|
"chainId": 43113, |
||||||
|
"displayName": "Fuji", |
||||||
|
"domainId": 43113, |
||||||
|
"isTestnet": true, |
||||||
|
"name": "fuji", |
||||||
|
"nativeToken": { |
||||||
|
"decimals": 18, |
||||||
|
"name": "Avalanche", |
||||||
|
"symbol": "AVAX" |
||||||
|
}, |
||||||
|
"protocol": "ethereum", |
||||||
|
"rpcUrls": [ |
||||||
|
{ |
||||||
|
"http": "https://api.avax-test.network/ext/bc/C/rpc", |
||||||
|
"pagination": { |
||||||
|
"maxBlockRange": 2048 |
||||||
|
} |
||||||
|
} |
||||||
|
] |
||||||
|
}, |
||||||
|
"mumbai": { |
||||||
|
"blockExplorers": [ |
||||||
|
{ |
||||||
|
"apiUrl": "https://api-testnet.polygonscan.com/api", |
||||||
|
"family": "etherscan", |
||||||
|
"name": "PolygonScan", |
||||||
|
"url": "https://mumbai.polygonscan.com" |
||||||
|
} |
||||||
|
], |
||||||
|
"blocks": { |
||||||
|
"confirmations": 3, |
||||||
|
"estimateBlockTime": 5, |
||||||
|
"reorgPeriod": 32 |
||||||
|
}, |
||||||
|
"chainId": 80001, |
||||||
|
"displayName": "Mumbai", |
||||||
|
"domainId": 80001, |
||||||
|
"isTestnet": true, |
||||||
|
"name": "mumbai", |
||||||
|
"nativeToken": { |
||||||
|
"decimals": 18, |
||||||
|
"name": "MATIC", |
||||||
|
"symbol": "MATIC" |
||||||
|
}, |
||||||
|
"protocol": "ethereum", |
||||||
|
"rpcUrls": [ |
||||||
|
{ |
||||||
|
"http": "https://rpc.ankr.com/polygon_mumbai", |
||||||
|
"pagination": { |
||||||
|
"maxBlockRange": 10000, |
||||||
|
"minBlockNumber": 22900000 |
||||||
|
} |
||||||
|
} |
||||||
|
], |
||||||
|
"transactionOverrides": { |
||||||
|
"maxFeePerGas": 150000000000, |
||||||
|
"maxPriorityFeePerGas": 40000000000 |
||||||
|
} |
||||||
|
}, |
||||||
|
"bsctestnet": { |
||||||
|
"blockExplorers": [ |
||||||
|
{ |
||||||
|
"apiUrl": "https://api-testnet.bscscan.com/api", |
||||||
|
"family": "etherscan", |
||||||
|
"name": "BscScan", |
||||||
|
"url": "https://testnet.bscscan.com" |
||||||
|
} |
||||||
|
], |
||||||
|
"blocks": { |
||||||
|
"confirmations": 1, |
||||||
|
"estimateBlockTime": 3, |
||||||
|
"reorgPeriod": 9 |
||||||
|
}, |
||||||
|
"chainId": 97, |
||||||
|
"displayName": "BSC Testnet", |
||||||
|
"domainId": 97, |
||||||
|
"isTestnet": true, |
||||||
|
"name": "bsctestnet", |
||||||
|
"nativeToken": { |
||||||
|
"decimals": 18, |
||||||
|
"name": "BNB", |
||||||
|
"symbol": "BNB" |
||||||
|
}, |
||||||
|
"protocol": "ethereum", |
||||||
|
"rpcUrls": [ |
||||||
|
{ |
||||||
|
"http": "https://bsc-testnet.publicnode.com" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"http": "https://bsc-testnet.blockpi.network/v1/rpc/public" |
||||||
|
} |
||||||
|
], |
||||||
|
"transactionOverrides": { |
||||||
|
"gasPrice": 80000000000 |
||||||
|
} |
||||||
|
}, |
||||||
|
"goerli": { |
||||||
|
"blockExplorers": [ |
||||||
|
{ |
||||||
|
"apiUrl": "https://api-goerli.etherscan.io/api", |
||||||
|
"family": "etherscan", |
||||||
|
"name": "Etherscan", |
||||||
|
"url": "https://goerli.etherscan.io" |
||||||
|
} |
||||||
|
], |
||||||
|
"blocks": { |
||||||
|
"confirmations": 1, |
||||||
|
"estimateBlockTime": 13, |
||||||
|
"reorgPeriod": 2 |
||||||
|
}, |
||||||
|
"chainId": 5, |
||||||
|
"displayName": "Goerli", |
||||||
|
"domainId": 5, |
||||||
|
"isTestnet": true, |
||||||
|
"name": "goerli", |
||||||
|
"nativeToken": { |
||||||
|
"decimals": 18, |
||||||
|
"name": "Ether", |
||||||
|
"symbol": "ETH" |
||||||
|
}, |
||||||
|
"protocol": "ethereum", |
||||||
|
"rpcUrls": [ |
||||||
|
{ |
||||||
|
"http": "https://goerli.infura.io/v3/9aa3d95b3bc440fa88ea12eaa4456161" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"http": "https://rpc.ankr.com/eth_goerli" |
||||||
|
} |
||||||
|
] |
||||||
|
}, |
||||||
|
"scrollsepolia": { |
||||||
|
"blockExplorers": [ |
||||||
|
{ |
||||||
|
"apiUrl": "https://api-sepolia.scrollscan.com/api", |
||||||
|
"family": "etherscan", |
||||||
|
"name": "Scroll Explorer", |
||||||
|
"url": "https://sepolia.scrollscan.dev/" |
||||||
|
} |
||||||
|
], |
||||||
|
"blocks": { |
||||||
|
"confirmations": 1, |
||||||
|
"estimateBlockTime": 3, |
||||||
|
"reorgPeriod": 1 |
||||||
|
}, |
||||||
|
"chainId": 534351, |
||||||
|
"displayName": "Scroll Sepolia", |
||||||
|
"domainId": 534351, |
||||||
|
"isTestnet": true, |
||||||
|
"name": "scrollsepolia", |
||||||
|
"nativeToken": { |
||||||
|
"decimals": 18, |
||||||
|
"name": "Ether", |
||||||
|
"symbol": "ETH" |
||||||
|
}, |
||||||
|
"protocol": "ethereum", |
||||||
|
"rpcUrls": [ |
||||||
|
{ |
||||||
|
"http": "https://sepolia-rpc.scroll.io" |
||||||
|
} |
||||||
|
] |
||||||
|
}, |
||||||
|
"sepolia": { |
||||||
|
"blockExplorers": [ |
||||||
|
{ |
||||||
|
"apiUrl": "https://api-sepolia.etherscan.io/api", |
||||||
|
"family": "etherscan", |
||||||
|
"name": "Etherscan", |
||||||
|
"url": "https://sepolia.etherscan.io" |
||||||
|
} |
||||||
|
], |
||||||
|
"blocks": { |
||||||
|
"confirmations": 1, |
||||||
|
"estimateBlockTime": 13, |
||||||
|
"reorgPeriod": 2 |
||||||
|
}, |
||||||
|
"chainId": 11155111, |
||||||
|
"displayName": "Sepolia", |
||||||
|
"domainId": 11155111, |
||||||
|
"isTestnet": true, |
||||||
|
"name": "sepolia", |
||||||
|
"nativeToken": { |
||||||
|
"decimals": 18, |
||||||
|
"name": "Ether", |
||||||
|
"symbol": "ETH" |
||||||
|
}, |
||||||
|
"protocol": "ethereum", |
||||||
|
"rpcUrls": [ |
||||||
|
{ |
||||||
|
"http": "https://ethereum-sepolia.blockpi.network/v1/rpc/public" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"http": "https://rpc.sepolia.org" |
||||||
|
} |
||||||
|
] |
||||||
|
}, |
||||||
|
"moonbasealpha": { |
||||||
|
"blockExplorers": [ |
||||||
|
{ |
||||||
|
"apiUrl": "https://api-moonbase.moonscan.io/api", |
||||||
|
"family": "etherscan", |
||||||
|
"name": "MoonScan", |
||||||
|
"url": "https://moonbase.moonscan.io" |
||||||
|
} |
||||||
|
], |
||||||
|
"blocks": { |
||||||
|
"confirmations": 1, |
||||||
|
"estimateBlockTime": 12, |
||||||
|
"reorgPeriod": 1 |
||||||
|
}, |
||||||
|
"chainId": 1287, |
||||||
|
"displayName": "Moonbase Alpha", |
||||||
|
"displayNameShort": "Moonbase", |
||||||
|
"domainId": 1287, |
||||||
|
"isTestnet": true, |
||||||
|
"name": "moonbasealpha", |
||||||
|
"nativeToken": { |
||||||
|
"decimals": 18, |
||||||
|
"name": "DEV", |
||||||
|
"symbol": "DEV" |
||||||
|
}, |
||||||
|
"protocol": "ethereum", |
||||||
|
"rpcUrls": [ |
||||||
|
{ |
||||||
|
"http": "https://rpc.api.moonbase.moonbeam.network" |
||||||
|
} |
||||||
|
] |
||||||
|
}, |
||||||
|
"optimismgoerli": { |
||||||
|
"blockExplorers": [ |
||||||
|
{ |
||||||
|
"apiUrl": "https://api-goerli-optimism.etherscan.io/api", |
||||||
|
"family": "etherscan", |
||||||
|
"name": "Etherscan", |
||||||
|
"url": "https://goerli-optimism.etherscan.io" |
||||||
|
} |
||||||
|
], |
||||||
|
"blocks": { |
||||||
|
"confirmations": 1, |
||||||
|
"estimateBlockTime": 3, |
||||||
|
"reorgPeriod": 1 |
||||||
|
}, |
||||||
|
"chainId": 420, |
||||||
|
"displayName": "Optimism Goerli", |
||||||
|
"displayNameShort": "Opt. Goerli", |
||||||
|
"domainId": 420, |
||||||
|
"isTestnet": true, |
||||||
|
"name": "optimismgoerli", |
||||||
|
"nativeToken": { |
||||||
|
"decimals": 18, |
||||||
|
"name": "Ether", |
||||||
|
"symbol": "ETH" |
||||||
|
}, |
||||||
|
"protocol": "ethereum", |
||||||
|
"rpcUrls": [ |
||||||
|
{ |
||||||
|
"http": "https://goerli.optimism.io" |
||||||
|
} |
||||||
|
] |
||||||
|
}, |
||||||
|
"arbitrumgoerli": { |
||||||
|
"blocks": { |
||||||
|
"confirmations": 1, |
||||||
|
"estimateBlockTime": 3, |
||||||
|
"reorgPeriod": 1 |
||||||
|
}, |
||||||
|
"chainId": 421613, |
||||||
|
"displayName": "Arbitrum Goerli", |
||||||
|
"displayNameShort": "Arb. Goerli", |
||||||
|
"domainId": 421613, |
||||||
|
"isTestnet": true, |
||||||
|
"name": "arbitrumgoerli", |
||||||
|
"nativeToken": { |
||||||
|
"decimals": 18, |
||||||
|
"name": "Ether", |
||||||
|
"symbol": "ETH" |
||||||
|
}, |
||||||
|
"protocol": "ethereum", |
||||||
|
"rpcUrls": [ |
||||||
|
{ |
||||||
|
"http": "https://goerli-rollup.arbitrum.io/rpc" |
||||||
|
} |
||||||
|
] |
||||||
|
}, |
||||||
|
"polygonzkevmtestnet": { |
||||||
|
"blockExplorers": [ |
||||||
|
{ |
||||||
|
"apiUrl": "https://api-testnet-zkevm.polygonscan.com/api", |
||||||
|
"family": "etherscan", |
||||||
|
"name": "PolygonScan", |
||||||
|
"url": "https://testnet-zkevm.polygonscan.com" |
||||||
|
} |
||||||
|
], |
||||||
|
"blocks": { |
||||||
|
"confirmations": 1, |
||||||
|
"estimateBlockTime": 3, |
||||||
|
"reorgPeriod": 1 |
||||||
|
}, |
||||||
|
"chainId": 1442, |
||||||
|
"displayName": "Polygon zkEVM Testnet", |
||||||
|
"displayNameShort": "ZkEvm Testnet", |
||||||
|
"domainId": 1442, |
||||||
|
"isTestnet": true, |
||||||
|
"name": "polygonzkevmtestnet", |
||||||
|
"nativeToken": { |
||||||
|
"decimals": 18, |
||||||
|
"name": "Ether", |
||||||
|
"symbol": "ETH" |
||||||
|
}, |
||||||
|
"protocol": "ethereum", |
||||||
|
"rpcUrls": [ |
||||||
|
{ |
||||||
|
"http": "https://rpc.public.zkevm-test.net" |
||||||
|
} |
||||||
|
] |
||||||
|
}, |
||||||
|
"solanatestnet": { |
||||||
|
"blockExplorers": [ |
||||||
|
{ |
||||||
|
"apiUrl": "https://explorer.solana.com", |
||||||
|
"family": "other", |
||||||
|
"name": "Solana Explorer", |
||||||
|
"url": "https://explorer.solana.com" |
||||||
|
} |
||||||
|
], |
||||||
|
"blocks": { |
||||||
|
"confirmations": 1, |
||||||
|
"estimateBlockTime": 0.4, |
||||||
|
"reorgPeriod": 0 |
||||||
|
}, |
||||||
|
"chainId": 1399811150, |
||||||
|
"displayName": "Solana Testnet", |
||||||
|
"displayNameShort": "Sol Testnet", |
||||||
|
"domainId": 1399811150, |
||||||
|
"isTestnet": true, |
||||||
|
"name": "solanatestnet", |
||||||
|
"nativeToken": { |
||||||
|
"decimals": 9, |
||||||
|
"name": "Sol", |
||||||
|
"symbol": "SOL" |
||||||
|
}, |
||||||
|
"protocol": "sealevel", |
||||||
|
"rpcUrls": [ |
||||||
|
{ |
||||||
|
"http": "https://api.testnet.solana.com" |
||||||
|
} |
||||||
|
] |
||||||
|
}, |
||||||
|
"eclipsetestnet": { |
||||||
|
"blockExplorers": [ |
||||||
|
{ |
||||||
|
"apiUrl": "https://testnet.dev2.eclipsenetwork.xyz", |
||||||
|
"family": "other", |
||||||
|
"name": "Eclipse Testnet Explorer", |
||||||
|
"url": "https://explorer.dev.eclipsenetwork.xyz/?cluster=testnet" |
||||||
|
} |
||||||
|
], |
||||||
|
"blocks": { |
||||||
|
"confirmations": 1, |
||||||
|
"estimateBlockTime": 0.4, |
||||||
|
"reorgPeriod": 0 |
||||||
|
}, |
||||||
|
"chainId": 239092742, |
||||||
|
"displayName": "Eclipse Testnet", |
||||||
|
"domainId": 239092742, |
||||||
|
"isTestnet": true, |
||||||
|
"name": "eclipsetestnet", |
||||||
|
"nativeToken": { |
||||||
|
"decimals": 9, |
||||||
|
"name": "Ether", |
||||||
|
"symbol": "ETH" |
||||||
|
}, |
||||||
|
"protocol": "sealevel", |
||||||
|
"rpcUrls": [ |
||||||
|
{ |
||||||
|
"http": "https://testnet.dev2.eclipsenetwork.xyz" |
||||||
|
} |
||||||
|
] |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,8 @@ |
|||||||
|
{ |
||||||
|
"mailbox": "75HBBLae3ddeneJVrZeyrDfv6vb7SMC3aCpBucSXS5aR", |
||||||
|
"validator_announce": "8qNYSi9EP1xSnRjtMpyof88A26GBbdcrsa61uSaHiwx3", |
||||||
|
"multisig_ism_message_id": "4GHxwWyKB9exhKG4fdyU2hfLgfFzhHp2WcsSKc2uNR1k", |
||||||
|
"igp_program_id": "5p7Hii6CJL4xGBYYTGEQmH9LnUSZteFJUu9AVLDExZX2", |
||||||
|
"overhead_igp_account": "hBHAApi5ZoeCYHqDdCKkCzVKmBdwywdT3hMqe327eZB", |
||||||
|
"igp_account": "9SQVtTNsbipdMzumhzi6X8GwojiSMwBfqAhS7FgyTcqy" |
||||||
|
} |
@ -0,0 +1,29 @@ |
|||||||
|
[ |
||||||
|
{ |
||||||
|
"domain": 11155111, |
||||||
|
"gasOracle": { |
||||||
|
"type": "remoteGasData", |
||||||
|
"tokenExchangeRate": "10000000000000000000", |
||||||
|
"gasPrice": "15000000000", |
||||||
|
"tokenDecimals": 18 |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
"domain": 1399811150, |
||||||
|
"gasOracle": { |
||||||
|
"type": "remoteGasData", |
||||||
|
"tokenExchangeRate": "10000000000000000000", |
||||||
|
"gasPrice": "28", |
||||||
|
"tokenDecimals": 9 |
||||||
|
} |
||||||
|
}, |
||||||
|
{ |
||||||
|
"domain": 239092742, |
||||||
|
"gasOracle": { |
||||||
|
"type": "remoteGasData", |
||||||
|
"tokenExchangeRate": "10000000000000000000", |
||||||
|
"gasPrice": "28", |
||||||
|
"tokenDecimals": 9 |
||||||
|
} |
||||||
|
} |
||||||
|
] |
@ -0,0 +1,5 @@ |
|||||||
|
{ |
||||||
|
"salt": "0x0000000000000000000000000000000000000000000000000000000000000000", |
||||||
|
"igp_account": "9SQVtTNsbipdMzumhzi6X8GwojiSMwBfqAhS7FgyTcqy", |
||||||
|
"overhead_igp_account": "hBHAApi5ZoeCYHqDdCKkCzVKmBdwywdT3hMqe327eZB" |
||||||
|
} |
@ -0,0 +1,5 @@ |
|||||||
|
{ |
||||||
|
"salt": "0x0000000000000000000000000000000000000000000000000000000000000000", |
||||||
|
"igp_account": "9SQVtTNsbipdMzumhzi6X8GwojiSMwBfqAhS7FgyTcqy", |
||||||
|
"overhead_igp_account": "hBHAApi5ZoeCYHqDdCKkCzVKmBdwywdT3hMqe327eZB" |
||||||
|
} |
@ -0,0 +1,117 @@ |
|||||||
|
{ |
||||||
|
"alfajores": { |
||||||
|
"threshold": 2, |
||||||
|
"validators": [ |
||||||
|
"0x2233a5ce12f814bd64c9cdd73410bb8693124d40", |
||||||
|
"0xba279f965489d90f90490e3c49e860e0b43c2ae6", |
||||||
|
"0x86485dcec5f7bb8478dd251676372d054dea6653" |
||||||
|
], |
||||||
|
"type": 3 |
||||||
|
}, |
||||||
|
"arbitrumgoerli": { |
||||||
|
"threshold": 2, |
||||||
|
"validators": [ |
||||||
|
"0x071c8d135845ae5a2cb73f98d681d519014c0a8b", |
||||||
|
"0x1bcf03360989f15cbeb174c188288f2c6d2760d7", |
||||||
|
"0xc1590eaaeaf380e7859564c5ebcdcc87e8369e0d" |
||||||
|
], |
||||||
|
"type": 3 |
||||||
|
}, |
||||||
|
"basegoerli": { |
||||||
|
"threshold": 2, |
||||||
|
"validators": [ |
||||||
|
"0xf6eddda696dcd3bf10f7ce8a02db31ef2e775a03", |
||||||
|
"0x5a7d05cebf5db4dde9b2fedcefa76fb58fa05071", |
||||||
|
"0x9260a6c7d54cbcbed28f8668679cd1fa3a203b25" |
||||||
|
], |
||||||
|
"type": 3 |
||||||
|
}, |
||||||
|
"bsctestnet": { |
||||||
|
"threshold": 2, |
||||||
|
"validators": [ |
||||||
|
"0x242d8a855a8c932dec51f7999ae7d1e48b10c95e", |
||||||
|
"0xf620f5e3d25a3ae848fec74bccae5de3edcd8796", |
||||||
|
"0x1f030345963c54ff8229720dd3a711c15c554aeb" |
||||||
|
], |
||||||
|
"type": 3 |
||||||
|
}, |
||||||
|
"fuji": { |
||||||
|
"threshold": 2, |
||||||
|
"validators": [ |
||||||
|
"0xd8154f73d04cc7f7f0c332793692e6e6f6b2402e", |
||||||
|
"0x895ae30bc83ff1493b9cf7781b0b813d23659857", |
||||||
|
"0x43e915573d9f1383cbf482049e4a012290759e7f" |
||||||
|
], |
||||||
|
"type": 3 |
||||||
|
}, |
||||||
|
"goerli": { |
||||||
|
"threshold": 2, |
||||||
|
"validators": [ |
||||||
|
"0x05a9b5efe9f61f9142453d8e9f61565f333c6768", |
||||||
|
"0x43a96c7dfbd8187c95013d6ee8665650cbdb2673", |
||||||
|
"0x7940a12c050e24e1839c21ecb12f65afd84e8c5b" |
||||||
|
], |
||||||
|
"type": 3 |
||||||
|
}, |
||||||
|
"moonbasealpha": { |
||||||
|
"threshold": 2, |
||||||
|
"validators": [ |
||||||
|
"0x521877064bd7ac7500d300f162c8c47c256a2f9c", |
||||||
|
"0xbc1c70f58ae0459d4b8a013245420a893837d568", |
||||||
|
"0x01e42c2c44af81dda1ac16fec76fea2a7a54a44c" |
||||||
|
], |
||||||
|
"type": 3 |
||||||
|
}, |
||||||
|
"mumbai": { |
||||||
|
"threshold": 2, |
||||||
|
"validators": [ |
||||||
|
"0xebc301013b6cd2548e347c28d2dc43ec20c068f2", |
||||||
|
"0x315db9868fc8813b221b1694f8760ece39f45447", |
||||||
|
"0x17517c98358c5937c5d9ee47ce1f5b4c2b7fc9f5" |
||||||
|
], |
||||||
|
"type": 3 |
||||||
|
}, |
||||||
|
"optimismgoerli": { |
||||||
|
"threshold": 2, |
||||||
|
"validators": [ |
||||||
|
"0x79e58546e2faca865c6732ad5f6c4951051c4d67", |
||||||
|
"0x7bbfe1bb7146aad7df309c637987d856179ebbc1", |
||||||
|
"0xf3d2fb4d53c2bb6a88cec040e0d87430fcee4e40" |
||||||
|
], |
||||||
|
"type": 3 |
||||||
|
}, |
||||||
|
"polygonzkevmtestnet": { |
||||||
|
"threshold": 2, |
||||||
|
"validators": [ |
||||||
|
"0x3f06b725bc9648917eb11c414e9f8d76fd959550", |
||||||
|
"0x27bfc57679d9dd4ab2e870f5ed7ec0b339a0b636", |
||||||
|
"0xd476548222f43206d0abaa30e46e28670aa7859c" |
||||||
|
], |
||||||
|
"type": 3 |
||||||
|
}, |
||||||
|
"scrollsepolia": { |
||||||
|
"threshold": 2, |
||||||
|
"validators": [ |
||||||
|
"0xbe18dbd758afb367180260b524e6d4bcd1cb6d05", |
||||||
|
"0x9a11ed23ae962974018ab45bc133caabff7b3271", |
||||||
|
"0x7867bea3c9761fe64e6d124b171f91fd5dd79644" |
||||||
|
], |
||||||
|
"type": 3 |
||||||
|
}, |
||||||
|
"sepolia": { |
||||||
|
"threshold": 2, |
||||||
|
"validators": [ |
||||||
|
"0xb22b65f202558adf86a8bb2847b76ae1036686a5", |
||||||
|
"0x469f0940684d147defc44f3647146cb90dd0bc8e", |
||||||
|
"0xd3c75dcf15056012a4d74c483a0c6ea11d8c2b83" |
||||||
|
], |
||||||
|
"type": 3 |
||||||
|
}, |
||||||
|
"solanatestnet": { |
||||||
|
"threshold": 1, |
||||||
|
"validators": [ |
||||||
|
"0xd4ce8fa138d4e083fc0e480cca0dbfa4f5f30bd5" |
||||||
|
], |
||||||
|
"type": 3 |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,117 @@ |
|||||||
|
{ |
||||||
|
"alfajores": { |
||||||
|
"threshold": 2, |
||||||
|
"validators": [ |
||||||
|
"0x2233a5ce12f814bd64c9cdd73410bb8693124d40", |
||||||
|
"0xba279f965489d90f90490e3c49e860e0b43c2ae6", |
||||||
|
"0x86485dcec5f7bb8478dd251676372d054dea6653" |
||||||
|
], |
||||||
|
"type": 3 |
||||||
|
}, |
||||||
|
"arbitrumgoerli": { |
||||||
|
"threshold": 2, |
||||||
|
"validators": [ |
||||||
|
"0x071c8d135845ae5a2cb73f98d681d519014c0a8b", |
||||||
|
"0x1bcf03360989f15cbeb174c188288f2c6d2760d7", |
||||||
|
"0xc1590eaaeaf380e7859564c5ebcdcc87e8369e0d" |
||||||
|
], |
||||||
|
"type": 3 |
||||||
|
}, |
||||||
|
"basegoerli": { |
||||||
|
"threshold": 2, |
||||||
|
"validators": [ |
||||||
|
"0xf6eddda696dcd3bf10f7ce8a02db31ef2e775a03", |
||||||
|
"0x5a7d05cebf5db4dde9b2fedcefa76fb58fa05071", |
||||||
|
"0x9260a6c7d54cbcbed28f8668679cd1fa3a203b25" |
||||||
|
], |
||||||
|
"type": 3 |
||||||
|
}, |
||||||
|
"bsctestnet": { |
||||||
|
"threshold": 2, |
||||||
|
"validators": [ |
||||||
|
"0x242d8a855a8c932dec51f7999ae7d1e48b10c95e", |
||||||
|
"0xf620f5e3d25a3ae848fec74bccae5de3edcd8796", |
||||||
|
"0x1f030345963c54ff8229720dd3a711c15c554aeb" |
||||||
|
], |
||||||
|
"type": 3 |
||||||
|
}, |
||||||
|
"fuji": { |
||||||
|
"threshold": 2, |
||||||
|
"validators": [ |
||||||
|
"0xd8154f73d04cc7f7f0c332793692e6e6f6b2402e", |
||||||
|
"0x895ae30bc83ff1493b9cf7781b0b813d23659857", |
||||||
|
"0x43e915573d9f1383cbf482049e4a012290759e7f" |
||||||
|
], |
||||||
|
"type": 3 |
||||||
|
}, |
||||||
|
"goerli": { |
||||||
|
"threshold": 2, |
||||||
|
"validators": [ |
||||||
|
"0x05a9b5efe9f61f9142453d8e9f61565f333c6768", |
||||||
|
"0x43a96c7dfbd8187c95013d6ee8665650cbdb2673", |
||||||
|
"0x7940a12c050e24e1839c21ecb12f65afd84e8c5b" |
||||||
|
], |
||||||
|
"type": 3 |
||||||
|
}, |
||||||
|
"moonbasealpha": { |
||||||
|
"threshold": 2, |
||||||
|
"validators": [ |
||||||
|
"0x521877064bd7ac7500d300f162c8c47c256a2f9c", |
||||||
|
"0xbc1c70f58ae0459d4b8a013245420a893837d568", |
||||||
|
"0x01e42c2c44af81dda1ac16fec76fea2a7a54a44c" |
||||||
|
], |
||||||
|
"type": 3 |
||||||
|
}, |
||||||
|
"mumbai": { |
||||||
|
"threshold": 2, |
||||||
|
"validators": [ |
||||||
|
"0xebc301013b6cd2548e347c28d2dc43ec20c068f2", |
||||||
|
"0x315db9868fc8813b221b1694f8760ece39f45447", |
||||||
|
"0x17517c98358c5937c5d9ee47ce1f5b4c2b7fc9f5" |
||||||
|
], |
||||||
|
"type": 3 |
||||||
|
}, |
||||||
|
"optimismgoerli": { |
||||||
|
"threshold": 2, |
||||||
|
"validators": [ |
||||||
|
"0x79e58546e2faca865c6732ad5f6c4951051c4d67", |
||||||
|
"0x7bbfe1bb7146aad7df309c637987d856179ebbc1", |
||||||
|
"0xf3d2fb4d53c2bb6a88cec040e0d87430fcee4e40" |
||||||
|
], |
||||||
|
"type": 3 |
||||||
|
}, |
||||||
|
"polygonzkevmtestnet": { |
||||||
|
"threshold": 2, |
||||||
|
"validators": [ |
||||||
|
"0x3f06b725bc9648917eb11c414e9f8d76fd959550", |
||||||
|
"0x27bfc57679d9dd4ab2e870f5ed7ec0b339a0b636", |
||||||
|
"0xd476548222f43206d0abaa30e46e28670aa7859c" |
||||||
|
], |
||||||
|
"type": 3 |
||||||
|
}, |
||||||
|
"scrollsepolia": { |
||||||
|
"threshold": 2, |
||||||
|
"validators": [ |
||||||
|
"0xbe18dbd758afb367180260b524e6d4bcd1cb6d05", |
||||||
|
"0x9a11ed23ae962974018ab45bc133caabff7b3271", |
||||||
|
"0x7867bea3c9761fe64e6d124b171f91fd5dd79644" |
||||||
|
], |
||||||
|
"type": 3 |
||||||
|
}, |
||||||
|
"sepolia": { |
||||||
|
"threshold": 2, |
||||||
|
"validators": [ |
||||||
|
"0xb22b65f202558adf86a8bb2847b76ae1036686a5", |
||||||
|
"0x469f0940684d147defc44f3647146cb90dd0bc8e", |
||||||
|
"0xd3c75dcf15056012a4d74c483a0c6ea11d8c2b83" |
||||||
|
], |
||||||
|
"type": 3 |
||||||
|
}, |
||||||
|
"eclipsetestnet": { |
||||||
|
"threshold": 1, |
||||||
|
"validators": [ |
||||||
|
"0xf344f34abca9a444545b5295066348a0ae22dda3" |
||||||
|
], |
||||||
|
"type": 3 |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,8 @@ |
|||||||
|
{ |
||||||
|
"mailbox": "75HBBLae3ddeneJVrZeyrDfv6vb7SMC3aCpBucSXS5aR", |
||||||
|
"validator_announce": "8qNYSi9EP1xSnRjtMpyof88A26GBbdcrsa61uSaHiwx3", |
||||||
|
"multisig_ism_message_id": "4GHxwWyKB9exhKG4fdyU2hfLgfFzhHp2WcsSKc2uNR1k", |
||||||
|
"igp_program_id": "5p7Hii6CJL4xGBYYTGEQmH9LnUSZteFJUu9AVLDExZX2", |
||||||
|
"overhead_igp_account": "hBHAApi5ZoeCYHqDdCKkCzVKmBdwywdT3hMqe327eZB", |
||||||
|
"igp_account": "9SQVtTNsbipdMzumhzi6X8GwojiSMwBfqAhS7FgyTcqy" |
||||||
|
} |
@ -0,0 +1,10 @@ |
|||||||
|
{ |
||||||
|
"solanatestnet": { |
||||||
|
"hex": "0xb5eb96475b2d58f7b9a9ff2f60f46cf5ac1be244e557574971885337522b59c9", |
||||||
|
"base58": "DF99ZiHj8aN4ETbKmpMoMsRTSbm7gtL5j6sKKLC5mkTS" |
||||||
|
}, |
||||||
|
"eclipsetestnet": { |
||||||
|
"hex": "0x6dcd836e4ed228f42f3b2d6e2c2723b431b8e8b0bc9dded26bdff16ffaf818bd", |
||||||
|
"base58": "8PdCNrJqkDfSMjg9BvXrDr3Hooo7WZ6cN7Qn9mHL1GZr" |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,14 @@ |
|||||||
|
{ |
||||||
|
"solanatestnet": { |
||||||
|
"type": "native", |
||||||
|
"decimals": 9, |
||||||
|
"interchainGasPaymaster": "hBHAApi5ZoeCYHqDdCKkCzVKmBdwywdT3hMqe327eZB" |
||||||
|
}, |
||||||
|
"eclipsetestnet": { |
||||||
|
"type": "synthetic", |
||||||
|
"decimals": 9, |
||||||
|
"name": "Solana (solanatestnet)", |
||||||
|
"symbol": "SOL", |
||||||
|
"interchainGasPaymaster": "hBHAApi5ZoeCYHqDdCKkCzVKmBdwywdT3hMqe327eZB" |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue