diff --git a/web/packages/api/package.json b/web/packages/api/package.json index 023bb597e0..d25c1900fd 100644 --- a/web/packages/api/package.json +++ b/web/packages/api/package.json @@ -1,6 +1,6 @@ { "name": "@snowbridge/api", - "version": "0.1.10", + "version": "0.1.11", "description": "Snowbridge API client", "license": "Apache-2.0", "repository": { diff --git a/web/packages/api/src/history.ts b/web/packages/api/src/history.ts index 7d37f153d5..40da24dfdb 100644 --- a/web/packages/api/src/history.ts +++ b/web/packages/api/src/history.ts @@ -908,74 +908,84 @@ const getEthOutboundMessages = async ( om.getBlock(), context.ethereum.api.getTransaction(om.transactionHash), ]) - const [ - tokenAddress, - destinationParachain, - [addressType, beneficiaryAddress], - destinationFee, - amount, - ] = context.ethereum.contracts.gateway.interface.decodeFunctionData( - "sendToken", - transaction!.data - ) - let beneficiary = beneficiaryAddress as string - switch (addressType) { - case 0n: - { - // 4-byte index - const index = BigInt(beneficiary.substring(0, 6)) - beneficiary = index.toString() - } - break - case 2n: - { - // 20-byte address - beneficiary = beneficiary.substring(0, 42) - } - break - } - let beaconBlockRoot - if (!skipLightClientUpdates) { - try { - beaconBlockRoot = await fetchBeaconSlot( - context.config.ethereum.beacon_url, - block.parentBeaconBlockRoot as any - ) - } catch (err) { - let message = "Unknown" - if (err instanceof Error) { - message = err.message + try { + const [ + tokenAddress, + destinationParachain, + [addressType, beneficiaryAddress], + destinationFee, + amount, + ] = context.ethereum.contracts.gateway.interface.decodeFunctionData( + "sendToken", + transaction!.data + ) + let beneficiary = beneficiaryAddress as string + switch (addressType) { + case 0n: + { + // 4-byte index + const index = BigInt(beneficiary.substring(0, 6)) + beneficiary = index.toString() + } + break + case 2n: + { + // 20-byte address + beneficiary = beneficiary.substring(0, 42) + } + break + } + + let beaconBlockRoot + if (!skipLightClientUpdates) { + try { + beaconBlockRoot = await fetchBeaconSlot( + context.config.ethereum.beacon_url, + block.parentBeaconBlockRoot as any + ) + } catch (err) { + let message = "Unknown" + if (err instanceof Error) { + message = err.message + } + console.error( + `Error fetching beacon slot: ${message}. Skipping light client update.`, + err + ) } - console.error( - `Error fetching beacon slot: ${message}. Skipping light client update.`, - err - ) } - } - result.push({ - blockNumber: om.blockNumber, - blockHash: om.blockHash, - logIndex: om.index, - transactionIndex: om.transactionIndex, - transactionHash: om.transactionHash, - data: { - sourceAddress: transaction!.from, - timestamp: block.timestamp, - channelId: om.args.channelID, - nonce: Number(om.args.nonce), - messageId: om.args.messageID, - parentBeaconSlot: beaconBlockRoot - ? Number(beaconBlockRoot.data.message.slot) - : undefined, - tokenAddress: tokenAddress as string, - destinationParachain: Number(destinationParachain), - beneficiaryAddress: beneficiary, - destinationFee: destinationFee.toString() as string, - amount: amount.toString() as string, - }, - }) + result.push({ + blockNumber: om.blockNumber, + blockHash: om.blockHash, + logIndex: om.index, + transactionIndex: om.transactionIndex, + transactionHash: om.transactionHash, + data: { + sourceAddress: transaction!.from, + timestamp: block.timestamp, + channelId: om.args.channelID, + nonce: Number(om.args.nonce), + messageId: om.args.messageID, + parentBeaconSlot: beaconBlockRoot + ? Number(beaconBlockRoot.data.message.slot) + : undefined, + tokenAddress: tokenAddress as string, + destinationParachain: Number(destinationParachain), + beneficiaryAddress: beneficiary, + destinationFee: destinationFee.toString() as string, + amount: amount.toString() as string, + }, + }) + } catch (err) { + let message = "Transaction decoding error" + if (err instanceof Error) { + message = `Transaction decoding error: ${err.message}` + } + console.error("Skipping message: ", message) + continue + } } return result } diff --git a/web/packages/contract-types/package.json b/web/packages/contract-types/package.json index 0b13fee0d9..cfb4684c73 100644 --- a/web/packages/contract-types/package.json +++ b/web/packages/contract-types/package.json @@ -1,6 +1,6 @@ { "name": "@snowbridge/contract-types", - "version": "0.1.10", + "version": "0.1.11", "description": "Snowbridge contract type bindings", "license": "Apache-2.0", "repository": { diff --git a/web/packages/contracts/package.json b/web/packages/contracts/package.json index c9ebbb0960..1fddc647b5 100644 --- a/web/packages/contracts/package.json +++ b/web/packages/contracts/package.json @@ -1,6 +1,6 @@ { "name": "@snowbridge/contracts", - "version": "0.1.10", + "version": "0.1.11", "description": "Snowbridge contract source and abi.", "license": "Apache-2.0", "repository": { diff --git a/web/packages/operations/src/global_transfer_history.ts b/web/packages/operations/src/global_transfer_history.ts index d1c784b8c4..8ce226bbe1 100644 --- a/web/packages/operations/src/global_transfer_history.ts +++ b/web/packages/operations/src/global_transfer_history.ts @@ -17,26 +17,24 @@ const monitor = async () => { if (!config.SUBSCAN_API) throw Error(`Environment ${env} does not support subscan.`) const ethereumProvider = new AlchemyProvider("sepolia", process.env.REACT_APP_ALCHEMY_KEY) - const context = await contextFactory( - { - ethereum: { - execution_url: ethereumProvider, - beacon_url: config.BEACON_HTTP_API, + const context = await contextFactory({ + ethereum: { + execution_url: ethereumProvider, + beacon_url: config.BEACON_HTTP_API, + }, + polkadot: { + url: { + bridgeHub: config.BRIDGE_HUB_WS_URL, + assetHub: config.ASSET_HUB_WS_URL, + relaychain: config.RELAY_CHAIN_WS_URL, + parachains: config.PARACHAINS, }, - polkadot: { - url: { - bridgeHub: config.BRIDGE_HUB_WS_URL, - assetHub: config.ASSET_HUB_WS_URL, - relaychain: config.RELAY_CHAIN_WS_URL, - parachains: config.PARACHAINS, - }, - }, - appContracts: { - gateway: config.GATEWAY_CONTRACT, - beefy: config.BEEFY_CONTRACT, - }, - } - ) + }, + appContracts: { + gateway: config.GATEWAY_CONTRACT, + beefy: config.BEEFY_CONTRACT, + }, + }) const ethBlockTimeSeconds = 12 const polkadotBlockTimeSeconds = 9