Interactuar con su contrato

Procedamos a generar transacciones y recuperar información del contrato que hemos desplegado.

Consultas

Las consultas leen de la cadena de bloques. No modifican nada almacenado en la cadena, por lo que no incurren en gastos de gas.

Hay varios tipos de consultas que podemos realizar, pero un tipo común que nos interesa es el estado del contrato, que llamaremos en modo inteligente. Esto nos permite realizar consultas con argumentos, en lugar de volcar todos los datos o metadatos del contrato.

Si consultamos el count antes de modificar ningún estado, obtendremos el valor que establecimos durante la instanciación:

archway contracts query smart CONTRACT [STDININPUT] [--json] [--log-level debug|error|info|warn] [--no-validation] [--args <value> | --args-file <value>| ]

Un ejemplo básico para nuestro contrato de incremento sería:

archway contracts query smart increment --args '{"get_count": {}}'

Outputs:

{
  "count": 0
}

¿Por qué el argumento de consulta {"get_count": {}}?

Si abrimos src/contract.rs e inspeccionamos la función pub fn query, veremos la sentencia case matching que coincide con nuestra consulta JSON:

pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> StdResult<Binary> {
  match msg {
      QueryMsg::GetCount {} => to_binary(&query_count(deps)?), // Here it is
  }
}

Información

QueryMsg es un enum con la propiedad GetCount, definida en el archivo src/msg.rs. Es bueno ser consciente del formato aquí, ya que el atributo enum está en mayúsculas sin espacios en Rust, pero en minúsculas con snake case cuando se convierte a argumentos JSON. Esto se controla con el atributo #serde(rename_all = "snake_case") justo encima de la definición de QueryMsg.

Transacciones

Para incrementar el valor de nuestro contador, ejecutaremos una transacción que llama a la función pub fn try_increment en src/contract.rs. Esta función ya es pública, pero la ejecución de la transacción es manejada por la función pub fn execute en src/contract.rs, que hace la concordancia de patrones para llamar a try_increment.

Enviando una transacción de Incremento, usando el CLI de archway:

archway contracts execute increment --args '{"increment": {}}'

Información

Si alguna vez recibe un error de falta de gas, siempre puede utilizar el indicador --gas-adjustment y establecer un valor de 1,5 o más.

Enviando una transacción de Incremento, usando archwayd:

MAINNET
archwayd tx wasm execute --chain-id archway-1 archway188u72zstacfq4uknszr0cqry8vn68ynrcfcee4xjlmk6v2vhewysnkr798  '{"increment": {}}' --from my-wallet --node https://rpc.mainnet.archway.io:443 --gas auto --gas-prices $(archwayd q rewards estimate-fees 1 --node 'https://rpc.mainnet.archway.io:443' --output json | jq -r '.gas_unit_price | (.amount + .denom)') --gas-adjustment 1.3

TESTNET
archwayd tx wasm execute --chain-id constantine-3 archway188u72zstacfq4uknszr0cqry8vn68ynrcfcee4xjlmk6v2vhewysnkr798  '{"increment": {}}' --from my-wallet --node https://rpc.constantine.archway.tech:443 --gas auto --gas-prices $(archwayd q rewards estimate-fees 1 --node 'https://rpc.constantine.archway.tech:443' --output json | jq -r '.gas_unit_price | (.amount + .denom)') --gas-adjustment 1.3

Ejemplo output:

✔ Enter the name or address of the account that will send the transaction … mywallet
Executing contract increment2
  Chain: constantine-3
  Signer: mywallet
✅ Executed contract  increment2-0.1.0
  Transaction: CEFC1B9F6AE482249C3F6F3ED1C723F25FA8C129F53F5169544931207769311A

¿Por qué el argumento {"increment": {}}?

Si abrimos src/contract.rs e inspeccionamos la función pub fn execute, veremos una sentencia de concordancia de patrones que coincide con nuestro argumento JSON:

pub fn execute(
  deps: DepsMut,
  _env: Env,
  info: MessageInfo,
  msg: ExecuteMsg,
) -> Result<Response, ContractError> {
  match msg {
    ExecuteMsg::Increment {} => try_increment(deps), // Here it is
    ExecuteMsg::Reset { count } => try_reset(deps, info, count),
  }
}

Como puede ver, los atributos enum se convierten de nuevo. ExecuteMsg::Increment {} se convierte en {"increment": {}} en la CLI.

Información

Aunque no se aplica a nuestra dapp Increment, para las dapps que cobran pagos, la estructura MessageInfo es la forma en que los desarrolladores pueden acceder y procesar los fondos entrantes. Tanto los activos nativos de la cadena como los tokens cw20 son compatibles con el atributo funds de MessageInfo.

pub struct MessageInfo {
  pub sender: Addr,
  pub funds: Vec<Coin>,
}

Al cobrar pagos en el token nativo de Archway (por ejemplo, ARCH para mainnet, CONST para Constantine testnet) las cantidades enviadas en fondos deben utilizar la denominación mínima de la cadena (por ejemplo, aarch para mainnet, aconst para Constantine testnet). El envío de pagos con otras denominaciones (por ejemplo, ARCH, o CONST) fallará con un error.

Si nuestra transacción {"increment": {}} la transacción ha tenido éxito y volvemos a consultar el count, éste se habrá incrementado en 1*:

archway contracts query smart increment --args '{"get_count": {}}'

Ahora outputs:

{
  "count": 1
}

Last updated