以太坊合約開發(fā)ERC1155 NFT

ERC1155

ERC1155 是以太坊上的一個(gè)標(biāo)準(zhǔn)協(xié)議,用于創(chuàng)建可批量鑄造、可批量傳輸?shù)臄?shù)字資產(chǎn)之景,如游戲中的物品、收藏品膏潮、證書等锻狗。每個(gè) ERC1155 合約可以鑄造多種類型的資產(chǎn),每種資產(chǎn)都有一個(gè)唯一的 ID焕参,并且每種資產(chǎn)可以有多個(gè)實(shí)例轻纪。這個(gè)標(biāo)準(zhǔn)協(xié)議定義了一組功能和事件,使得 ERC1155 資產(chǎn)可以被安全地轉(zhuǎn)移叠纷、擁有刻帚、交易和檢索。與 ERC721 不同涩嚣,ERC1155 允許多種類型的資產(chǎn)被打包在一個(gè)交易中崇众,從而使得交易更加高效,并且減少了需要進(jìn)行的交易數(shù)量航厚。這個(gè)標(biāo)準(zhǔn)協(xié)議具有可擴(kuò)展性顷歌,并且在許多不同的場(chǎng)景下都可以使用,例如游戲阶淘、NFT 市場(chǎng)衙吩、證券發(fā)行等互妓。

Mint

可以在以下測(cè)試網(wǎng)絡(luò)自己mint溪窒,具體步驟可以參考 Github

Network Contract Address
Ethereum Goerli 0xb1ecef869cd9382ae17efb07bd813d49832ea6c1

開發(fā)

Openzeppelin 的幫助下可以很快的入手開發(fā)ERC1155標(biāo)準(zhǔn)的NFT合約。參考之前測(cè)試用的NFT代碼冯勉,自行編譯并且發(fā)布到了更多的測(cè)試網(wǎng)絡(luò)上澈蚌,可以很方便的進(jìn)行ERC1155 NFT測(cè)試。
引入ERC1155庫(kù)之后灼狰,自己只需要實(shí)現(xiàn)mint等自定義方法即可宛瞄,非常簡(jiǎn)單。
合約開發(fā)使用的是VSCode和hardhat交胚,合約驗(yàn)證使用hardhat flattening份汗。

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract TestToadz is ERC1155, Ownable {
    uint256 public constant maxTokens = 6969;
    uint256 public numAvailableTokens = 6969;
    uint256 public constant maxMintsPerTx = 5;
    bool public devMintLocked = false;
    uint256[10000] private _availableTokens;

    constructor() ERC1155("ipfs://QmWEFSMku6yGLQ9TQr66HjSd9kay8ZDYKbBEfjNi4pLtrr/{id}") {}

    function getNumAvailableTokens() public view returns (uint256) {
        return numAvailableTokens;
    }

    //Minting
    function mint(uint256 quantity, uint256 amount) public {
        uint256 updatedNumAvailableTokens = numAvailableTokens;
        require(
            block.timestamp >= 1337133769,
            "Sale starts at whatever this time is"
        );
        require(
            quantity <= maxMintsPerTx,
            "There is a limit on minting too many at a time!"
        );
        require(
            updatedNumAvailableTokens - quantity >= 0,
            "Minting this many would exceed supply!"
        );
        require(msg.sender == tx.origin, "No contracts!");

        uint256[] memory ids = new uint256[](quantity);
        uint256[] memory amounts = new uint256[](quantity);

        for (uint256 i = 0; i < quantity; i++) {
            uint256 tokenId = getRandomSerialToken(quantity, i);
            ids[i] = tokenId;
            amounts[i] = amount;
            updatedNumAvailableTokens--;
        }

        _mintBatch(msg.sender, ids, amounts, "");
        numAvailableTokens = updatedNumAvailableTokens;
    }

    //Dev mint special tokens
    function mintSpecial(uint256[] memory specialIds, uint256[] memory amounts ) external onlyOwner {
        require(!devMintLocked, "Dev Mint Permanently Locked");

        _mintBatch(msg.sender, specialIds, amounts, "");
    }

    function getRandomSerialToken(uint256 _numToFetch, uint256 _i)
        internal
        returns (uint256)
    {
        uint256 randomNum = uint256(
            keccak256(
                abi.encode(
                    msg.sender,
                    tx.gasprice,
                    block.number,
                    block.timestamp,
                    blockhash(block.number - 1),
                    _numToFetch,
                    _i
            )
        )
    );
    uint256 randomIndex = randomNum % numAvailableTokens;
    uint256 valAtIndex = _availableTokens[randomIndex];
    uint256 result;
    if (valAtIndex == 0) {
        result = randomIndex;
    } else {
        result = valAtIndex;
    }

    uint256 lastIndex = numAvailableTokens - 1;
    if (randomIndex != lastIndex) {
        uint256 lastValInArray = _availableTokens[lastIndex];
        if (lastValInArray == 0) {
            _availableTokens[randomIndex] = lastIndex;
        } else {
            _availableTokens[randomIndex] = lastValInArray;
        }
    }

    numAvailableTokens--;
    return result;
}

function lockDevMint() public onlyOwner {
    devMintLocked = true;
}
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蝴簇,隨后出現(xiàn)的幾起案子杯活,更是在濱河造成了極大的恐慌,老刑警劉巖熬词,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旁钧,死亡現(xiàn)場(chǎng)離奇詭異吸重,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)歪今,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門嚎幸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人寄猩,你說我怎么就攤上這事嫉晶。” “怎么了田篇?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵车遂,是天一觀的道長(zhǎng)凤薛。 經(jīng)常有香客問我牺氨,道長(zhǎng)奥裸,這世上最難降的妖魔是什么沿后? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任究恤,我火速辦了婚禮冤竹,結(jié)果婚禮上财饥,老公的妹妹穿的比我還像新娘落竹。我一直安慰自己闸氮,他們只是感情好剪况,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蒲跨,像睡著了一般译断。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上或悲,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天孙咪,我揣著相機(jī)與錄音,去河邊找鬼巡语。 笑死翎蹈,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的男公。 我是一名探鬼主播荤堪,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼枢赔!你這毒婦竟也來了澄阳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤踏拜,失蹤者是張志新(化名)和其女友劉穎碎赢,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體执隧,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡揩抡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年户侥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片峦嗤。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蕊唐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出烁设,到底是詐尸還是另有隱情替梨,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布装黑,位于F島的核電站副瀑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏恋谭。R本人自食惡果不足惜糠睡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望疚颊。 院中可真熱鬧狈孔,春花似錦、人聲如沸材义。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)其掂。三九已至油挥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間款熬,已是汗流浹背深寥。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留华烟,地道東北人翩迈。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓持灰,卻偏偏與公主長(zhǎng)得像盔夜,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子堤魁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容