Aller au contenu principal

SAVITRI-20 : Standard de Jeton Fongible

SAVITRI-20 est le standard de jeton fongible pour le Savitri Network, équivalent à l'ERC-20 d'Ethereum. Il permet la création et la gestion de jetons fongibles avec des mécaniques de transfert, d'approbation et d'allocation.

Interface

FonctionParamètresRetourneDescription
initializeowner, name, symbol, initial_supply-Déployer et initialiser un nouveau jeton
total_supply-u128Offre totale de jetons
balance_ofaddressu128Solde de jetons d'une adresse
transferto, amountResultTransférer des jetons à un destinataire
approvespender, amountResultApprouver l'allocation d'un dépensier
transfer_fromfrom, to, amountResultTransférer en utilisant une allocation
allowanceowner, spenderu128Vérifier l'allocation approuvée
mintto, amountResultFrapper de nouveaux jetons (propriétaire uniquement)
burnfrom, amountResultBrûler des jetons

Disposition du Stockage

Plage d'EmplacementUtilisation
0-99BaseContract (réservé)
100Offre totale
101+Mappage des soldes : keccak256(address || 101)
200+Mappage des allocations : keccak256(spender || keccak256(owner || 200))
300+Nom du jeton (stockage de chaîne)
400+Symbole du jeton (stockage de chaîne)

Toutes les valeurs sont stockées sous forme de tableaux de 32 octets avec des valeurs u128 au format little-endian.

Déployer un Jeton SAVITRI-20

Via l'Environnement d'Exécution des Contrats (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),
)?;

Via le 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)?;

Opérations sur les Jetons

Transfert

// 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),
)?;

Approbation et 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),
)?;

Interroger les Soldes

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)?;

Événements

ÉvénementChampsDescription
Transferfrom, to, amountTransfert de jeton
Approvalowner, spender, amountApprobation d'allocation
Mintto, amountNouveaux jetons frappés
Burnfrom, amountJetons brûlés

Sécurité

  • Vérification d'adresse non nulle : Les transferts vers/depuis l'adresse zéro sont rejetés
  • Validation du solde : Les transferts échouent si l'expéditeur a un solde insuffisant
  • Vérification d'allocation : transfer_from vérifie et décrémente l'allocation de manière atomique
  • Protection contre les débordements : Toutes les opérations arithmétiques utilisent des opérations vérifiées
  • Hachage d'emplacement Keccak256 : Empêche les collisions d'emplacements de stockage entre différents mappages