Cliente de Contratos
El ContractClient proporciona helpers de alto nivel para interactuar con contratos inteligentes, oráculos y gobernanza en Savitri Network.
Configuración
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);
// O directamente desde URL
let contract = ContractClient::from_url_and_wallet(
"http://localhost:8545",
wallet,
)?;
Llamadas a Contratos
Llamada Genérica a Contrato
let tx_hash = contract.call_contract(
&"contract_address_64hex".to_string(), // dirección del contrato
b"function_name", // selector de función
b"encoded_arguments", // args codificados en ABI
Some(0), // valor a enviar (0 para operaciones de lectura)
).await?;
println!("TX hash: {}", tx_hash);
El método call_contract:
- Construye los datos de llamada (
function_selector || args) - Crea una transacción mediante
TransactionBuilder - La firma con la billetera
- La envía mediante
savitri_sendRawTransaction - Devuelve el hash de la transacción
Cliente de Oráculo
Accede al sistema de oráculos para feeds de datos externos:
let oracle = contract.oracle();
// Solicitar datos de un oráculo
let tx_hash = oracle.request_data(
&"oracle_address".to_string(),
"temperature", // tipo de dato
b"sensor_id_001", // parámetros
).await?;
// Enviar una respuesta (como proveedor de oráculo)
let tx_hash = oracle.submit_response(
&"oracle_address".to_string(),
request_id, // u64
b"25.5", // datos de respuesta
).await?;
// Verificar datos
let is_valid = oracle.verify_data(
&"oracle_address".to_string(),
b"data_to_verify",
).await?;
Cliente de Gobernanza
Interactúa con el sistema de gobernanza en cadena:
let gov = contract.governance();
// Crear una propuesta
let tx_hash = gov.create_proposal(
&"governance_address".to_string(),
"Upgrade consensus parameters", // título
"Increase block size to 2MB", // descripción
604800, // período de votación (segundos)
).await?;
// Votar en una propuesta
let tx_hash = gov.vote(
&"governance_address".to_string(),
proposal_id, // u64
true, // true = a favor, false = en contra
).await?;
// Ejecutar una propuesta aprobada
let tx_hash = gov.execute(
&"governance_address".to_string(),
proposal_id,
).await?;
// Consultar el estado de una propuesta
let status = gov.get_proposal_status(
&"governance_address".to_string(),
proposal_id,
).await?;
println!("Proposal #{}: {}", status.id, status.status);
println!("Votes: {} for, {} against", status.votes_for, status.votes_against);
println!("Executed: {}", status.executed);
Campos de ProposalStatus
| Campo | Tipo | Descripción |
|---|---|---|
id | u64 | Identificador de la propuesta |
title | String | Título de la propuesta |
votes_for | u64 | Número de votos a favor |
votes_against | u64 | Número de votos en contra |
status | String | "active", "passed", "rejected", "executed" |
executed | bool | Si la propuesta ha sido ejecutada |