合约
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

在部署步骤中需要当前声明合约时,服务端返回的class_hash。
部署NFT合约
sncast \
--account <account_name> \
--url http://127.0.0.1:9944 \
deploy \
--class-hash <class-hash>
<class-hash> 是上一步声明后终端的输出 的 clash_hash 。
信息
如果你还没有部署过账户,可以阅读有关部署账户的文档。

命令行返回的 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>"

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

转移 NFT
在转移NFT之前,需要先部署一个新的账户。
创建账号
sncast \
--url http://127.0.0.1:9944 \
account create \
--name <account_name> \
--class-hash 0x6280083f8c2a2db9f737320d5e3029b380e0e820fe24b8d312a6a34fdba0cd

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

部署新账号
sncast --url http://127.0.0.1:9944 \
account deploy \
--name <account_name> --max-fee 86460

转移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>"

检查NFT转移结果
sncast -u http://127.0.0.1:9944 \
call --contract-address <contract_address> \
--function "owner_of" --calldata "<token_id>"

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