diff --git a/.changeset/swift-walls-do.md b/.changeset/swift-walls-do.md new file mode 100644 index 000000000..776a5653f --- /dev/null +++ b/.changeset/swift-walls-do.md @@ -0,0 +1,5 @@ +--- +"@layerzerolabs/onft721-example": patch +--- + +Add mint/send commands for ONFT721 diff --git a/examples/onft721/contracts/mocks/MyONFT721Mock.sol b/examples/onft721/contracts/mocks/MyONFT721Mock.sol index 5e7f83f39..197896a59 100644 --- a/examples/onft721/contracts/mocks/MyONFT721Mock.sol +++ b/examples/onft721/contracts/mocks/MyONFT721Mock.sol @@ -12,7 +12,7 @@ contract MyONFT721Mock is MyONFT721 { address _delegate ) MyONFT721(_name, _symbol, _lzEndpoint, _delegate) {} - function mint(address _to, uint256 _amount) public { - _mint(_to, _amount); + function mint(address _to, uint256 _id) public { + _mint(_to, _id); } } diff --git a/examples/onft721/hardhat.config.ts b/examples/onft721/hardhat.config.ts index cf20c1f2f..5acb49ec1 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 d2db4855f..e26b1dbe3 100644 --- a/examples/onft721/package.json +++ b/examples/onft721/package.json @@ -21,6 +21,7 @@ }, "devDependencies": { "@babel/core": "^7.23.9", + "@layerzerolabs/devtools": "~0.3.28", "@layerzerolabs/eslint-config-next": "~2.3.39", "@layerzerolabs/lz-definitions": "^2.3.39", "@layerzerolabs/lz-evm-messagelib-v2": "^2.3.39", 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 6b6abb222..17a89db71 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -740,6 +740,9 @@ importers: '@babel/core': specifier: ^7.23.9 version: 7.23.9 + '@layerzerolabs/devtools': + specifier: ~0.3.28 + version: link:../../packages/devtools '@layerzerolabs/eslint-config-next': specifier: ~2.3.39 version: 2.3.44(typescript@5.5.3)