SAVITRI-20: Estándar de Token Fungible
SAVITRI-20 es el estándar de token fungible para Savitri Network, equivalente al ERC-20 de Ethereum. Permite la creación y gestión de tokens fungibles con mecánicas de transferencia, aprobación y asignación de cuotas.
Interfaz
| Función | Parámetros | Retorna | Descripción |
|---|---|---|---|
initialize | owner, name, symbol, initial_supply | - | Desplegar e inicializar un nuevo token |
total_supply | - | u128 | Suministro total de tokens |
balance_of | address | u128 | Saldo de tokens de una dirección |
transfer | to, amount | Result | Transferir tokens a un destinatario |
approve | spender, amount | Result | Aprobar cuota para un gastador |
transfer_from | from, to, amount | Result | Transferir usando cuota aprobada |
allowance | owner, spender | u128 | Verificar cuota aprobada |
mint | to, amount | Result | Acuñar nuevos tokens (solo propietario) |
burn | from, amount | Result | Quemar tokens |
Disposición del Almacenamiento
| Rango de Ranulas | Propósito |
|---|---|
| 0-99 | BaseContract (reservado) |
| 100 | Suministro total |
| 101+ | Mapeo de saldos: keccak256(address || 101) |
| 200+ | Mapeo de cuotas: keccak256(spender || keccak256(owner || 200)) |
| 300+ | Nombre del token (almacenamiento de cadena) |
| 400+ | Símbolo del token (almacenamiento de cadena) |
Todos los valores se almacenan como arreglos de 32 bytes con valores u128 en formato little-endian.
Despliegue de un Token SAVITRI-20
Mediante el Entorno de Ejecución de Contratos (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),
)?;
Mediante el 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)?;
Operaciones con Tokens
Transferencia
// 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),
)?;
Aprobar y 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),
)?;
Consultar Saldos
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)?;
Eventos
| Evento | Campos | Descripción |
|---|---|---|
Transfer | from, to, amount | Transferencia de tokens |
Approval | owner, spender, amount | Aprobación de cuota |
Mint | to, amount | Nuevos tokens acuñados |
Burn | from, amount | Tokens quemados |
Seguridad
- Verificación de dirección no nula: Las transferencias hacia o desde la dirección cero son rechazadas
- Validación de saldo: Las transferencias fallan si el remitente no tiene saldo suficiente
- Verificación de cuota:
transfer_fromverifica y decrementa la cuota de forma atómica - Protección contra desbordamiento: Toda la aritmética usa operaciones verificadas
- Hash de ranura Keccak256: Previene colisiones de ranuras de almacenamiento entre diferentes mapeos