From 01b97f37883c679fa888bad6a293eed5fbdb2bce Mon Sep 17 00:00:00 2001 From: Alistair Singh Date: Sat, 26 Oct 2024 01:12:29 +0200 Subject: [PATCH 1/6] add hydra and moonbeam --- web/packages/api/src/environment.ts | 59 ++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/web/packages/api/src/environment.ts b/web/packages/api/src/environment.ts index ca8785f4e0..5a31906e4f 100644 --- a/web/packages/api/src/environment.ts +++ b/web/packages/api/src/environment.ts @@ -283,7 +283,7 @@ export const SNOWBRIDGE_ENV: { [id: string]: SnowbridgeEnvironment } = { id: "ethereum", name: "Ethereum", type: "ethereum", - destinationIds: ["assethub", "mythos", "bifrost"], + destinationIds: ["assethub", "mythos", "bifrost", "hydradx", "moonbeam"], erc20tokensReceivable: [ { id: "WETH", @@ -455,6 +455,63 @@ export const SNOWBRIDGE_ENV: { [id: string]: SnowbridgeEnvironment } = { }, ], }, + { + id: "hydradx", + name: "Hydration", + type: "substrate", + destinationIds: [], + paraInfo: { + paraId: 2034, + destinationFeeDOT: 100_000_000n, + skipExistentialDepositCheck: true, + addressType: "32byte", + decimals: 12, + maxConsumers: 16, + }, + erc20tokensReceivable: [ + { + id: "WETH", + address: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", + minimumTransferAmount: 1n, + }, + { + id: "WBTC", + address: "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599", + minimumTransferAmount: 1n, + }, + ], + }, + { + id: "moonbeam", + name: "Moonbeam", + type: "substrate", + destinationIds: [], + paraInfo: { + paraId: 2004, + destinationFeeDOT: 100_000_000n, + skipExistentialDepositCheck: false, + addressType: "20byte", + decimals: 18, + maxConsumers: 16, + }, + erc20tokensReceivable: [ + { + id: "WETH", + address: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", + minimumTransferAmount: 1n, + }, + { + id: "WBTC", + address: "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599", + minimumTransferAmount: 1n, + }, + { + id: "wstETH", + address: "0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0", + minimumTransferAmount: 1n, + }, + ], + }, ], config: { BEACON_HTTP_API: "https://lodestar-mainnet.chainsafe.io", From 1c00f4d656e71f78f1a9f1be2296b075721216cd Mon Sep 17 00:00:00 2001 From: Alistair Singh Date: Sun, 27 Oct 2024 02:30:41 +0200 Subject: [PATCH 2/6] update fees and minimums --- web/packages/api/src/environment.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web/packages/api/src/environment.ts b/web/packages/api/src/environment.ts index 5a31906e4f..7fe4ae9de0 100644 --- a/web/packages/api/src/environment.ts +++ b/web/packages/api/src/environment.ts @@ -472,7 +472,7 @@ export const SNOWBRIDGE_ENV: { [id: string]: SnowbridgeEnvironment } = { { id: "WETH", address: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", - minimumTransferAmount: 1n, + minimumTransferAmount: 15_000_000_000_000n, }, { id: "WBTC", @@ -498,7 +498,7 @@ export const SNOWBRIDGE_ENV: { [id: string]: SnowbridgeEnvironment } = { { id: "WETH", address: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", - minimumTransferAmount: 1n, + minimumTransferAmount: 15_000_000_000_000n, }, { id: "WBTC", From c10b242292b8bd480279302d6c1d09056e558ae6 Mon Sep 17 00:00:00 2001 From: Alistair Singh Date: Wed, 30 Oct 2024 23:46:57 +0200 Subject: [PATCH 3/6] add paseo parachains --- web/packages/api/src/environment.ts | 73 ++++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/web/packages/api/src/environment.ts b/web/packages/api/src/environment.ts index 7fe4ae9de0..90a956326d 100644 --- a/web/packages/api/src/environment.ts +++ b/web/packages/api/src/environment.ts @@ -180,7 +180,7 @@ export const SNOWBRIDGE_ENV: { [id: string]: SnowbridgeEnvironment } = { id: "ethereum", name: "Ethereum", type: "ethereum", - destinationIds: ["assethub"], + destinationIds: ["assethub", "hydradx"], erc20tokensReceivable: [ { id: "WETH", @@ -220,6 +220,77 @@ export const SNOWBRIDGE_ENV: { [id: string]: SnowbridgeEnvironment } = { }, ], }, + { + id: "muse", + name: "Muse", + type: "substrate", + destinationIds: [], + paraInfo: { + paraId: 3369, + destinationFeeDOT: 500_000_000n, + skipExistentialDepositCheck: true, + addressType: "20byte", + decimals: 18, + maxConsumers: 16, + }, + erc20tokensReceivable: [ + // TODO: Register + { + id: "MYTH", + address: "0xb34a6924a02100ba6ef12af1c798285e8f7a16ee", + minimumTransferAmount: 10_000_000_000_000_000n, + }, + ], + }, + { + id: "bifrost", + name: "Bifrost", + type: "substrate", + destinationIds: [], + paraInfo: { + paraId: 2030, + destinationFeeDOT: 20_000_000n, + skipExistentialDepositCheck: false, + addressType: "32byte", + decimals: 12, + maxConsumers: 16, + }, + erc20tokensReceivable: [ + // TODO: Register + { + id: "WETH", + address: "0xfff9976782d46cc05630d1f6ebab18b2324d6b14", + minimumTransferAmount: 15_000_000_000_000n, + }, + ], + }, + { + id: "hydradx", + name: "Hydration", + type: "substrate", + destinationIds: [], + paraInfo: { + paraId: 2034, + destinationFeeDOT: 100_000_000n, + skipExistentialDepositCheck: true, + addressType: "32byte", + decimals: 12, + maxConsumers: 16, + }, + erc20tokensReceivable: [ + { + id: "WETH", + address: "0xfff9976782d46cc05630d1f6ebab18b2324d6b14", + minimumTransferAmount: 15_000_000_000_000n, + }, + // Todo fix registration + { + id: "WBTC", + address: "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599", + minimumTransferAmount: 1n, + }, + ], + }, ], config: { BEACON_HTTP_API: "https://lodestar-sepolia.chainsafe.io", From a9a3ea390155623028a98672e5122628bd97cd95 Mon Sep 17 00:00:00 2001 From: Alistair Singh Date: Thu, 31 Oct 2024 22:55:57 +0200 Subject: [PATCH 4/6] adds paseo environment --- web/packages/api/src/environment.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/web/packages/api/src/environment.ts b/web/packages/api/src/environment.ts index 90a956326d..eb5faf692d 100644 --- a/web/packages/api/src/environment.ts +++ b/web/packages/api/src/environment.ts @@ -283,12 +283,12 @@ export const SNOWBRIDGE_ENV: { [id: string]: SnowbridgeEnvironment } = { address: "0xfff9976782d46cc05630d1f6ebab18b2324d6b14", minimumTransferAmount: 15_000_000_000_000n, }, - // Todo fix registration - { - id: "WBTC", - address: "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599", - minimumTransferAmount: 1n, - }, + // Todo fix token metadata + //{ + // id: "WBTC", + // address: "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599", + // minimumTransferAmount: 1n, + //}, ], }, ], From 69a761909292dea9fcc3edd0c0283e4a1b569347 Mon Sep 17 00:00:00 2001 From: Alistair Singh Date: Mon, 2 Dec 2024 04:09:17 +0200 Subject: [PATCH 5/6] refactor context --- web/packages/api/src/assets.ts | 28 +- web/packages/api/src/environment.ts | 34 ++- web/packages/api/src/index.ts | 276 ++++++++++-------- web/packages/api/src/status.ts | 71 +++-- web/packages/api/src/subscan.ts | 8 +- web/packages/api/src/toEthereum.ts | 83 +++--- web/packages/api/src/toPolkadot.ts | 73 ++--- .../operations/src/global_transfer_history.ts | 30 +- web/packages/operations/src/main.ts | 1 - web/packages/operations/src/monitor.ts | 57 ++-- .../operations/src/transfer_to_ethereum.ts | 45 +-- .../operations/src/transfer_to_polkadot.ts | 45 +-- web/packages/operations/src/transfer_token.ts | 26 +- 13 files changed, 416 insertions(+), 361 deletions(-) diff --git a/web/packages/api/src/assets.ts b/web/packages/api/src/assets.ts index 77b5e8ebfc..435d075928 100644 --- a/web/packages/api/src/assets.ts +++ b/web/packages/api/src/assets.ts @@ -3,12 +3,18 @@ import { Codec, Registry } from "@polkadot/types/types" import { IERC20Metadata__factory, IERC20__factory } from "@snowbridge/contract-types" import { Context } from "./index" +/** + * @deprecated use Parachain.properties() + */ export interface NativeAsset { tokenSymbol: string tokenDecimal: number ss58Format: number } +/** + * @deprecated use Parachain.properties() + */ export const parachainNativeAsset = async (api: ApiPromise): Promise => { const properties = await api.rpc.system.properties() const tokenSymbols = properties.tokenSymbol.unwrapOrDefault() @@ -42,22 +48,26 @@ export const assetStatusInfo = async ( tokenAddress: string, ownerAddress?: string ) => { + const assetHub = (await context.assetHub()).api + const ethereum = context.ethereum() + const gateway = context.gateway() + let [ethereumNetwork, isTokenRegistered] = await Promise.all([ - context.ethereum.api.getNetwork(), - context.ethereum.contracts.gateway.isTokenRegistered(tokenAddress), + ethereum.getNetwork(), + gateway.isTokenRegistered(tokenAddress), ]) const ethereumChainId = ethereumNetwork.chainId const multiLocation = erc20TokenToAssetLocation( - context.polkadot.api.assetHub.registry, + assetHub.registry, ethereumChainId, tokenAddress ) const foreignAsset = ( - await context.polkadot.api.assetHub.query.foreignAssets.asset(multiLocation) + await assetHub.query.foreignAssets.asset(multiLocation) ).toPrimitive() as { status: "Live" } - const tokenContract = IERC20__factory.connect(tokenAddress, context.ethereum.api) + const tokenContract = IERC20__factory.connect(tokenAddress, ethereum) let ownerBalance = BigInt(0) let tokenGatewayAllowance = BigInt(0) let isValidERC20 = true @@ -94,8 +104,9 @@ export const assetErc20Balance = async ( balance: bigint gatewayAllowance: bigint }> => { - const tokenContract = IERC20__factory.connect(token, context.ethereum.api) - const gateway = await context.ethereum.contracts.gateway.getAddress() + const ethereum = context.ethereum() + const tokenContract = IERC20__factory.connect(token, ethereum) + const gateway = await context.gateway().getAddress() const [balance, gatewayAllowance] = await Promise.all([ tokenContract.balanceOf(owner), tokenContract.allowance(owner, gateway), @@ -116,7 +127,8 @@ export const assetErc20Metadata = async ( context: Context, tokenAddress: string ): Promise => { - const tokenMetadata = IERC20Metadata__factory.connect(tokenAddress, context.ethereum.api) + const ethereum = context.ethereum() + const tokenMetadata = IERC20Metadata__factory.connect(tokenAddress, ethereum) const [name, symbol, decimals] = await Promise.all([ tokenMetadata.name(), tokenMetadata.symbol(), diff --git a/web/packages/api/src/environment.ts b/web/packages/api/src/environment.ts index eb5faf692d..e64fdeb961 100644 --- a/web/packages/api/src/environment.ts +++ b/web/packages/api/src/environment.ts @@ -2,8 +2,6 @@ export type Config = { BEACON_HTTP_API: string ETHEREUM_API: (secret: string) => string RELAY_CHAIN_URL: string - ASSET_HUB_URL: string - BRIDGE_HUB_URL: string GATEWAY_CONTRACT: string BEEFY_CONTRACT: string ASSET_HUB_PARAID: number @@ -11,7 +9,7 @@ export type Config = { PRIMARY_GOVERNANCE_CHANNEL_ID: string SECONDARY_GOVERNANCE_CHANNEL_ID: string RELAYERS: Relayer[] - PARACHAINS: string[] + PARACHAINS: { [paraId: number]: string } SUBSCAN_API?: { RELAY_CHAIN_URL: string ASSET_HUB_URL: string @@ -117,9 +115,11 @@ export const SNOWBRIDGE_ENV: { [id: string]: SnowbridgeEnvironment } = { BEACON_HTTP_API: "http://127.0.0.1:9596", ETHEREUM_API: () => "ws://127.0.0.1:8546", RELAY_CHAIN_URL: "ws://127.0.0.1:9944", - ASSET_HUB_URL: "ws://127.0.0.1:12144", - BRIDGE_HUB_URL: "ws://127.0.0.1:11144", - PARACHAINS: ["ws://127.0.0.1:13144"], + PARACHAINS: { + 1000: "ws://127.0.0.1:12144", + 1002: "ws://127.0.0.1:11144", + 2000: "ws://127.0.0.1:13144", + }, GATEWAY_CONTRACT: "0xEDa338E4dC46038493b885327842fD3E301CaB39", BEEFY_CONTRACT: "0x992B9df075935E522EC7950F37eC8557e86f6fdb", ASSET_HUB_PARAID: 1000, @@ -296,9 +296,10 @@ export const SNOWBRIDGE_ENV: { [id: string]: SnowbridgeEnvironment } = { BEACON_HTTP_API: "https://lodestar-sepolia.chainsafe.io", ETHEREUM_API: (key) => `https://eth-sepolia.g.alchemy.com/v2/${key}`, RELAY_CHAIN_URL: "wss://paseo-rpc.dwellir.com", - ASSET_HUB_URL: "wss://asset-hub-paseo-rpc.dwellir.com", - BRIDGE_HUB_URL: "wss://bridge-hub-paseo.dotters.network", - PARACHAINS: [], + PARACHAINS: { + 1000: "wss://asset-hub-paseo-rpc.dwellir.com", + 1002: "wss://bridge-hub-paseo.dotters.network", + }, GATEWAY_CONTRACT: "0x5a84b15B618beEE6F6285F6bd2bA20a08673e473", BEEFY_CONTRACT: "0xE7388f953f50d377D131350490156dB649E5DC10", ASSET_HUB_PARAID: 1000, @@ -588,9 +589,11 @@ export const SNOWBRIDGE_ENV: { [id: string]: SnowbridgeEnvironment } = { BEACON_HTTP_API: "https://lodestar-mainnet.chainsafe.io", ETHEREUM_API: (key) => `https://eth-mainnet.g.alchemy.com/v2/${key}`, RELAY_CHAIN_URL: "https://polkadot-rpc.dwellir.com", - ASSET_HUB_URL: "wss://asset-hub-polkadot-rpc.dwellir.com", - BRIDGE_HUB_URL: "https://bridge-hub-polkadot-rpc.dwellir.com", - PARACHAINS: ["https://polkadot-mythos-rpc.polkadot.io"], + PARACHAINS: { + 1000: "wss://asset-hub-polkadot-rpc.dwellir.com", + 1002: "https://bridge-hub-polkadot-rpc.dwellir.com", + 3369: "https://polkadot-mythos-rpc.polkadot.io", + }, GATEWAY_CONTRACT: "0x27ca963c279c93801941e1eb8799c23f407d68e7", BEEFY_CONTRACT: "0x6eD05bAa904df3DE117EcFa638d4CB84e1B8A00C", ASSET_HUB_PARAID: 1000, @@ -682,9 +685,10 @@ export const SNOWBRIDGE_ENV: { [id: string]: SnowbridgeEnvironment } = { BEACON_HTTP_API: "https://lodestar-sepolia.chainsafe.io", ETHEREUM_API: (key) => `https://eth-sepolia.g.alchemy.com/v2/${key}`, RELAY_CHAIN_URL: "https://westend-rpc.polkadot.io", - ASSET_HUB_URL: "wss://westend-asset-hub-rpc.polkadot.io", - BRIDGE_HUB_URL: "https://westend-bridge-hub-rpc.polkadot.io", - PARACHAINS: [], + PARACHAINS: { + 1000: "wss://westend-asset-hub-rpc.polkadot.io", + 1002: "https://westend-bridge-hub-rpc.polkadot.io", + }, GATEWAY_CONTRACT: "0x9ed8b47bc3417e3bd0507adc06e56e2fa360a4e9", BEEFY_CONTRACT: "0x6DFaD3D73A28c48E4F4c616ECda80885b415283a", ASSET_HUB_PARAID: 1000, diff --git a/web/packages/api/src/index.ts b/web/packages/api/src/index.ts index 22108da865..c74bb02ee8 100644 --- a/web/packages/api/src/index.ts +++ b/web/packages/api/src/index.ts @@ -14,12 +14,10 @@ interface Config { beacon_url: string } polkadot: { - url: { - bridgeHub: string - assetHub: string - relaychain: string - parachains?: string[] - } + assetHubParaId: number + bridgeHubParaId: number + relaychain: string + parachains: { [paraId: number]: string } } appContracts: { gateway: string @@ -28,142 +26,184 @@ interface Config { graphqlApiUrl?: string } -interface AppContracts { - gateway: IGateway - beefyClient: BeefyClient +export interface ChainProperties { + tokenSymbol: string + tokenDecimal: number + ss58Format: number + isEthereum: boolean } -export class Context { - config: Config - ethereum: EthereumContext - polkadot: PolkadotContext +export interface SusbtrateChain { + get api(): ApiPromise + properties(): Promise +} - constructor(config: Config, ethereum: EthereumContext, polkadot: PolkadotContext) { - this.config = config - this.ethereum = ethereum - this.polkadot = polkadot +export interface Parachain extends SusbtrateChain { + get parachainId(): number + get isSystemParachain(): boolean +} + +export class SubstrateChain implements SusbtrateChain { + #api: ApiPromise + #properties?: ChainProperties + + constructor(api: ApiPromise) { + this.#api = api + } + async properties(): Promise { + if (this.#properties) { + return this.#properties + } + const properties = await this.#api.rpc.system.properties() + const tokenSymbols = properties.tokenSymbol.unwrapOrDefault() + const tokenDecimals = properties.tokenDecimals.unwrapOrDefault() + const isEthereum = properties.isEthereum.toPrimitive() + + return { + tokenSymbol: tokenSymbols.at(0)?.toString() ?? "DOT", + tokenDecimal: tokenDecimals.at(0)?.toNumber() ?? 10, + ss58Format: properties.ss58Format.unwrapOr(null)?.toNumber() ?? 42, + isEthereum: isEthereum, + } + } + + get api(): ApiPromise { + return this.#api } } -class EthereumContext { - api: AbstractProvider - contracts: AppContracts +export class GenericParachain extends SubstrateChain implements Parachain { + #parachainId: number - constructor(api: AbstractProvider, contracts: AppContracts) { - this.api = api - this.contracts = contracts + constructor(parachainId: number, api: ApiPromise) { + super(api) + this.#parachainId = parachainId + } + get isSystemParachain(): boolean { + return this.#parachainId < 2000 + } + + get parachainId(): number { + return this.#parachainId } } -type Parachains = { [paraId: number]: ApiPromise } - -class PolkadotContext { - api: { - relaychain: ApiPromise - assetHub: ApiPromise - bridgeHub: ApiPromise - parachains: Parachains - } - constructor( - relaychain: ApiPromise, - assetHub: ApiPromise, - bridgeHub: ApiPromise, - parachains: Parachains - ) { - this.api = { - relaychain: relaychain, - assetHub: assetHub, - bridgeHub: bridgeHub, - parachains: parachains, +export class Context { + config: Config + + // Ethereum + #ethereum?: AbstractProvider + #gateway?: IGateway + #beefyClient?: BeefyClient + + // Substrate + #parachains: { [paraId: number]: GenericParachain } + #relaychain?: SubstrateChain + + constructor(config: Config) { + this.config = config + this.#parachains = {} + } + + async relaychain(): Promise { + if (this.#relaychain) { + return this.#relaychain } + const url = this.config.polkadot.relaychain + const api = await ApiPromise.create({ + provider: url.startsWith("http") ? new HttpProvider(url) : new WsProvider(url), + }) + this.#relaychain = new SubstrateChain(api) + return this.#relaychain } -} -export const contextFactory = async (config: Config): Promise => { - let ethApi: AbstractProvider - if (typeof config.ethereum.execution_url === "string") { - if (config.ethereum.execution_url.startsWith("http")) { - ethApi = new JsonRpcProvider(config.ethereum.execution_url) - } else { - ethApi = new WebSocketProvider(config.ethereum.execution_url) + async assetHub(): Promise { + return this.parachain(this.config.polkadot.assetHubParaId) + } + + bridgeHub(): Promise { + return this.parachain(this.config.polkadot.bridgeHubParaId) + } + + hasParachain(paraId: number): boolean { + return paraId in this.config.polkadot.parachains + } + + parachains(): number[] { + return Object.keys(this.config.polkadot.parachains).map((key) => Number(key)) + } + + async parachain(paraId: number): Promise { + if (paraId in this.#parachains) { + return this.#parachains[paraId] } - } else { - ethApi = config.ethereum.execution_url - } - - const parasConnect: Promise<{ paraId: number; api: ApiPromise }>[] = [] - for (const parachain of config.polkadot.url.parachains ?? []) { - parasConnect.push(addParachainConnection(parachain)) - } - - const [relaychainApi, assetHubApi, bridgeHubApi] = await Promise.all([ - ApiPromise.create({ - provider: config.polkadot.url.relaychain.startsWith("http") - ? new HttpProvider(config.polkadot.url.relaychain) - : new WsProvider(config.polkadot.url.relaychain), - }), - ApiPromise.create({ - provider: config.polkadot.url.assetHub.startsWith("http") - ? new HttpProvider(config.polkadot.url.assetHub) - : new WsProvider(config.polkadot.url.assetHub), - }), - ApiPromise.create({ - provider: config.polkadot.url.bridgeHub.startsWith("http") - ? new HttpProvider(config.polkadot.url.bridgeHub) - : new WsProvider(config.polkadot.url.bridgeHub), - }), - ]) - - const paras = await Promise.all(parasConnect) - const parachains: Parachains = {} - for (const { paraId, api } of paras) { + const { parachains } = this.config.polkadot if (paraId in parachains) { - throw new Error(`${paraId} already added.`) + const url = parachains[paraId] + const api = await ApiPromise.create({ + provider: url.startsWith("http") ? new HttpProvider(url) : new WsProvider(url), + }) + const onChainParaId = ( + await api.query.parachainInfo.parachainId() + ).toPrimitive() as number + console.warn( + `Parachain id configured does not match onchain value. Configured = ${paraId}, OnChain=${onChainParaId}` + ) + this.#parachains[onChainParaId] = new GenericParachain(onChainParaId, api) + return this.#parachains[onChainParaId] + } else { + throw Error(`Parachain id ${paraId} not in the list of parachain urls.`) } - parachains[paraId] = api } - const gatewayAddr = config.appContracts.gateway - const beefyAddr = config.appContracts.beefy - - const appContracts: AppContracts = { - //TODO: Get gateway address from bridgehub - gateway: IGateway__factory.connect(gatewayAddr, ethApi), - //TODO: Get beefy client from gateway - beefyClient: BeefyClient__factory.connect(beefyAddr, ethApi), - } + ethereum(): AbstractProvider { + if (this.#ethereum) { + return this.#ethereum + } - const ethCtx = new EthereumContext(ethApi, appContracts) - const polCtx = new PolkadotContext(relaychainApi, assetHubApi, bridgeHubApi, parachains) + const { config } = this - const context = new Context(config, ethCtx, polCtx) - await Promise.all(parasConnect) - return context -} + if (typeof config.ethereum.execution_url === "string") { + if (config.ethereum.execution_url.startsWith("http")) { + this.#ethereum = new JsonRpcProvider(config.ethereum.execution_url) + } else { + this.#ethereum = new WebSocketProvider(config.ethereum.execution_url) + } + } else { + this.#ethereum = this.config.ethereum.execution_url as AbstractProvider + } -export const addParachainConnection = async (url: string) => { - const api = await ApiPromise.create({ - provider: url.startsWith("http") ? new HttpProvider(url) : new WsProvider(url), - }) - const paraId = (await api.query.parachainInfo.parachainId()).toPrimitive() as number - console.log(`${url} added with parachain id: ${paraId}`) - return { paraId, api } -} + return this.#ethereum + } -export const destroyContext = async (context: Context): Promise => { - // clean up etheruem - await context.ethereum.contracts.beefyClient.removeAllListeners() - await context.ethereum.contracts.gateway.removeAllListeners() - if (typeof context.config.ethereum.execution_url === "string") { - context.ethereum.api.destroy() + gateway(): IGateway { + if (this.#gateway) { + return this.#gateway + } + return IGateway__factory.connect(this.config.appContracts.gateway, this.ethereum()) } - // clean up polkadot - await context.polkadot.api.relaychain.disconnect() - await context.polkadot.api.bridgeHub.disconnect() - await context.polkadot.api.assetHub.disconnect() + beefyClient(): BeefyClient { + if (this.#beefyClient) { + return this.#beefyClient + } + return BeefyClient__factory.connect(this.config.appContracts.beefy, this.ethereum()) + } + + async destroyContext(): Promise { + // clean up etheruem + if (typeof this.config.ethereum.execution_url === "string" && this.#ethereum) { + await this.beefyClient().removeAllListeners() + await this.gateway().removeAllListeners() + this.ethereum().destroy() + } + // clean up polkadot + if (this.#relaychain) { + await this.#relaychain.api.disconnect() + } - for (const paraId of Object.keys(context.polkadot.api.parachains)) { - await context.polkadot.api.parachains[Number(paraId)].disconnect() + for (const paraId of Object.keys(this.#parachains)) { + await this.#parachains[Number(paraId)].api.disconnect() + } } } diff --git a/web/packages/api/src/status.ts b/web/packages/api/src/status.ts index 47dbead06b..aebc11498f 100644 --- a/web/packages/api/src/status.ts +++ b/web/packages/api/src/status.ts @@ -77,20 +77,24 @@ export const bridgeStatusInfo = async ( } ): Promise => { // Beefy status - const latestBeefyBlock = Number(await context.ethereum.contracts.beefyClient.latestBeefyBlock()) - const latestPolkadotBlock = ( - await context.polkadot.api.relaychain.query.system.number() - ).toPrimitive() as number - const latestBeaconSlot = await context.ethereum.api.getBlockNumber() + const beefyClient = context.beefyClient() + const gateway = context.gateway() + const ethereum = context.ethereum() + const relaychain = (await context.relaychain()).api + const bridgeHub = (await context.bridgeHub()).api + + const latestBeefyBlock = Number(await beefyClient.latestBeefyBlock()) + const latestPolkadotBlock = (await relaychain.query.system.number()).toPrimitive() as number + const latestBeaconSlot = await ethereum.getBlockNumber() const latestFinalizedBeefyBlock = ( - await context.polkadot.api.relaychain.rpc.chain.getHeader( - (await context.polkadot.api.relaychain.rpc.beefy.getFinalizedHead()).toU8a() + await relaychain.rpc.chain.getHeader( + (await relaychain.rpc.beefy.getFinalizedHead()).toU8a() ) ).number.toNumber() const beefyBlockLatency = latestFinalizedBeefyBlock - latestBeefyBlock const beefyLatencySeconds = beefyBlockLatency * options.polkadotBlockTimeInSeconds const previousBeefyBlock = Number( - await context.ethereum.contracts.beefyClient.latestBeefyBlock({ + await beefyClient.latestBeefyBlock({ blockTag: latestBeaconSlot > options.toEthereumCheckIntervalInBlock ? latestBeaconSlot - options.toEthereumCheckIntervalInBlock @@ -104,7 +108,7 @@ export const bridgeStatusInfo = async ( fetchBeaconSlot(context.config.ethereum.beacon_url, "head"), ]) const latestBeaconBlockRoot = ( - await context.polkadot.api.bridgeHub.query.ethereumBeaconClient.latestFinalizedBlockRoot() + await bridgeHub.query.ethereumBeaconClient.latestFinalizedBlockRoot() ).toHex() const latestBeaconBlockOnPolkadot = Number( (await fetchBeaconSlot(context.config.ethereum.beacon_url, latestBeaconBlockRoot)).data @@ -112,15 +116,13 @@ export const bridgeStatusInfo = async ( ) const beaconBlockLatency = latestBeaconBlock.data.message.slot - latestBeaconBlockOnPolkadot const beaconLatencySeconds = beaconBlockLatency * options.ethereumBlockTimeInSeconds - const latestBridgeHubBlock = ( - await context.polkadot.api.bridgeHub.query.system.number() - ).toPrimitive() as number - const previousBridgeHubBlock = await context.polkadot.api.bridgeHub.query.system.blockHash( + const latestBridgeHubBlock = (await bridgeHub.query.system.number()).toPrimitive() as number + const previousBridgeHubBlock = await bridgeHub.query.system.blockHash( latestBridgeHubBlock > options.toPolkadotCheckIntervalInBlock ? latestBridgeHubBlock - options.toPolkadotCheckIntervalInBlock : 10 ) - const bridgeHubApiAt = await context.polkadot.api.bridgeHub.at(previousBridgeHubBlock.toU8a()) + const bridgeHubApiAt = await bridgeHub.at(previousBridgeHubBlock.toU8a()) const previousBeaconBlockRoot = await bridgeHubApiAt.query.ethereumBeaconClient.latestFinalizedBlockRoot() const previousBeaconBlock = Number( @@ -129,15 +131,15 @@ export const bridgeStatusInfo = async ( ) // Operating mode - const ethereumOperatingMode = await context.ethereum.contracts.gateway.operatingMode() + const ethereumOperatingMode = await gateway.operatingMode() const beaconOperatingMode = ( - await context.polkadot.api.bridgeHub.query.ethereumBeaconClient.operatingMode() + await bridgeHub.query.ethereumBeaconClient.operatingMode() ).toPrimitive() const inboundOperatingMode = ( - await context.polkadot.api.bridgeHub.query.ethereumInboundQueue.operatingMode() + await bridgeHub.query.ethereumInboundQueue.operatingMode() ).toPrimitive() const outboundOperatingMode = ( - await context.polkadot.api.bridgeHub.query.ethereumOutboundQueue.operatingMode() + await bridgeHub.query.ethereumOutboundQueue.operatingMode() ).toPrimitive() return { @@ -176,33 +178,38 @@ export const channelStatusInfo = async ( toEthereumCheckIntervalInBlock: 2400, } ): Promise => { - const [inbound_nonce_eth, outbound_nonce_eth] = - await context.ethereum.contracts.gateway.channelNoncesOf(channelId) - const operatingMode = await context.ethereum.contracts.gateway.channelOperatingModeOf(channelId) + const beefyClient = context.beefyClient() + const gateway = context.gateway() + const ethereum = context.ethereum() + const relaychain = (await context.relaychain()).api + const bridgeHub = (await context.bridgeHub()).api + + const [inbound_nonce_eth, outbound_nonce_eth] = await gateway.channelNoncesOf(channelId) + const operatingMode = await gateway.channelOperatingModeOf(channelId) const inbound_nonce_sub = ( - await context.polkadot.api.bridgeHub.query.ethereumInboundQueue.nonce(channelId) + await bridgeHub.query.ethereumInboundQueue.nonce(channelId) ).toPrimitive() as number const outbound_nonce_sub = ( - await context.polkadot.api.bridgeHub.query.ethereumOutboundQueue.nonce(channelId) + await bridgeHub.query.ethereumOutboundQueue.nonce(channelId) ).toPrimitive() as number - const latestEthereumBlock = await context.ethereum.api.getBlockNumber() - const [previous_inbound_nonce_eth, previous_outbound_nonce_eth] = - await context.ethereum.contracts.gateway.channelNoncesOf(channelId, { + const latestEthereumBlock = await ethereum.getBlockNumber() + const [previous_inbound_nonce_eth, previous_outbound_nonce_eth] = await gateway.channelNoncesOf( + channelId, + { blockTag: latestEthereumBlock > options.toEthereumCheckIntervalInBlock ? latestEthereumBlock - options.toEthereumCheckIntervalInBlock : 100, - }) - const latestBridgeHubBlock = ( - await context.polkadot.api.bridgeHub.query.system.number() - ).toPrimitive() as number - const previousBridgeHubBlock = await context.polkadot.api.bridgeHub.query.system.blockHash( + } + ) + const latestBridgeHubBlock = (await bridgeHub.query.system.number()).toPrimitive() as number + const previousBridgeHubBlock = await bridgeHub.query.system.blockHash( latestBridgeHubBlock > options.toPolkadotCheckIntervalInBlock ? latestBridgeHubBlock - options.toPolkadotCheckIntervalInBlock : 10 ) - const bridgeHubApiAt = await context.polkadot.api.bridgeHub.at(previousBridgeHubBlock.toU8a()) + const bridgeHubApiAt = await bridgeHub.at(previousBridgeHubBlock.toU8a()) const previous_inbound_nonce_sub = ( await bridgeHubApiAt.query.ethereumInboundQueue.nonce(channelId) ).toPrimitive() as number diff --git a/web/packages/api/src/subscan.ts b/web/packages/api/src/subscan.ts index 3e65f34d00..6cdd86b29b 100644 --- a/web/packages/api/src/subscan.ts +++ b/web/packages/api/src/subscan.ts @@ -50,7 +50,11 @@ export const createApi = (baseUrl: string, apiKey: string, options = { limit: 1 redirect: "follow", } - if (rateLimit.remaining === 0 && rateLimit.retryAfter !== null && rateLimit.retryAfter > 0) { + if ( + rateLimit.remaining === 0 && + rateLimit.retryAfter !== null && + rateLimit.retryAfter > 0 + ) { console.log("Being rate limited: retryAfter", rateLimit) await sleepMs(rateLimit.retryAfter * 1000) } @@ -154,7 +158,7 @@ export const fetchEvents = async ( for (const { event_index, params } of paramsResponse.json.data) { if (params === undefined) { console.warn("Event does not have any params", event_index) - continue; + continue } const event = map.get(event_index) diff --git a/web/packages/api/src/toEthereum.ts b/web/packages/api/src/toEthereum.ts index a4ff051030..7f2d4c3633 100644 --- a/web/packages/api/src/toEthereum.ts +++ b/web/packages/api/src/toEthereum.ts @@ -88,11 +88,7 @@ export const getSendFee = async ( defaultFee: 2_750_872_500_000n, } ) => { - const { - polkadot: { - api: { assetHub }, - }, - } = context + const assetHub = (await context.assetHub()).api // Fees stored in 0x5fbc5c7ba58845ad1f1a9a7c5bc12fad const feeStorageKey = xxhashAsHex(":BridgeHubEthereumBaseFee:", 128, true) const feeStorageItem = await assetHub.rpc.state.getStorage(feeStorageKey) @@ -110,11 +106,9 @@ export const validateSend = async ( validateOptions: Partial = {} ): Promise => { const options = { ...ValidateOptionDefaults, ...validateOptions } - const { - polkadot: { - api: { assetHub, bridgeHub, relaychain, parachains }, - }, - } = context + const assetHub = (await context.assetHub()).api + const bridgeHub = (await context.bridgeHub()).api + const relaychain = (await context.relaychain()).api const errors: SendValidationError[] = [] @@ -152,13 +146,13 @@ export const validateSend = async ( let parachainHasPalletXcm = true let hrmpChannelSetup = true let sourceParachain = undefined - let parachainKnownToContext = true let assetBalance = 0n let hasAsset = false + + let parachainKnownToContext = context.hasParachain(sourceParachainId) if (parachainKnownToContext && sourceParachainId != assetHubParaIdDecoded) { - parachainKnownToContext = sourceParachainId in parachains - parachainHasPalletXcm = - parachains[sourceParachainId].tx.polkadotXcm.transferAssets !== undefined + const parachainApi = (await context.parachain(sourceParachainId)).api + parachainHasPalletXcm = parachainApi.tx.polkadotXcm.transferAssets !== undefined let [hrmpChannel, sourceParachainHead] = await Promise.all([ relaychain.query.hrmp.hrmpChannels({ sender: sourceParachainId, @@ -174,7 +168,7 @@ export const validateSend = async ( if (foreignAssetExists) { assetBalance = (await palletAssetsBalance( - parachains[sourceParachainId], + parachainApi, assetInfo.multiLocation, signer.address, "foreignAssets" @@ -214,8 +208,8 @@ export const validateSend = async ( message: "Asset balance insufficient for transfer.", }) - const bridgeStatus = await bridgeStatusInfo(context); - + const bridgeStatus = await bridgeStatusInfo(context) + const bridgeOperational = bridgeStatus.toEthereum.operatingMode.outbound === "Normal" const lightClientLatencyIsAcceptable = bridgeStatus.toEthereum.latencySeconds < options.acceptableLatencyInSeconds @@ -359,12 +353,10 @@ export const send = async ( scanBlocks: 100, } ): Promise => { - const { - polkadot: { - api: { assetHub, bridgeHub, parachains, relaychain }, - }, - ethereum, - } = context + const assetHub = (await context.assetHub()).api + const bridgeHub = (await context.bridgeHub()).api + const relaychain = (await context.relaychain()).api + const ethereum = context.ethereum() if (!plan.success) { throw Error("plan failed") } @@ -392,7 +384,7 @@ export const send = async ( let pResult = undefined if (plan.success.sourceParachain) { // TODO: Support orml xtokens - let parachainApi = parachains[plan.success.sourceParachain.paraId] + let parachainApi = (await context.parachain(plan.success.sourceParachain.paraId)).api const dotLocation = parachainApi.createType("StagingXcmV3MultiLocation", { parents: 1, interior: "Here", @@ -504,7 +496,7 @@ export const send = async ( const [bridgeHubHead, ethereumHead, relaychainHead] = await Promise.all([ bridgeHub.rpc.chain.getFinalizedHead(), - ethereum.api.getBlock("finalized"), + ethereum.getBlock("finalized"), relaychain.rpc.chain.getFinalizedHead(), ]) @@ -623,15 +615,12 @@ export const trackSendProgressPolling = async ( scanBlocks: 600, } ): Promise<{ status: "success" | "pending"; result: SendResult }> => { - const { - polkadot: { - api: { relaychain, bridgeHub }, - }, - ethereum, - ethereum: { - contracts: { beefyClient, gateway }, - }, - } = context + const bridgeHub = (await context.bridgeHub()).api + const relaychain = (await context.relaychain()).api + const ethereum = context.ethereum() + const beefyClient = context.beefyClient() + const gateway = context.gateway() + const { success } = result if (result.failure || !success || !success.plan.success) { @@ -645,9 +634,9 @@ export const trackSendProgressPolling = async ( await bridgeHub.rpc.chain.getHeader(success.bridgeHub.submittedAtHash) ).number.toNumber() + 1, ethereumBeefyClient: - (await ethereum.api.getBlock(success.ethereum.submittedAtHash))?.number ?? 0 + 1, + (await ethereum.getBlock(success.ethereum.submittedAtHash))?.number ?? 0 + 1, ethereumMessageDispatched: - (await ethereum.api.getBlock(success.ethereum.submittedAtHash))?.number ?? 0 + 1, + (await ethereum.getBlock(success.ethereum.submittedAtHash))?.number ?? 0 + 1, } } @@ -701,7 +690,7 @@ export const trackSendProgressPolling = async ( const NewMMRRootEvent = beefyClient.getEvent("NewMMRRoot") const from = success.polling.ethereumBeefyClient - let to = (await ethereum.api.getBlockNumber()) ?? 0 + let to = (await ethereum.getBlockNumber()) ?? 0 if (from - to > options.scanBlocks) { to = from + options.scanBlocks } @@ -743,7 +732,7 @@ export const trackSendProgressPolling = async ( const InboundMessageDispatched = gateway.getEvent("InboundMessageDispatched") const from = success.polling.ethereumMessageDispatched - let to = (await ethereum.api.getBlockNumber()) ?? 0 + let to = (await ethereum.getBlockNumber()) ?? 0 if (from - to > options.scanBlocks) { to = from + options.scanBlocks } @@ -787,15 +776,11 @@ export async function* trackSendProgress( scanBlocks: 200, } ): AsyncGenerator { - const { - polkadot: { - api: { relaychain, bridgeHub }, - }, - ethereum, - ethereum: { - contracts: { beefyClient, gateway }, - }, - } = context + const bridgeHub = (await context.bridgeHub()).api + const relaychain = (await context.relaychain()).api + const ethereum = context.ethereum() + const beefyClient = context.beefyClient() + const gateway = context.gateway() const { success } = result if (result.failure || !success || !success.plan.success) { @@ -856,7 +841,7 @@ export async function* trackSendProgress( } beefyClient.on(NewMMRRootEvent, listener) }) - success.ethereum.beefyBlockNumber = await ethereum.api.getBlockNumber() + success.ethereum.beefyBlockNumber = await ethereum.getBlockNumber() } yield `Included in BEEFY Light client block ${success.ethereum.beefyBlockNumber}. Waiting for message to be delivered.` @@ -883,7 +868,7 @@ export async function* trackSendProgress( } gateway.on(InboundMessageDispatched, listener) }) - success.ethereum.transferBlockNumber = await ethereum.api.getBlockNumber() + success.ethereum.transferBlockNumber = await ethereum.getBlockNumber() } if (success.ethereum.messageDispatchSuccess) { yield `Transfer complete in Ethereum block ${success.ethereum.transferBlockNumber}.` diff --git a/web/packages/api/src/toPolkadot.ts b/web/packages/api/src/toPolkadot.ts index 5c628b03ae..2277dc68b7 100644 --- a/web/packages/api/src/toPolkadot.ts +++ b/web/packages/api/src/toPolkadot.ts @@ -112,12 +112,9 @@ export const getSendFee = async ( destinationParaId: number, destinationFee: bigint ): Promise => { - const { - ethereum: { - contracts: { gateway }, - }, - } = context - return await gateway.quoteSendTokenFee(tokenAddress, destinationParaId, destinationFee) + return await context + .gateway() + .quoteSendTokenFee(tokenAddress, destinationParaId, destinationFee) } export const getSubstrateAccount = async (parachain: ApiPromise, beneficiaryHex: string) => { @@ -139,12 +136,11 @@ export const validateSend = async ( validateOptions: Partial = {} ): Promise => { const options = { ...ValidateOptionDefaults, ...validateOptions } - const { - ethereum, - polkadot: { - api: { assetHub, bridgeHub, relaychain, parachains }, - }, - } = context + const assetHub = (await context.assetHub()).api + const bridgeHub = (await context.bridgeHub()).api + const relaychain = (await context.relaychain()).api + const ethereum = context.ethereum() + const parachains = context.parachains() const sourceAddress = await source.getAddress() @@ -188,7 +184,7 @@ export const validateSend = async ( let ethereumBalance = 0n let canPayFee = false if (assetInfo.isTokenRegistered) { - ethereumBalance = await ethereum.api.getBalance(sourceAddress) + ethereumBalance = await ethereum.getBalance(sourceAddress) fee = await getSendFee(context, tokenAddress, destinationParaId, destinationFee) canPayFee = fee < ethereumBalance } @@ -245,13 +241,12 @@ export const validateSend = async ( hrmpChannelSetup = hrmpChannel.toPrimitive() !== null if (destinationParaId in parachains) { + const destinationParachainId = (await context.parachain(destinationParaId)).api existentialDeposit = BigInt( - parachains[ - destinationParaId - ].consts.balances.existentialDeposit.toPrimitive() as number + destinationParachainId.consts.balances.existentialDeposit.toPrimitive() as number ) const { balance, consumers } = await getSubstrateAccount( - parachains[destinationParaId], + destinationParachainId, beneficiaryHex ) beneficiaryAccountExists = @@ -287,8 +282,8 @@ export const validateSend = async ( }) let destinationParachain = undefined - if (destinationParaId in context.polkadot.api.parachains) { - const destParaApi = context.polkadot.api.parachains[destinationParaId] + if (destinationParaId in parachains) { + const destParaApi = (await context.parachain(destinationParaId)).api destinationParachain = { validatedAtHash: u8aToHex(await destParaApi.rpc.chain.getFinalizedHead()), } @@ -412,11 +407,8 @@ export const send = async ( plan: SendValidationResult, confirmations = 1 ): Promise => { - const { - polkadot: { - api: { assetHub, bridgeHub }, - }, - } = context + const assetHub = (await context.assetHub()).api + const bridgeHub = (await context.bridgeHub()).api const { success } = plan if (plan.failure || !success) { @@ -494,8 +486,8 @@ export const send = async ( const messageAccepted = events.find((log) => log.name === "OutboundMessageAccepted") let destinationParachain = undefined - if (success.destinationParaId in context.polkadot.api.parachains) { - const destParaApi = context.polkadot.api.parachains[success.destinationParaId] + if (success.destinationParaId in context.parachains) { + const destParaApi = (await context.parachain(success.destinationParaId)).api destinationParachain = { submittedAtHash: u8aToHex(await destParaApi.rpc.chain.getFinalizedHead()), } @@ -532,11 +524,8 @@ export const trackSendProgressPolling = async ( scanBlocks: 600, } ): Promise<{ status: "success" | "pending"; result: SendResult }> => { - const { - polkadot: { - api: { assetHub, bridgeHub, parachains }, - }, - } = context + const assetHub = (await context.assetHub()).api + const bridgeHub = (await context.bridgeHub()).api const { success } = result if (result.failure || !success || !success.plan.success) { @@ -547,11 +536,13 @@ export const trackSendProgressPolling = async ( let destinationMessageProcessed: number | undefined = undefined if ( success.destinationParachain !== undefined && - success.plan.success.destinationParaId in parachains + context.hasParachain(success.plan.success.destinationParaId) ) { + const destinationApi = (await context.parachain(success.plan.success.destinationParaId)) + .api destinationMessageProcessed = ( - await parachains[success.plan.success.destinationParaId].rpc.chain.getHeader( + await destinationApi.rpc.chain.getHeader( success.destinationParachain.submittedAtHash ) ).number.toNumber() + 1 @@ -731,12 +722,12 @@ export const trackSendProgressPolling = async ( if ( success.destinationParachain !== undefined && success.plan.success.assetHub.paraId !== success.plan.success.destinationParaId && - success.plan.success.destinationParaId in parachains && + context.hasParachain(success.plan.success.destinationParaId) && success.polling.destinationMessageProcessed !== undefined && success.destinationParachain.events === undefined && success.assetHub.extrinsicSuccess === true ) { - const destParaApi = parachains[success.plan.success.destinationParaId] + const destParaApi = (await context.parachain(success.plan.success.destinationParaId)).api let extrinsicSuccess = false let messageQueueProcessedAt console.log( @@ -784,11 +775,8 @@ export async function* trackSendProgress( scanBlocks: 200, } ): AsyncGenerator { - const { - polkadot: { - api: { assetHub, bridgeHub, parachains }, - }, - } = context + const assetHub = (await context.assetHub()).api + const bridgeHub = (await context.bridgeHub()).api const { success } = result if (result.failure || !success || !success.plan.success) { @@ -936,12 +924,13 @@ export async function* trackSendProgress( if (success.destinationParachain !== undefined) { if ( success.plan.success.assetHub.paraId !== success.plan.success.destinationParaId && - success.plan.success.destinationParaId in parachains && + context.hasParachain(success.plan.success.destinationParaId) && success.destinationParachain.events === undefined ) { yield `Waiting for delivery to destination parachain ${success.plan.success.destinationParaId}` - const destParaApi = parachains[success.plan.success.destinationParaId] + const destParaApi = (await context.parachain(success.plan.success.destinationParaId)) + .api const issuedTo = success.plan?.success.beneficiaryAddress const { allEvents: receivedEvents, extrinsicSuccess } = await waitForMessageQueuePallet( diff --git a/web/packages/operations/src/global_transfer_history.ts b/web/packages/operations/src/global_transfer_history.ts index e936b1f21f..9e72a69724 100644 --- a/web/packages/operations/src/global_transfer_history.ts +++ b/web/packages/operations/src/global_transfer_history.ts @@ -1,4 +1,4 @@ -import { contextFactory, destroyContext, environment, subscan, history } from "@snowbridge/api" +import { environment, subscan, history, Context } from "@snowbridge/api" import { BeefyClient__factory, IGateway__factory } from "@snowbridge/contract-types" import { AlchemyProvider } from "ethers" @@ -18,18 +18,16 @@ const monitor = async () => { if (!config.SUBSCAN_API) throw Error(`Environment ${env} does not support subscan.`) const ethereumProvider = new AlchemyProvider(ethChainId, process.env.REACT_APP_ALCHEMY_KEY) - const context = await contextFactory({ + const context = new Context({ ethereum: { execution_url: ethereumProvider, beacon_url: config.BEACON_HTTP_API, }, polkadot: { - url: { - bridgeHub: config.BRIDGE_HUB_URL, - assetHub: config.ASSET_HUB_URL, - relaychain: config.RELAY_CHAIN_URL, - parachains: config.PARACHAINS, - }, + bridgeHubParaId: config.BRIDGE_HUB_PARAID, + assetHubParaId: config.ASSET_HUB_PARAID, + relaychain: config.RELAY_CHAIN_URL, + parachains: config.PARACHAINS, }, appContracts: { gateway: config.GATEWAY_CONTRACT, @@ -47,6 +45,10 @@ const monitor = async () => { const relaychainScan = subscan.createApi(config.SUBSCAN_API.RELAY_CHAIN_URL, subscanKey) const skipLightClientUpdates = true + const bridgeHub = (await context.bridgeHub()).api + const assetHub = (await context.assetHub()).api + const ethereum = context.ethereum() + const [ ethNowBlock, assetHubNowBlock, @@ -54,11 +56,11 @@ const monitor = async () => { bridgeHubParaIdCodec, assetHubParaIdCodec, ] = await Promise.all([ - context.ethereum.api.getBlock("latest"), - context.polkadot.api.assetHub.rpc.chain.getHeader(), - context.polkadot.api.bridgeHub.rpc.chain.getHeader(), - context.polkadot.api.bridgeHub.query.parachainInfo.parachainId(), - context.polkadot.api.assetHub.query.parachainInfo.parachainId(), + ethereum.getBlock("latest"), + assetHub.rpc.chain.getHeader(), + bridgeHub.rpc.chain.getHeader(), + bridgeHub.query.parachainInfo.parachainId(), + assetHub.query.parachainInfo.parachainId(), ]) if (ethNowBlock == null) throw Error("Cannot fetch block") @@ -122,7 +124,7 @@ const monitor = async () => { transfers.sort((a, b) => b.info.when.getTime() - a.info.when.getTime()) console.log(JSON.stringify(transfers, null, 2)) - await destroyContext(context) + await context.destroyContext() } monitor() diff --git a/web/packages/operations/src/main.ts b/web/packages/operations/src/main.ts index 7b7ac8094a..220864f7f0 100644 --- a/web/packages/operations/src/main.ts +++ b/web/packages/operations/src/main.ts @@ -32,5 +32,4 @@ if (process.argv[2] == "start") { console.error("Error:", error) process.exit(1) }) - } diff --git a/web/packages/operations/src/monitor.ts b/web/packages/operations/src/monitor.ts index e9ba21b9c2..0a0120be4f 100644 --- a/web/packages/operations/src/monitor.ts +++ b/web/packages/operations/src/monitor.ts @@ -1,6 +1,6 @@ import { u8aToHex } from "@polkadot/util" import { blake2AsU8a } from "@polkadot/util-crypto" -import { contextFactory, destroyContext, environment, status, utils } from "@snowbridge/api" +import { Context, environment, status, utils } from "@snowbridge/api" import { sendMetrics } from "./alarm" import { BlockLatencyThreshold } from "./alarm" @@ -18,17 +18,26 @@ export const monitor = async (): Promise => { const infuraKey = process.env.REACT_APP_INFURA_KEY || "" - const context = await contextFactory({ + const parachains = { ...config.PARACHAINS } + Object.keys(config.PARACHAINS).forEach((parachainId) => { + const paraId = Number(parachainId) + if (paraId === config.BRIDGE_HUB_PARAID) { + parachains[paraId] = process.env["BRIDGE_HUB_URL"] || config.PARACHAINS[paraId] + } + if (paraId === config.ASSET_HUB_PARAID) { + parachains[paraId] = process.env["ASSET_HUB_URL"] || config.PARACHAINS[paraId] + } + }) + const context = new Context({ ethereum: { execution_url: process.env["EXECUTION_NODE_URL"] || config.ETHEREUM_API(infuraKey), beacon_url: process.env["BEACON_NODE_URL"] || config.BEACON_HTTP_API, }, polkadot: { - url: { - bridgeHub: process.env["BRIDGE_HUB_URL"] || config.BRIDGE_HUB_URL, - assetHub: process.env["ASSET_HUB_URL"] || config.ASSET_HUB_URL, - relaychain: process.env["RELAY_CHAIN_URL"] || config.RELAY_CHAIN_URL, - }, + bridgeHubParaId: config.BRIDGE_HUB_PARAID, + assetHubParaId: config.ASSET_HUB_PARAID, + relaychain: process.env["RELAY_CHAIN_URL"] || config.RELAY_CHAIN_URL, + parachains: parachains, }, appContracts: { gateway: config.GATEWAY_CONTRACT, @@ -78,10 +87,14 @@ export const monitor = async (): Promise => { secondaryGov.name = status.ChannelKind.Secondary console.log("Secondary Governance Channel:", secondaryGov) + const bridgeHub = (await context.bridgeHub()).api + const ethereum = context.ethereum() + const gateway = context.gateway() + let assetHubSovereign = BigInt( ( ( - await context.polkadot.api.bridgeHub.query.system.account( + await bridgeHub.query.system.account( utils.paraIdToSovereignAccount("sibl", config.ASSET_HUB_PARAID) ) ).toPrimitive() as any @@ -89,17 +102,13 @@ export const monitor = async (): Promise => { ) console.log("Asset Hub Sovereign balance on bridgehub:", assetHubSovereign) - let assetHubAgentBalance = await context.ethereum.api.getBalance( - await context.ethereum.contracts.gateway.agentOf( - utils.paraIdToAgentId(context.polkadot.api.bridgeHub.registry, config.ASSET_HUB_PARAID) - ) + let assetHubAgentBalance = await ethereum.getBalance( + await gateway.agentOf(utils.paraIdToAgentId(bridgeHub.registry, config.ASSET_HUB_PARAID)) ) console.log("Asset Hub Agent balance:", assetHubAgentBalance) const bridgeHubAgentId = u8aToHex(blake2AsU8a("0x00", 256)) - let bridgeHubAgentBalance = await context.ethereum.api.getBalance( - await context.ethereum.contracts.gateway.agentOf(bridgeHubAgentId) - ) + let bridgeHubAgentBalance = await ethereum.getBalance(await gateway.agentOf(bridgeHubAgentId)) console.log("Bridge Hub Agent balance:", bridgeHubAgentBalance) console.log("Relayers:") @@ -108,17 +117,12 @@ export const monitor = async (): Promise => { let balance = 0n switch (relayer.type) { case "ethereum": - balance = await context.ethereum.api.getBalance(relayer.account) + balance = await ethereum.getBalance(relayer.account) break case "substrate": balance = BigInt( - ( - ( - await context.polkadot.api.bridgeHub.query.system.account( - relayer.account - ) - ).toPrimitive() as any - ).data.free + ((await bridgeHub.query.system.account(relayer.account)).toPrimitive() as any) + .data.free ) break } @@ -138,10 +142,7 @@ export const monitor = async (): Promise => { }, { name: "AssetHubAgent", - account: utils.paraIdToAgentId( - context.polkadot.api.bridgeHub.registry, - config.ASSET_HUB_PARAID - ), + account: utils.paraIdToAgentId(bridgeHub.registry, config.ASSET_HUB_PARAID), balance: assetHubAgentBalance, type: "ethereum", }, @@ -157,7 +158,7 @@ export const monitor = async (): Promise => { await sendMetrics(allMetrics) - await destroyContext(context) + await context.destroyContext() return allMetrics } diff --git a/web/packages/operations/src/transfer_to_ethereum.ts b/web/packages/operations/src/transfer_to_ethereum.ts index eb894ff044..587d531d21 100644 --- a/web/packages/operations/src/transfer_to_ethereum.ts +++ b/web/packages/operations/src/transfer_to_ethereum.ts @@ -1,11 +1,6 @@ import "dotenv/config" import { Keyring } from "@polkadot/keyring" -import { - contextFactory, - destroyContext, - environment, - toEthereum, -} from "@snowbridge/api" +import { Context, environment, toEthereum } from "@snowbridge/api" import { Wallet } from "ethers" import cron from "node-cron" @@ -21,17 +16,28 @@ const transfer = async () => { const { config } = snowbridgeEnv - const context = await contextFactory({ + const parachains = { ...config.PARACHAINS } + Object.keys(config.PARACHAINS).forEach((parachainId) => { + const paraId = Number(parachainId) + if (paraId === config.BRIDGE_HUB_PARAID) { + parachains[paraId] = process.env["BRIDGE_HUB_URL"] || config.PARACHAINS[paraId] + } + if (paraId === config.ASSET_HUB_PARAID) { + parachains[paraId] = process.env["ASSET_HUB_URL"] || config.PARACHAINS[paraId] + } + }) + const context = new Context({ ethereum: { - execution_url: process.env["EXECUTION_NODE_URL"] || config.ETHEREUM_API(process.env.REACT_APP_INFURA_KEY || ""), + execution_url: + process.env["EXECUTION_NODE_URL"] || + config.ETHEREUM_API(process.env.REACT_APP_INFURA_KEY || ""), beacon_url: process.env["BEACON_NODE_URL"] || config.BEACON_HTTP_API, }, polkadot: { - url: { - bridgeHub: process.env["BRIDGE_HUB_URL"] || config.BRIDGE_HUB_URL, - assetHub: process.env["ASSET_HUB_URL"] || config.ASSET_HUB_URL, - relaychain: process.env["RELAY_CHAIN_URL"] || config.RELAY_CHAIN_URL, - }, + relaychain: process.env["RELAY_CHAIN_URL"] || config.RELAY_CHAIN_URL, + bridgeHubParaId: config.BRIDGE_HUB_PARAID, + assetHubParaId: config.ASSET_HUB_PARAID, + parachains, }, appContracts: { gateway: config.GATEWAY_CONTRACT, @@ -40,12 +46,17 @@ const transfer = async () => { }) const polkadot_keyring = new Keyring({ type: "sr25519" }) + const ethereum = context.ethereum() + const ETHEREUM_ACCOUNT = new Wallet( - process.env["ETHEREUM_KEY"] || "0x5e002a1af63fd31f1c25258f3082dc889762664cb8f218d86da85dff8b07b342", - context.ethereum.api + process.env["ETHEREUM_KEY"] || + "0x5e002a1af63fd31f1c25258f3082dc889762664cb8f218d86da85dff8b07b342", + ethereum ) const ETHEREUM_ACCOUNT_PUBLIC = await ETHEREUM_ACCOUNT.getAddress() - const POLKADOT_ACCOUNT = process.env["SUBSTRATE_KEY"]?polkadot_keyring.addFromUri(process.env["SUBSTRATE_KEY"]):polkadot_keyring.addFromUri("//Ferdie") + const POLKADOT_ACCOUNT = process.env["SUBSTRATE_KEY"] + ? polkadot_keyring.addFromUri(process.env["SUBSTRATE_KEY"]) + : polkadot_keyring.addFromUri("//Ferdie") const amount = 2_000_000_000_000n @@ -67,7 +78,7 @@ const transfer = async () => { const result = await toEthereum.send(context, POLKADOT_ACCOUNT, plan) console.log("Execute:", result) } - await destroyContext(context) + context.destroyContext() } if (process.argv.length != 3) { diff --git a/web/packages/operations/src/transfer_to_polkadot.ts b/web/packages/operations/src/transfer_to_polkadot.ts index 9d72ccc006..4581267874 100644 --- a/web/packages/operations/src/transfer_to_polkadot.ts +++ b/web/packages/operations/src/transfer_to_polkadot.ts @@ -1,11 +1,6 @@ import "dotenv/config" import { Keyring } from "@polkadot/keyring" -import { - contextFactory, - destroyContext, - environment, - toPolkadot, -} from "@snowbridge/api" +import { Context, environment, toPolkadot } from "@snowbridge/api" import { WETH9__factory } from "@snowbridge/contract-types" import { Wallet } from "ethers" import cron from "node-cron" @@ -22,17 +17,28 @@ const transfer = async () => { const { config } = snowbridgeEnv - const context = await contextFactory({ + const parachains = { ...config.PARACHAINS } + Object.keys(config.PARACHAINS).forEach((parachainId) => { + const paraId = Number(parachainId) + if (paraId === config.BRIDGE_HUB_PARAID) { + parachains[paraId] = process.env["BRIDGE_HUB_URL"] || config.PARACHAINS[paraId] + } + if (paraId === config.ASSET_HUB_PARAID) { + parachains[paraId] = process.env["ASSET_HUB_URL"] || config.PARACHAINS[paraId] + } + }) + const context = new Context({ ethereum: { - execution_url: process.env["EXECUTION_NODE_URL"] || config.ETHEREUM_API(process.env.REACT_APP_INFURA_KEY || ""), + execution_url: + process.env["EXECUTION_NODE_URL"] || + config.ETHEREUM_API(process.env.REACT_APP_INFURA_KEY || ""), beacon_url: process.env["BEACON_NODE_URL"] || config.BEACON_HTTP_API, }, polkadot: { - url: { - bridgeHub: process.env["BRIDGE_HUB_URL"] || config.BRIDGE_HUB_URL, - assetHub: process.env["ASSET_HUB_URL"] || config.ASSET_HUB_URL, - relaychain: process.env["RELAY_CHAIN_URL"] || config.RELAY_CHAIN_URL, - }, + relaychain: process.env["RELAY_CHAIN_URL"] || config.RELAY_CHAIN_URL, + assetHubParaId: config.ASSET_HUB_PARAID, + bridgeHubParaId: config.BRIDGE_HUB_PARAID, + parachains, }, appContracts: { gateway: config.GATEWAY_CONTRACT, @@ -42,10 +48,13 @@ const transfer = async () => { const polkadot_keyring = new Keyring({ type: "sr25519" }) const ETHEREUM_ACCOUNT = new Wallet( - process.env["ETHEREUM_KEY"] || "0x5e002a1af63fd31f1c25258f3082dc889762664cb8f218d86da85dff8b07b342", - context.ethereum.api + process.env["ETHEREUM_KEY"] || + "0x5e002a1af63fd31f1c25258f3082dc889762664cb8f218d86da85dff8b07b342", + context.ethereum() ) - const POLKADOT_ACCOUNT = process.env["SUBSTRATE_KEY"]?polkadot_keyring.addFromUri(process.env["SUBSTRATE_KEY"]):polkadot_keyring.addFromUri("//Ferdie") + const POLKADOT_ACCOUNT = process.env["SUBSTRATE_KEY"] + ? polkadot_keyring.addFromUri(process.env["SUBSTRATE_KEY"]) + : polkadot_keyring.addFromUri("//Ferdie") const POLKADOT_ACCOUNT_PUBLIC = POLKADOT_ACCOUNT.address const amount = 2_000_000_000_000n @@ -63,7 +72,7 @@ const transfer = async () => { const approveResult = await weth9.approve(config.GATEWAY_CONTRACT, amount) const approveReceipt = await approveResult.wait() - console.log('deposit tx', depositReceipt?.hash, 'approve tx', approveReceipt?.hash) + console.log("deposit tx", depositReceipt?.hash, "approve tx", approveReceipt?.hash) } console.log("# Ethereum to Asset Hub") @@ -81,7 +90,7 @@ const transfer = async () => { let result = await toPolkadot.send(context, ETHEREUM_ACCOUNT, plan) console.log("Execute:", result) } - await destroyContext(context) + await context.destroyContext() } if (process.argv.length != 3) { diff --git a/web/packages/operations/src/transfer_token.ts b/web/packages/operations/src/transfer_token.ts index 39abcd878b..f045b45dd0 100644 --- a/web/packages/operations/src/transfer_token.ts +++ b/web/packages/operations/src/transfer_token.ts @@ -1,11 +1,5 @@ import { Keyring } from "@polkadot/keyring" -import { - contextFactory, - destroyContext, - environment, - toEthereum, - toPolkadot, -} from "@snowbridge/api" +import { Context, environment, toEthereum, toPolkadot } from "@snowbridge/api" import { WETH9__factory } from "@snowbridge/contract-types" import { Wallet } from "ethers" @@ -21,18 +15,16 @@ const monitor = async () => { const { config } = snwobridgeEnv - const context = await contextFactory({ + const context = new Context({ ethereum: { execution_url: config.ETHEREUM_API(process.env.REACT_APP_INFURA_KEY || ""), beacon_url: config.BEACON_HTTP_API, }, polkadot: { - url: { - bridgeHub: config.BRIDGE_HUB_URL, - assetHub: config.ASSET_HUB_URL, - relaychain: config.RELAY_CHAIN_URL, - parachains: config.PARACHAINS, - }, + bridgeHubParaId: config.BRIDGE_HUB_PARAID, + assetHubParaId: config.ASSET_HUB_PARAID, + relaychain: config.RELAY_CHAIN_URL, + parachains: config.PARACHAINS, }, appContracts: { gateway: config.GATEWAY_CONTRACT, @@ -43,7 +35,7 @@ const monitor = async () => { const ETHEREUM_ACCOUNT = new Wallet( "0x5e002a1af63fd31f1c25258f3082dc889762664cb8f218d86da85dff8b07b342", - context.ethereum.api + context.ethereum() ) const ETHEREUM_ACCOUNT_PUBLIC = await ETHEREUM_ACCOUNT.getAddress() const POLKADOT_ACCOUNT = polkadot_keyring.addFromUri("//Ferdie") @@ -65,7 +57,7 @@ const monitor = async () => { const approveResult = await weth9.approve(config.GATEWAY_CONTRACT, amount) const approveReceipt = await approveResult.wait() - console.log('deposit tx', depositReceipt?.hash, 'approve tx', approveReceipt?.hash) + console.log("deposit tx", depositReceipt?.hash, "approve tx", approveReceipt?.hash) } console.log("# Ethereum to Asset Hub") @@ -162,7 +154,7 @@ const monitor = async () => { console.log("Complete:", result) } - await destroyContext(context) + await context.destroyContext() } monitor() From ae6b99ec363e350b7630902ddbdd397b8e0677eb Mon Sep 17 00:00:00 2001 From: Alistair Singh Date: Mon, 2 Dec 2024 23:59:14 +0200 Subject: [PATCH 6/6] convert to type --- web/packages/api/src/index.ts | 2 +- web/packages/operations/data.txt | 1592 ++++++++++++++++++++++++++++++ 2 files changed, 1593 insertions(+), 1 deletion(-) create mode 100644 web/packages/operations/data.txt diff --git a/web/packages/api/src/index.ts b/web/packages/api/src/index.ts index c74bb02ee8..26fd02ef06 100644 --- a/web/packages/api/src/index.ts +++ b/web/packages/api/src/index.ts @@ -26,7 +26,7 @@ interface Config { graphqlApiUrl?: string } -export interface ChainProperties { +export type ChainProperties = { tokenSymbol: string tokenDecimal: number ss58Format: number diff --git a/web/packages/operations/data.txt b/web/packages/operations/data.txt new file mode 100644 index 0000000000..01c6848630 --- /dev/null +++ b/web/packages/operations/data.txt @@ -0,0 +1,1592 @@ +https://polkadot-mythos-rpc.polkadot.io added with parachain id: 3369 +[ + { + "id": "0x0a1ddc73b713ec54648a67d6ab0204a35412e04bfe34f68b4870c9c2de6ad1ce", + "status": 1, + "info": { + "when": "2024-11-18T15:54:42.000Z", + "sourceAddress": "15AX5Mcq8Dzays358VobG42QT9KsWJQexNoeVruYUgtt5PcW", + "tokenAddress": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", + "beneficiaryAddress": "0xacc0481a9ac0bac015a24993b9bdac5a418b97a6", + "amount": "69000000000000008" + }, + "submitted": { + "extrinsic_index": "7585788-3", + "extrinsic_hash": "0x1ff613841a4d883627d72132a0ba12d96c5e20dfceed016c86e11bd7381e049e", + "block_hash": "0x5ad160268a2301c1b15722f50828a29a8dfea501bf4206fa48997df600ef242a", + "account_id": "15AX5Mcq8Dzays358VobG42QT9KsWJQexNoeVruYUgtt5PcW", + "block_num": 7585788, + "block_timestamp": 1731945282, + "messageId": "0x0a1ddc73b713ec54648a67d6ab0204a35412e04bfe34f68b4870c9c2de6ad1ce", + "bridgeHubMessageId": "0x92b0d2deb1f4ba53651d9738470b72a1e47c22a0e588accf0bbea08a87feddff", + "success": true, + "relayChain": { + "block_num": 23467239, + "block_hash": "0xa20cb96f2a62842db8e3a90e08bb07cb77daa07e482bafe303fd340e1a396487" + } + }, + "bridgeHubXcmDelivered": { + "block_timestamp": 1731945294, + "event_index": "3901104-9", + "extrinsic_hash": "0x0f2c3712a4e045d886517473cea0d3c85bea51111196ab56199ba058ac16713b", + "siblingParachain": 1000, + "success": true + }, + "bridgeHubChannelDelivered": { + "block_timestamp": 1731945294, + "event_index": "3901104-11", + "extrinsic_hash": "0x0f2c3712a4e045d886517473cea0d3c85bea51111196ab56199ba058ac16713b", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "success": true + }, + "bridgeHubMessageQueued": { + "block_timestamp": 1731945294, + "event_index": "3901104-5", + "extrinsic_hash": "0x0f2c3712a4e045d886517473cea0d3c85bea51111196ab56199ba058ac16713b" + }, + "bridgeHubMessageAccepted": { + "block_timestamp": 1731945294, + "event_index": "3901104-10", + "extrinsic_hash": "0x0f2c3712a4e045d886517473cea0d3c85bea51111196ab56199ba058ac16713b", + "nonce": 63 + }, + "ethereumMessageDispatched": { + "blockNumber": 21216883, + "blockHash": "0xcf8be543aaf02ca60d806492863b5d152f69f1359ad51f31b18c5032bd1bc498", + "transactionHash": "0xe6b6104dc42bad22bc95755e9e2da12b95fcd1ed77b90cd9887bdf980cbdde96", + "transactionIndex": 123, + "logIndex": 357, + "messageId": "0x0a1ddc73b713ec54648a67d6ab0204a35412e04bfe34f68b4870c9c2de6ad1ce", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "nonce": 63, + "success": true + } + }, + { + "id": "0x9e0b21a7bb74c10de10580e2c55e86089124a7fcb2562d10d5ee202a7b9d771b", + "status": 1, + "info": { + "when": "2024-11-18T13:39:23.000Z", + "sourceAddress": "0xC1af060ab8213AD5EE2Dab1a5891245eBe756400", + "beneficiaryAddress": "0x769cac6c783b28e8ecf3c404af388996435b1f8aba90b0f363928caaf342142f", + "tokenAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "destinationParachain": 1000, + "destinationFee": "0", + "amount": "200000" + }, + "submitted": { + "blockHash": "0xdf8f2d4b1663f0a97272a5c3190afe575600fe166b79d82ec6010da3a9945233", + "blockNumber": 21214958, + "logIndex": 2, + "transactionHash": "0xfc2792d22739ef72847ed1f23e3e7a65a8a084fa918d5144b528b99deacbc97b", + "transactionIndex": 0, + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "messageId": "0x9e0b21a7bb74c10de10580e2c55e86089124a7fcb2562d10d5ee202a7b9d771b", + "nonce": 310 + }, + "inboundMessageReceived": { + "extrinsic_index": "3900534-2", + "extrinsic_hash": "0xf784365cbe5a0e628f325c0feed63962c8439f4f6ad826b48408db4ab821538d", + "event_index": "3900534-7", + "block_timestamp": 1731938310, + "messageId": "0x9e0b21a7bb74c10de10580e2c55e86089124a7fcb2562d10d5ee202a7b9d771b", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "nonce": 310 + }, + "assetHubMessageProcessed": { + "extrinsic_hash": "0x20fecdfb9c00afca1159b50517cb2d9d266e65faa06611f1891f9bb71dbc57cf", + "event_index": "7585213-7", + "block_timestamp": 1731938322, + "success": true, + "sibling": 1002 + } + }, + { + "id": "0xffac68ddbda8e08121129005e9c2e6616b11b99f367745fba16204104e7c4481", + "status": 1, + "info": { + "when": "2024-11-18T13:27:59.000Z", + "sourceAddress": "0xC1af060ab8213AD5EE2Dab1a5891245eBe756400", + "beneficiaryAddress": "0x769cac6c783b28e8ecf3c404af388996435b1f8aba90b0f363928caaf342142f", + "tokenAddress": "0xdAC17F958D2ee523a2206206994597C13D831ec7", + "destinationParachain": 1000, + "destinationFee": "0", + "amount": "100000" + }, + "submitted": { + "blockHash": "0x053fcd41e268eba488f26b28702bce47fafc932fcab7fa6a27c131800991fef4", + "blockNumber": 21214901, + "logIndex": 274, + "transactionHash": "0x9ca5c792d61fb69e28f74756830ddaaf7107ed91a1dc545038e519ea6e376acd", + "transactionIndex": 83, + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "messageId": "0xffac68ddbda8e08121129005e9c2e6616b11b99f367745fba16204104e7c4481", + "nonce": 309 + }, + "inboundMessageReceived": { + "extrinsic_index": "3900472-2", + "extrinsic_hash": "0xc01b98f1d70a6a56e4b829cb38d070bbbd3ad025f47ddc0ded3797dcedbae7e0", + "event_index": "3900472-7", + "block_timestamp": 1731937560, + "messageId": "0xffac68ddbda8e08121129005e9c2e6616b11b99f367745fba16204104e7c4481", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "nonce": 309 + }, + "assetHubMessageProcessed": { + "extrinsic_hash": "0xaa0d272d6185e0a634c3b74ea4580665c24dfaaac50847c998be7e15d6fc159c", + "event_index": "7585151-18", + "block_timestamp": 1731937572, + "success": true, + "sibling": 1002 + } + }, + { + "id": "0x2a61ae5a862a15a86e08392d72f5cf034c18e625fdde4dd73839fc9f02261844", + "status": 1, + "info": { + "when": "2024-11-17T06:46:35.000Z", + "sourceAddress": "0xb3ff54b7F24950945bA8f1778F52835a7aD30A7F", + "beneficiaryAddress": "0xabac13d33ce4cd129377b28dab59c30dd21cf796", + "tokenAddress": "0xBA41Ddf06B7fFD89D1267b5A93BFeF2424eb2003", + "destinationParachain": 3369, + "destinationFee": "500000000", + "amount": "90000000000000000000000" + }, + "submitted": { + "blockHash": "0x66e2294a562122d6bc2aaa1e2eb6ed30e508f05ec9c28c9614546ca09bcf4ebc", + "blockNumber": 21205727, + "logIndex": 223, + "transactionHash": "0xb33df27231abcb7942b762085be7d85b479c72b845756b1cee291cd0ea8837a7", + "transactionIndex": 86, + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "messageId": "0x2a61ae5a862a15a86e08392d72f5cf034c18e625fdde4dd73839fc9f02261844", + "nonce": 308 + }, + "inboundMessageReceived": { + "extrinsic_index": "3891351-2", + "extrinsic_hash": "0xb851670330c2339904762c9b7c401316ab8a79052bb3b4289d668b8921c3b6c5", + "event_index": "3891351-7", + "block_timestamp": 1731826932, + "messageId": "0x2a61ae5a862a15a86e08392d72f5cf034c18e625fdde4dd73839fc9f02261844", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "nonce": 308 + }, + "assetHubMessageProcessed": { + "extrinsic_hash": "0x87b16b95115e941d0800ed0aa3d582f68986c43ef54b9582c3f716c85a170dbd", + "event_index": "7576019-9", + "block_timestamp": 1731826944, + "success": true, + "sibling": 1002 + } + }, + { + "id": "0xea362f002a4c61c2d322e5107ccbb6403f98e83e3ff9e5da03360a3bdc821e29", + "status": 1, + "info": { + "when": "2024-11-16T17:42:12.000Z", + "sourceAddress": "148g3izP8a8vydTK8qrZVp4FyVUtgvC1kxkSpwQyGZrtZtZv", + "tokenAddress": "0x5d3d01fd6d2ad1169b17918eb4f153c6616288eb", + "beneficiaryAddress": "0xd0ce021bceff33ca74c7b26a108fbbef75bc060d", + "amount": "8183000000000000000" + }, + "submitted": { + "extrinsic_index": "7572040-3", + "extrinsic_hash": "0xf70b9109dfdabae7e63f42643a26cdb7d1000460b1021e722a1b779a910509c2", + "block_hash": "0xac02cbd8c37e7e9f54e42293cb8ed083dc3625fba3db24032b619401be04416b", + "account_id": "148g3izP8a8vydTK8qrZVp4FyVUtgvC1kxkSpwQyGZrtZtZv", + "block_num": 7572040, + "block_timestamp": 1731778932, + "messageId": "0xea362f002a4c61c2d322e5107ccbb6403f98e83e3ff9e5da03360a3bdc821e29", + "bridgeHubMessageId": "0xcab3094103f4e1019e7af0f1876c1c4e67dda738b69a79c479e1e76c43b5e5cd", + "success": true, + "relayChain": { + "block_num": 23439594, + "block_hash": "0x90d4a34805b474b7706c45d7158835c467c82b0e0823141447645f820a71f9a1" + } + }, + "bridgeHubXcmDelivered": { + "block_timestamp": 1731778944, + "event_index": "3887375-14", + "extrinsic_hash": "0xca4e56f1d84c9a4934fb231b7ca4d5947f594d3ae816daa0c8eea71d6da38e7b", + "siblingParachain": 1000, + "success": true + }, + "bridgeHubChannelDelivered": { + "block_timestamp": 1731778944, + "event_index": "3887375-16", + "extrinsic_hash": "0xca4e56f1d84c9a4934fb231b7ca4d5947f594d3ae816daa0c8eea71d6da38e7b", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "success": true + }, + "bridgeHubMessageQueued": { + "block_timestamp": 1731778944, + "event_index": "3887375-10", + "extrinsic_hash": "0xca4e56f1d84c9a4934fb231b7ca4d5947f594d3ae816daa0c8eea71d6da38e7b" + }, + "bridgeHubMessageAccepted": { + "block_timestamp": 1731778944, + "event_index": "3887375-15", + "extrinsic_hash": "0xca4e56f1d84c9a4934fb231b7ca4d5947f594d3ae816daa0c8eea71d6da38e7b", + "nonce": 62 + }, + "ethereumMessageDispatched": { + "blockNumber": 21202557, + "blockHash": "0xe28d288a9237c16c317d8821b2683359b1b3c94a301afa72df9a6e4a02bc5ed8", + "transactionHash": "0x0b04b8b34cc7a559ede6566f87aecaa7605fa2b2103e7f57ebd22684d06adf23", + "transactionIndex": 124, + "logIndex": 409, + "messageId": "0xea362f002a4c61c2d322e5107ccbb6403f98e83e3ff9e5da03360a3bdc821e29", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "nonce": 62, + "success": true + } + }, + { + "id": "0xbe7314dfd62634b16c1b650dffcf12f2c3aa44932b142c6929103628071d5392", + "status": 1, + "info": { + "when": "2024-11-16T13:08:54.000Z", + "sourceAddress": "148g3izP8a8vydTK8qrZVp4FyVUtgvC1kxkSpwQyGZrtZtZv", + "tokenAddress": "0x5d3d01fd6d2ad1169b17918eb4f153c6616288eb", + "beneficiaryAddress": "0xd0ce021bceff33ca74c7b26a108fbbef75bc060d", + "amount": "3333000000000000000" + }, + "submitted": { + "extrinsic_index": "7570681-2", + "extrinsic_hash": "0x0626fced40c14560d17b3239365681b0f7ca42318b0e059fa8bee25ca4f83242", + "block_hash": "0xc013708a0e91475349ba98bf356ac7499a53848e7fbc151864044a77e7e3ba1e", + "account_id": "148g3izP8a8vydTK8qrZVp4FyVUtgvC1kxkSpwQyGZrtZtZv", + "block_num": 7570681, + "block_timestamp": 1731762534, + "messageId": "0xbe7314dfd62634b16c1b650dffcf12f2c3aa44932b142c6929103628071d5392", + "bridgeHubMessageId": "0x487cd80447a49e91a0a1b82b2e7c9737eb22a99fddac34a39bd2dec7615bd714", + "success": true, + "relayChain": { + "block_num": 23436866, + "block_hash": "0x58d31879e86151f984ae8be789bdcc2a62703cfb0c2839a0b384f14f12f718eb" + } + }, + "bridgeHubXcmDelivered": { + "block_timestamp": 1731762546, + "event_index": "3886016-14", + "extrinsic_hash": "0xad803516a6a562666da287263108e48255e36edb17cb1bb6f29997d309f33447", + "siblingParachain": 1000, + "success": true + }, + "bridgeHubChannelDelivered": { + "block_timestamp": 1731762546, + "event_index": "3886016-16", + "extrinsic_hash": "0xad803516a6a562666da287263108e48255e36edb17cb1bb6f29997d309f33447", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "success": true + }, + "bridgeHubMessageQueued": { + "block_timestamp": 1731762546, + "event_index": "3886016-10", + "extrinsic_hash": "0xad803516a6a562666da287263108e48255e36edb17cb1bb6f29997d309f33447" + }, + "bridgeHubMessageAccepted": { + "block_timestamp": 1731762546, + "event_index": "3886016-15", + "extrinsic_hash": "0xad803516a6a562666da287263108e48255e36edb17cb1bb6f29997d309f33447", + "nonce": 61 + }, + "ethereumMessageDispatched": { + "blockNumber": 21201342, + "blockHash": "0x537fe3aba5b91244451bc21e0da20d05017ca6713f844bc94c28f41f3b1cad19", + "transactionHash": "0x94b099c6ca5b41727280daf5cee4367ae86aaceaf865f652b622391dbcba8e19", + "transactionIndex": 54, + "logIndex": 228, + "messageId": "0xbe7314dfd62634b16c1b650dffcf12f2c3aa44932b142c6929103628071d5392", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "nonce": 61, + "success": true + } + }, + { + "id": "0xe1d191b3224f5a633c7ab40460f6de3b7abe83ae1c5f952c43e9ba209433d20e", + "status": 1, + "info": { + "when": "2024-11-16T04:53:06.000Z", + "sourceAddress": "148g3izP8a8vydTK8qrZVp4FyVUtgvC1kxkSpwQyGZrtZtZv", + "tokenAddress": "0x5d3d01fd6d2ad1169b17918eb4f153c6616288eb", + "beneficiaryAddress": "0xd0ce021bceff33ca74c7b26a108fbbef75bc060d", + "amount": "3767000000000000000" + }, + "submitted": { + "extrinsic_index": "7568237-2", + "extrinsic_hash": "0xfb882f1279c31aeecb18a960d98858825376f73f1839424769e1459dc9fa8394", + "block_hash": "0x195b5777e3f8a560dfc612dcb0467d4f79d56eb14cf447528bcf21f573337f1b", + "account_id": "148g3izP8a8vydTK8qrZVp4FyVUtgvC1kxkSpwQyGZrtZtZv", + "block_num": 7568237, + "block_timestamp": 1731732786, + "messageId": "0xe1d191b3224f5a633c7ab40460f6de3b7abe83ae1c5f952c43e9ba209433d20e", + "bridgeHubMessageId": "0x70ba46120d1760c6c4e7f98d7ae0837cb0d63884e7a0af98d3cf9b6194607a00", + "success": true, + "relayChain": { + "block_num": 23431932, + "block_hash": "0x39a2d531935c5f4e33d17af70fe4987cff87c2bed3ea8c864879275b7b3efcb8" + } + }, + "bridgeHubXcmDelivered": { + "block_timestamp": 1731732798, + "event_index": "3883569-14", + "extrinsic_hash": "0xf805e1fb4b50611998344ed438e6b87fc5a8460948691713f4fa6c3b0389e72f", + "siblingParachain": 1000, + "success": true + }, + "bridgeHubChannelDelivered": { + "block_timestamp": 1731732798, + "event_index": "3883569-16", + "extrinsic_hash": "0xf805e1fb4b50611998344ed438e6b87fc5a8460948691713f4fa6c3b0389e72f", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "success": true + }, + "bridgeHubMessageQueued": { + "block_timestamp": 1731732798, + "event_index": "3883569-10", + "extrinsic_hash": "0xf805e1fb4b50611998344ed438e6b87fc5a8460948691713f4fa6c3b0389e72f" + }, + "bridgeHubMessageAccepted": { + "block_timestamp": 1731732798, + "event_index": "3883569-15", + "extrinsic_hash": "0xf805e1fb4b50611998344ed438e6b87fc5a8460948691713f4fa6c3b0389e72f", + "nonce": 60 + }, + "ethereumMessageDispatched": { + "blockNumber": 21198943, + "blockHash": "0x4d23c6744e225db6fdc449fa324b5070048a1b5f618ea27f43bbc5e61ba277b0", + "transactionHash": "0x3bed75cb77191f6ce5c88832173c941206ebcce7bd531f239cad4d254d72d857", + "transactionIndex": 133, + "logIndex": 304, + "messageId": "0xe1d191b3224f5a633c7ab40460f6de3b7abe83ae1c5f952c43e9ba209433d20e", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "nonce": 60, + "success": true + } + }, + { + "id": "0x04b7a6c7552d2890094dfe43e037cb5f5495fec2419f33b0072439a9ee7629a0", + "status": 1, + "info": { + "when": "2024-11-16T03:22:30.000Z", + "sourceAddress": "148g3izP8a8vydTK8qrZVp4FyVUtgvC1kxkSpwQyGZrtZtZv", + "tokenAddress": "0x5d3d01fd6d2ad1169b17918eb4f153c6616288eb", + "beneficiaryAddress": "0xd0ce021bceff33ca74c7b26a108fbbef75bc060d", + "amount": "3376000000000000000" + }, + "submitted": { + "extrinsic_index": "7567788-2", + "extrinsic_hash": "0xd36380574c682c4b760f7bc28e9f6c7b23b10660d2e16323b429d3d8a958da81", + "block_hash": "0x82d37f7e6a296338cd6214cb2b56632c6ab6f6db32232303fc97673b206a8eb2", + "account_id": "148g3izP8a8vydTK8qrZVp4FyVUtgvC1kxkSpwQyGZrtZtZv", + "block_num": 7567788, + "block_timestamp": 1731727350, + "messageId": "0x04b7a6c7552d2890094dfe43e037cb5f5495fec2419f33b0072439a9ee7629a0", + "bridgeHubMessageId": "0x7266a63740a232482cacd40c7a7ab435b1c44efe854a2dca2fdc79eaf106fac2", + "success": true, + "relayChain": { + "block_num": 23431033, + "block_hash": "0x3f7832ec79abb5015c692a326375e7742c3323473ea6e7b2ac208292574b1209" + } + }, + "bridgeHubXcmDelivered": { + "block_timestamp": 1731727362, + "event_index": "3883120-13", + "extrinsic_hash": "0x4603828297f961ce55b014447aed6c829ef1a85755c11f60eda43a1a7b931122", + "siblingParachain": 1000, + "success": true + }, + "bridgeHubChannelDelivered": { + "block_timestamp": 1731727362, + "event_index": "3883120-15", + "extrinsic_hash": "0x4603828297f961ce55b014447aed6c829ef1a85755c11f60eda43a1a7b931122", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "success": true + }, + "bridgeHubMessageQueued": { + "block_timestamp": 1731727362, + "event_index": "3883120-9", + "extrinsic_hash": "0x4603828297f961ce55b014447aed6c829ef1a85755c11f60eda43a1a7b931122" + }, + "bridgeHubMessageAccepted": { + "block_timestamp": 1731727362, + "event_index": "3883120-14", + "extrinsic_hash": "0x4603828297f961ce55b014447aed6c829ef1a85755c11f60eda43a1a7b931122", + "nonce": 59 + }, + "ethereumMessageDispatched": { + "blockNumber": 21197748, + "blockHash": "0x4b5af10b8bab586367b91004b7f82e2035d67b6a6b0623971adcae3586c53197", + "transactionHash": "0x6fae456fe930e42d52a2cf665b152c3b765e9557c1a745c0f1cbc84143864e47", + "transactionIndex": 134, + "logIndex": 381, + "messageId": "0x04b7a6c7552d2890094dfe43e037cb5f5495fec2419f33b0072439a9ee7629a0", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "nonce": 59, + "success": true + } + }, + { + "id": "0x33694273d7fbd856d395615dba69badbef8c471cba69eb60f3317e8159a28e18", + "status": 1, + "info": { + "when": "2024-11-15T21:06:36.000Z", + "sourceAddress": "148g3izP8a8vydTK8qrZVp4FyVUtgvC1kxkSpwQyGZrtZtZv", + "tokenAddress": "0x5d3d01fd6d2ad1169b17918eb4f153c6616288eb", + "beneficiaryAddress": "0xd0ce021bceff33ca74c7b26a108fbbef75bc060d", + "amount": "5847900000000000000" + }, + "submitted": { + "extrinsic_index": "7565928-2", + "extrinsic_hash": "0x5165361a445b36f78dfaa4465f6f5a01fc3461b3a05183231b06f271d5d6ddda", + "block_hash": "0x9b41ed9129f714869ba8c8b276bbdaa7dc13e2d8ba145a43f22a41fabddad9ac", + "account_id": "148g3izP8a8vydTK8qrZVp4FyVUtgvC1kxkSpwQyGZrtZtZv", + "block_num": 7565928, + "block_timestamp": 1731704796, + "messageId": "0x33694273d7fbd856d395615dba69badbef8c471cba69eb60f3317e8159a28e18", + "bridgeHubMessageId": "0xf94bb2d4e3ee045d8daa55b3bc9c990b1478eb8ddffa5eb198609eed591dd2ed", + "success": true, + "relayChain": { + "block_num": 23427291, + "block_hash": "0x3d945deef8e848643bae2a82e365256fa0c2f01c78323ae041c7419af90e8aa2" + } + }, + "bridgeHubXcmDelivered": { + "block_timestamp": 1731704808, + "event_index": "3881255-9", + "extrinsic_hash": "0xc3f839d841a0daac523ea26bc9cedb7d5fa642f205bc431eb58c6dc27f73ef99", + "siblingParachain": 1000, + "success": true + }, + "bridgeHubChannelDelivered": { + "block_timestamp": 1731704808, + "event_index": "3881255-11", + "extrinsic_hash": "0xc3f839d841a0daac523ea26bc9cedb7d5fa642f205bc431eb58c6dc27f73ef99", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "success": true + }, + "bridgeHubMessageQueued": { + "block_timestamp": 1731704808, + "event_index": "3881255-5", + "extrinsic_hash": "0xc3f839d841a0daac523ea26bc9cedb7d5fa642f205bc431eb58c6dc27f73ef99" + }, + "bridgeHubMessageAccepted": { + "block_timestamp": 1731704808, + "event_index": "3881255-10", + "extrinsic_hash": "0xc3f839d841a0daac523ea26bc9cedb7d5fa642f205bc431eb58c6dc27f73ef99", + "nonce": 58 + }, + "ethereumMessageDispatched": { + "blockNumber": 21196585, + "blockHash": "0x57f67046d76c00e384ec5de4c2d9af842eff95dc1b20bd35eacca32707db6895", + "transactionHash": "0xc7348995589066b2651a7aae48970a3e64d26d3a3d887edd22c03a9650a98d63", + "transactionIndex": 143, + "logIndex": 309, + "messageId": "0x33694273d7fbd856d395615dba69badbef8c471cba69eb60f3317e8159a28e18", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "nonce": 58, + "success": true + } + }, + { + "id": "0xbc611c82469dd61b83096f618395d26b04e5ea8af3fa79e899695057ebf1a3b9", + "status": 1, + "info": { + "when": "2024-11-15T17:21:30.000Z", + "sourceAddress": "1bGoXRxHSCJsiSJW8nG6xJCszGT5oX6ti57UGtqKMUFBYTC", + "tokenAddress": "0x5d3d01fd6d2ad1169b17918eb4f153c6616288eb", + "beneficiaryAddress": "0x674b7087f241b465bb8fab9aa5a56871029969f4", + "amount": "3597000000000000000" + }, + "submitted": { + "extrinsic_index": "7564816-2", + "extrinsic_hash": "0x7a00000212aca1dbd01bf14e807a85b016c12417863ec2b68fe8da5537729c85", + "block_hash": "0xdcc895282104e508bcce582243b1cfa76555554d95907390beb03567bc39a769", + "account_id": "1bGoXRxHSCJsiSJW8nG6xJCszGT5oX6ti57UGtqKMUFBYTC", + "block_num": 7564816, + "block_timestamp": 1731691290, + "messageId": "0xbc611c82469dd61b83096f618395d26b04e5ea8af3fa79e899695057ebf1a3b9", + "bridgeHubMessageId": "0x16a2cc541d9230ede5fdef30ba3872b04c13b9f616c16d01108946a036fcb930", + "success": true, + "relayChain": { + "block_num": 23425055, + "block_hash": "0x7a23b0de79c7328c607811bbaead06391178d54d79ad49ab9bf86e7d852d7c09" + } + }, + "bridgeHubXcmDelivered": { + "block_timestamp": 1731691302, + "event_index": "3880142-9", + "extrinsic_hash": "0xce90fa287296d85964131da32e744509d73d96e2951b2b007e68c9ef809f7643", + "siblingParachain": 1000, + "success": true + }, + "bridgeHubChannelDelivered": { + "block_timestamp": 1731691302, + "event_index": "3880142-11", + "extrinsic_hash": "0xce90fa287296d85964131da32e744509d73d96e2951b2b007e68c9ef809f7643", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "success": true + }, + "bridgeHubMessageQueued": { + "block_timestamp": 1731691302, + "event_index": "3880142-5", + "extrinsic_hash": "0xce90fa287296d85964131da32e744509d73d96e2951b2b007e68c9ef809f7643" + }, + "bridgeHubMessageAccepted": { + "block_timestamp": 1731691302, + "event_index": "3880142-10", + "extrinsic_hash": "0xce90fa287296d85964131da32e744509d73d96e2951b2b007e68c9ef809f7643", + "nonce": 57 + }, + "ethereumMessageDispatched": { + "blockNumber": 21195362, + "blockHash": "0xfa41996ab2bf87bb668f09e79a2bcb0897cab630daadac1570e10e0f46bcba1a", + "transactionHash": "0xdc049adcff7204a2a445bf9d5c6619de236395e7ee2596c4c97140c6a1751334", + "transactionIndex": 142, + "logIndex": 367, + "messageId": "0xbc611c82469dd61b83096f618395d26b04e5ea8af3fa79e899695057ebf1a3b9", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "nonce": 57, + "success": true + } + }, + { + "id": null, + "status": 2, + "info": { + "when": "2024-11-15T16:34:24.000Z", + "sourceAddress": "13GjwdXx8ain5yrQcA4SFsAB8oAeZYkCqhywRBV3fivw2KNn", + "tokenAddress": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", + "beneficiaryAddress": "0x7dbe175cdc81d620753cbce3bc093b98a4e9b95e", + "amount": "330829270523374" + }, + "submitted": { + "extrinsic_index": "7564581-2", + "extrinsic_hash": "0x407a17bd23c8666b0e6115228744679f323ccc84df4be7419f0e8c20daf8e7d6", + "block_hash": "0x1e91f0bfb46f46e720673d67ce83e87ead23b857206d1b9b0596480fe1a3507a", + "account_id": "13GjwdXx8ain5yrQcA4SFsAB8oAeZYkCqhywRBV3fivw2KNn", + "block_num": 7564581, + "block_timestamp": 1731688464, + "messageId": null, + "bridgeHubMessageId": null, + "success": false, + "relayChain": { + "block_num": 23424585, + "block_hash": "0xbc888986bf840d8fac5e2aa7cbaa62c8176bbdca74001c147283c04d2adf24ed" + } + } + }, + { + "id": "0xd893ce68dc078c596e66ecb7ea7e29a4873be5854dccf98732d6b7f265209056", + "status": 1, + "info": { + "when": "2024-11-15T16:22:12.000Z", + "sourceAddress": "148g3izP8a8vydTK8qrZVp4FyVUtgvC1kxkSpwQyGZrtZtZv", + "tokenAddress": "0x5d3d01fd6d2ad1169b17918eb4f153c6616288eb", + "beneficiaryAddress": "0xd0ce021bceff33ca74c7b26a108fbbef75bc060d", + "amount": "8000000000000000" + }, + "submitted": { + "extrinsic_index": "7564520-3", + "extrinsic_hash": "0x23da686043b310d715cad9afb969b01f5e4f31e96a1e2923342492191eeab125", + "block_hash": "0x8fd6a4f1a9d563d3518b86bf3a97e807310b92330a017313da02d2b8d055824e", + "account_id": "148g3izP8a8vydTK8qrZVp4FyVUtgvC1kxkSpwQyGZrtZtZv", + "block_num": 7564520, + "block_timestamp": 1731687732, + "messageId": "0xd893ce68dc078c596e66ecb7ea7e29a4873be5854dccf98732d6b7f265209056", + "bridgeHubMessageId": "0xadcb830ae88ccb57f431f06fa08e42ca13ad9a09f19167bb45f7fb139c8a9220", + "success": true, + "relayChain": { + "block_num": 23424463, + "block_hash": "0x2882d5fdcd0e0e3d7fb61a89b56277c4453b6a63ff61bbd75307082e559cef94" + } + }, + "bridgeHubXcmDelivered": { + "block_timestamp": 1731687744, + "event_index": "3879846-14", + "extrinsic_hash": "0x35ee943ee6dbf694ed471ca004a9ba0f1d132f511125aad8790c4c5fbe1d05b6", + "siblingParachain": 1000, + "success": true + }, + "bridgeHubChannelDelivered": { + "block_timestamp": 1731687744, + "event_index": "3879846-16", + "extrinsic_hash": "0x35ee943ee6dbf694ed471ca004a9ba0f1d132f511125aad8790c4c5fbe1d05b6", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "success": true + }, + "bridgeHubMessageQueued": { + "block_timestamp": 1731687744, + "event_index": "3879846-10", + "extrinsic_hash": "0x35ee943ee6dbf694ed471ca004a9ba0f1d132f511125aad8790c4c5fbe1d05b6" + }, + "bridgeHubMessageAccepted": { + "block_timestamp": 1731687744, + "event_index": "3879846-15", + "extrinsic_hash": "0x35ee943ee6dbf694ed471ca004a9ba0f1d132f511125aad8790c4c5fbe1d05b6", + "nonce": 56 + }, + "ethereumMessageDispatched": { + "blockNumber": 21195358, + "blockHash": "0x182bc5ed90a0685f73029f67b5c7d36c12b7a2bb0db8a6f7a81773b21d180b23", + "transactionHash": "0xe21ccb6e08569b7eab6c2ee49630c25880ee03967fb5f343ddac42c7c4376b4e", + "transactionIndex": 147, + "logIndex": 367, + "messageId": "0xd893ce68dc078c596e66ecb7ea7e29a4873be5854dccf98732d6b7f265209056", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "nonce": 56, + "success": true + } + }, + { + "id": "0x8cfb9c288b0995b0128bfaf2dd480968977c0ed010197be285fd3fe24ad4c8ac", + "status": 1, + "info": { + "when": "2024-11-15T13:08:30.000Z", + "sourceAddress": "1bGoXRxHSCJsiSJW8nG6xJCszGT5oX6ti57UGtqKMUFBYTC", + "tokenAddress": "0x5d3d01fd6d2ad1169b17918eb4f153c6616288eb", + "beneficiaryAddress": "0x674b7087f241b465bb8fab9aa5a56871029969f4", + "amount": "3170000000000000000" + }, + "submitted": { + "extrinsic_index": "7563559-2", + "extrinsic_hash": "0x5a9235480d5b6f9ff3731d0b9c0caf5c86e0078b3aa162fdf920ace487664e48", + "block_hash": "0xb46ef0ed018b037528448665cc7808bc3894bced5701df49f6cbfc37dd04eb9e", + "account_id": "1bGoXRxHSCJsiSJW8nG6xJCszGT5oX6ti57UGtqKMUFBYTC", + "block_num": 7563559, + "block_timestamp": 1731676110, + "messageId": "0x8cfb9c288b0995b0128bfaf2dd480968977c0ed010197be285fd3fe24ad4c8ac", + "bridgeHubMessageId": "0x69ac82c547380928420d4cb4acb42bb2eafefdda6ee84be1972d6d0c5a4d5898", + "success": true, + "relayChain": { + "block_num": 23422530, + "block_hash": "0x478cce622ac80045f3bf998ce644376162abfdb6eac45d99add0e1c188ef7592" + } + }, + "bridgeHubXcmDelivered": { + "block_timestamp": 1731676122, + "event_index": "3878886-9", + "extrinsic_hash": "0x75d44570a40cda9a69b7e06237e8adca620ecc89a5c593121022d3e81d7d5963", + "siblingParachain": 1000, + "success": true + }, + "bridgeHubChannelDelivered": { + "block_timestamp": 1731676122, + "event_index": "3878886-11", + "extrinsic_hash": "0x75d44570a40cda9a69b7e06237e8adca620ecc89a5c593121022d3e81d7d5963", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "success": true + }, + "bridgeHubMessageQueued": { + "block_timestamp": 1731676122, + "event_index": "3878886-5", + "extrinsic_hash": "0x75d44570a40cda9a69b7e06237e8adca620ecc89a5c593121022d3e81d7d5963" + }, + "bridgeHubMessageAccepted": { + "block_timestamp": 1731676122, + "event_index": "3878886-10", + "extrinsic_hash": "0x75d44570a40cda9a69b7e06237e8adca620ecc89a5c593121022d3e81d7d5963", + "nonce": 55 + }, + "ethereumMessageDispatched": { + "blockNumber": 21194173, + "blockHash": "0xf6a4cee5ab1ca5d1b0fd2f3f75dc0530cefcea7af8a109af7f506487edc8411c", + "transactionHash": "0x2090ec0b706bf377fa5e9e53e51e5e537a4e5e5cbe8ae9476cf362e193d77561", + "transactionIndex": 140, + "logIndex": 332, + "messageId": "0x8cfb9c288b0995b0128bfaf2dd480968977c0ed010197be285fd3fe24ad4c8ac", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "nonce": 55, + "success": true + } + }, + { + "id": "0xe29ce57bdfab677d8ab2332e25d6ba674760c7be1f143b9d9c1cab0f8331d4dd", + "status": 1, + "info": { + "when": "2024-11-15T10:29:59.000Z", + "sourceAddress": "0xC1af060ab8213AD5EE2Dab1a5891245eBe756400", + "beneficiaryAddress": "0x769cac6c783b28e8ecf3c404af388996435b1f8aba90b0f363928caaf342142f", + "tokenAddress": "0xdAC17F958D2ee523a2206206994597C13D831ec7", + "destinationParachain": 1000, + "destinationFee": "0", + "amount": "10000" + }, + "submitted": { + "blockHash": "0xe69374651ae639c205dc2fff12721b054b873c7a9078d046fda01fcd0cf446f3", + "blockNumber": 21192509, + "logIndex": 41, + "transactionHash": "0x6fb338b41acb77a7c2bd3e44003b03f6dd18821f93c0a211243d077da79db572", + "transactionIndex": 7, + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "messageId": "0xe29ce57bdfab677d8ab2332e25d6ba674760c7be1f143b9d9c1cab0f8331d4dd", + "nonce": 307 + }, + "inboundMessageReceived": { + "extrinsic_index": "3878192-2", + "extrinsic_hash": "0x461294c1c8b06f1667b48f23771bd10040332c42bd90a2c94eb93ba5eb91f928", + "event_index": "3878192-7", + "block_timestamp": 1731667596, + "messageId": "0xe29ce57bdfab677d8ab2332e25d6ba674760c7be1f143b9d9c1cab0f8331d4dd", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "nonce": 307 + }, + "assetHubMessageProcessed": { + "extrinsic_hash": "0x8b83c3c7b88d1aaa3cf076c12799f0656dd941260271a6d6ed1f417ed5e8ae6a", + "event_index": "7562866-7", + "block_timestamp": 1731667608, + "success": true, + "sibling": 1002 + } + }, + { + "id": "0x5f1212ebb153d706a5479929f2c0d441e26cd2c0e1db5c40b11022bd4577c2b3", + "status": 1, + "info": { + "when": "2024-11-14T21:30:59.000Z", + "sourceAddress": "0xB9888dD3fA1069220Ed53089230Cb543d13526e6", + "beneficiaryAddress": "0xb9888dd3fa1069220ed53089230cb543d13526e6", + "tokenAddress": "0xBA41Ddf06B7fFD89D1267b5A93BFeF2424eb2003", + "destinationParachain": 3369, + "destinationFee": "500000000", + "amount": "3608000000000000000000" + }, + "submitted": { + "blockHash": "0x23e02330fa30c5a0afbd268220678eded5392deb1edcb490b04408b7ed5ad698", + "blockNumber": 21188632, + "logIndex": 316, + "transactionHash": "0x5c57664d863e2ffd533703f02b32cfcc9e04b074612cca3c6f1adacbd8134ba8", + "transactionIndex": 80, + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "messageId": "0x5f1212ebb153d706a5479929f2c0d441e26cd2c0e1db5c40b11022bd4577c2b3", + "nonce": 306 + }, + "inboundMessageReceived": { + "extrinsic_index": "3874390-2", + "extrinsic_hash": "0x9ebdd74a3a50f46733a3fbe568485bedf0fb44cc70c4eed4c30d42077610a437", + "event_index": "3874390-7", + "block_timestamp": 1731621150, + "messageId": "0x5f1212ebb153d706a5479929f2c0d441e26cd2c0e1db5c40b11022bd4577c2b3", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "nonce": 306 + }, + "assetHubMessageProcessed": { + "extrinsic_hash": "0x7a76316ac341d01ad7c7cf09ebf8bc29b026e57110c66172ac9c5d84c458f1e6", + "event_index": "7559063-18", + "block_timestamp": 1731621162, + "success": true, + "sibling": 1002 + } + }, + { + "id": "0xd31cff16a300130bbb089a1e4444b2ff8d38239ba7dbba08ccc752a7d1df5fe6", + "status": 1, + "info": { + "when": "2024-11-14T19:53:11.000Z", + "sourceAddress": "0xB9888dD3fA1069220Ed53089230Cb543d13526e6", + "beneficiaryAddress": "0xb9888dd3fa1069220ed53089230cb543d13526e6", + "tokenAddress": "0xBA41Ddf06B7fFD89D1267b5A93BFeF2424eb2003", + "destinationParachain": 3369, + "destinationFee": "500000000", + "amount": "100000000000000000000" + }, + "submitted": { + "blockHash": "0x22f94e72fe1a763d1a328f3f245d533f4d2b7bdb99c8b7ddaeeadbf881947cb2", + "blockNumber": 21188144, + "logIndex": 251, + "transactionHash": "0x0735d02a6647314329887d7f558801743e42ebc9dc4630f075224d0d215c34f0", + "transactionIndex": 51, + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "messageId": "0xd31cff16a300130bbb089a1e4444b2ff8d38239ba7dbba08ccc752a7d1df5fe6", + "nonce": 305 + }, + "inboundMessageReceived": { + "extrinsic_index": "3873898-2", + "extrinsic_hash": "0xc8b57402b9b7de2a4b9e6182576034254a44b24921e5d2eb39cae1ac80fa6bbc", + "event_index": "3873898-7", + "block_timestamp": 1731615120, + "messageId": "0xd31cff16a300130bbb089a1e4444b2ff8d38239ba7dbba08ccc752a7d1df5fe6", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "nonce": 305 + }, + "assetHubMessageProcessed": { + "extrinsic_hash": "0x0e1fca2c1c70114b076a97b5064ce586099d14eefdb92f342e040627a6af76f3", + "event_index": "7558572-9", + "block_timestamp": 1731615138, + "success": true, + "sibling": 1002 + } + }, + { + "id": "0x0241febf91ad5339fee18b6eba82b83badaebe6d6b46c65f9be7a46d1f53c027", + "status": 1, + "info": { + "when": "2024-11-11T12:39:35.000Z", + "sourceAddress": "0x3A46EE99fBd48cB132C815Ac6A7a5c22eD79c424", + "beneficiaryAddress": "0xde1b53e14ae882062a0db0efd946da8d81480c52f3fc3a00e8dc26da59483945", + "tokenAddress": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "destinationParachain": 1000, + "destinationFee": "0", + "amount": "1000000000000000" + }, + "submitted": { + "blockHash": "0xb8109da26c5628d8ca5af183b83e9ef32bf2ac0fa78766e5d2b559c51fe3bc95", + "blockNumber": 21164498, + "logIndex": 261, + "transactionHash": "0xaaf51944c71ed3a96c4b8407699401b2d7b121cdc662083c28e27871aee6641b", + "transactionIndex": 151, + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "messageId": "0x0241febf91ad5339fee18b6eba82b83badaebe6d6b46c65f9be7a46d1f53c027", + "nonce": 303 + }, + "inboundMessageReceived": { + "extrinsic_index": "3850474-2", + "extrinsic_hash": "0xd2ade46bec244a795a6995f0d8147cba4c0aa2db42e7f8d8217d34b4886788fa", + "event_index": "3850474-7", + "block_timestamp": 1731330096, + "messageId": "0x0241febf91ad5339fee18b6eba82b83badaebe6d6b46c65f9be7a46d1f53c027", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "nonce": 303 + }, + "assetHubMessageProcessed": { + "extrinsic_hash": "0xbaaf4a162a061f13297aa968c645779316714b0931f7b343af796652002fb36d", + "event_index": "7535154-7", + "block_timestamp": 1731330114, + "success": true, + "sibling": 1002 + } + }, + { + "id": "0x39d5008f77cb17ee80713450501e1638dca45ed750789cd3078068d39673d0eb", + "status": 1, + "info": { + "when": "2024-11-11T11:34:23.000Z", + "sourceAddress": "0x3A46EE99fBd48cB132C815Ac6A7a5c22eD79c424", + "beneficiaryAddress": "0xde1b53e14ae882062a0db0efd946da8d81480c52f3fc3a00e8dc26da59483945", + "tokenAddress": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "destinationParachain": 1000, + "destinationFee": "0", + "amount": "40000000000000" + }, + "submitted": { + "blockHash": "0x46d127387f883ef0f01e15f41392e98ea3e93ecb9eb61a0dc2e5ac66795f7c3b", + "blockNumber": 21164175, + "logIndex": 328, + "transactionHash": "0x7535960a6df0bd21fd723238b26b68ad4c9429b473d7b42c0bfe52725534d111", + "transactionIndex": 151, + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "messageId": "0x39d5008f77cb17ee80713450501e1638dca45ed750789cd3078068d39673d0eb", + "nonce": 302 + }, + "inboundMessageReceived": { + "extrinsic_index": "3850123-2", + "extrinsic_hash": "0x6216e96d33e12e9f8b68a12c27e9a3b9df98a3aa963ee4846716a75be3386981", + "event_index": "3850123-7", + "block_timestamp": 1731325860, + "messageId": "0x39d5008f77cb17ee80713450501e1638dca45ed750789cd3078068d39673d0eb", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "nonce": 302 + }, + "assetHubMessageProcessed": { + "extrinsic_hash": "0x7d64dd8ce2388b4213843dec9cc4521636efc370a1cd71cb7b646f027d76177c", + "event_index": "7534803-7", + "block_timestamp": 1731325872, + "success": true, + "sibling": 1002 + } + }, + { + "id": "0x0a1e510c1b828f96fc1005fe858f7ff3697d7f766e0e81a20aff5ae9c475915d", + "status": 1, + "info": { + "when": "2024-11-10T23:21:47.000Z", + "sourceAddress": "0x3A46EE99fBd48cB132C815Ac6A7a5c22eD79c424", + "beneficiaryAddress": "0x3a46ee99fbd48cb132c815ac6a7a5c22ed79c424", + "tokenAddress": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "destinationParachain": 2030, + "destinationFee": "20000000", + "amount": "30000000000000" + }, + "submitted": { + "blockHash": "0x534f67d73893af9025ca11bd3ab277c9b650600fc2b5b2039579fc870f50be96", + "blockNumber": 21160524, + "logIndex": 770, + "transactionHash": "0x574c1c9aad049986d7b2617df44f6bd6d989ef036ca56280c3edb18be0d861f2", + "transactionIndex": 190, + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "messageId": "0x0a1e510c1b828f96fc1005fe858f7ff3697d7f766e0e81a20aff5ae9c475915d", + "nonce": 301 + }, + "inboundMessageReceived": { + "extrinsic_index": "3846514-2", + "extrinsic_hash": "0xa3fdc1bd3e53ed343c42cf1e8a51847ac558bf703946b47125b5d2d0bf9cf63b", + "event_index": "3846514-7", + "block_timestamp": 1731282024, + "messageId": "0x0a1e510c1b828f96fc1005fe858f7ff3697d7f766e0e81a20aff5ae9c475915d", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "nonce": 301 + }, + "assetHubMessageProcessed": { + "extrinsic_hash": "0x9c9080c806305713bba3222ae35131d6ef8fbd10ebb1c14a27f3356fbbad3111", + "event_index": "7531196-10", + "block_timestamp": 1731282036, + "success": true, + "sibling": 1002 + } + }, + { + "id": "0x4a419ecb83164b071a86273fce526c31db33a43491f9e53de3989e2176d8e512", + "status": 1, + "info": { + "when": "2024-11-10T21:24:35.000Z", + "sourceAddress": "0xe00f61C9fB48640435729a0854767f123f62Bc80", + "beneficiaryAddress": "0x9eb68d6bb39dd70a5df66b48bd35344621b04e24d79fa24b24fc599ba155ed1c", + "tokenAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "destinationParachain": 1000, + "destinationFee": "0", + "amount": "50000000" + }, + "submitted": { + "blockHash": "0x0557796360d02722301c68807691de67f86f5fc58bdb714e81e5e1a2f83cd945", + "blockNumber": 21159940, + "logIndex": 361, + "transactionHash": "0xa5837915e8f21d086a445bbd76d98fbc042f5891e8648255ac66c482d55f522c", + "transactionIndex": 66, + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "messageId": "0x4a419ecb83164b071a86273fce526c31db33a43491f9e53de3989e2176d8e512", + "nonce": 300 + }, + "inboundMessageReceived": { + "extrinsic_index": "3845944-2", + "extrinsic_hash": "0xa7e192dc34d9679246b0fae1c1d699c3d4c98d7ce53659b871a5fa79aeb188d0", + "event_index": "3845944-7", + "block_timestamp": 1731275094, + "messageId": "0x4a419ecb83164b071a86273fce526c31db33a43491f9e53de3989e2176d8e512", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "nonce": 300 + }, + "assetHubMessageProcessed": { + "extrinsic_hash": "0x5f68120c01d92243c606ea54423816ea262cef4b4903834a34477f793b93a1a9", + "event_index": "7530625-7", + "block_timestamp": 1731275106, + "success": true, + "sibling": 1002 + } + }, + { + "id": "0xe7a42cb96251f98163c006be8488db3906a4194e37539324453452390d586512", + "status": 1, + "info": { + "when": "2024-11-10T05:37:11.000Z", + "sourceAddress": "0x715128a2C79b3640A469B2cb3992f4D93eD3C48e", + "beneficiaryAddress": "0x50ff161b71e884dad3c7ddfd7adf857e2175aeeab233b3c4e848f857cfc43b3c", + "tokenAddress": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "destinationParachain": 2030, + "destinationFee": "20000000", + "amount": "25000000000000000" + }, + "submitted": { + "blockHash": "0xd73c695fa40b8d8bbc53337c4a60d3995315589340726b306d88f59cc94c53b1", + "blockNumber": 21155218, + "logIndex": 298, + "transactionHash": "0x11392121a85f3a6250e62da0f6d9a6495f8dc3eb8bff336c9cfa07a06252e567", + "transactionIndex": 115, + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "messageId": "0xe7a42cb96251f98163c006be8488db3906a4194e37539324453452390d586512", + "nonce": 299 + }, + "inboundMessageReceived": { + "extrinsic_index": "3841278-2", + "extrinsic_hash": "0xb207f0ebc2052ef4bb8401553359ba6347d6020b4be7a5261d65ca32556a063d", + "event_index": "3841278-7", + "block_timestamp": 1731218304, + "messageId": "0xe7a42cb96251f98163c006be8488db3906a4194e37539324453452390d586512", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "nonce": 299 + }, + "assetHubMessageProcessed": { + "extrinsic_hash": "0xbeb6d6e7164c1d42ec7b077c065f4db1c4b5452a9d30d7d5ef45fd01b520d7fb", + "event_index": "7525965-10", + "block_timestamp": 1731218316, + "success": true, + "sibling": 1002 + } + }, + { + "id": "0xe43895861cdf33b59b60e6a25b51eb83ea0638c71618b41a44f67505e53a7608", + "status": 1, + "info": { + "when": "2024-11-09T19:06:47.000Z", + "sourceAddress": "0x56A00dAA8ec50cA867Cb1C68601b96bF1A84C540", + "beneficiaryAddress": "0x56a00daa8ec50ca867cb1c68601b96bf1a84c540", + "tokenAddress": "0xBA41Ddf06B7fFD89D1267b5A93BFeF2424eb2003", + "destinationParachain": 3369, + "destinationFee": "500000000", + "amount": "79000000000000000000" + }, + "submitted": { + "blockHash": "0x4b131d3f5b4cf1c549914eaff394aee4c167fbd89e7d7cb53cf71fcb162e9f5e", + "blockNumber": 21152078, + "logIndex": 484, + "transactionHash": "0xc05cfac49e45b3df117e89e455ee01005c94a4105de9329dd774f95ef23b71ed", + "transactionIndex": 81, + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "messageId": "0xe43895861cdf33b59b60e6a25b51eb83ea0638c71618b41a44f67505e53a7608", + "nonce": 298 + }, + "inboundMessageReceived": { + "extrinsic_index": "3838128-2", + "extrinsic_hash": "0x51ad32e51a58c5f44fda47f2b933a7ab6dff9b0803fc121ac0d802a99fda8c08", + "event_index": "3838128-7", + "block_timestamp": 1731180288, + "messageId": "0xe43895861cdf33b59b60e6a25b51eb83ea0638c71618b41a44f67505e53a7608", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "nonce": 298 + }, + "assetHubMessageProcessed": { + "extrinsic_hash": "0xa1d910d5778e2bbd2c56ffc7af2551190dc7e88b72c7676b71b1635a13661dfd", + "event_index": "7522816-10", + "block_timestamp": 1731180300, + "success": true, + "sibling": 1002 + } + }, + { + "id": "0x029211f68e16e5aed5f045ef56bf78a4cd19a9daca090db4dc19c0a60b392ed7", + "status": 1, + "info": { + "when": "2024-11-09T11:01:47.000Z", + "sourceAddress": "0x5DD57766FdB0982Afd9Ca2Eb5064B632622bCfDb", + "beneficiaryAddress": "0xd8b8b4b858e8130df5d78e55a3b35bbfe5d6795b7021054be7e09a9738b04f09", + "tokenAddress": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "destinationParachain": 2030, + "destinationFee": "20000000", + "amount": "1000000000000000" + }, + "submitted": { + "blockHash": "0xafa8a9aafbad754a802e4bbc685607bbd1472c02e49cb210a7454af384b183fa", + "blockNumber": 21149667, + "logIndex": 166, + "transactionHash": "0xc6f350e6741dccfd0eb2632827db6cf9fbd285632864bd1b8768165d011a5ad3", + "transactionIndex": 28, + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "messageId": "0x029211f68e16e5aed5f045ef56bf78a4cd19a9daca090db4dc19c0a60b392ed7", + "nonce": 297 + }, + "inboundMessageReceived": { + "extrinsic_index": "3835713-2", + "extrinsic_hash": "0xa275e21669e05d42671f75719bd4cdaa9e2dbc5f9e9438334605265dead4d513", + "event_index": "3835713-7", + "block_timestamp": 1731151104, + "messageId": "0x029211f68e16e5aed5f045ef56bf78a4cd19a9daca090db4dc19c0a60b392ed7", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "nonce": 297 + }, + "assetHubMessageProcessed": { + "extrinsic_hash": "0x1c3afbd4a1ae630d607ee8b5ad8568469e3a4b699ae29f611f0bb21a9df52689", + "event_index": "7520403-10", + "block_timestamp": 1731151116, + "success": true, + "sibling": 1002 + } + }, + { + "id": "0xdbbb176d1e7ab22108ff3752129200345f26c4b78bdfdca3795ca81edd61f229", + "status": 1, + "info": { + "when": "2024-11-08T16:57:42.000Z", + "sourceAddress": "11CNsKrurDkC9cm54axNLx7W8MsMWsxKCWYPvgMLaahSPsj", + "tokenAddress": "0x5d3d01fd6d2ad1169b17918eb4f153c6616288eb", + "beneficiaryAddress": "0x97a6c2de9a2ac3d75e85d70e465bd5a621813ce8", + "amount": "72495000000000000000" + }, + "submitted": { + "extrinsic_index": "7514947-2", + "extrinsic_hash": "0xc127861781722fd940f5aae2982ac06464b3c91df9e22eea3ce7563442c012d5", + "block_hash": "0xf8143d3b0791a8a24801c4dc7a5ac0d3215e3565e29bbee6bbce8596a19ef8fa", + "account_id": "11CNsKrurDkC9cm54axNLx7W8MsMWsxKCWYPvgMLaahSPsj", + "block_num": 7514947, + "block_timestamp": 1731085062, + "messageId": "0xdbbb176d1e7ab22108ff3752129200345f26c4b78bdfdca3795ca81edd61f229", + "bridgeHubMessageId": "0x67d438f9389044a7b4e50734f128c2160235cdcd89da91c0bf92b6045106048c", + "success": true, + "relayChain": { + "block_num": 23324453, + "block_hash": "0x66700b3dedb7944f641417ca4e7b700dfa3e8beb685075b020014977d286bc95" + } + }, + "bridgeHubXcmDelivered": { + "block_timestamp": 1731085074, + "event_index": "3830265-14", + "extrinsic_hash": "0xd8b1a4905c66cea67d5a53a556a4a493dc9f01a00dd6b07cf21e4e3c14f60c69", + "siblingParachain": 1000, + "success": true + }, + "bridgeHubChannelDelivered": { + "block_timestamp": 1731085074, + "event_index": "3830265-16", + "extrinsic_hash": "0xd8b1a4905c66cea67d5a53a556a4a493dc9f01a00dd6b07cf21e4e3c14f60c69", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "success": true + }, + "bridgeHubMessageQueued": { + "block_timestamp": 1731085074, + "event_index": "3830265-10", + "extrinsic_hash": "0xd8b1a4905c66cea67d5a53a556a4a493dc9f01a00dd6b07cf21e4e3c14f60c69" + }, + "bridgeHubMessageAccepted": { + "block_timestamp": 1731085074, + "event_index": "3830265-15", + "extrinsic_hash": "0xd8b1a4905c66cea67d5a53a556a4a493dc9f01a00dd6b07cf21e4e3c14f60c69", + "nonce": 54 + }, + "ethereumMessageDispatched": { + "blockNumber": 21145675, + "blockHash": "0x6cf7ca22c7b008184e17ccf5a0b085aade7f64571443483b8012fb6724a5f938", + "transactionHash": "0x0d3a93fa898370498ff53c87fe5918116184cc8323438e90ca72ac415ab2474e", + "transactionIndex": 239, + "logIndex": 656, + "messageId": "0xdbbb176d1e7ab22108ff3752129200345f26c4b78bdfdca3795ca81edd61f229", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "nonce": 54, + "success": true + } + }, + { + "id": "0x6d1546090bac59588f9968b1df99580a1494dd0988e696c945c63321f7840c43", + "status": 1, + "info": { + "when": "2024-11-07T21:49:59.000Z", + "sourceAddress": "0xb3ff54b7F24950945bA8f1778F52835a7aD30A7F", + "beneficiaryAddress": "0xabac13d33ce4cd129377b28dab59c30dd21cf796", + "tokenAddress": "0xBA41Ddf06B7fFD89D1267b5A93BFeF2424eb2003", + "destinationParachain": 3369, + "destinationFee": "500000000", + "amount": "55000000000000000000000" + }, + "submitted": { + "blockHash": "0x6d1c8fa3ab1345280a7325953c40e932376ecda9563643a4752204ca2e1115ec", + "blockNumber": 21138562, + "logIndex": 281, + "transactionHash": "0xc4cf43057a9156683f6d0444867f52da48eb5b5e407934eda77dc48ba5c604a7", + "transactionIndex": 36, + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "messageId": "0x6d1546090bac59588f9968b1df99580a1494dd0988e696c945c63321f7840c43", + "nonce": 296 + }, + "inboundMessageReceived": { + "extrinsic_index": "3824684-2", + "extrinsic_hash": "0x9e12dec71cbd8440fc91a8cf07e16f205613d85957ae9d168aee1dd3a8e63aa1", + "event_index": "3824684-7", + "block_timestamp": 1731017424, + "messageId": "0x6d1546090bac59588f9968b1df99580a1494dd0988e696c945c63321f7840c43", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "nonce": 296 + }, + "assetHubMessageProcessed": { + "extrinsic_hash": "0xb22577fa6ee120f156faeb5a26e6fa77e0784f05e48e6f38a431cd541ed0719e", + "event_index": "7509372-19", + "block_timestamp": 1731017436, + "success": true, + "sibling": 1002 + } + }, + { + "id": "0xcff68b755e6d05c070f84ccc6d4900d1e1eabb4c6b01f86cffe76c4e5d8786e2", + "status": 1, + "info": { + "when": "2024-11-07T12:10:59.000Z", + "sourceAddress": "0xC1af060ab8213AD5EE2Dab1a5891245eBe756400", + "beneficiaryAddress": "0x769cac6c783b28e8ecf3c404af388996435b1f8aba90b0f363928caaf342142f", + "tokenAddress": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "destinationParachain": 1000, + "destinationFee": "0", + "amount": "20000000" + }, + "submitted": { + "blockHash": "0x567e888b26ff5d59b24289da2f94d032f17d69136583c85b73a17ab8e819dc82", + "blockNumber": 21135689, + "logIndex": 340, + "transactionHash": "0x357c24fdf7c836e383a5b3d8b3204f03773b11688ccda2e8b62515bcc2e830c3", + "transactionIndex": 227, + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "messageId": "0xcff68b755e6d05c070f84ccc6d4900d1e1eabb4c6b01f86cffe76c4e5d8786e2", + "nonce": 295 + }, + "inboundMessageReceived": { + "extrinsic_index": "3821828-2", + "extrinsic_hash": "0xb66cd05bf91104d38cf96d49906244a102149dba1b0787fe38b9b87b2ed44b6e", + "event_index": "3821828-7", + "block_timestamp": 1730982924, + "messageId": "0xcff68b755e6d05c070f84ccc6d4900d1e1eabb4c6b01f86cffe76c4e5d8786e2", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "nonce": 295 + }, + "assetHubMessageProcessed": { + "extrinsic_hash": "0x6910968dbe9c537cccb385e4a8fe6163b6b5cc7fe0d5fc181b0801313a80489f", + "event_index": "7506514-7", + "block_timestamp": 1730982936, + "success": true, + "sibling": 1002 + } + }, + { + "id": "0x11a94260744617e1e65a87d2908d2d74274cb34377eb29fb4d7bb985233a3e70", + "status": 1, + "info": { + "when": "2024-11-06T21:26:47.000Z", + "sourceAddress": "0x2796262E067c9fD0ccF939673B461A2502d16367", + "beneficiaryAddress": "0x280506e525f3d3ced8d316b02e9e85614abebfb7", + "tokenAddress": "0xBA41Ddf06B7fFD89D1267b5A93BFeF2424eb2003", + "destinationParachain": 3369, + "destinationFee": "500000000", + "amount": "2000000000000000000000000" + }, + "submitted": { + "blockHash": "0x81af531954d11120a551bfbe49611ef2d0bf000c8e702af482385b2bbd08680e", + "blockNumber": 21131289, + "logIndex": 273, + "transactionHash": "0x33df9cc8925bd23280617b8901c8889d22622c8415c69431e53e62571ef7f3ed", + "transactionIndex": 41, + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "messageId": "0x11a94260744617e1e65a87d2908d2d74274cb34377eb29fb4d7bb985233a3e70", + "nonce": 294 + }, + "inboundMessageReceived": { + "extrinsic_index": "3817415-2", + "extrinsic_hash": "0xb3194ccf8ce7015f9ac1c800e1a2e4f18f88bb3c8e1ba844253be21ea8d15b99", + "event_index": "3817415-7", + "block_timestamp": 1730929572, + "messageId": "0x11a94260744617e1e65a87d2908d2d74274cb34377eb29fb4d7bb985233a3e70", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "nonce": 294 + }, + "assetHubMessageProcessed": { + "extrinsic_hash": "0xab03223985ac1a4748602ae02aebcc64b5ea59205837f13beeec3e01bf1d598d", + "event_index": "7502100-10", + "block_timestamp": 1730929584, + "success": true, + "sibling": 1002 + } + }, + { + "id": "0x4916ded17bc7e46287cd41327c27128a810a7313b93e91bbf6391c815717145f", + "status": 1, + "info": { + "when": "2024-11-06T12:41:24.000Z", + "sourceAddress": "14hYErHah31krca99cnZgqtbD9NVcG3iNWZP7zCtndx6hA3", + "tokenAddress": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", + "beneficiaryAddress": "0x7b777ce9e2874300ebac873a4c38cd8d24d34f6a", + "amount": "6161910000000000000" + }, + "submitted": { + "extrinsic_index": "7499398-2", + "extrinsic_hash": "0x9e330fa4d6ef771b18723d6dc9e8552f45d8e6d939609036f6eca4c3a47d0de7", + "block_hash": "0x13e5d3435597204ca6f0356098f053ceb184c4ac1f77cc2ebed7b6270f999453", + "account_id": "14hYErHah31krca99cnZgqtbD9NVcG3iNWZP7zCtndx6hA3", + "block_num": 7499398, + "block_timestamp": 1730896884, + "messageId": "0x4916ded17bc7e46287cd41327c27128a810a7313b93e91bbf6391c815717145f", + "bridgeHubMessageId": "0x4a1d92bc39e5637bb23b53bda4e994e30bf2198131cd43fe92248904c2099eb5", + "success": true, + "relayChain": { + "block_num": 23293172, + "block_hash": "0x239b5090e7ac55782f4e6aa997f4ff8cd8fcd052758305ef41a81a2a38fb1b8f" + } + }, + "bridgeHubXcmDelivered": { + "block_timestamp": 1730896896, + "event_index": "3814713-14", + "extrinsic_hash": "0x527b76ec3796a2c9c7aa638ad4cedec2a62c7c17d4f63c31c874553ef317127e", + "siblingParachain": 1000, + "success": true + }, + "bridgeHubChannelDelivered": { + "block_timestamp": 1730896896, + "event_index": "3814713-16", + "extrinsic_hash": "0x527b76ec3796a2c9c7aa638ad4cedec2a62c7c17d4f63c31c874553ef317127e", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "success": true + }, + "bridgeHubMessageQueued": { + "block_timestamp": 1730896896, + "event_index": "3814713-10", + "extrinsic_hash": "0x527b76ec3796a2c9c7aa638ad4cedec2a62c7c17d4f63c31c874553ef317127e" + }, + "bridgeHubMessageAccepted": { + "block_timestamp": 1730896896, + "event_index": "3814713-15", + "extrinsic_hash": "0x527b76ec3796a2c9c7aa638ad4cedec2a62c7c17d4f63c31c874553ef317127e", + "nonce": 53 + }, + "ethereumMessageDispatched": { + "blockNumber": 21129690, + "blockHash": "0xf361ad1b17bba98abd43ffb63e62537a9e0f49482294748415b7fbbe0498bdce", + "transactionHash": "0xe4974175cbda96e89a7e0f70127fe11d45586765c56261025a3a8c48ebaf45b4", + "transactionIndex": 162, + "logIndex": 379, + "messageId": "0x4916ded17bc7e46287cd41327c27128a810a7313b93e91bbf6391c815717145f", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "nonce": 53, + "success": true + } + }, + { + "id": "0xf5e40c72045b1e8fcabce6a06082c533b239a6775b145ae05349b42db97f16d2", + "status": 1, + "info": { + "when": "2024-11-05T22:32:35.000Z", + "sourceAddress": "0xb3ff54b7F24950945bA8f1778F52835a7aD30A7F", + "beneficiaryAddress": "0xabac13d33ce4cd129377b28dab59c30dd21cf796", + "tokenAddress": "0xBA41Ddf06B7fFD89D1267b5A93BFeF2424eb2003", + "destinationParachain": 3369, + "destinationFee": "500000000", + "amount": "80000000000000000000000" + }, + "submitted": { + "blockHash": "0x254b52c12b0537aa1abfa4c5e2a73aee33eeb3607ceee7360451909ba2aa0780", + "blockNumber": 21124451, + "logIndex": 1055, + "transactionHash": "0x2a3ad8238ea9feaa8e2ed08b7748d796d5797b8211fa3202068c9ce9efae2ef2", + "transactionIndex": 136, + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "messageId": "0xf5e40c72045b1e8fcabce6a06082c533b239a6775b145ae05349b42db97f16d2", + "nonce": 290 + }, + "inboundMessageReceived": { + "extrinsic_index": "3810590-2", + "extrinsic_hash": "0x80e594c57b7d8eaff203204cecc82b7ddda2fa5e9ba264c30773db439a25e74f", + "event_index": "3810590-7", + "block_timestamp": 1730846970, + "messageId": "0xf5e40c72045b1e8fcabce6a06082c533b239a6775b145ae05349b42db97f16d2", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "nonce": 290 + }, + "assetHubMessageProcessed": { + "extrinsic_hash": "0x340f4a1d2ebdc95130d438f68a4f0346a82be89da04d6c46ed51d480073b51d5", + "event_index": "7495269-9", + "block_timestamp": 1730846988, + "success": true, + "sibling": 1002 + } + }, + { + "id": "0x7be17084b585a5c013478172e0e51632e2c07bcf8740b3e686d3d9348a37afd9", + "status": 1, + "info": { + "when": "2024-11-05T13:47:35.000Z", + "sourceAddress": "0xb3ff54b7F24950945bA8f1778F52835a7aD30A7F", + "beneficiaryAddress": "0xabac13d33ce4cd129377b28dab59c30dd21cf796", + "tokenAddress": "0xBA41Ddf06B7fFD89D1267b5A93BFeF2424eb2003", + "destinationParachain": 3369, + "destinationFee": "500000000", + "amount": "70000000000000000000000" + }, + "submitted": { + "blockHash": "0xcae50febd9b9ce4d7795764ab7f70bbe97b26011a266f2765049b56fe20042a8", + "blockNumber": 21121842, + "logIndex": 423, + "transactionHash": "0x8530d6f54f8a6f86186a2969c7de13fc8bba5499eefde605358202a6f5a45a22", + "transactionIndex": 136, + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "messageId": "0x7be17084b585a5c013478172e0e51632e2c07bcf8740b3e686d3d9348a37afd9", + "nonce": 289 + }, + "inboundMessageReceived": { + "extrinsic_index": "3807989-2", + "extrinsic_hash": "0x81ec4a168472219855a9f3ca34ff6217cf915505a6569c9915664cca9a4bc45b", + "event_index": "3807989-7", + "block_timestamp": 1730815536, + "messageId": "0x7be17084b585a5c013478172e0e51632e2c07bcf8740b3e686d3d9348a37afd9", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "nonce": 289 + }, + "assetHubMessageProcessed": { + "extrinsic_hash": "0x36bf0610b8a2fdc115e18abb02da65be925d5641b01d361af0bb44c08b7217fa", + "event_index": "7492670-9", + "block_timestamp": 1730815554, + "success": true, + "sibling": 1002 + } + }, + { + "id": "0xe82f120381eb2c7fc62fa1e944aa8d8aef8dc614129a8ab0ce111fc0c466ef7c", + "status": 1, + "info": { + "when": "2024-11-05T02:24:11.000Z", + "sourceAddress": "0xe43B0b1f5e60CeFb2aEFffbB58cd7881fDbF6C08", + "beneficiaryAddress": "0xe43b0b1f5e60cefb2aefffbb58cd7881fdbf6c08", + "tokenAddress": "0xBA41Ddf06B7fFD89D1267b5A93BFeF2424eb2003", + "destinationParachain": 3369, + "destinationFee": "500000000", + "amount": "1000000000000000000" + }, + "submitted": { + "blockHash": "0x4019368cbd8b8461ef938ca778135c1589463529c06f4ef0cf00e4bb78cf3d9a", + "blockNumber": 21118446, + "logIndex": 466, + "transactionHash": "0xda850ff887b8a75ad5c578040c320a81b11c7c1a04517bf7e45d338159c6ee79", + "transactionIndex": 131, + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "messageId": "0xe82f120381eb2c7fc62fa1e944aa8d8aef8dc614129a8ab0ce111fc0c466ef7c", + "nonce": 288 + }, + "inboundMessageReceived": { + "extrinsic_index": "3804588-2", + "extrinsic_hash": "0x423b1f2a65c1a385908161481de0ac4f93dfd630223436e7972dbb6cf86a141e", + "event_index": "3804588-7", + "block_timestamp": 1730774358, + "messageId": "0xe82f120381eb2c7fc62fa1e944aa8d8aef8dc614129a8ab0ce111fc0c466ef7c", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "nonce": 288 + }, + "assetHubMessageProcessed": { + "extrinsic_hash": "0xf46a64965bad6c622dc781a2fac0ebdd06efddf09be13989455479a7e6ba4a17", + "event_index": "7489267-9", + "block_timestamp": 1730774370, + "success": true, + "sibling": 1002 + } + }, + { + "id": "0x64395c136d2138f73b880b14b4d6a7dc78b728ee113d14326139dbb1f7d37081", + "status": 1, + "info": { + "when": "2024-11-05T01:03:59.000Z", + "sourceAddress": "0x1076c2cfB8d1f3AA5Bf050D8C0d6D128175BFEee", + "beneficiaryAddress": "0x5a0e44608596e533c2fe4dca91187863df8ace6e", + "tokenAddress": "0xBA41Ddf06B7fFD89D1267b5A93BFeF2424eb2003", + "destinationParachain": 3369, + "destinationFee": "500000000", + "amount": "33169560707000000000000" + }, + "submitted": { + "blockHash": "0x929231d5424829b4f4a8b567cd5da5ce33c94f078fe9e63f2c47ac9580d4e6b0", + "blockNumber": 21118047, + "logIndex": 597, + "transactionHash": "0xacd9928c868134947834c1468a5b3ac5b2a9309c67c0086e7dba079efc134f14", + "transactionIndex": 155, + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "messageId": "0x64395c136d2138f73b880b14b4d6a7dc78b728ee113d14326139dbb1f7d37081", + "nonce": 287 + }, + "inboundMessageReceived": { + "extrinsic_index": "3804210-2", + "extrinsic_hash": "0xaf20fc9f8820afa6f4c42440e3a201edff83aea5f909b255ee2365d03c254f9a", + "event_index": "3804210-7", + "block_timestamp": 1730769810, + "messageId": "0x64395c136d2138f73b880b14b4d6a7dc78b728ee113d14326139dbb1f7d37081", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "nonce": 287 + }, + "assetHubMessageProcessed": { + "extrinsic_hash": "0x958bba8c5c4e26263f863d571e16eeb08f55e8ed760b1fea25a56cd3ff5f2ac2", + "event_index": "7488889-9", + "block_timestamp": 1730769828, + "success": true, + "sibling": 1002 + } + }, + { + "id": "0xc0b4b7d205d92c68f9eac90eee2906a868bd70be129d26ba31b0d83d9f2d1220", + "status": 1, + "info": { + "when": "2024-11-04T23:59:11.000Z", + "sourceAddress": "0x1076c2cfB8d1f3AA5Bf050D8C0d6D128175BFEee", + "beneficiaryAddress": "0x5a0e44608596e533c2fe4dca91187863df8ace6e", + "tokenAddress": "0xBA41Ddf06B7fFD89D1267b5A93BFeF2424eb2003", + "destinationParachain": 3369, + "destinationFee": "500000000", + "amount": "1000000000000000000000" + }, + "submitted": { + "blockHash": "0x5793bb6bd3b635e4b7adbae171365f936af013482a2132323ae50cfa4b3b3be4", + "blockNumber": 21117724, + "logIndex": 360, + "transactionHash": "0x10f8e0690dd784981c2ac7f191e0e548aac4bc3e74f6376d4cc206038a672d30", + "transactionIndex": 167, + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "messageId": "0xc0b4b7d205d92c68f9eac90eee2906a868bd70be129d26ba31b0d83d9f2d1220", + "nonce": 286 + }, + "inboundMessageReceived": { + "extrinsic_index": "3803891-2", + "extrinsic_hash": "0x14e759334f782d666cef5a0b5ab63981f3f3f570a3045ee2d0111b85e5fd2271", + "event_index": "3803891-7", + "block_timestamp": 1730765976, + "messageId": "0xc0b4b7d205d92c68f9eac90eee2906a868bd70be129d26ba31b0d83d9f2d1220", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "nonce": 286 + }, + "assetHubMessageProcessed": { + "extrinsic_hash": "0x5e80f1eab2c7b5cecee96936ff4b4b2a2b93a448e6ff156a8f7ebccb799a272b", + "event_index": "7488569-10", + "block_timestamp": 1730765988, + "success": true, + "sibling": 1002 + } + }, + { + "id": "0x2985f3a8340af593456325ada3b294da33f95007b89abbc97e6dee37d087a751", + "status": 1, + "info": { + "when": "2024-11-04T16:34:06.000Z", + "sourceAddress": "16kgeC6FB292m9j1GQ3E2X4osCoGdf3L7CkD4nQcJjLhaDve", + "tokenAddress": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", + "beneficiaryAddress": "0x95d50631c0b4cf4b14a6753df6cc56dd31f6c814", + "amount": "5000000000000000000" + }, + "submitted": { + "extrinsic_index": "7486248-2", + "extrinsic_hash": "0x0e763ee8e3cfc2a0274b02dac283875434c4bc61f8dbba3292e843e74c98e293", + "block_hash": "0xa1a4c0e2463b070504667ac2e3a1e5926f8d176895c2f745aafb17ff77cb8552", + "account_id": "16kgeC6FB292m9j1GQ3E2X4osCoGdf3L7CkD4nQcJjLhaDve", + "block_num": 7486248, + "block_timestamp": 1730738046, + "messageId": "0x2985f3a8340af593456325ada3b294da33f95007b89abbc97e6dee37d087a751", + "bridgeHubMessageId": "0x671114c85d6b923f41f2af4f970e5cf4b94ae4831f835cd3eb0ca7721d2525d7", + "success": true, + "relayChain": { + "block_num": 23266718, + "block_hash": "0x9f62ad42e3c63060c00f48de69c1794a1094d309c70a996876142cb7ac1d314e" + } + }, + "bridgeHubXcmDelivered": { + "block_timestamp": 1730738058, + "event_index": "3801572-14", + "extrinsic_hash": "0x5f687194fc31e58ef61fb25bb90b9c6dc1fffa7eee795fe1316235236cd270c9", + "siblingParachain": 1000, + "success": true + }, + "bridgeHubChannelDelivered": { + "block_timestamp": 1730738058, + "event_index": "3801572-16", + "extrinsic_hash": "0x5f687194fc31e58ef61fb25bb90b9c6dc1fffa7eee795fe1316235236cd270c9", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "success": true + }, + "bridgeHubMessageQueued": { + "block_timestamp": 1730738058, + "event_index": "3801572-10", + "extrinsic_hash": "0x5f687194fc31e58ef61fb25bb90b9c6dc1fffa7eee795fe1316235236cd270c9" + }, + "bridgeHubMessageAccepted": { + "block_timestamp": 1730738058, + "event_index": "3801572-15", + "extrinsic_hash": "0x5f687194fc31e58ef61fb25bb90b9c6dc1fffa7eee795fe1316235236cd270c9", + "nonce": 50 + }, + "ethereumMessageDispatched": { + "blockNumber": 21116563, + "blockHash": "0xfa4c6852e19b39f6f75b1d44a7293f5f6f4bc769b708854a31df1df7f0c02f85", + "transactionHash": "0x6927ff8406aed03665126b697c74da7ac680ea0c6a4aaeba29346341a9555ba9", + "transactionIndex": 154, + "logIndex": 373, + "messageId": "0x2985f3a8340af593456325ada3b294da33f95007b89abbc97e6dee37d087a751", + "channelId": "0xc173fac324158e77fb5840738a1a541f633cbec8884c6a601c567d2b376a0539", + "nonce": 50, + "success": true + } + } +]