Saltar al contenido principal

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ónParámetrosRetornaDescripción
initializeowner, name, symbol, initial_supply-Desplegar e inicializar un nuevo token
total_supply-u128Suministro total de tokens
balance_ofaddressu128Saldo de tokens de una dirección
transferto, amountResultTransferir tokens a un destinatario
approvespender, amountResultAprobar cuota para un gastador
transfer_fromfrom, to, amountResultTransferir usando cuota aprobada
allowanceowner, spenderu128Verificar cuota aprobada
mintto, amountResultAcuñar nuevos tokens (solo propietario)
burnfrom, amountResultQuemar tokens

Disposición del Almacenamiento

Rango de RanulasPropósito
0-99BaseContract (reservado)
100Suministro 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

EventoCamposDescripción
Transferfrom, to, amountTransferencia de tokens
Approvalowner, spender, amountAprobación de cuota
Mintto, amountNuevos tokens acuñados
Burnfrom, amountTokens 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_from verifica 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