跳到主要内容

SAVITRI-20:同质化代币标准

SAVITRI-20 是 Savitri Network 的同质化代币标准,等同于以太坊的 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+代币符号(字符串存储)

所有值以 32 字节数组存储,u128 值采用小端序格式。

部署 SAVITRI-20 代币

通过合约运行时(Rust)

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

// Initialize a new token
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")?;

// Deploy token contract
let deploy_tx = TransactionBuilder::new()
.data(savitri20_bytecode)
.value(0)
.nonce(nonce)
.fee(5_000_000_000_000_000)
.build_and_sign(&wallet)?;

代币操作

转账

// Direct transfer
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

// Approve spender
SAVITRI20::approve(
&mut contract_storage,
&storage,
&owner,
&spender,
5000_000_000_000_000_000, // 5000 token allowance
&mut event_system,
Some(&mut gas_meter),
)?;

// Transfer using allowance
SAVITRI20::transfer_from(
&mut contract_storage,
&storage,
&spender, // caller (must have allowance)
&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代币销毁

安全性

  • 非零地址检查:拒绝向/从零地址转账
  • 余额验证:发送方余额不足时转账失败
  • 限额检查transfer_from 原子性地验证并减少限额
  • 溢出保护:所有算术运算使用检查操作
  • Keccak256 槽哈希:防止不同映射之间的存储槽冲突