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 |
||||
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