메인 콘텐츠로 건너뛰기

SAVITRI-721: NFT 표준

SAVITRI-721 (SNT1 -- Savitri Non-Fungible Token)은 Savitri Network의 NFT 표준으로, Ethereum의 ERC-721에 해당합니다. 각 토큰은 고유한 ID와 단일 소유자를 가집니다.

인터페이스

함수매개변수반환설명
balance_ofowneru64주소가 소유한 NFT 수
owner_oftoken_idaddress특정 토큰의 소유자
transfer_fromfrom, to, token_idResultNFT 전송
approveto, token_idResult토큰 전송을 위한 주소 승인
safe_transfer_fromfrom, to, token_idResult안전 확인이 포함된 전송
token_uritoken_idString토큰 메타데이터 URI 조회
mintto, token_id, uriResult새 NFT 발행

스토리지 레이아웃

슬롯 범위목적파생
0-99BaseContract (예약됨)직접
100+토큰 소유자keccak256(100 || token_id)
200+토큰 잔액keccak256(200 || address)
300+토큰 승인keccak256(300 || token_id)
400+토큰 URIkeccak256(400 || token_id)

Keccak256 해시는 카테고리 간 슬롯 충돌을 방지합니다 (예: token_id 100은 잔액 기본 슬롯과 충돌하지 않음).

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

전송

// 직접 전송
SAVITRI721::transfer_from(
&mut contract_storage,
&storage,
&from, // 현재 소유자
&to, // 새 소유자
42, // token_id
&mut event_system,
Some(&mut gas_meter),
)?;

조회

// 토큰 #42의 소유자는?
let owner = SAVITRI721::owner_of(&contract_storage, &storage, 42)?;

// 이 주소가 소유한 NFT 수는?
let count = SAVITRI721::balance_of(&contract_storage, &storage, &address)?;

// 메타데이터 URI 조회
let uri = SAVITRI721::token_uri(&contract_storage, &storage, 42)?;

이벤트

이벤트필드설명
Transferfrom, to, token_idNFT 전송됨
Approvalowner, approved, token_id승인 허가됨
Mintto, token_id새 NFT 발행됨

SDK를 통해

use savitri_sdk::{ContractClient, Wallet};

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

// 컨트랙트 호출을 통한 NFT 발행
let tx = contract.call_contract(
&nft_contract_address,
b"mint",
&encode_mint_args(recipient, token_id, uri),
Some(0),
).await?;