SAVITRI-20: Стандарт взаимозаменяемых токенов
SAVITRI-20 — стандарт взаимозаменяемых токенов для Savitri Network, аналог ERC-20 в Ethereum. Он позволяет создавать и управлять взаимозаменяемыми токенами с механизмами переводов, одобрений и лимитов расходования.
Интерфейс
| Функция | Параметры | Возвращает | Описание |
|---|---|---|---|
initialize | owner, name, symbol, initial_supply | - | Развернуть и инициализировать новый токен |
total_supply | - | u128 | Общий объём предложения токена |
balance_of | address | u128 | Баланс токена по адресу |
transfer | to, amount | Result | Перевести токены получателю |
approve | spender, amount | Result | Одобрить лимит расходования |
transfer_from | from, to, amount | Result | Перевод с использованием лимита |
allowance | owner, spender | u128 | Проверить одобренный лимит |
mint | to, amount | Result | Выпустить новые токены (только владелец) |
burn | from, amount | Result | Сжечь токены |
Схема хранилища
| Диапазон слотов | Назначение |
|---|---|
| 0–99 | BaseContract (зарезервировано) |
| 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)?;
События
| Событие | Поля | Описание |
|---|---|---|
Transfer | from, to, amount | Перевод токена |
Approval | owner, spender, amount | Одобрение лимита расходования |
Mint | to, amount | Выпуск новых токенов |
Burn | from, amount | Сжигание токенов |
Безопасность
- Проверка ненулевого адреса: переводы на/с нулевого адреса отклоняются
- Проверка баланса: переводы завершаются ошибкой при недостаточном балансе отправителя
- Проверка лимита:
transfer_fromатомарно верифицирует и уменьшает лимит - Защита от переполнения: все арифметические операции используют проверяемые вычисления
- Хеширование слотов Keccak256: предотвращает коллизии слотов хранилища между различными маппингами