锁定时, 可选择指定地址
This commit is contained in:
parent
6342b7cc76
commit
8e6a76527f
@ -27,7 +27,7 @@ contract NFTLock is ERC721Holder, HasSignature, TimeChecker, Pausable {
|
||||
mapping(address nft => bool status) public supportNftList;
|
||||
|
||||
event UnLock(address indexed nft, address indexed user, uint256 nonce, NFTInfo[] nftList);
|
||||
event Lock(address indexed nft, address indexed user, uint256[] tokenIds);
|
||||
event Lock(address indexed nft, address indexed owner, address indexed to, uint256[] tokenIds);
|
||||
event VerifierUpdated(address indexed verifier);
|
||||
|
||||
constructor(uint256 _duration, address _verifier) TimeChecker(_duration) {
|
||||
@ -36,16 +36,17 @@ contract NFTLock is ERC721Holder, HasSignature, TimeChecker, Pausable {
|
||||
verifier = _verifier;
|
||||
}
|
||||
|
||||
function lock(address nft, uint256[] calldata tokenIds) external whenNotPaused{
|
||||
function lock(address nft, address to, uint256[] calldata tokenIds) external whenNotPaused{
|
||||
require(tokenIds.length <= 100, "tokenIds too many");
|
||||
require(to != address(0), "not support nft");
|
||||
require(supportNftList[nft], "not support nft");
|
||||
address to = _msgSender();
|
||||
address owner = _msgSender();
|
||||
for (uint256 i = 0; i < tokenIds.length; i++) {
|
||||
lockedOriginal[nft][tokenIds[i]] = to;
|
||||
lockedRecords[nft][to].add(tokenIds[i]);
|
||||
INFT(nft).transferFrom(to, address(this), tokenIds[i]);
|
||||
INFT(nft).transferFrom(owner, address(this), tokenIds[i]);
|
||||
}
|
||||
emit Lock(nft, to, tokenIds);
|
||||
emit Lock(nft, owner, to, tokenIds);
|
||||
}
|
||||
/**
|
||||
* @dev unlock or mint nft
|
||||
|
@ -43,14 +43,14 @@ describe('NFTLock', function() {
|
||||
|
||||
describe("Lock", function () {
|
||||
it('should lock NFT', async function() {
|
||||
const { nftLock, nft, otherAccount } = await loadFixture(deployOneContract);
|
||||
const { nftLock, nft, otherAccount, owner } = await loadFixture(deployOneContract);
|
||||
const tokenId = "1001"
|
||||
// @ts-ignore
|
||||
await nft.connect(otherAccount).approve(nftLock.target, tokenId);
|
||||
//@ts-ignore
|
||||
await nftLock.connect(otherAccount).lock(nft.target, [tokenId]);
|
||||
await nftLock.connect(otherAccount).lock(nft.target, owner.address, [tokenId]);
|
||||
expect(await nft.balanceOf(nftLock.target)).to.equal(1);
|
||||
expect(await nftLock.lockedOriginal(nft.target, tokenId)).to.equal(otherAccount.address);
|
||||
expect(await nftLock.lockedOriginal(nft.target, tokenId)).to.equal(owner.address);
|
||||
expect(await nft.ownerOf(tokenId)).to.equal(nftLock.target);
|
||||
});
|
||||
|
||||
@ -64,15 +64,16 @@ describe('NFTLock', function() {
|
||||
// @ts-ignore
|
||||
await nft.connect(otherAccount).approve(nftLock.target, tokenId);
|
||||
//@ts-ignore
|
||||
await nftLock.connect(otherAccount).lock(nft.target, [tokenId]);
|
||||
await nftLock.connect(otherAccount).lock(nft.target, owner.address, [tokenId]);
|
||||
const nonce = (Math.random() * 1000) | 0;
|
||||
const now = Date.now() / 1000 | 0;
|
||||
let localMsgHash = solidityPackedKeccak256(["address", "address", "address", "uint256", "uint256", "uint256", "uint256", "bool"],
|
||||
[otherAccount.address, nft.target, nftLock.target, chainId, now, nonce, tokenId, false]);
|
||||
[owner.address, nft.target, nftLock.target, chainId, now, nonce, tokenId, false]);
|
||||
const signature = await owner.signMessage(getBytes(localMsgHash));
|
||||
//@ts-ignore
|
||||
await nftLock.connect(otherAccount).unlockOrMint(nft.target, [[tokenId, false]], now, nonce, signature);
|
||||
expect(await nft.ownerOf(tokenId)).to.equal(otherAccount.address);
|
||||
await nftLock.unlockOrMint(nft.target, [[tokenId, false]], now, nonce, signature);
|
||||
// await nftLock.connect(otherAccount).unlockOrMint(nft.target, [[tokenId, false]], now, nonce, signature);
|
||||
expect(await nft.ownerOf(tokenId)).to.equal(owner.address);
|
||||
});
|
||||
|
||||
it('should mint NFT from lock', async function() {
|
||||
|
Loading…
x
Reference in New Issue
Block a user