【CryptZombies】レッスン5チャプター8:ERC721 takeOwnership
takeOwnership関数は、msg.senderがそのトークン/ゾンビを受け取ることを承認されているか確認し、承認されていれば_transfer関数を呼び出すだけでOKです。
テストの実行
①初めに、requireステートメントを使って、zombieApprovalsでキーが_tokenIdの場合にmsg.senderと同等となるようにせよ。こうしてもしmsg.senderがトークンを受け取ることが承認されていなかった場合、エラーが投げられる。
function takeOwnership(uint256 _tokenId) public { require(zombieApprovals[_tokenId] == msg.sender); }
②_transfer関数を呼び出すには、トークン所有者のアドレスを知る必要がある。(_fromの引数として必要だ)。幸い、このアドレスはownerOf関数で参照可能だ。ではownerというaddress変数を宣言し、それがownerOf(_tokenId)と同等となるようにせよ。
ownerOf関数はerc721.solに格納されているので、そちらを参照します。
function takeOwnership(uint256 _tokenId) public { require(zombieApprovals[_tokenId] == msg.sender); address owner = ownerOf(_tokenId); }
③最後に、_transfer関数を呼び出して、必要な情報全てを渡せ。(ここでは、_toの引数にmsg.senderを使う。なぜなら関数を呼び出しているのは、トークンが送られるべき者だからだ)。
function takeOwnership(uint256 _tokenId) public { require(zombieApprovals[_tokenId] == msg.sender); address owner = ownerOf(_tokenId); _transfer(owner, msg.sender, _tokenId); }
注: 上の2と3のステップは1行のコードにて行うことができるが、少しばかり読みやすくするために分割している。
お疲れさまでした!
<参考>
CryptoZombies - イーサリアム上でゲームを開発する方法を学習。Powered by Loom Network