无题
setApprovalForAll()的实例
ERC721 标准合约是没有提供批量转移NFT到不同的地址中的接口,如果项目方想给白名单用户空投,代理合约配合setApprovalForAll()函数提供了一种解决方案。
关于接口合约的基础介绍:
Solidity8.0全面精通-42-接口合约_哔哩哔哩_bilibili
关于空投的原理可以参考以下两个视频
https://www.youtube.com/watch?v=-0nU2usv4S4&t=2s
https://www.youtube.com/watch?v=M7ThuAS47Cc
空投用到的合约源文件
1 | /** |
合约也已经开源到了Polygon网络上,可以直接拿来用。
https://polygonscan.com/address/0x2A6dFC4C69a716b7F02b55CE76432226AefCB193#code
使用方法
注:以下过程中BanaCatNFT contract 均可以替换成自己想要批量转移NFT的目标主合约
- 在主合约中调用
setApprovalForAll()
给提供批量转发NFT功能的代理合约授权;
这一步是在NFT主合约中完成的,将自己地址下的所有NFT授权给代理合约,让它具备转发的资格。
Polygon Transaction Hash (Txhash) Details | PolygonScan
- 在代理合约中调用
setInterfaceContract()
函数将BanaCatNFT contract 的合约地址设置为代理合约的目标接口
这一步的目的是让代理合约知道自己要从哪个NFT主合约中转移NFT
Polygon Transaction Hash (Txhash) Details | PolygonScan
-
构建
NFTList
,addressList
发起交易
这里有个小问题需要注意一下,**bulkTransfer()
**函数的两个参数会因为函数的执行上下文的不容儿有所差别
- 通过Remix部署,并在Remix后台发送交易,参数形式为:
addrList:[”address1”, “address2”, ……](地址用双引号括起来,地址和地址之间用半角逗号分隔)例如
1 | ["0x204Eb0dDD556Fc33805A53BA29572B349Ea3c288","0xcd06Db13ACff23EEa734f771ed52cE59642E52b1",……] |
nftlist:[tokenID1,tokenID2,……](tokenID之间通过半角逗号分隔)
1 | [1,2,3,……] |
- 部署之后通过本地RPC调用发起交易:同上
- 在polyscan浏览器发起交易:
addrList:[address1, address2, ……](地址不用双引号,地址和地址之间用半角逗号分隔)例如
1 | [0x204Eb0dDD556Fc33805A53BA29572B349Ea3c288,0xcd06Db13ACff23EEa734f771ed52cE59642E52b1,……] |
nftlist:[tokenID1,tokenID2,……](tokenID之间通过半角逗号分隔,‼️tokenID之间不能有空格‼️)
1 | [1,2,3,……] |
最终发起的交易是长这样的