Aller au contenu principal

Client de Contrats

Le ContractClient fournit des assistants de haut niveau pour interagir avec les contrats intelligents, les oracles et la gouvernance sur le réseau Savitri.

Configuration

use savitri_sdk::{ContractClient, Wallet, RpcClient};

let wallet = Wallet::from_private_key_hex("your_private_key")?;
let rpc = RpcClient::from_url("http://localhost:8545")?;

let contract = ContractClient::new(rpc, wallet);

// Ou directement depuis une URL
let contract = ContractClient::from_url_and_wallet(
"http://localhost:8545",
wallet,
)?;

Appels de Contrats

Appel de Contrat Générique

let tx_hash = contract.call_contract(
&"contract_address_64hex".to_string(), // adresse du contrat
b"function_name", // sélecteur de fonction
b"encoded_arguments", // arguments encodés ABI
Some(0), // valeur à envoyer (0 pour lecture)
).await?;

println!("Hash TX : {}", tx_hash);

La méthode call_contract :

  1. Construit les données d'appel (function_selector || args)
  2. Crée une transaction via TransactionBuilder
  3. La signe avec le portefeuille
  4. La soumet via savitri_sendRawTransaction
  5. Retourne le hash de la transaction

Client Oracle

Accédez au système oracle pour les flux de données externes :

let oracle = contract.oracle();

// Demander des données à un oracle
let tx_hash = oracle.request_data(
&"oracle_address".to_string(),
"temperature", // type de données
b"sensor_id_001", // paramètres
).await?;

// Soumettre une réponse (en tant que fournisseur oracle)
let tx_hash = oracle.submit_response(
&"oracle_address".to_string(),
request_id, // u64
b"25.5", // données de réponse
).await?;

// Vérifier des données
let is_valid = oracle.verify_data(
&"oracle_address".to_string(),
b"data_to_verify",
).await?;

Client de Gouvernance

Interagissez avec le système de gouvernance on-chain :

let gov = contract.governance();

// Créer une proposition
let tx_hash = gov.create_proposal(
&"governance_address".to_string(),
"Upgrade consensus parameters", // titre
"Increase block size to 2MB", // description
604800, // période de vote (secondes)
).await?;

// Voter sur une proposition
let tx_hash = gov.vote(
&"governance_address".to_string(),
proposal_id, // u64
true, // true = soutien, false = opposition
).await?;

// Exécuter une proposition approuvée
let tx_hash = gov.execute(
&"governance_address".to_string(),
proposal_id,
).await?;

// Vérifier le statut d'une proposition
let status = gov.get_proposal_status(
&"governance_address".to_string(),
proposal_id,
).await?;

println!("Proposition #{} : {}", status.id, status.status);
println!("Votes : {} pour, {} contre", status.votes_for, status.votes_against);
println!("Exécutée : {}", status.executed);

Champs de ProposalStatus

ChampTypeDescription
idu64Identifiant de la proposition
titleStringTitre de la proposition
votes_foru64Nombre de votes favorables
votes_againstu64Nombre de votes défavorables
statusString"active", "passed", "rejected", "executed"
executedboolIndique si la proposition a été exécutée