From db7ad09be63f19ca60dfa2027663a45b9b1efe35 Mon Sep 17 00:00:00 2001 From: claravanstaden Date: Fri, 14 Mar 2025 10:57:04 +0200 Subject: [PATCH 1/3] reinitialize bridge command --- control/preimage/src/commands.rs | 54 +++++++++++++++++++++++-- control/preimage/src/main.rs | 67 ++++++++++++++++++++++++++------ 2 files changed, 106 insertions(+), 15 deletions(-) diff --git a/control/preimage/src/commands.rs b/control/preimage/src/commands.rs index 13568b6a01..cc3dd2934d 100644 --- a/control/preimage/src/commands.rs +++ b/control/preimage/src/commands.rs @@ -27,6 +27,10 @@ use crate::bridge_hub_runtime::runtime_types::{ snowbridge_pallet_outbound_queue, snowbridge_pallet_system, }; use crate::bridge_hub_runtime::RuntimeCall as BridgeHubRuntimeCall; +use hex_literal::hex; +use sp_crypto_hashing::twox_64; + +const ASSET_HUB_CHANNEL_ID: [u8; 32] = hex!("c173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539"); #[cfg(feature = "polkadot")] pub mod asset_hub_polkadot_types { @@ -149,12 +153,21 @@ pub fn outbound_queue_operating_mode(param: &OperatingModeEnum) -> BridgeHubRunt } pub fn upgrade(params: &UpgradeArgs) -> BridgeHubRuntimeCall { + let initializer = if params.initializer { + Some(( + params.initializer_params.as_ref().unwrap().clone(), + params.initializer_gas.unwrap(), + )) + } else { + None + }; + BridgeHubRuntimeCall::EthereumSystem(snowbridge_pallet_system::pallet::Call::upgrade { impl_address: params.logic_address.into_array().into(), impl_code_hash: params.logic_code_hash.0.into(), - initializer: Some(Initializer { - params: params.initializer_params.clone().into(), - maximum_required_gas: params.initializer_gas, + initializer: initializer.map(|(params, gas)| Initializer { + params: params.into(), + maximum_required_gas: gas, }), }) } @@ -263,6 +276,41 @@ pub fn set_assethub_fee(fee: u128) -> AssetHubRuntimeCall { ) } +pub fn set_inbound_nonce() -> BridgeHubRuntimeCall { + set_nonce("EthereumInboundQueue") +} + +pub fn set_outbound_nonce() -> BridgeHubRuntimeCall { + set_nonce("EthereumOutboundQueue") +} + +fn set_nonce(pallet_name: &str) -> BridgeHubRuntimeCall { + let new_nonce: Vec = 0u64.encode(); + + let mut key = Vec::new(); + let pallet_prefix = pallet_name.as_bytes(); + key.extend_from_slice(&twox_128(&pallet_prefix)); + + let storage_prefix = b"Nonce"; + key.extend_from_slice(&twox_128(storage_prefix)); + + let encoded_id = ASSET_HUB_CHANNEL_ID.encode(); + let hash_id_64 = twox_64(&encoded_id); + key.extend_from_slice(&hash_id_64); + key.extend_from_slice(&encoded_id); + + println!("nonce key for {}: 0x{}", pallet_name, hex::encode(&key)); + + BridgeHubRuntimeCall::System( + crate::bridge_hub_runtime::runtime_types::frame_system::pallet::Call::set_storage { + items: vec![( + key, + new_nonce, + )], + }, + ) +} + pub fn force_checkpoint(params: &ForceCheckpointArgs) -> BridgeHubRuntimeCall { let mut file = File::open(params.checkpoint.clone()).expect("File not found"); let mut data = String::new(); diff --git a/control/preimage/src/main.rs b/control/preimage/src/main.rs index b27e8a8523..896b875bd0 100644 --- a/control/preimage/src/main.rs +++ b/control/preimage/src/main.rs @@ -61,6 +61,8 @@ pub enum Command { TreasuryProposal2024(TreasuryProposal2024Args), /// Governance update 202501 GovUpdate202501(GovUpdate202501Args), + /// Reinitialize bridge + ReinitializeBridge(ReinitializeBridgeArgs), } #[derive(Debug, Args)] @@ -112,13 +114,17 @@ pub struct UpgradeArgs { #[arg(long, value_name = "HASH", value_parser=parse_hex_bytes32)] logic_code_hash: FixedBytes<32>, + /// Initialize the logic contract + #[arg(long, requires_all=["initializer_params", "initializer_gas"])] + initializer: bool, + /// ABI-encoded params to pass to initializer - #[arg(long, value_name = "BYTES", value_parser=parse_hex_bytes)] - initializer_params: Bytes, + #[arg(long, requires = "initializer", value_name = "BYTES", value_parser=parse_hex_bytes)] + initializer_params: Option, /// Maximum gas required by the initializer - #[arg(long, value_name = "GAS")] - initializer_gas: u64, + #[arg(long, requires = "initializer", value_name = "GAS")] + initializer_gas: Option, } #[derive(Debug, Args)] @@ -242,6 +248,16 @@ pub struct RegisterEtherArgs { ether_decimals: u8, } +#[derive(Debug, Args)] +pub struct ReinitializeBridgeArgs { + #[arg(long, value_name = "FILE")] + pub checkpoint: PathBuf, + #[command(flatten)] + register_ether: RegisterEtherArgs, + #[command(flatten)] + gateway_address: GatewayAddressArgs, +} + #[derive(Debug, Args)] pub struct ApiEndpoints { #[arg(long, value_name = "URL")] @@ -318,14 +334,14 @@ async fn run() -> Result<(), Box> { .bridge_hub_api .unwrap_or(BRIDGE_HUB_API.to_owned()), ) - .await?; + .await?; let asset_hub_api: OnlineClient = OnlineClient::from_url( cli.api_endpoints .asset_hub_api .unwrap_or(ASSET_HUB_API.to_owned()), ) - .await?; + .await?; let relay_api: OnlineClient = OnlineClient::from_url(cli.api_endpoints.relay_api.unwrap_or(RELAY_API.to_owned())).await?; @@ -355,7 +371,7 @@ async fn run() -> Result<(), Box> { commands::force_checkpoint(¶ms.force_checkpoint), ], ) - .await?; + .await?; let (register_ether_call, set_ether_metadata_call) = commands::register_ether(¶ms.register_ether); let asset_hub_call = send_xcm_asset_hub( @@ -367,7 +383,7 @@ async fn run() -> Result<(), Box> { set_ethereum_fee, ], ) - .await?; + .await?; utility_force_batch(vec![bridge_hub_call, asset_hub_call]) } Command::UpdateAsset(params) => { @@ -378,7 +394,7 @@ async fn run() -> Result<(), Box> { commands::force_set_metadata(params), ], ) - .await? + .await? } Command::GatewayOperatingMode(params) => { let call = commands::gateway_operating_mode(¶ms.gateway_operating_mode); @@ -448,9 +464,9 @@ async fn run() -> Result<(), Box> { } Command::TreasuryProposal2024(params) => treasury_commands::treasury_proposal(¶ms), Command::GovUpdate202501(GovUpdate202501Args { - pricing_parameters, - register_ether, - }) => { + pricing_parameters, + register_ether, + }) => { let (set_pricing_parameters, set_ethereum_fee) = commands::pricing_parameters(&context, pricing_parameters).await?; @@ -470,6 +486,33 @@ async fn run() -> Result<(), Box> { ah_set_pricing_call, ah_register_ether_call, ]) + }, + Command::ReinitializeBridge(params) => { + let force_checkpoint_call = commands::force_checkpoint(&ForceCheckpointArgs{ + checkpoint: params.checkpoint.clone(), + }); + let gateway_address_call = commands::set_gateway_address(¶ms.gateway_address); + let inbound_nonce_call = commands::set_inbound_nonce(); + let outbound_nonce_call = commands::set_outbound_nonce(); + let (register_ether_call, set_ether_metadata_call) = + commands::register_ether(¶ms.register_ether); + + let bridge_hub_call = send_xcm_bridge_hub(&context, vec![ + force_checkpoint_call, + gateway_address_call, + inbound_nonce_call, + outbound_nonce_call, + ]).await?; + + let asset_hub_call = send_xcm_asset_hub( + &context, + vec![ + register_ether_call, + set_ether_metadata_call, + ], + ) + .await?; + utility_force_batch(vec![bridge_hub_call, asset_hub_call]) } }; From 7d166b70c145812721249e5bdf43d00e80cd2ad0 Mon Sep 17 00:00:00 2001 From: claravanstaden Date: Fri, 14 Mar 2025 16:32:48 +0200 Subject: [PATCH 2/3] reinitialize bridge command --- relayer/contracts/gateway.go | 218 +++++++++++---------- web/packages/test/config/beacon-relay.json | 9 +- 2 files changed, 115 insertions(+), 112 deletions(-) diff --git a/relayer/contracts/gateway.go b/relayer/contracts/gateway.go index 1a4eba075a..19207c678d 100644 --- a/relayer/contracts/gateway.go +++ b/relayer/contracts/gateway.go @@ -91,7 +91,7 @@ type VerificationProof struct { // GatewayMetaData contains all meta data concerning the Gateway contract. var GatewayMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"agentOf\",\"inputs\":[{\"name\":\"agentID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"channelNoncesOf\",\"inputs\":[{\"name\":\"channelID\",\"type\":\"bytes32\",\"internalType\":\"ChannelID\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"channelOperatingModeOf\",\"inputs\":[{\"name\":\"channelID\",\"type\":\"bytes32\",\"internalType\":\"ChannelID\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumOperatingMode\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"implementation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isTokenRegistered\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatingMode\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumOperatingMode\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pricingParameters\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"UD60x18\"},{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"queryForeignTokenID\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"quoteRegisterTokenFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"quoteSendTokenFee\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destinationChain\",\"type\":\"uint32\",\"internalType\":\"ParaID\"},{\"name\":\"destinationFee\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"sendToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destinationChain\",\"type\":\"uint32\",\"internalType\":\"ParaID\"},{\"name\":\"destinationAddress\",\"type\":\"tuple\",\"internalType\":\"structMultiAddress\",\"components\":[{\"name\":\"kind\",\"type\":\"uint8\",\"internalType\":\"enumKind\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"destinationFee\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"amount\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"submitV1\",\"inputs\":[{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structInboundMessage\",\"components\":[{\"name\":\"channelID\",\"type\":\"bytes32\",\"internalType\":\"ChannelID\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"command\",\"type\":\"uint8\",\"internalType\":\"enumCommand\"},{\"name\":\"params\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"maxDispatchGas\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxFeePerGas\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"reward\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"id\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"leafProof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"headerProof\",\"type\":\"tuple\",\"internalType\":\"structVerification.Proof\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structVerification.ParachainHeader\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"number\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extrinsicsRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"digestItems\",\"type\":\"tuple[]\",\"internalType\":\"structVerification.DigestItem[]\",\"components\":[{\"name\":\"kind\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"consensusEngineID\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"headProof\",\"type\":\"tuple\",\"internalType\":\"structVerification.HeadProof\",\"components\":[{\"name\":\"pos\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"width\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"proof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}]},{\"name\":\"leafPartial\",\"type\":\"tuple\",\"internalType\":\"structVerification.MMRLeafPartial\",\"components\":[{\"name\":\"version\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"parentNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"nextAuthoritySetID\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextAuthoritySetLen\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"nextAuthoritySetRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"leafProof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"leafProofOrder\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AgentCreated\",\"inputs\":[{\"name\":\"agentID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"agent\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AgentFundsWithdrawn\",\"inputs\":[{\"name\":\"agentID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChannelCreated\",\"inputs\":[{\"name\":\"channelID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"ChannelID\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChannelUpdated\",\"inputs\":[{\"name\":\"channelID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"ChannelID\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ForeignTokenRegistered\",\"inputs\":[{\"name\":\"tokenID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InboundMessageDispatched\",\"inputs\":[{\"name\":\"channelID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"ChannelID\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"messageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"success\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatingModeChanged\",\"inputs\":[{\"name\":\"mode\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumOperatingMode\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OutboundMessageAccepted\",\"inputs\":[{\"name\":\"channelID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"ChannelID\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"messageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"payload\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PricingParametersChanged\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenRegistrationSent\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenSent\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"destinationChain\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"ParaID\"},{\"name\":\"destinationAddress\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structMultiAddress\",\"components\":[{\"name\":\"kind\",\"type\":\"uint8\",\"internalType\":\"enumKind\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"amount\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenTransferFeesChanged\",\"inputs\":[],\"anonymous\":false}]", + ABI: "[{\"type\":\"function\",\"name\":\"agentOf\",\"inputs\":[{\"name\":\"agentID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"channelNoncesOf\",\"inputs\":[{\"name\":\"channelID\",\"type\":\"bytes32\",\"internalType\":\"ChannelID\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"channelOperatingModeOf\",\"inputs\":[{\"name\":\"channelID\",\"type\":\"bytes32\",\"internalType\":\"ChannelID\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumOperatingMode\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositEther\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"implementation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isTokenRegistered\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatingMode\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumOperatingMode\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pricingParameters\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"UD60x18\"},{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"queryForeignTokenID\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"quoteRegisterTokenFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"quoteSendTokenFee\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destinationChain\",\"type\":\"uint32\",\"internalType\":\"ParaID\"},{\"name\":\"destinationFee\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"sendToken\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destinationChain\",\"type\":\"uint32\",\"internalType\":\"ParaID\"},{\"name\":\"destinationAddress\",\"type\":\"tuple\",\"internalType\":\"structMultiAddress\",\"components\":[{\"name\":\"kind\",\"type\":\"uint8\",\"internalType\":\"enumKind\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"destinationFee\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"amount\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"submitV1\",\"inputs\":[{\"name\":\"message\",\"type\":\"tuple\",\"internalType\":\"structInboundMessage\",\"components\":[{\"name\":\"channelID\",\"type\":\"bytes32\",\"internalType\":\"ChannelID\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"command\",\"type\":\"uint8\",\"internalType\":\"enumCommand\"},{\"name\":\"params\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"maxDispatchGas\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maxFeePerGas\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"reward\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"id\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"leafProof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"headerProof\",\"type\":\"tuple\",\"internalType\":\"structVerification.Proof\",\"components\":[{\"name\":\"header\",\"type\":\"tuple\",\"internalType\":\"structVerification.ParachainHeader\",\"components\":[{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"number\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extrinsicsRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"digestItems\",\"type\":\"tuple[]\",\"internalType\":\"structVerification.DigestItem[]\",\"components\":[{\"name\":\"kind\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"consensusEngineID\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"headProof\",\"type\":\"tuple\",\"internalType\":\"structVerification.HeadProof\",\"components\":[{\"name\":\"pos\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"width\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"proof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}]},{\"name\":\"leafPartial\",\"type\":\"tuple\",\"internalType\":\"structVerification.MMRLeafPartial\",\"components\":[{\"name\":\"version\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"parentNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"nextAuthoritySetID\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nextAuthoritySetLen\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"nextAuthoritySetRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"leafProof\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"leafProofOrder\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AgentCreated\",\"inputs\":[{\"name\":\"agentID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"agent\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChannelCreated\",\"inputs\":[{\"name\":\"channelID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"ChannelID\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChannelUpdated\",\"inputs\":[{\"name\":\"channelID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"ChannelID\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposited\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ForeignTokenRegistered\",\"inputs\":[{\"name\":\"tokenID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InboundMessageDispatched\",\"inputs\":[{\"name\":\"channelID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"ChannelID\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"messageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"success\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatingModeChanged\",\"inputs\":[{\"name\":\"mode\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumOperatingMode\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OutboundMessageAccepted\",\"inputs\":[{\"name\":\"channelID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"ChannelID\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"messageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"payload\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PricingParametersChanged\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenRegistrationSent\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenSent\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"destinationChain\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"ParaID\"},{\"name\":\"destinationAddress\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structMultiAddress\",\"components\":[{\"name\":\"kind\",\"type\":\"uint8\",\"internalType\":\"enumKind\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"amount\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"TokenTransferFeesChanged\",\"inputs\":[],\"anonymous\":false}]", } // GatewayABI is the input ABI used to generate the binding from. @@ -552,6 +552,27 @@ func (_Gateway *GatewayCallerSession) QuoteSendTokenFee(token common.Address, de return _Gateway.Contract.QuoteSendTokenFee(&_Gateway.CallOpts, token, destinationChain, destinationFee) } +// DepositEther is a paid mutator transaction binding the contract method 0x98ea5fca. +// +// Solidity: function depositEther() payable returns() +func (_Gateway *GatewayTransactor) DepositEther(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Gateway.contract.Transact(opts, "depositEther") +} + +// DepositEther is a paid mutator transaction binding the contract method 0x98ea5fca. +// +// Solidity: function depositEther() payable returns() +func (_Gateway *GatewaySession) DepositEther() (*types.Transaction, error) { + return _Gateway.Contract.DepositEther(&_Gateway.TransactOpts) +} + +// DepositEther is a paid mutator transaction binding the contract method 0x98ea5fca. +// +// Solidity: function depositEther() payable returns() +func (_Gateway *GatewayTransactorSession) DepositEther() (*types.Transaction, error) { + return _Gateway.Contract.DepositEther(&_Gateway.TransactOpts) +} + // RegisterToken is a paid mutator transaction binding the contract method 0x09824a80. // // Solidity: function registerToken(address token) payable returns() @@ -750,9 +771,9 @@ func (_Gateway *GatewayFilterer) ParseAgentCreated(log types.Log) (*GatewayAgent return event, nil } -// GatewayAgentFundsWithdrawnIterator is returned from FilterAgentFundsWithdrawn and is used to iterate over the raw logs and unpacked data for AgentFundsWithdrawn events raised by the Gateway contract. -type GatewayAgentFundsWithdrawnIterator struct { - Event *GatewayAgentFundsWithdrawn // Event containing the contract specifics and raw log +// GatewayChannelCreatedIterator is returned from FilterChannelCreated and is used to iterate over the raw logs and unpacked data for ChannelCreated events raised by the Gateway contract. +type GatewayChannelCreatedIterator struct { + Event *GatewayChannelCreated // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -766,7 +787,7 @@ type GatewayAgentFundsWithdrawnIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *GatewayAgentFundsWithdrawnIterator) Next() bool { +func (it *GatewayChannelCreatedIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -775,7 +796,7 @@ func (it *GatewayAgentFundsWithdrawnIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(GatewayAgentFundsWithdrawn) + it.Event = new(GatewayChannelCreated) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -790,7 +811,7 @@ func (it *GatewayAgentFundsWithdrawnIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(GatewayAgentFundsWithdrawn) + it.Event = new(GatewayChannelCreated) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -806,61 +827,51 @@ func (it *GatewayAgentFundsWithdrawnIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *GatewayAgentFundsWithdrawnIterator) Error() error { +func (it *GatewayChannelCreatedIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *GatewayAgentFundsWithdrawnIterator) Close() error { +func (it *GatewayChannelCreatedIterator) Close() error { it.sub.Unsubscribe() return nil } -// GatewayAgentFundsWithdrawn represents a AgentFundsWithdrawn event raised by the Gateway contract. -type GatewayAgentFundsWithdrawn struct { - AgentID [32]byte - Recipient common.Address - Amount *big.Int +// GatewayChannelCreated represents a ChannelCreated event raised by the Gateway contract. +type GatewayChannelCreated struct { + ChannelID [32]byte Raw types.Log // Blockchain specific contextual infos } -// FilterAgentFundsWithdrawn is a free log retrieval operation binding the contract event 0xf953871855f78d5ccdd6268f2d9d69fc67f26542a35d2bba1c615521aed57054. +// FilterChannelCreated is a free log retrieval operation binding the contract event 0xe7e6b36c9bc4c7817d3879c45d6ce1edd3c61b1966c488f1817697bb0b704525. // -// Solidity: event AgentFundsWithdrawn(bytes32 indexed agentID, address indexed recipient, uint256 amount) -func (_Gateway *GatewayFilterer) FilterAgentFundsWithdrawn(opts *bind.FilterOpts, agentID [][32]byte, recipient []common.Address) (*GatewayAgentFundsWithdrawnIterator, error) { +// Solidity: event ChannelCreated(bytes32 indexed channelID) +func (_Gateway *GatewayFilterer) FilterChannelCreated(opts *bind.FilterOpts, channelID [][32]byte) (*GatewayChannelCreatedIterator, error) { - var agentIDRule []interface{} - for _, agentIDItem := range agentID { - agentIDRule = append(agentIDRule, agentIDItem) - } - var recipientRule []interface{} - for _, recipientItem := range recipient { - recipientRule = append(recipientRule, recipientItem) + var channelIDRule []interface{} + for _, channelIDItem := range channelID { + channelIDRule = append(channelIDRule, channelIDItem) } - logs, sub, err := _Gateway.contract.FilterLogs(opts, "AgentFundsWithdrawn", agentIDRule, recipientRule) + logs, sub, err := _Gateway.contract.FilterLogs(opts, "ChannelCreated", channelIDRule) if err != nil { return nil, err } - return &GatewayAgentFundsWithdrawnIterator{contract: _Gateway.contract, event: "AgentFundsWithdrawn", logs: logs, sub: sub}, nil + return &GatewayChannelCreatedIterator{contract: _Gateway.contract, event: "ChannelCreated", logs: logs, sub: sub}, nil } -// WatchAgentFundsWithdrawn is a free log subscription operation binding the contract event 0xf953871855f78d5ccdd6268f2d9d69fc67f26542a35d2bba1c615521aed57054. +// WatchChannelCreated is a free log subscription operation binding the contract event 0xe7e6b36c9bc4c7817d3879c45d6ce1edd3c61b1966c488f1817697bb0b704525. // -// Solidity: event AgentFundsWithdrawn(bytes32 indexed agentID, address indexed recipient, uint256 amount) -func (_Gateway *GatewayFilterer) WatchAgentFundsWithdrawn(opts *bind.WatchOpts, sink chan<- *GatewayAgentFundsWithdrawn, agentID [][32]byte, recipient []common.Address) (event.Subscription, error) { +// Solidity: event ChannelCreated(bytes32 indexed channelID) +func (_Gateway *GatewayFilterer) WatchChannelCreated(opts *bind.WatchOpts, sink chan<- *GatewayChannelCreated, channelID [][32]byte) (event.Subscription, error) { - var agentIDRule []interface{} - for _, agentIDItem := range agentID { - agentIDRule = append(agentIDRule, agentIDItem) - } - var recipientRule []interface{} - for _, recipientItem := range recipient { - recipientRule = append(recipientRule, recipientItem) + var channelIDRule []interface{} + for _, channelIDItem := range channelID { + channelIDRule = append(channelIDRule, channelIDItem) } - logs, sub, err := _Gateway.contract.WatchLogs(opts, "AgentFundsWithdrawn", agentIDRule, recipientRule) + logs, sub, err := _Gateway.contract.WatchLogs(opts, "ChannelCreated", channelIDRule) if err != nil { return nil, err } @@ -870,8 +881,8 @@ func (_Gateway *GatewayFilterer) WatchAgentFundsWithdrawn(opts *bind.WatchOpts, select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(GatewayAgentFundsWithdrawn) - if err := _Gateway.contract.UnpackLog(event, "AgentFundsWithdrawn", log); err != nil { + event := new(GatewayChannelCreated) + if err := _Gateway.contract.UnpackLog(event, "ChannelCreated", log); err != nil { return err } event.Raw = log @@ -892,21 +903,21 @@ func (_Gateway *GatewayFilterer) WatchAgentFundsWithdrawn(opts *bind.WatchOpts, }), nil } -// ParseAgentFundsWithdrawn is a log parse operation binding the contract event 0xf953871855f78d5ccdd6268f2d9d69fc67f26542a35d2bba1c615521aed57054. +// ParseChannelCreated is a log parse operation binding the contract event 0xe7e6b36c9bc4c7817d3879c45d6ce1edd3c61b1966c488f1817697bb0b704525. // -// Solidity: event AgentFundsWithdrawn(bytes32 indexed agentID, address indexed recipient, uint256 amount) -func (_Gateway *GatewayFilterer) ParseAgentFundsWithdrawn(log types.Log) (*GatewayAgentFundsWithdrawn, error) { - event := new(GatewayAgentFundsWithdrawn) - if err := _Gateway.contract.UnpackLog(event, "AgentFundsWithdrawn", log); err != nil { +// Solidity: event ChannelCreated(bytes32 indexed channelID) +func (_Gateway *GatewayFilterer) ParseChannelCreated(log types.Log) (*GatewayChannelCreated, error) { + event := new(GatewayChannelCreated) + if err := _Gateway.contract.UnpackLog(event, "ChannelCreated", log); err != nil { return nil, err } event.Raw = log return event, nil } -// GatewayChannelCreatedIterator is returned from FilterChannelCreated and is used to iterate over the raw logs and unpacked data for ChannelCreated events raised by the Gateway contract. -type GatewayChannelCreatedIterator struct { - Event *GatewayChannelCreated // Event containing the contract specifics and raw log +// GatewayChannelUpdatedIterator is returned from FilterChannelUpdated and is used to iterate over the raw logs and unpacked data for ChannelUpdated events raised by the Gateway contract. +type GatewayChannelUpdatedIterator struct { + Event *GatewayChannelUpdated // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -920,7 +931,7 @@ type GatewayChannelCreatedIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *GatewayChannelCreatedIterator) Next() bool { +func (it *GatewayChannelUpdatedIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -929,7 +940,7 @@ func (it *GatewayChannelCreatedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(GatewayChannelCreated) + it.Event = new(GatewayChannelUpdated) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -944,7 +955,7 @@ func (it *GatewayChannelCreatedIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(GatewayChannelCreated) + it.Event = new(GatewayChannelUpdated) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -960,51 +971,51 @@ func (it *GatewayChannelCreatedIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *GatewayChannelCreatedIterator) Error() error { +func (it *GatewayChannelUpdatedIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *GatewayChannelCreatedIterator) Close() error { +func (it *GatewayChannelUpdatedIterator) Close() error { it.sub.Unsubscribe() return nil } -// GatewayChannelCreated represents a ChannelCreated event raised by the Gateway contract. -type GatewayChannelCreated struct { +// GatewayChannelUpdated represents a ChannelUpdated event raised by the Gateway contract. +type GatewayChannelUpdated struct { ChannelID [32]byte Raw types.Log // Blockchain specific contextual infos } -// FilterChannelCreated is a free log retrieval operation binding the contract event 0xe7e6b36c9bc4c7817d3879c45d6ce1edd3c61b1966c488f1817697bb0b704525. +// FilterChannelUpdated is a free log retrieval operation binding the contract event 0x66e174b5e03ba247add8660a34e70bdd484239fe794c2567772e8e93a5c1696b. // -// Solidity: event ChannelCreated(bytes32 indexed channelID) -func (_Gateway *GatewayFilterer) FilterChannelCreated(opts *bind.FilterOpts, channelID [][32]byte) (*GatewayChannelCreatedIterator, error) { +// Solidity: event ChannelUpdated(bytes32 indexed channelID) +func (_Gateway *GatewayFilterer) FilterChannelUpdated(opts *bind.FilterOpts, channelID [][32]byte) (*GatewayChannelUpdatedIterator, error) { var channelIDRule []interface{} for _, channelIDItem := range channelID { channelIDRule = append(channelIDRule, channelIDItem) } - logs, sub, err := _Gateway.contract.FilterLogs(opts, "ChannelCreated", channelIDRule) + logs, sub, err := _Gateway.contract.FilterLogs(opts, "ChannelUpdated", channelIDRule) if err != nil { return nil, err } - return &GatewayChannelCreatedIterator{contract: _Gateway.contract, event: "ChannelCreated", logs: logs, sub: sub}, nil + return &GatewayChannelUpdatedIterator{contract: _Gateway.contract, event: "ChannelUpdated", logs: logs, sub: sub}, nil } -// WatchChannelCreated is a free log subscription operation binding the contract event 0xe7e6b36c9bc4c7817d3879c45d6ce1edd3c61b1966c488f1817697bb0b704525. +// WatchChannelUpdated is a free log subscription operation binding the contract event 0x66e174b5e03ba247add8660a34e70bdd484239fe794c2567772e8e93a5c1696b. // -// Solidity: event ChannelCreated(bytes32 indexed channelID) -func (_Gateway *GatewayFilterer) WatchChannelCreated(opts *bind.WatchOpts, sink chan<- *GatewayChannelCreated, channelID [][32]byte) (event.Subscription, error) { +// Solidity: event ChannelUpdated(bytes32 indexed channelID) +func (_Gateway *GatewayFilterer) WatchChannelUpdated(opts *bind.WatchOpts, sink chan<- *GatewayChannelUpdated, channelID [][32]byte) (event.Subscription, error) { var channelIDRule []interface{} for _, channelIDItem := range channelID { channelIDRule = append(channelIDRule, channelIDItem) } - logs, sub, err := _Gateway.contract.WatchLogs(opts, "ChannelCreated", channelIDRule) + logs, sub, err := _Gateway.contract.WatchLogs(opts, "ChannelUpdated", channelIDRule) if err != nil { return nil, err } @@ -1014,8 +1025,8 @@ func (_Gateway *GatewayFilterer) WatchChannelCreated(opts *bind.WatchOpts, sink select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(GatewayChannelCreated) - if err := _Gateway.contract.UnpackLog(event, "ChannelCreated", log); err != nil { + event := new(GatewayChannelUpdated) + if err := _Gateway.contract.UnpackLog(event, "ChannelUpdated", log); err != nil { return err } event.Raw = log @@ -1036,21 +1047,21 @@ func (_Gateway *GatewayFilterer) WatchChannelCreated(opts *bind.WatchOpts, sink }), nil } -// ParseChannelCreated is a log parse operation binding the contract event 0xe7e6b36c9bc4c7817d3879c45d6ce1edd3c61b1966c488f1817697bb0b704525. +// ParseChannelUpdated is a log parse operation binding the contract event 0x66e174b5e03ba247add8660a34e70bdd484239fe794c2567772e8e93a5c1696b. // -// Solidity: event ChannelCreated(bytes32 indexed channelID) -func (_Gateway *GatewayFilterer) ParseChannelCreated(log types.Log) (*GatewayChannelCreated, error) { - event := new(GatewayChannelCreated) - if err := _Gateway.contract.UnpackLog(event, "ChannelCreated", log); err != nil { +// Solidity: event ChannelUpdated(bytes32 indexed channelID) +func (_Gateway *GatewayFilterer) ParseChannelUpdated(log types.Log) (*GatewayChannelUpdated, error) { + event := new(GatewayChannelUpdated) + if err := _Gateway.contract.UnpackLog(event, "ChannelUpdated", log); err != nil { return nil, err } event.Raw = log return event, nil } -// GatewayChannelUpdatedIterator is returned from FilterChannelUpdated and is used to iterate over the raw logs and unpacked data for ChannelUpdated events raised by the Gateway contract. -type GatewayChannelUpdatedIterator struct { - Event *GatewayChannelUpdated // Event containing the contract specifics and raw log +// GatewayDepositedIterator is returned from FilterDeposited and is used to iterate over the raw logs and unpacked data for Deposited events raised by the Gateway contract. +type GatewayDepositedIterator struct { + Event *GatewayDeposited // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -1064,7 +1075,7 @@ type GatewayChannelUpdatedIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *GatewayChannelUpdatedIterator) Next() bool { +func (it *GatewayDepositedIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -1073,7 +1084,7 @@ func (it *GatewayChannelUpdatedIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(GatewayChannelUpdated) + it.Event = new(GatewayDeposited) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1088,7 +1099,7 @@ func (it *GatewayChannelUpdatedIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(GatewayChannelUpdated) + it.Event = new(GatewayDeposited) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1104,51 +1115,42 @@ func (it *GatewayChannelUpdatedIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *GatewayChannelUpdatedIterator) Error() error { +func (it *GatewayDepositedIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *GatewayChannelUpdatedIterator) Close() error { +func (it *GatewayDepositedIterator) Close() error { it.sub.Unsubscribe() return nil } -// GatewayChannelUpdated represents a ChannelUpdated event raised by the Gateway contract. -type GatewayChannelUpdated struct { - ChannelID [32]byte - Raw types.Log // Blockchain specific contextual infos +// GatewayDeposited represents a Deposited event raised by the Gateway contract. +type GatewayDeposited struct { + Sender common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos } -// FilterChannelUpdated is a free log retrieval operation binding the contract event 0x66e174b5e03ba247add8660a34e70bdd484239fe794c2567772e8e93a5c1696b. +// FilterDeposited is a free log retrieval operation binding the contract event 0x2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4. // -// Solidity: event ChannelUpdated(bytes32 indexed channelID) -func (_Gateway *GatewayFilterer) FilterChannelUpdated(opts *bind.FilterOpts, channelID [][32]byte) (*GatewayChannelUpdatedIterator, error) { - - var channelIDRule []interface{} - for _, channelIDItem := range channelID { - channelIDRule = append(channelIDRule, channelIDItem) - } +// Solidity: event Deposited(address sender, uint256 amount) +func (_Gateway *GatewayFilterer) FilterDeposited(opts *bind.FilterOpts) (*GatewayDepositedIterator, error) { - logs, sub, err := _Gateway.contract.FilterLogs(opts, "ChannelUpdated", channelIDRule) + logs, sub, err := _Gateway.contract.FilterLogs(opts, "Deposited") if err != nil { return nil, err } - return &GatewayChannelUpdatedIterator{contract: _Gateway.contract, event: "ChannelUpdated", logs: logs, sub: sub}, nil + return &GatewayDepositedIterator{contract: _Gateway.contract, event: "Deposited", logs: logs, sub: sub}, nil } -// WatchChannelUpdated is a free log subscription operation binding the contract event 0x66e174b5e03ba247add8660a34e70bdd484239fe794c2567772e8e93a5c1696b. +// WatchDeposited is a free log subscription operation binding the contract event 0x2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4. // -// Solidity: event ChannelUpdated(bytes32 indexed channelID) -func (_Gateway *GatewayFilterer) WatchChannelUpdated(opts *bind.WatchOpts, sink chan<- *GatewayChannelUpdated, channelID [][32]byte) (event.Subscription, error) { - - var channelIDRule []interface{} - for _, channelIDItem := range channelID { - channelIDRule = append(channelIDRule, channelIDItem) - } +// Solidity: event Deposited(address sender, uint256 amount) +func (_Gateway *GatewayFilterer) WatchDeposited(opts *bind.WatchOpts, sink chan<- *GatewayDeposited) (event.Subscription, error) { - logs, sub, err := _Gateway.contract.WatchLogs(opts, "ChannelUpdated", channelIDRule) + logs, sub, err := _Gateway.contract.WatchLogs(opts, "Deposited") if err != nil { return nil, err } @@ -1158,8 +1160,8 @@ func (_Gateway *GatewayFilterer) WatchChannelUpdated(opts *bind.WatchOpts, sink select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(GatewayChannelUpdated) - if err := _Gateway.contract.UnpackLog(event, "ChannelUpdated", log); err != nil { + event := new(GatewayDeposited) + if err := _Gateway.contract.UnpackLog(event, "Deposited", log); err != nil { return err } event.Raw = log @@ -1180,12 +1182,12 @@ func (_Gateway *GatewayFilterer) WatchChannelUpdated(opts *bind.WatchOpts, sink }), nil } -// ParseChannelUpdated is a log parse operation binding the contract event 0x66e174b5e03ba247add8660a34e70bdd484239fe794c2567772e8e93a5c1696b. +// ParseDeposited is a log parse operation binding the contract event 0x2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4. // -// Solidity: event ChannelUpdated(bytes32 indexed channelID) -func (_Gateway *GatewayFilterer) ParseChannelUpdated(log types.Log) (*GatewayChannelUpdated, error) { - event := new(GatewayChannelUpdated) - if err := _Gateway.contract.UnpackLog(event, "ChannelUpdated", log); err != nil { +// Solidity: event Deposited(address sender, uint256 amount) +func (_Gateway *GatewayFilterer) ParseDeposited(log types.Log) (*GatewayDeposited, error) { + event := new(GatewayDeposited) + if err := _Gateway.contract.UnpackLog(event, "Deposited", log); err != nil { return nil, err } event.Raw = log diff --git a/web/packages/test/config/beacon-relay.json b/web/packages/test/config/beacon-relay.json index e8b6d40c00..f838d2a15e 100644 --- a/web/packages/test/config/beacon-relay.json +++ b/web/packages/test/config/beacon-relay.json @@ -1,15 +1,15 @@ { "source": { "beacon": { - "endpoint": "http://127.0.0.1:9596", - "stateEndpoint": "http://127.0.0.1:9596", + "endpoint": "https://lodestar-sepolia.chainsafe.io", + "stateEndpoint": "https://lodestar-sepolia.chainsafe.io", "spec": { "syncCommitteeSize": 512, "slotsInEpoch": 32, "epochsPerSyncCommitteePeriod": 256, "forkVersions": { - "deneb": 0, - "electra": 2000000 + "deneb": 132608, + "electra": 222464 } }, "datastore": { @@ -27,3 +27,4 @@ "updateSlotInterval": 30 } } + From a882b8321dc41637f22488001f4808b4853ef9e6 Mon Sep 17 00:00:00 2001 From: claravanstaden Date: Wed, 19 Mar 2025 11:11:28 +0200 Subject: [PATCH 3/3] paseo updates --- control/preimage/src/main.rs | 12 ++++++------ .../bridge-hub-paseo/bridge-hub-metadata.bin | Bin 383825 -> 389106 bytes control/runtimes/paseo/polkadot-metadata.bin | Bin 415960 -> 424800 bytes 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/control/preimage/src/main.rs b/control/preimage/src/main.rs index 896b875bd0..ffd949b88b 100644 --- a/control/preimage/src/main.rs +++ b/control/preimage/src/main.rs @@ -250,8 +250,8 @@ pub struct RegisterEtherArgs { #[derive(Debug, Args)] pub struct ReinitializeBridgeArgs { - #[arg(long, value_name = "FILE")] - pub checkpoint: PathBuf, + //#[arg(long, value_name = "FILE")] + // pub checkpoint: PathBuf, #[command(flatten)] register_ether: RegisterEtherArgs, #[command(flatten)] @@ -488,9 +488,9 @@ async fn run() -> Result<(), Box> { ]) }, Command::ReinitializeBridge(params) => { - let force_checkpoint_call = commands::force_checkpoint(&ForceCheckpointArgs{ - checkpoint: params.checkpoint.clone(), - }); + //let force_checkpoint_call = commands::force_checkpoint(&ForceCheckpointArgs{ + // checkpoint: params.checkpoint.clone(), + // }); let gateway_address_call = commands::set_gateway_address(¶ms.gateway_address); let inbound_nonce_call = commands::set_inbound_nonce(); let outbound_nonce_call = commands::set_outbound_nonce(); @@ -498,7 +498,7 @@ async fn run() -> Result<(), Box> { commands::register_ether(¶ms.register_ether); let bridge_hub_call = send_xcm_bridge_hub(&context, vec![ - force_checkpoint_call, + // force_checkpoint_call, gateway_address_call, inbound_nonce_call, outbound_nonce_call, diff --git a/control/runtimes/bridge-hub-paseo/bridge-hub-metadata.bin b/control/runtimes/bridge-hub-paseo/bridge-hub-metadata.bin index 44ff98ef802a6f3d55df5dbeb6a8c3844c1057da..b34a5c2fb1c4d73af8b0d1ebb8dc27ceda10c2d0 100644 GIT binary patch delta 19398 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 OY=E)es#F}aO8*V_)XKB~ delta 14793 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 diff --git a/control/runtimes/paseo/polkadot-metadata.bin b/control/runtimes/paseo/polkadot-metadata.bin index 53bb1448f451b7f79f4d5f815cb5a92ddc709262..241a943a6e9167e929d8e3ae0c8528d84f58a2a1 100644 GIT binary patch delta 24168 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 delta 18369 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