Aller au contenu principal

SAVITRI-721 : Standard NFT

SAVITRI-721 (SNT1 -- Savitri Non-Fungible Token) est le standard NFT pour le Savitri Network, équivalent à l'ERC-721 d'Ethereum. Chaque jeton possède un identifiant unique et un seul propriétaire.

Interface

FonctionParamètresRetourneDescription
balance_ofowneru64Nombre de NFT possédés par une adresse
owner_oftoken_idaddressPropriétaire d'un jeton spécifique
transfer_fromfrom, to, token_idResultTransférer un NFT
approveto, token_idResultApprouver une adresse pour transférer le jeton
safe_transfer_fromfrom, to, token_idResultTransfert avec vérifications de sécurité
token_uritoken_idStringObtenir l'URI des métadonnées du jeton
mintto, token_id, uriResultFrapper un nouveau NFT

Disposition du Stockage

Plage d'EmplacementUtilisationDérivation
0-99BaseContract (réservé)Directe
100+Propriétaires de jetonskeccak256(100 || token_id)
200+Soldes de jetonskeccak256(200 || address)
300+Approbations de jetonskeccak256(300 || token_id)
400+URIs de jetonskeccak256(400 || token_id)

Le hachage Keccak256 empêche les collisions d'emplacements entre les catégories (par exemple, le token_id 100 n'entrera pas en collision avec l'emplacement de base des soldes).

Frapper un NFT

use savitri_contracts::contracts::standards::savitri721::SAVITRI721;

SAVITRI721::mint(
&mut contract_storage,
&storage,
&recipient, // [u8; 32]
42, // token_id: u64
"ipfs://Qm.../meta", // token URI
&mut event_system,
Some(&mut gas_meter),
)?;

Transfert

// Direct transfer
SAVITRI721::transfer_from(
&mut contract_storage,
&storage,
&from, // current owner
&to, // new owner
42, // token_id
&mut event_system,
Some(&mut gas_meter),
)?;

Interrogation

// Who owns token #42?
let owner = SAVITRI721::owner_of(&contract_storage, &storage, 42)?;

// How many NFTs does this address own?
let count = SAVITRI721::balance_of(&contract_storage, &storage, &address)?;

// Get metadata URI
let uri = SAVITRI721::token_uri(&contract_storage, &storage, 42)?;

Événements

ÉvénementChampsDescription
Transferfrom, to, token_idNFT transféré
Approvalowner, approved, token_idApprobation accordée
Mintto, token_idNouveau NFT frappé

Via le SDK

use savitri_sdk::{ContractClient, Wallet};

let contract = ContractClient::from_url_and_wallet("http://localhost:8545", wallet)?;

// Mint NFT via contract call
let tx = contract.call_contract(
&nft_contract_address,
b"mint",
&encode_mint_args(recipient, token_id, uri),
Some(0),
).await?;