Перейти к основному содержимому

SAVITRI-20: Стандарт взаимозаменяемых токенов

SAVITRI-20 — стандарт взаимозаменяемых токенов для Savitri Network, аналог ERC-20 в Ethereum. Он позволяет создавать и управлять взаимозаменяемыми токенами с механизмами переводов, одобрений и лимитов расходования.

Интерфейс

ФункцияПараметрыВозвращаетОписание
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 — в формате little-endian.

Развёртывание токена 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),
)?;

Approve и 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: предотвращает коллизии слотов хранилища между различными маппингами