Appearance
S1C10: Give 1 Get 1
1. 问题
需要同时持有 S1C1 和 S1C9 的 NFT,然后将一个 NFT 转给挑战合约以换取 flag。
2. 原因
挑战使用 ERC-721 safeTransferFrom 实现"以物易物"机制 — 需要把某个特定 NFT 转给合约,合约验证后 mint S1C10 flag。
3. 方案
- 确认已持有 S1C1 和 S1C9 的 NFT tokenId
- 调用挑战合约的交换函数,将指定 NFT 转入合约
- 合约验证后自动 mint S1C10 flag
4. 遇到的陷阱
NFT 所有权确认: 需要找到自己的 tokenId(S1 NFTFlags 不实现 ERC721Enumerable)。
5. 陷阱的原因
Season1NFTFlags 只继承 ERC721,不包含 tokenOfOwnerByIndex,无法通过枚举查询持有者。需要扫描 tokenId 范围找到所有者。
6. 如何解决
通过 ownerOf(tokenId) 扫描 tokenId 范围,找到属于自己地址的 token:
bash
for tid in $(seq 1 100); do
owner=$(cast call $NFT_FLAGS "ownerOf(uint256)(address)" $tid)
if [ "$owner" = "$MY_ADDRESS" ]; then echo "My token: $tid"; fi
done
7. 技术要点
| 要点 | 说明 |
|---|---|
| ERC-721 transfer | safeTransferFrom 会触发 onERC721Received 回调 |
| ERC721 vs ERC721Enumerable | 非 Enumerable 版本不维护 token 列表,无法按索引查询 |
| Token 所有权扫描 | 暴力扫描 tokenId 范围来查找所属 token |