Integración con contratos inteligentes

Para integrarse con otros contratos CosmWasm, es crucial entender qué son los puntos de entrada y cómo utilizarlos. Los puntos de entrada en un contrato inteligente son los métodos que permiten interactuar con él.

Los contratos inteligentes en CosmWasm definen tres puntos de entrada principales: instanciar, ejecutar y consultar.

  • instantiate: Es el método al que se llama cuando el contrato se despliega en la red. Normalmente se utiliza para inicializar el estado del contrato.

  • execute: Este método se llama cuando se envía una transacción al contrato. Se utiliza para actualizar el estado del contrato.

  • query: Este método se llama para leer datos del estado del contrato. No altera el estado.

Cuando estás creando un contrato inteligente que necesita interactuar con otro contrato, necesitas mirar qué hacen estos puntos de entrada, y manejar la interacción dentro de estos métodos. Por esta razón, necesitarías saber qué parámetros acepta cada método y qué devuelve.

Por ejemplo, si el otro contrato tiene un método de ejecución que acepta un mensaje Transfer, necesitas saber qué campos espera el mensaje Transfer.

En CosmWasm, las llamadas entre contratos se facilitan utilizando el tipo de mensaje CosmosMsg::Wasm(WasmMsg::Execute{}). Esto permite a tu contrato definir un conjunto de mensajes que desea enviar a otros contratos en ejecución. Estos mensajes serán devueltos al tiempo de ejecución y ejecutados después de que la ejecución de tu contrato se complete con éxito.

El tipo WasmMsg::Execute toma los siguientes argumentos:

  • contract_addr: La dirección del contrato al que desea llamar.

  • msg: El mensaje que desea enviar al contrato. Debe ser un objeto JSON que coincida con el esquema de mensajes del contrato.

  • send: Las monedas que desea transferir al contrato como parte de la llamada.

Llamadas a los puntos de entrada del otro contrato

Puedes utilizar el tipo de mensaje CosmosMsg::Wasm(WasmMsg::Execute{}) para interactuar con el método de ejecución de otro contrato. Aquí tienes un ejemplo de cómo hacerlo:

// Construct the Transfer message for the other contract
let transfer_msg = to_binary(&Transfer {
    recipient: deps.api.addr_humanize(&recipient_raw)?,
    amount,
})?;
// Construct the WasmMsg
let msg = WasmMsg::Execute {
    contract_addr: other_contract_addr.to_string(),
    msg: transfer_msg,
    send: vec![],
};
// Return the WasmMsg to be executed by the runtime
Ok(Response::new()
    .add_attribute("action", "call_other_contract")
    .add_message(msg))

En este ejemplo, Transfer es uno de los puntos de entrada en el otro contrato. Tenga en cuenta que lo anterior es sólo para fines explicativos, y le recomendamos que consulte nuestras guías para aprender más.

Es importante recordar que el mensaje WasmMsg::Execute se ejecutará después de que la ejecución de su contrato se complete con éxito. Si la ejecución de tu contrato falla, el mensaje WasmMsg::Execute no se ejecutará.

Last updated