Solidity
即時實施 ERC-1155 合約
我想實現一個 ERC-1155 令牌來表示影片的所有權。創建這樣的合約相對容易:
import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol"; contract MyVideos is ERC1155 { uint256 public constant Video1 = 0; uint256 public constant Video2 = 1; uint256 public constant Video3 = 2; constructor() public ERC1155("https://video/api/item/{id}.json") { _mint(msg.sender, Video1, 100, "IPFS hash"); _mint(msg.sender, Video2, 1000, "IPFS hash"); _mint(msg.sender, Video3, 1, "IPFS hash"); } }
但是,我不知道如何動態地動態創建這樣的 ERC-1155 令牌。具體來說,我將如何添加帶有 10000 個令牌的 Video3
(_mint(msg.sender, Video4, 10000, "IPFS hash");
但是在 MyVideos 合約已經創建之後,我如何添加這個新的令牌呢?
我真的很感激你能給我的任何幫助。
非常感謝!
您需要為該函式編寫一個公共包裝
_mint
函式。由於這個函式是internal
,它只能在合約本身的上下文中被呼叫。就像是:
function addNewVideo(uint VideoN, uint ntokens, bytes memory IPFS_hash) public { _mint(msg.sender, VideoN, ntokens, IPFS_hash); }
這是使用“工廠”方法完成的。你有一個工廠契約,它會為你做這件事。看看uniswap v2合約工廠:
function createPair(address tokenA, address tokenB) external returns (address pair) { require(tokenA != tokenB, 'UniswapV2: IDENTICAL_ADDRESSES'); (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), 'UniswapV2: ZERO_ADDRESS'); require(getPair[token0][token1] == address(0), 'UniswapV2: PAIR_EXISTS'); // single check is sufficient bytes memory bytecode = type(UniswapV2Pair).creationCode; bytes32 salt = keccak256(abi.encodePacked(token0, token1)); assembly { pair := create2(0, add(bytecode, 32), mload(bytecode), salt) } IUniswapV2Pair(pair).initialize(token0, token1); getPair[token0][token1] = pair; getPair[token1][token0] = pair; // populate mapping in the reverse direction allPairs.push(pair); emit PairCreated(token0, token1, pair, allPairs.length); }
https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2Factory.sol