From cdfe7eddbb49af502fd1ee85878d96b9d2f80a17 Mon Sep 17 00:00:00 2001 From: John War Date: Fri, 20 Jan 2023 22:38:58 -0500 Subject: [PATCH] Retry failed message --- tasks/index.ts | 2 +- tasks/retrySend.ts | 49 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 tasks/retrySend.ts diff --git a/tasks/index.ts b/tasks/index.ts index e45729c..2c9a4c8 100644 --- a/tasks/index.ts +++ b/tasks/index.ts @@ -1,4 +1,4 @@ -// import "./retrySend" +import "./retrySend" import "./setUxpTrustedRemote" import "./sendUxpCrossChain" import "./setUxdTrustedRemote" diff --git a/tasks/retrySend.ts b/tasks/retrySend.ts new file mode 100644 index 0000000..fe94f25 --- /dev/null +++ b/tasks/retrySend.ts @@ -0,0 +1,49 @@ +import { task } from "hardhat/config"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; +import { loadConfig, loadCoreContracts } from "../scripts/common/loaders"; +import { UXDToken } from "../typechain-types"; + +task("retrySend", "Retries sending UXD tokens cross chain") +.addParam("srcchain", "source chain") +.addParam("nonce", "message nonce") +.addOptionalParam("to", "target address") +.addOptionalParam("from", "original message sender") +.addOptionalParam("amount", "amount to send in") +.setAction(async (taskArgs, hre: HardhatRuntimeEnvironment) => { + const sender = taskArgs.from || (await hre.ethers.getSigners())[0].address; + const amount = taskArgs.amount || "1.0"; + const recipient = taskArgs.to || sender; + const nonce = taskArgs.nonce || 1 + await retryMessage(taskArgs.srcchain, recipient, amount, nonce, hre); +}); + +async function retryMessage(srcChain: string, recipient: string, amount: string, nonce: string, hre: HardhatRuntimeEnvironment) { + const dstCoreContracts = await loadCoreContracts(hre); + const srcCoreContracts = await loadCoreContracts(hre, srcChain); + const srcConfig = await loadConfig(hre, srcChain); + const UXD = await hre.ethers.getContractFactory("UXDToken"); + const dstUxd: UXDToken = UXD.attach(dstCoreContracts.uxd) as UXDToken; + const srcPath = hre.ethers.utils.solidityPack(["address", "address"], [srcCoreContracts.uxd, dstCoreContracts.uxd]) + const sender = (await hre.ethers.getSigners())[0].address; + + const amountWei = hre.ethers.utils.parseEther(amount); + const recipientBytes32 = hre.ethers.utils.defaultAbiCoder.encode(["address"], [recipient]) + const senderBytes32 = hre.ethers.utils.defaultAbiCoder.encode(["address"], [sender]) + const payloadForCall = hre.ethers.utils.defaultAbiCoder.encode(["uint8", "bytes"], [1, recipient]); + + console.log(`payloadForCall = ${payloadForCall}`) + const payload = hre.ethers.utils.solidityPack( + ["uint8", "bytes32", "uint64", "bytes32", "uint64", "bytes"], + [1, recipientBytes32, amountWei, senderBytes32, 3000000, payloadForCall] + ) + + console.log(`payload = ${payload}`) + const tx = await (await dstUxd.retryMessage( + srcConfig.layerZero.current.chainId, + srcPath, + nonce, + payload, + )).wait() + + console.log(`retry send UXD on ${hre.network.name} uxd = ${dstCoreContracts.uxd}] tx = ${tx.transactionHash}`); +}