Solidity

即時實施 ERC-1155 合約

  • January 27, 2021

我想實現一個 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

引用自:https://ethereum.stackexchange.com/questions/92823