Токен CRC1155 похож на токен CRC721, однако, он имеет большее количеств функций в том числе для экономии газа. В отличие от CRC721, CRC1155 позволяет создавать много копий различных NFT в одной транзакции. Это называется периодической чеканкой (batch minting) и позволяет эффективно расходовать газ. CRC1155 также известен как мульти токен (Multi token Standard), поскольку он может взаимодействовать одновременно с взаимозаменяемыми и не взаимозаменяемыми токенами.
В данной инструкции мы используем Hardhat и js-conflux-sdk в тестовой сети Conflux для написания, развертывания и взаимодействия со смарт-контрактом, совместимым с CRC1155.
Для начала нам понадобятся:
- Кошелек Conflux. Вы можете скачать его здесь. Для получения токенов CFX в тестовой сети Conflux есть кран.
- Шаблон смарт-контракта. В качестве шаблона можете скачать этот репозиторий. Обратите внимание, что аналогичную структуру папок можно создать, запустив npx hardhat initв пустой папке, выбрав расширенный параметр Typechain.
Обратите внимание, что hardhat создаст в каталоге некоторые дополнительные файлы и модули, например, hardhat.config.ts и другие, которые не задействованы в этой инструкции, вы можете просто игнорировать их.
Давайте приступим!
Во-первых, вам необходимо понимание смарт-контракта на высоком уровне. Для упрощения задачи мы использовали стандарт ERC1155 от Openzeppelin, мы создаем новый контракт под названием СRC1155, который напрямую наследует готовый контракт Openzeppelin ERC1155.
import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
contract CRC1155 is ERC1155
Теперь мы можем описывать дополнительные функции для нашего ERC1155 NFT, не беспокоясь об основных функциях. В контракте есть конструктор, который задает имя и символ NFT, а также задает URI токена.
constructor(string memory _globalURI) ERC1155(_globalURI)
{}
Данная функция позволяет пользователю бесплатно выпустить NFT на заданный адрес:
function mintToken( address _to, uint256[] calldata _tokenIds, uint256[] calldata _amounts)
external {
_mintBatch(_to, _tokenIds, _amounts, "0x00");
}
Он также содержит две функции, которые возвращают имя и символ CRC1155 NFT:
function name() public pure returns (string memory) {
return "Conflux 1155";
}
function symbol() public pure returns (string memory) {
return "CFX1155";
}
Теперь давайте углубимся в сценарий развертывания и взаимодействия с контрактом.
При развертывании контракта с NFT токеном, для создания самого контракта и сетевых объектов мы будем использовать js-conflux-sdk вместо ethersjs . Поскольку мы пишем скрипты развертывания на typescript, нам необходимо импортировать все необходимые модули, включая abi, байт-код нашего скомпилированного контракта CRC1155 и сам модуль Conflux.
import { abi, bytecode } from '../artifacts/contracts/CRC1155.sol/CRC1155.json'
import { Conflux } from 'js-conflux-sdk'
abi и байт-код контракта автоматически генерируются всякий раз, когда вы запускаете скрипт hardhat или компилируете контракт, они сохраняются в каталоге artifacts.
Чтобы взаимодействовать с Conflux, вам необходимо инициализировать экземпляр (инстанс) сети с помощью Conflux sdk. В этом примере мы инициализируем экземпляр testnet.
const testnet = 'https://test.confluxrpc.com'
const cfx = new Conflux({
url: testnet,
networkId: 1,
logger: console,
})
Теперь мы можем использовать cfx для создания нового контракта и отправки транзакции развертывания.
const contract = cfx.Contract({ abi, bytecode })
//deploy contract
const txReceipt = await contract.constructor(globalURI).sendTransaction({ from: acct }).executed()
Из квитанции о транзакции мы можем получить адрес развернутого нами контракта для дальнейшего взаимодействовия с ним.
//get deployed contract instance
const nftContract = cfx.Contract({ abi, address: txReceipt.contractCreated })
//call the mint function
const tx = await nftContract.mintToken(acct.toString(), [0, 1, 2, 3, 4], [5, 4, 3, 2, 1]) .sendTransaction({ from: acct.toString() })
npx hardhat run scripts/deploy.ts
Поздравляем, вы успешно развернули токен CRC1155 в сети Conflux testnet с использованием hardhat и js-conflux-sdk.
Чтобы узнать больше о методах js-conflux-sdk, рекомендуем ознакомиться с документацией на github.
Оригинал инструкции: https://medium.com/conflux-network/deploying-a-crc721-token-on-conflux-f0f3eaf03f52