From 3795fe4f9f2f11890b4e3ebfbf16f1676344f9d5 Mon Sep 17 00:00:00 2001 From: Ryan Goulding Date: Wed, 3 Jul 2024 10:47:15 -0400 Subject: [PATCH] feat: ONFT721 tasks Signed-off-by: Ryan Goulding --- examples/onft721/hardhat.config.ts | 1 + examples/onft721/package.json | 3 ++ examples/onft721/tasks/index.ts | 2 ++ examples/onft721/tasks/mint.ts | 28 +++++++++++++++ examples/onft721/tasks/send.ts | 56 ++++++++++++++++++++++++++++++ pnpm-lock.yaml | 4 +++ 6 files changed, 94 insertions(+) create mode 100644 examples/onft721/tasks/index.ts create mode 100644 examples/onft721/tasks/mint.ts create mode 100644 examples/onft721/tasks/send.ts diff --git a/examples/onft721/hardhat.config.ts b/examples/onft721/hardhat.config.ts index be20edcdf..d019ecb4a 100644 --- a/examples/onft721/hardhat.config.ts +++ b/examples/onft721/hardhat.config.ts @@ -9,6 +9,7 @@ import 'hardhat-deploy' import 'hardhat-contract-sizer' import '@nomiclabs/hardhat-ethers' import '@layerzerolabs/toolbox-hardhat' +import './tasks' import { HardhatUserConfig, HttpNetworkAccountsUserConfig } from 'hardhat/types' import { EndpointId } from '@layerzerolabs/lz-definitions' diff --git a/examples/onft721/package.json b/examples/onft721/package.json index 3ec44927d..3993a858e 100644 --- a/examples/onft721/package.json +++ b/examples/onft721/package.json @@ -20,6 +20,9 @@ "ethers": "^5.7.2", "hardhat-deploy": "^0.12.1" }, + "dependencies": { + "@layerzerolabs/devtools": "0.3.17" + }, "devDependencies": { "@babel/core": "^7.23.9", "@layerzerolabs/eslint-config-next": "~2.3.3", diff --git a/examples/onft721/tasks/index.ts b/examples/onft721/tasks/index.ts new file mode 100644 index 000000000..4fbe2d05c --- /dev/null +++ b/examples/onft721/tasks/index.ts @@ -0,0 +1,2 @@ +import './mint' +import './send' diff --git a/examples/onft721/tasks/mint.ts b/examples/onft721/tasks/mint.ts new file mode 100644 index 000000000..1d27abe27 --- /dev/null +++ b/examples/onft721/tasks/mint.ts @@ -0,0 +1,28 @@ +import { task } from 'hardhat/config' +import { ActionType, HardhatRuntimeEnvironment } from 'hardhat/types' + +const ABI = ['function mint(address _to, uint256 _tokenId) public'] + +const createMyONFT721MockContract = async (hre: HardhatRuntimeEnvironment, onft721Address: string) => { + return await hre.ethers.getContractAt(ABI, onft721Address) +} + +interface TaskArgs { + onft721Address: string + tokenId: number +} + +const action: ActionType = async (taskArgs: TaskArgs, hre) => { + const signer = (await hre.getNamedAccounts()).deployer + const user = await hre.ethers.getSigner(signer) + + const myONFT721Mock = await createMyONFT721MockContract(hre, taskArgs.onft721Address) + + const tx = await myONFT721Mock.mint(user.address, taskArgs.tokenId) + const txReceipt = await tx.wait() + console.log(`Transaction hash: ${txReceipt.transactionHash}`) +} + +task('mint', 'Mint ONFT721 Mock', action) + .addParam('onft721Address', 'ONFT721 contract address') + .addParam('tokenId', 'Token ID') diff --git a/examples/onft721/tasks/send.ts b/examples/onft721/tasks/send.ts new file mode 100644 index 000000000..d78d4b9c3 --- /dev/null +++ b/examples/onft721/tasks/send.ts @@ -0,0 +1,56 @@ +import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers' +import { task } from 'hardhat/config' +import { ActionType, HardhatRuntimeEnvironment } from 'hardhat/types' + +import { makeBytes32 } from '@layerzerolabs/devtools' + +const DEFAULT_EXTRA_OPTIONS = '0x' +const DEFAULT_COMPOSE_MSG = '0x' +const DEFAULT_OFT_CMD = '0x' + +const ONFT721_ABI = [ + 'function send((uint32 dstEid,bytes32 to,uint256 tokenId,bytes extraOptions,bytes composeMsg,bytes oftCmd),(uint256 nativeFee,uint256 lzFee),address refundAddress) external payable returns (MessagingReceipt msgReceipt)', + 'function quoteSend((uint32 dstEid,bytes32 to,uint256 tokenId,bytes extraOptions,bytes composeMsg,bytes oftCmd),bool payInLzToken) external view returns ((uint256, uint256))', +] + +const getONFT721Contract = async (hre: HardhatRuntimeEnvironment, onft721Address: string, signer: SignerWithAddress) => + hre.ethers.getContractAt(ONFT721_ABI, onft721Address, signer) + +const createSendParam = (user: SignerWithAddress, taskArgs: TaskArgs) => { + return { + dstEid: taskArgs.dstEid, + to: makeBytes32(user.address), + tokenId: taskArgs.tokenId, + extraOptions: DEFAULT_EXTRA_OPTIONS, + composeMsg: DEFAULT_COMPOSE_MSG, + oftCmd: DEFAULT_OFT_CMD, + } +} + +interface TaskArgs { + onft721Address: string + dstEid: number + to: string + tokenId: number +} + +const action: ActionType = async (taskArgs: TaskArgs, hre) => { + const signer = (await hre.getNamedAccounts()).deployer + const user = await hre.ethers.getSigner(signer) + + const sendParam = createSendParam(user, taskArgs) + const onft721 = await getONFT721Contract(hre, taskArgs.onft721Address, user) + const messagingFee = await onft721.quoteSend(sendParam, false) + + const tx = await onft721.send(sendParam, messagingFee, user.address, { + value: messagingFee[0], + gasLimit: 1_000_000, + }) + const txReceipt = await tx.wait() + console.log(`Transaction hash: ${txReceipt.transactionHash}`) +} + +task('send', 'Send ONFT721 from one chain to another', action) + .addParam('onft721Address', 'ONFT721 contract address') + .addParam('dstEid', 'Destination LayerZero EndpointV2 ID') + .addParam('tokenId', 'Token ID') diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 46d57b6b6..16b58ae2a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -287,6 +287,10 @@ importers: version: 5.3.3 examples/onft721: + dependencies: + '@layerzerolabs/devtools': + specifier: 0.3.17 + version: link:../../packages/devtools devDependencies: '@babel/core': specifier: ^7.23.9