OpenZepplinのERC1155メモ(作成中)
5183 ワード
とりあえず
説明
まず大事なところ
// Mapping from token ID to account balances
mapping(uint256 => mapping(address => uint256)) private _balances;
tokenIDに対し(address => uint256)のマッピングを持っています。
こんなイメージ
ERC1155
ERC20、ERC721のイメージ
ERC20
ERC721
コード
Batchについて
ERC721などと比べてERC1155はコードにBatchとつく関数がいくつか存在します。
ERC1155の目的は、一つのコントラクトで複数種類のトークンを扱えることですがそれと同時に、一度に複数種類のトークンを送金、移転できるためガスを節約できるというメリットがあります。
それを実現するためにBatchというメソッドが定義されています。
URI
constructorでuriを設定している。
constructor(string memory uri_) {
_setURI(uri_);
}
セットしたURIはuri()
で取得する。
ただdocに書いてある通りidを設定して返すなどちょっと変える必要あり。
/**
* @dev See {IERC1155MetadataURI-uri}.
*
* This implementation returns the same URI for *all* token types. It relies
* on the token type ID substitution mechanism
* https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
*
* Clients calling this function must replace the `\{id\}` substring with the
* actual token type ID.
*/
function uri(uint256) public view virtual override returns (string memory) {
return _uri;
}
例えばこんな感じ
setしたuriとトークンのIDを結合して返してあげるなど。
function uri(uint256 id) public view virtual override returns (string memory) {
return Strings.strConnect(_uri, Strings.toString(id));
}
/**
* 引数の文字列を結合して返す
* @param str1 string
* @param str2 string
* @return string memory
*/
function strConnect(string memory str1, string memory str2) internal pure returns (string memory) {
bytes memory strbyte1 = bytes(str1);
bytes memory strbyte2 = bytes(str2);
bytes memory str = new bytes(strbyte1.length + strbyte2.length);
uint8 point = 0;
for(uint8 j = 0; j < strbyte1.length;j++){
str[point] = strbyte1[j];
point++;
}
for(uint8 k = 0; k < strbyte2.length;k++){
str[point] = strbyte2[k];
point++;
}
return string(str);
}
balanceOf
balanceOfは所持している数量を返すだけ
function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
require(account != address(0), "ERC1155: address zero is not a valid owner");
return _balances[id][account];
}
ちなみにbalanceOfBatch
も用意してあり、違いはaddressとidを複数渡せるところ
function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
public
view
virtual
override
returns (uint256[] memory)
{
require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");
uint256[] memory batchBalances = new uint256[](accounts.length);
for (uint256 i = 0; i < accounts.length; ++i) {
batchBalances[i] = balanceOf(accounts[i], ids[i]);
}
return batchBalances;
}
mint
function _mint(
address to,
uint256 id,
uint256 amount,
bytes memory data
) internal virtual {
require(to != address(0), "ERC1155: mint to the zero address");
address operator = _msgSender();
uint256[] memory ids = _asSingletonArray(id);
uint256[] memory amounts = _asSingletonArray(amount);
_beforeTokenTransfer(operator, address(0), to, ids, amounts, data);
_balances[id][to] += amount;
emit TransferSingle(operator, address(0), to, id, amount);
_afterTokenTransfer(operator, address(0), to, ids, amounts, data);
_doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
}
Author And Source
この問題について(OpenZepplinのERC1155メモ(作成中)), 我々は、より多くの情報をここで見つけました https://zenn.dev/mkurita/articles/9b64ede2d4e919著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Collection and Share based on the CC protocol