Complex state y maps

En soluciones más complejas, puede que sea necesario almacenar información adicional. Una opción es serializar estructuras de datos JSON extensas, lo que permite la recuperación de datos a través de pares clave-valor. En el contexto de CW20, la asociación de direcciones con sus saldos CW20 se logra utilizando una estructura de datos de Mapa:

pub const BALANCES: Map<&Addr, Uint128> = Map::new("balance");

El código para esto se puede encontrar aquí.

A continuación se presenta un ejemplo de interacción con el valor del mapa SALDOS, como se ve aquí. El fragmento de código relevante es:

let rcpt_addr = deps.api.addr_validate(&recipient)?;
BALANCES.update(
   deps.storage,
   &info.sender,
   |balance: Option<Uint128>| -> StdResult<_> {
      Ok(balance.unwrap_or_default().checked_sub(amount)?)
   },
)?;

Están sucediendo muchas cosas aquí, así que analicémoslas:

  • deps.storage se proporciona como entrada. Esto es del contexto del contrato. deps es similar a ctx que puede haber encontrado en el SDK de Cosmos.

  • &rcpt_addr es una referencia prestada a la dirección del destinatario validada. Ha sido verificado y es válido; de lo contrario, la declaración let habría generado un error. Esto representa la clave en el par clave/valor.

  • La tercera declaración es una función anónima (lambda) que devuelve StdResult y realiza algunos cálculos basados en el valor actual del saldo. balance representa el valor en el par clave/valor y &rcpt_addr es la clave.

Para un uso más avanzado, incluida la indexación y funciones adicionales, consulte:

Last updated