Interactuar con Oracle en EVM

Descripción general

Este tutorial demuestra cómo obtener precios de Oracle en un entorno EVM Minitia utilizando consultas de Cosmos. La integración se ve facilitada por las COSMOS_CONTRACTprecompilaciones EVM de Initia que permiten realizar consultas a través de un contrato CosmWasm. Aquí, exploramos el uso de datos de Oracle para obtener información y precios de pares de divisas directamente a través de contratos inteligentes de Cosmos.

Implementación de contrato de muestra

A través del repositorio evm-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.

function get_all_currency_pairs() external returns (string memory) {
    string memory path = "/slinky.oracle.v1.Query/GetAllCurrencyPairs";
    string memory req = "{}";
    return COSMOS_CONTRACT.query_cosmos(path, req);
}

// response example: '{"currency_pairs":[{"Base":"BITCOIN","Quote":"USD"},{"Base":"INIT","Quote":"USD"}]}'

Obtener precio

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

function get_price(string memory pair_id) external returns (Price memory) {
    string memory path = "/slinky.oracle.v1.Query/GetPrice";
    string memory req = string.concat(string.concat('{"currency_pair_id":"', pair_id), '"}');
    string memory queryRes = COSMOS_CONTRACT.query_cosmos(path, req);
    
    uint returnValue;
    JsmnSolLib.Token[] memory tokens;
    uint actualNum;
    (returnValue, tokens, actualNum) = JsmnSolLib.parse(queryRes, 15);

    return get_price_from_tokens(queryRes, tokens, 0);
}

Obtener precios

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

function get_prices(string[] memory pair_ids) external returns (Price[] memory) {
    string memory path = "/slinky.oracle.v1.Query/GetPrices";
    string memory req = string.concat(string.concat('{"currency_pair_ids":["', join(pair_ids, '","')), '"]}');
    uint numberElements = 3 + pair_ids.length * 15;

    string memory queryRes = COSMOS_CONTRACT.query_cosmos(path, req);
    
    uint returnValue;
    JsmnSolLib.Token[] memory tokens;
    uint actualNum;
    (returnValue, tokens, actualNum) = JsmnSolLib.parse(queryRes, numberElements);

    Price[] memory response = new Price[](actualNum / 15);
    uint index = 3;
    while (index < actualNum) {
        response[index / 15] = get_price_from_tokens(queryRes, tokens, index);
        index = index + 15;
    }

    return response;
}

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 EVM. 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