UNPKG

polymer-template-gizr

Version:

Template project to start building IBC enabled Solidity contracts, with Hardhat and Foundry support

242 lines (220 loc) โ€ข 11 kB
const hre = require("hardhat"); const { areAddressesEqual, getConfigPath } = require("./_helpers.js"); const { getDispatcher, getUcHandlerAddress } = require("./_vibc-helpers.js"); const explorerOpUrl = "https://optimism-sepolia.blockscout.com/"; const explorerBaseUrl = "https://base-sepolia.blockscout.com/"; function filterChannelEvents(portAddress) { const config = require(getConfigPath()); return areAddressesEqual(portAddress, config.createChannel["srcAddr"]) || areAddressesEqual(portAddress, config.createChannel["dstAddr"]); } function listenForIbcChannelEvents(network, source, dispatcher) { const explorerUrl = network === "optimism" ? explorerOpUrl : explorerBaseUrl; console.log(`๐Ÿ‘‚ Listening for IBC channel events on ${network}...`); dispatcher.on( "OpenIbcChannel", (portAddress, version, ordering, feeEnabled, connectionHops, counterparytPortId, counterpartyChannelId, event) => { const txHash = event.log.transactionHash; const counterpartyChannelIdString = hre.ethers.decodeBytes32String(counterpartyChannelId); const url = `${explorerUrl}tx/${txHash}`; if (filterChannelEvents(portAddress)) { console.log(` -------------------------------------------`); if (source) { console.log(` ๐Ÿ™‹โ€โ™€๏ธ CHANNEL OPEN INIT !!! ๐Ÿ™‹โ€โ™€๏ธ`); } else { console.log(` ๐Ÿ™‹โ€โ™‚๏ธ CHANNEL OPEN TRY !!! ๐Ÿ™‹โ€โ™‚๏ธ`); } console.log(` ------------------------------------------- ๐Ÿ”” Event name: ${event.log.fragment.name} โ›“๏ธ Network: ${network} ๐Ÿ”— Port Address: ${portAddress} ๐Ÿ”— Counterparty Port ID: ${counterparytPortId} ๐Ÿ›ฃ๏ธ Counterparty Channel ID: ${counterpartyChannelIdString} ๐Ÿฆ˜ Connection Hops: ${connectionHops} ๐Ÿ”€ Ordering: ${ordering} ๐Ÿ’ฐ Fee Enabled: ${feeEnabled} #๏ธโƒฃ Version: ${version} ------------------------------------------- ๐Ÿงพ TxHash: ${txHash} ๐Ÿ” Explorer URL: ${url} -------------------------------------------\n`); if (source) { console.log(` โฑ๏ธ Waiting for channel open try...`); } else { console.log(` โฑ๏ธ Waiting for channel open ack...`); } } } ); dispatcher.on("ConnectIbcChannel", (portAddress, channelId, event) => { const txHash = event.log.transactionHash; const channelIdString = hre.ethers.decodeBytes32String(channelId); const url = `${explorerUrl}tx/${txHash}`; if (filterChannelEvents(portAddress)) { console.log(` -------------------------------------------`); if (source) { console.log(` ๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ CHANNEL OPEN ACK !!! ๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ`); } else { console.log(` ๐Ÿคตโ€โ™‚๏ธ๐Ÿ’๐Ÿ‘ฐโ€โ™€๏ธ CHANNEL OPEN CONFIRM !!! ๐Ÿ‘ฐโ€โ™€๏ธ๐Ÿ’๐Ÿคตโ€โ™‚๏ธ`); } console.log(` ------------------------------------------- ๐Ÿ”” Event name: ${event.log.fragment.name} โ›“๏ธ Network: ${network} ๐Ÿ”— Port Address: ${portAddress} ๐Ÿ›ฃ๏ธ Channel ID: ${channelIdString} ------------------------------------------- ๐Ÿงพ TxHash: ${txHash} ๐Ÿ” Explorer URL: ${url} -------------------------------------------\n`); if (source) { console.log(` โฑ๏ธ Waiting for channel open confirm...`); } else { console.log(` โฑ๏ธ Waiting for channel creation overview...`); } } dispatcher.removeAllListeners(); }); dispatcher.on("CloseIbcChannel", (portAddress, channelId, event) => { const txHash = event.log.transactionHash; const channelIdString = hre.ethers.decodeBytes32String(channelId); const url = `${explorerUrl}tx/${txHash}`; if (filterChannelEvents(portAddress)) { console.log(` ------------------------------------------- ๐Ÿ”— ๐Ÿ”’ IBC CHANNEL CLOSED !!! ๐Ÿ”— ๐Ÿ”’ ------------------------------------------- ๐Ÿ”” Event name: ${event.log.fragment.name} โ›“๏ธ Network: ${network} ๐Ÿ”— Port Address: ${portAddress} ๐Ÿ›ฃ๏ธ Channel ID: ${channelIdString} ------------------------------------------- ๐Ÿงพ TxHash: ${txHash} ๐Ÿ” Explorer URL: ${url} -------------------------------------------\n`); } dispatcher.removeAllListeners(); }); } function filterPacketEvents(portAddress, network) { const config = require(getConfigPath()); const sendPacketConfig = config.sendPacket; const ucHandlerAddr = getUcHandlerAddress(network); return areAddressesEqual(portAddress, sendPacketConfig[`${network}`].portAddr) || areAddressesEqual(portAddress, ucHandlerAddr); } function listenForIbcPacketEvents(network, dispatcher) { const explorerUrl = network === "optimism" ? explorerOpUrl : explorerBaseUrl; console.log(`๐Ÿ‘‚ Listening for IBC packet events on ${network}...`); dispatcher.on("SendPacket", (sourcePortAddress, sourceChannelId, packet, sequence, timeoutTimestamp, event) => { const txHash = event.log.transactionHash; const sourceChannelIdString = hre.ethers.decodeBytes32String(sourceChannelId); const url = `${explorerUrl}tx/${txHash}`; if (filterPacketEvents(sourcePortAddress, network)) { console.log(` ------------------------------------------- ๐Ÿ“ฆ ๐Ÿ“ฎ PACKET HAS BEEN SENT !!! ๐Ÿ“ฆ ๐Ÿ“ฎ ------------------------------------------- ๐Ÿ”” Event name: ${event.log.fragment.name} โ›“๏ธ Network: ${network} ๐Ÿ”— Source Port Address: ${sourcePortAddress} ๐Ÿ›ฃ๏ธ Source Channel ID: ${sourceChannelIdString} ๐Ÿ“ˆ Sequence: ${sequence} โณ Timeout Timestamp: ${timeoutTimestamp} ------------------------------------------- ๐Ÿงพ TxHash: ${txHash} ๐Ÿ” Explorer URL: ${url} -------------------------------------------\n`); console.log(` โฑ๏ธ Waiting for packet receipt...`); } }); dispatcher.on("RecvPacket", (destPortAddress, destChannelId, sequence, event) => { const txHash = event.log.transactionHash; const destChannelIdString = hre.ethers.decodeBytes32String(destChannelId); const url = `${explorerUrl}tx/${txHash}`; if (filterPacketEvents(destPortAddress,network)) { console.log(` ------------------------------------------- ๐Ÿ“ฆ ๐Ÿ“ฌ PACKET IS RECEIVED !!! ๐Ÿ“ฆ ๐Ÿ“ฌ ------------------------------------------- ๐Ÿ”” Event name: ${event.log.fragment.name} โ›“๏ธ Network: ${network} ๐Ÿ”— Destination Port Address: ${destPortAddress} ๐Ÿ›ฃ๏ธ Destination Channel ID: ${destChannelIdString} ๐Ÿ“ˆ Sequence: ${sequence} ------------------------------------------- ๐Ÿงพ TxHash: ${txHash} ๐Ÿ” Explorer URL: ${url} -------------------------------------------\n`); console.log(` โฑ๏ธ Waiting for write acknowledgement...`); } }); dispatcher.on("WriteAckPacket", (writerPortAddress, writerChannelId, sequence, ackPacket, event) => { const txHash = event.log.transactionHash; const writerChannelIdString = hre.ethers.decodeBytes32String(writerChannelId); const url = `${explorerUrl}tx/${txHash}`; if (filterPacketEvents(writerPortAddress, network)) { console.log(` ------------------------------------------- ๐Ÿ“ฆ ๐Ÿ“ ACKNOWLEDGEMENT WRITTEN !!! ๐Ÿ“ฆ ๐Ÿ“ ------------------------------------------- ๐Ÿ”” Event name: ${event.log.fragment.name} โ›“๏ธ Network: ${network} ๐Ÿ”— Destination Port Address: ${writerPortAddress} ๐Ÿ›ฃ๏ธ Channel ID: ${writerChannelIdString} ๐Ÿ“ˆ Sequence: ${sequence} ------------------------------------------- ๐Ÿงพ TxHash: ${txHash} ๐Ÿ” Explorer URL: ${url} -------------------------------------------\n`); console.log(` โฑ๏ธ Waiting for acknowledgement...`); } dispatcher.removeAllListeners(); }); dispatcher.on("Acknowledgement", (sourcePortAddress, sourceChannelId, sequence, event) => { const txHash = event.log.transactionHash; const sourceChannelIdString = hre.ethers.decodeBytes32String(sourceChannelId); const url = `${explorerUrl}tx/${txHash}`; if (filterPacketEvents(sourcePortAddress, network)) { console.log(` ------------------------------------------- ๐Ÿ“ฆ ๐Ÿ PACKET IS ACKNOWLEDGED !!! ๐Ÿ“ฆ ๐Ÿ ------------------------------------------- ๐Ÿ”” Event name: ${event.log.fragment.name} โ›“๏ธ Network: ${network} ๐Ÿ”— Source Port Address: ${sourcePortAddress} ๐Ÿ›ฃ๏ธ Source Channel ID: ${sourceChannelIdString} ๐Ÿ“ˆ Sequence: ${sequence} ------------------------------------------- ๐Ÿงพ TxHash: ${txHash} ๐Ÿ” Explorer URL: ${url} -------------------------------------------\n`); } dispatcher.removeAllListeners(); }); } async function setupIbcPacketEventListener() { console.log("๐Ÿ”Š Setting up IBC packet event listener...") // Get the dispatchers for both source and destination to listen for IBC packet events const opDispatcher = await getDispatcher("optimism"); const baseDispatcher = await getDispatcher("base"); listenForIbcPacketEvents("optimism", opDispatcher); listenForIbcPacketEvents("base", baseDispatcher); } async function setupIbcChannelEventListener() { console.log("๐Ÿ”Š Setting up IBC channel event listener...") const config = require(getConfigPath()); const opIsSource = config.createChannel.srcChain === "optimism"; const baseIsSource = config.createChannel.srcChain === "base"; // Get the dispatchers for both source and destination to listen for IBC packet events const opDispatcher = await getDispatcher("optimism"); const baseDispatcher = await getDispatcher("base"); listenForIbcChannelEvents("optimism", opIsSource , opDispatcher); listenForIbcChannelEvents("base", baseIsSource, baseDispatcher); } module.exports = { listenForIbcChannelEvents, listenForIbcPacketEvents, setupIbcPacketEventListener, setupIbcChannelEventListener };