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,