Passa al contenuto principale

SAVITRI-721: Standard NFT

SAVITRI-721 (SNT1 -- Savitri Non-Fungible Token) è lo standard NFT per la Savitri Network, equivalente all'ERC-721 di Ethereum. Ogni token ha un ID univoco e un unico proprietario.

Interfaccia

FunzioneParametriRitornaDescrizione
balance_ofowneru64Numero di NFT di proprietà di un indirizzo
owner_oftoken_idaddressProprietario di un token specifico
transfer_fromfrom, to, token_idResultTrasferisce un NFT
approveto, token_idResultApprova un indirizzo per trasferire il token
safe_transfer_fromfrom, to, token_idResultTrasferimento con controlli di sicurezza
token_uritoken_idStringOttieni l'URI dei metadati del token
mintto, token_id, uriResultConia un nuovo NFT

Layout dello Storage

Intervallo SlotScopoDerivazione
0-99BaseContract (riservato)Diretto
100+Proprietari tokenkeccak256(100 || token_id)
200+Saldi tokenkeccak256(200 || address)
300+Approvazioni tokenkeccak256(300 || token_id)
400+URI tokenkeccak256(400 || token_id)

L'hash Keccak256 previene le collisioni di slot tra categorie (ad es., token_id 100 non entrerà in conflitto con lo slot base dei saldi).

Coniatura di 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),
)?;

Trasferimento

// Trasferimento diretto
SAVITRI721::transfer_from(
&mut contract_storage,
&storage,
&from, // proprietario corrente
&to, // nuovo proprietario
42, // token_id
&mut event_system,
Some(&mut gas_meter),
)?;

Interrogazione

// Chi possiede il token #42?
let owner = SAVITRI721::owner_of(&contract_storage, &storage, 42)?;

// Quanti NFT possiede questo indirizzo?
let count = SAVITRI721::balance_of(&contract_storage, &storage, &address)?;

// Ottieni l'URI dei metadati
let uri = SAVITRI721::token_uri(&contract_storage, &storage, 42)?;

Eventi

EventoCampiDescrizione
Transferfrom, to, token_idNFT trasferito
Approvalowner, approved, token_idApprovazione concessa
Mintto, token_idNuovo NFT coniato

Tramite SDK

use savitri_sdk::{ContractClient, Wallet};

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

// Conia NFT tramite chiamata al contract
let tx = contract.call_contract(
&nft_contract_address,
b"mint",
&encode_mint_args(recipient, token_id, uri),
Some(0),
).await?;