메인 콘텐츠로 건너뛰기

SAVITRI-20: 대체 가능 토큰 표준

SAVITRI-20은 Savitri Network의 대체 가능 토큰 표준으로, Ethereum의 ERC-20에 해당합니다. 전송, 승인, 허용량 메커니즘을 갖춘 대체 가능 토큰의 생성 및 관리를 가능하게 합니다.

인터페이스

함수매개변수반환설명
initializeowner, name, symbol, initial_supply-새 토큰 배포 및 초기화
total_supply-u128총 토큰 공급량
balance_ofaddressu128주소의 토큰 잔액
transferto, amountResult수신자에게 토큰 전송
approvespender, amountResult지출자에게 허용량 승인
transfer_fromfrom, to, amountResult허용량을 통한 전송
allowanceowner, spenderu128승인된 허용량 확인
mintto, amountResult새 토큰 발행 (소유자 전용)
burnfrom, amountResult토큰 소각

스토리지 레이아웃

슬롯 범위목적
0-99BaseContract (예약됨)
100총 공급량
101+잔액 매핑: keccak256(address || 101)
200+허용량 매핑: keccak256(spender || keccak256(owner || 200))
300+토큰 이름 (문자열 스토리지)
400+토큰 심볼 (문자열 스토리지)

모든 값은 u128 값을 little-endian으로 저장한 32바이트 배열로 저장됩니다.

SAVITRI-20 토큰 배포

컨트랙트 런타임을 통해 (Rust)

use savitri_contracts::contracts::standards::savitri20::SAVITRI20;

// 새 토큰 초기화
SAVITRI20::initialize(
&mut contract_storage,
&storage,
&owner_address, // [u8; 32]
"My Token", // name
"MTK", // symbol
1_000_000_000_000_000_000_000_000, // 1M tokens (18 decimals)
Some(&mut gas_meter),
)?;

SDK를 통해

use savitri_sdk::{TransactionBuilder, Wallet};

let wallet = Wallet::from_private_key_hex("your_key")?;

// 토큰 컨트랙트 배포
let deploy_tx = TransactionBuilder::new()
.data(savitri20_bytecode)
.value(0)
.nonce(nonce)
.fee(5_000_000_000_000_000)
.build_and_sign(&wallet)?;

토큰 작업

전송

// 직접 전송
SAVITRI20::transfer(
&mut contract_storage,
&storage,
&sender, // [u8; 32]
&recipient, // [u8; 32]
1000_000_000_000_000_000, // 1000 tokens
&mut event_system,
Some(&mut gas_meter),
)?;

승인 및 TransferFrom

// 지출자 승인
SAVITRI20::approve(
&mut contract_storage,
&storage,
&owner,
&spender,
5000_000_000_000_000_000, // 5000 token allowance
&mut event_system,
Some(&mut gas_meter),
)?;

// 허용량을 통한 전송
SAVITRI20::transfer_from(
&mut contract_storage,
&storage,
&spender, // caller (허용량 필요)
&owner, // from
&recipient, // to
1000_000_000_000_000_000,
&mut event_system,
Some(&mut gas_meter),
)?;

잔액 조회

let balance = SAVITRI20::balance_of(&contract_storage, &storage, &address)?;
let supply = SAVITRI20::total_supply(&contract_storage, &storage)?;
let allowed = SAVITRI20::allowance(&contract_storage, &storage, &owner, &spender)?;

이벤트

이벤트필드설명
Transferfrom, to, amount토큰 전송
Approvalowner, spender, amount허용량 승인
Mintto, amount새 토큰 발행
Burnfrom, amount토큰 소각

보안

  • null 주소 확인: 제로 주소로/에서의 전송 거부
  • 잔액 검증: 발신자 잔액 부족 시 전송 실패
  • 허용량 확인: transfer_from은 허용량을 원자적으로 확인하고 감소
  • 오버플로우 방지: 모든 산술 연산에 확인된 연산 사용
  • Keccak256 슬롯 해시: 매핑 간 스토리지 슬롯 충돌 방지