Expand description

§Concordium Smart Contract Testing

This library supports writing integration tests in Rust for Concordium smart contracts.

To use the library, you must add it to your Cargo.toml file under the [dev-dependencies] section. The library requries the rust edition 2021 or greater.

[package]
# ...
edition = "2021"

[dev-dependencies]
concordium-smart-contract-testing = "4.0"

§Basic usage

use concordium_smart_contract_testing::*;

// Create a "chain" with default parameters.
let mut chain = Chain::new();

// Define an account address to be used.
const ACC: AccountAddress = AccountAddress([0;32]);

// Create an account with 10000 CCD in balance.
chain.create_account(Account::new(ACC, Amount::from_ccd(1000)));

// Deploy a smart contract module (built with [Cargo Concordium](https://developer.concordium.software/en/mainnet/smart-contracts/guides/setup-tools.html#cargo-concordium)).
let deployment = chain
    .module_deploy_v1(
        Signer::with_one_key(),
        ACC,
        module_load_v1("path/to/contract.wasm.v1").unwrap())
    .unwrap();

// Initialize a smart contract from the deployed module.
let initialization = chain
    .contract_init(
        Signer::with_one_key(), // Used for specifying the number of signatures.
        ACC, // Invoker account.
        Energy::from(10000), // Maximum energy allowed for initializing.
        InitContractPayload {
            mod_ref: deployment.module_reference, // Module to initialize from.
            init_name: OwnedContractName::new_unchecked("init_my_contract".into()), // Contract to init.
            param: OwnedParameter::from_serial(&"my_param").unwrap(), // Any type implementing [`Serial`] can be used.
            amount: Amount::zero(), // CCD to send the contract.
        }
    )
    .unwrap();

// Update the initialized contract.
let update = chain
    .contract_update(
        Signer::with_one_key(), // Used for specifying the number of signatures.
        ACC, // Invoker account.
        Address::Account(ACC), // Sender (can also be a contract).
        Energy::from(10000),  // Maximum energy allowed for the update.
        UpdateContractPayload {
            address: initialization.contract_address, // The contract to update.
            receive_name: OwnedReceiveName::new_unchecked("my_contract.my_entrypoint".into()), // The receive function to call.
            message: OwnedParameter::from_serial(&42u8).unwrap(), // The parameter sent to the contract.
            amount: Amount::from_ccd(100), // Sending the contract 100 CCD.
        }
    )
    .unwrap();

// Check the trace elements produced (updates, interrupts, resumes, transfers, etc.).
assert!(matches!(update.effective_trace_elements().collect::<Vec<_>>()[..], [ContractTraceElement::Updated{..}]));

// Check the return value.
assert_eq!(update.return_value, to_bytes(&84u8));

// Check the balances of both contracts and accounts.
assert_eq!(chain.contract_balance(initialization.contract_address), Some(Amount::from_ccd(100)));
assert_eq!(chain.account_balance_available(ACC), Some(
    Amount::from_ccd(1000)
    - Amount::from_ccd(100) // Amount sent to contract.
    - deployment.transaction_fee
    - initialization.transaction_fee
    - update.transaction_fee));
     

Modules§

  • We expose the PublicKey, SecretKey, and Signature from the third-party ed25519_dalek crate here because these types appear in Concordium’s API.

Structs§

Enums§

Traits§

  • A trait implemented by types which can extract debug information from contract receive entrypoint executions.

Functions§

  • Dual to to_bytes.
  • Return whether execution is running under cargo concordium test with debugging enabled.
  • Load a v1 wasm module as it is output from cargo concordium build, i.e. including the prefix of 4 version bytes and 4 module length bytes.
  • Load a raw wasm module, i.e. one without the prefix of 4 version bytes and 4 module length bytes. The module still has to be a valid V1 smart contract module.
  • Serialize the given value to a freshly allocated vector of bytes using the provided Serial instance.

Type Aliases§

  • The minimum number of credentials that need to sign any transaction coming from an associated account.
  • Hash of a block.
  • A reference to a smart contract module deployed on the chain.
  • The minimum number of signatures on a credential that need to sign any transaction coming from an associated account.
  • Time at the beginning of the current slot, in miliseconds since unix epoch.