Skip to content
On this page

S1C10: Give 1 Get 1

1. 问题

需要同时持有 S1C1 和 S1C9 的 NFT,然后将一个 NFT 转给挑战合约以换取 flag。

2. 原因

挑战使用 ERC-721 safeTransferFrom 实现"以物易物"机制 — 需要把某个特定 NFT 转给合约,合约验证后 mint S1C10 flag。

3. 方案

  1. 确认已持有 S1C1 和 S1C9 的 NFT tokenId
  2. 调用挑战合约的交换函数,将指定 NFT 转入合约
  3. 合约验证后自动 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 transfersafeTransferFrom 会触发 onERC721Received 回调
ERC721 vs ERC721Enumerable非 Enumerable 版本不维护 token 列表,无法按索引查询
Token 所有权扫描暴力扫描 tokenId 范围来查找所属 token

Built with AiAda