lock和unlock时检查owner是否符合执行条件

This commit is contained in:
CounterFire2023 2024-07-22 15:49:15 +08:00
parent b1d6322a07
commit 6dd7a4ed0c

View File

@ -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,