From 6dd7a4ed0c7b60a6a514110b9108ee712a9d70f5 Mon Sep 17 00:00:00 2001 From: CounterFire2023 <136581895+CounterFire2023@users.noreply.github.com> Date: Mon, 22 Jul 2024 15:49:15 +0800 Subject: [PATCH] =?UTF-8?q?lock=E5=92=8Cunlock=E6=97=B6=E6=A3=80=E6=9F=A5o?= =?UTF-8?q?wner=E6=98=AF=E5=90=A6=E7=AC=A6=E5=90=88=E6=89=A7=E8=A1=8C?= =?UTF-8?q?=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/chain/contract/Locker.js | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/components/chain/contract/Locker.js b/src/components/chain/contract/Locker.js index 51b351b..aa7d090 100644 --- a/src/components/chain/contract/Locker.js +++ b/src/components/chain/contract/Locker.js @@ -1,7 +1,6 @@ import { ethers } from 'ethers' import { apiUnlockOrMint, apiMintNft } from '@/utils/marketplace' -import { BlockChain } from "@/components/chain/BlockChain" const lockAbi = [ 'function lock(address nft, address to, uint256[] tokenIds) external' @@ -9,7 +8,8 @@ const lockAbi = [ const erc721Abi = [ 'function approve(address to, uint256 tokenId) external', - 'function getApproved(uint256 tokenId) public view returns (address)' + 'function getApproved(uint256 tokenId) public view returns (address)', + 'function ownerOf(uint256 tokenId) public view returns (address)' ] const lockAddressImtbl = import.meta.env.VUE_APP_LOCKER_ADDRESS @@ -25,9 +25,14 @@ export class Locker { const nftContract = new ethers.Contract(nft, erc721Abi, provider.getSigner()) const address = this.bc.store.passportAddress console.log('lock', nft, address, tokenIds) + const userAddress = await provider.getSigner().getAddress() for (let tokenId of tokenIds) { const addressApproval = await nftContract.getApproved(tokenId) if ((addressApproval || "").toLowerCase() != lockAddress.toLowerCase()) { + const owner = await nftContract.ownerOf(tokenId) + if (owner.toLowerCase() != userAddress.toLowerCase()) { + throw new Error('params mismatch, perhaps one transaction is pending') + } const resApproval = await nftContract.approve(lockAddress, tokenId); const res = await provider.waitForTransaction(resApproval.hash) if (res.status == 0) { @@ -79,6 +84,13 @@ export class Locker { return txHash } async execUnlock(provider, chainId, nft, tokenIds) { + for (let tokenId of tokenIds) { + const nftContract = new ethers.Contract(nft, erc721Abi, provider.getSigner()) + const owner = await nftContract.ownerOf(tokenId) + if (owner.toLowerCase() != lockAddressImtbl.toLowerCase() && owner.toLowerCase() != lockAddressMain.toLowerCase()) { + throw new Error('params mismatch, perhaps one transaction is pending') + } + } const preDatas = { net_id: chainId, contract_address: nft,