Skip to content

Commit

Permalink
feat: ONFT721 tasks
Browse files Browse the repository at this point in the history
Signed-off-by: Ryan Goulding <[email protected]>
  • Loading branch information
ryandgoulding committed Jul 3, 2024
1 parent 49feeba commit 9c4a35d
Show file tree
Hide file tree
Showing 6 changed files with 94 additions and 0 deletions.
1 change: 1 addition & 0 deletions examples/onft721/hardhat.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down
3 changes: 3 additions & 0 deletions examples/onft721/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
2 changes: 2 additions & 0 deletions examples/onft721/tasks/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
import './mint'
import './send'
28 changes: 28 additions & 0 deletions examples/onft721/tasks/mint.ts
Original file line number Diff line number Diff line change
@@ -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<TaskArgs> = 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')
56 changes: 56 additions & 0 deletions examples/onft721/tasks/send.ts
Original file line number Diff line number Diff line change
@@ -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<TaskArgs> = 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')
4 changes: 4 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 9c4a35d

Please sign in to comment.