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 { ethers } from 'ethers'
import { apiUnlockOrMint, apiMintNft } from '@/utils/marketplace' import { apiUnlockOrMint, apiMintNft } from '@/utils/marketplace'
import { BlockChain } from "@/components/chain/BlockChain"
const lockAbi = [ const lockAbi = [
'function lock(address nft, address to, uint256[] tokenIds) external' 'function lock(address nft, address to, uint256[] tokenIds) external'
@ -9,7 +8,8 @@ const lockAbi = [
const erc721Abi = [ const erc721Abi = [
'function approve(address to, uint256 tokenId) external', '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 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 nftContract = new ethers.Contract(nft, erc721Abi, provider.getSigner())
const address = this.bc.store.passportAddress const address = this.bc.store.passportAddress
console.log('lock', nft, address, tokenIds) console.log('lock', nft, address, tokenIds)
const userAddress = await provider.getSigner().getAddress()
for (let tokenId of tokenIds) { for (let tokenId of tokenIds) {
const addressApproval = await nftContract.getApproved(tokenId) const addressApproval = await nftContract.getApproved(tokenId)
if ((addressApproval || "").toLowerCase() != lockAddress.toLowerCase()) { 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 resApproval = await nftContract.approve(lockAddress, tokenId);
const res = await provider.waitForTransaction(resApproval.hash) const res = await provider.waitForTransaction(resApproval.hash)
if (res.status == 0) { if (res.status == 0) {
@ -79,6 +84,13 @@ export class Locker {
return txHash return txHash
} }
async execUnlock(provider, chainId, nft, tokenIds) { 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 = { const preDatas = {
net_id: chainId, net_id: chainId,
contract_address: nft, contract_address: nft,