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
| Funzione | Parametri | Ritorna | Descrizione |
|---|---|---|---|
balance_of | owner | u64 | Numero di NFT di proprietà di un indirizzo |
owner_of | token_id | address | Proprietario di un token specifico |
transfer_from | from, to, token_id | Result | Trasferisce un NFT |
approve | to, token_id | Result | Approva un indirizzo per trasferire il token |
safe_transfer_from | from, to, token_id | Result | Trasferimento con controlli di sicurezza |
token_uri | token_id | String | Ottieni l'URI dei metadati del token |
mint | to, token_id, uri | Result | Conia un nuovo NFT |
Layout dello Storage
| Intervallo Slot | Scopo | Derivazione |
|---|---|---|
| 0-99 | BaseContract (riservato) | Diretto |
| 100+ | Proprietari token | keccak256(100 || token_id) |
| 200+ | Saldi token | keccak256(200 || address) |
| 300+ | Approvazioni token | keccak256(300 || token_id) |
| 400+ | URI token | keccak256(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
| Evento | Campi | Descrizione |
|---|---|---|
Transfer | from, to, token_id | NFT trasferito |
Approval | owner, approved, token_id | Approvazione concessa |
Mint | to, token_id | Nuovo 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?;