57 releases (6 stable)

2.0.0 Mar 15, 2024
1.1.2 Nov 23, 2023
1.1.0 Jun 19, 2023
1.0.1 Dec 19, 2022
0.3.2 Oct 28, 2020

#7 in #migrate

Download history 14033/week @ 2024-04-29 11376/week @ 2024-05-06 12282/week @ 2024-05-13 13275/week @ 2024-05-20 12481/week @ 2024-05-27 13646/week @ 2024-06-03 14079/week @ 2024-06-10 13359/week @ 2024-06-17 12043/week @ 2024-06-24 9379/week @ 2024-07-01 10076/week @ 2024-07-08 13428/week @ 2024-07-15 12575/week @ 2024-07-22 12195/week @ 2024-07-29 10776/week @ 2024-08-05 15501/week @ 2024-08-12

52,445 downloads per month
Used in 451 crates (276 directly)

Apache-2.0

15KB
202 lines

CW2 Spec: Contract Info

Most of the CW* specs are focused on the public interfaces of the contract – the APIs used for ExecuteMsg or QueryMsg. However, when we wish to migrate or inspect smart contract info, we need some form of smart contract information embedded on state.

This is where CW2 comes in. It specifies a special Item to be stored on disk by all contracts on instantiate.

ContractInfo must be stored under the "contract_info" key which translates to "636F6E74726163745F696E666F" in hex format. Since the state is well defined, we do not need to support any "smart queries". We do provide a helper to construct a "raw query" to read the ContractInfo of any CW2-compliant contract.

You can query using:

wasmd query wasm contract-state raw [contract_addr] 636F6E74726163745F696E666F --node $RPC

When the migrate function is called, then the new contract can read that data and see if this is an expected contract we can migrate from. And also contain extra version information if we support multiple migrate paths. This crate provides an ensure_from_older_version helper that handles this.

Data structures

Required

All CW2-compliant contracts must store the following data:

pub struct ContractVersion {
    /// contract is a globally unique identifier for the contract.
    /// it should build off standard namespacing for whichever language it is in,
    /// and prefix it with the registry we use.
    /// For rust we prefix with `crates.io:`, to give us eg. `crates.io:cw20-base`
    pub contract: String,
    /// version is any string that this implementation knows. It may be simple counter "1", "2".
    /// or semantic version on release tags "v0.7.0", or some custom feature flag list.
    /// the only code that needs to understand the version parsing is code that knows how to
    /// migrate from the given contract (and is tied to it's implementation somehow)
    pub version: String,
}

Thus, an serialized example may looks like:

{
  "contract": "crates.io:cw20-base",
  "version": "v0.1.0"
}

Dependencies

~4–7.5MB
~150K SLoC