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
| Fonction | Paramètres | Retourne | Description |
|---|---|---|---|
initialize | owner, name, symbol, initial_supply | - | Déployer et initialiser un nouveau jeton |
total_supply | - | u128 | Offre totale de jetons |
balance_of | address | u128 | Solde de jetons d'une adresse |
transfer | to, amount | Result | Transférer des jetons à un destinataire |
approve | spender, amount | Result | Approuver l'allocation d'un dépensier |
transfer_from | from, to, amount | Result | Transférer en utilisant une allocation |
allowance | owner, spender | u128 | Vérifier l'allocation approuvée |
mint | to, amount | Result | Frapper de nouveaux jetons (propriétaire uniquement) |
burn | from, amount | Result | Brûler des jetons |
Disposition du Stockage
| Plage d'Emplacement | Utilisation |
|---|---|
| 0-99 | BaseContract (réservé) |
| 100 | Offre 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énement | Champs | Description |
|---|---|---|
Transfer | from, to, amount | Transfert de jeton |
Approval | owner, spender, amount | Approbation d'allocation |
Mint | to, amount | Nouveaux jetons frappés |
Burn | from, amount | Jetons 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_fromvé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