Interactuando con Oracle en WasmVM

Descripción general

Este tutorial lo guía a través de la obtención de precios de Oracle en un entorno WasmVM en Minitia utilizando la consulta Stargate. Siguiendo este tutorial, los desarrolladores pueden entender cómo integrar y recuperar datos financieros en tiempo real dentro de sus contratos inteligentes en la cadena de bloques Minitia.

Implementación de contrato de muestra

Utilizando el repositorio wasm-slinky-query , puede obtener precios de Oracle a través de un contrato CosmWasm.

En esta sección, proporcionaremos un contrato de ejemplo y mostraremos cómo implementarlo para que pueda llamar a Stargate Query o implementarlo directamente en su contrato.

Obtenga todos los pares de divisas

Función para recuperar todos los pares de divisas disponibles en Oracle.

fn get_all_currency_pairs(&self, deps: Deps, _env: Env) -> StdResult<GetAllCurrencyPairsResponse> {
    let request = GetAllCurrencyPairsRequest { 
        special_fields: ::protobuf::SpecialFields::new()
    };
    let bytes = request.write_to_bytes().unwrap();

    let data = Binary::from(bytes);
    let request = QueryRequest::<Empty>::Stargate{path: "/slinky.oracle.v1.Query/GetAllCurrencyPairs".to_string(), data};
    let res: GetAllCurrencyPairsResponse = deps.querier.query(&request)?;
    Ok(res)
}

#[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)]
#[allow(non_snake_case)]
pub struct CurrencyPair {
    pub Base: String,
    pub Quote: String,
}

Obtener precio

Función para obtener el precio de un par de divisas específico. pair_idestá en un formato de {Base}/{Quote}.

fn get_price(&self, deps: Deps, _env: Env, pair_id: String) -> StdResult<GetPriceResponse> {
    let request = GetPriceRequest { 
        currency_pair_selector: Some(Currency_pair_selector::CurrencyPairId(pair_id)),
        special_fields: ::protobuf::SpecialFields::new()
    };
    let bytes = request.write_to_bytes().unwrap();
    
    let data = Binary::from(bytes);
    let request = QueryRequest::Stargate{path: "/slinky.oracle.v1.Query/GetPrice".to_string(), data};
    let res: GetPriceResponseRaw = deps.querier.query(&request)?;
    Ok(convert_raw_price_response(&res))
}

#[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct GetPriceResponse {
    pub price: QuotePrice,
    pub nonce: u64,
    pub decimals: u64,
    pub id: u64,
}

#[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct QuotePrice {
    pub price: Uint256,
    pub block_timestamp: String, // ISO string
    pub block_height: u64,
}

Obtener precios

Función para obtener precios de múltiples pares de divisas.

fn get_prices(&self, deps: Deps, _env: Env, pair_ids: Vec<String>) -> StdResult<GetPricesResponse> {
    let request = GetPricesRequest { 
        currency_pair_ids: pair_ids,
        special_fields: ::protobuf::SpecialFields::new()
    };
    let bytes = request.write_to_bytes().unwrap();
    
    let data = Binary::from(bytes);
    let request = QueryRequest::Stargate{path: "/slinky.oracle.v1.Query/GetPrices".to_string(), data};
    let raw_res: GetPricesResponseRaw = deps.querier.query(&request)?;
    let res = GetPricesResponse {
        prices: raw_res.prices.into_iter().map(|raw| convert_raw_price_response(&raw)).collect()
    };
    Ok(res)
}

#[derive(Clone, Debug, PartialEq, serde::Deserialize, serde::Serialize)]
pub struct GetPricesResponse {
    pub prices: Vec<GetPriceResponse>
}

Conclusión

Este contrato proporciona una base para integrar datos de Oracle en tiempo real en sus aplicaciones blockchain, aprovechando los oráculos basados ​​en Cosmos dentro de un contexto WasmVM. Es adecuado para aplicaciones financieras que requieren acceso a precios de divisas actualizados y puede ampliarse o modificarse para adaptarse a requisitos específicos o funcionalidades adicionales.

Last updated