跳到主要内容

合约

NFT

Build NFT 合约

下面是构建NFT合约的示例

git clone https://github.com/Generative-Labs/madara-nft-contract
cd madara-nft-contract
注意

由于 madara 尚不支持高于 2.1.0 版本的 cairo。

工具链需要指定更低的版本!

curl --proto '=https' --tlsv1.2 -sSf https://docs.swmansion.com/scarb/install.sh | sh -s -- -v 0.6.2

使用 scarb构建合约

scarb clean && scarb build

声明NFT合约

在部署步骤中需要当前声明合约时,服务端返回的class_hash。

信息

在 StarkNet 中,Class Hash 是一个重要的概念。Class Hash 是一种哈希值,用于唯一标识 StarkNet 合约的代码。StarkNet 将合约的代码哈希为一个固定长度的值,并使用这个值来表示合约。这样做有助于确保合约的唯一性和安全性,并允许在链上进行有效的状态更新和验证。

更多关于合约class_hash的说明可以查看 starknet文档

sncast --account 0x3 --url http://127.0.0.1:9944 \
declare --contract-name MadaraNFT

NFTDeclare

在部署步骤中需要当前声明合约时,服务端返回的class_hash。

部署NFT合约

sncast \
--account <account_name> \
--url http://127.0.0.1:9944 \
deploy \
--class-hash <class-hash>

<class-hash> 是上一步声明后终端的输出 的 clash_hash 。

信息

如果你还没有部署过账户,可以阅读有关部署账户的文档。

Deploy Account

NFTDeploy

命令行返回的 contract_address 是已成功部署的合同的地址。

Mint

信息

token_id 是cairo中的 u256 类型. u256有两部分组成,高位和低位,是一个数组的形式。

token_uri_hex 是cairo中的felt252类型

下面是在python中使用 token_uri_hex 的示例

token_uri = 'i.ibb.co/7XK7CDZ/im-394091.jpg'

token_uri_hex = hex(int.from_bytes(token_uri.encode('utf-8'), 'big'))
sncast -u http://127.0.0.1:9944 \
--account 0x3 \
invoke --contract-address <contract_address> \
--function "mint_with_url" \
--calldata "<token_id> <token_uri_hex>"

MintToken

检查Mint 结果

sncast -u http://127.0.0.1:9944 \
call --contract-address <contract_address> \
--function "token_uri" --calldata "<token_id>"

NFTOwnerOf

转移 NFT

在转移NFT之前,需要先部署一个新的账户。

创建账号

sncast \
--url http://127.0.0.1:9944 \
account create \
--name <account_name> \
--class-hash 0x6280083f8c2a2db9f737320d5e3029b380e0e820fe24b8d312a6a34fdba0cd

AccountCreate

更新账号余额

sncast -u http://127.0.0.1:9944 \
--account 0x3 \
invoke --contract-address 0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7 \
--function "transfer" \
--calldata "<YourAddress> 100000 100000"

UpdateCreateAccountBalance

部署新账号

sncast --url http://127.0.0.1:9944 \
account deploy \
--name <account_name> --max-fee 86460

DeployCreateAccount

转移NFT到新的账号

sncast -u http://127.0.0.1:9944 \
--account <origin_account_name> \
invoke --contract-address <contract_address> \
--function "transfer_from" \
--calldata "<origin_account_address> <new_account_address> <token_id>"

TransferNFT

检查NFT转移结果

sncast -u http://127.0.0.1:9944  \
call --contract-address <contract_address> \
--function "owner_of" --calldata "<token_id>"

CheckTransferNFTResult

可以看到NFT已经转移到了新的账号。