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 :
- Construit les données d'appel (
function_selector || args) - Crée une transaction via
TransactionBuilder - La signe avec le portefeuille
- La soumet via
savitri_sendRawTransaction - 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
| Champ | Type | Description |
|---|---|---|
id | u64 | Identifiant de la proposition |
title | String | Titre de la proposition |
votes_for | u64 | Nombre de votes favorables |
votes_against | u64 | Nombre de votes défavorables |
status | String | "active", "passed", "rejected", "executed" |
executed | bool | Indique si la proposition a été exécutée |