stellar-interchain-token-service 2.0.0

InterchainTokenService contract, responsible for allowing users/developers to easily create their own token bridge.
Documentation
use stellar_axelar_std::testutils::Address as _;
use stellar_axelar_std::{
    assert_auth, assert_auth_err, assert_contract_err, events, Address, String,
};

use super::utils::setup_env;
use crate::error::ContractError;
use crate::event::{TrustedChainRemovedEvent, TrustedChainSetEvent};

#[test]
fn set_trusted_address() {
    let (env, client, _, _, _) = setup_env();

    let chain = String::from_str(&env, "chain");

    assert_auth!(client.operator(), client.set_trusted_chain(&chain));

    goldie::assert!(events::fmt_last_emitted_event::<TrustedChainSetEvent>(&env));

    assert!(client.is_trusted_chain(&chain));
}

#[test]
fn set_trusted_chain_fails_if_not_operator() {
    let (env, client, _, _, _) = setup_env();

    let not_operator = Address::generate(&env);
    let chain = String::from_str(&env, "chain");

    assert_auth_err!(not_operator, client.set_trusted_chain(&chain));
    assert_auth_err!(client.owner(), client.set_trusted_chain(&chain));
}

#[test]
fn set_trusted_chain_fails_if_already_set() {
    let (env, client, _, _, _) = setup_env();

    let chain = String::from_str(&env, "chain");
    client.mock_all_auths().set_trusted_chain(&chain);

    assert_contract_err!(
        client.mock_all_auths().try_set_trusted_chain(&chain),
        ContractError::TrustedChainAlreadySet
    );
}

#[test]
fn remove_trusted_chain() {
    let (env, client, _, _, _) = setup_env();

    let chain = String::from_str(&env, "chain");

    assert_auth!(client.operator(), client.set_trusted_chain(&chain));

    assert_auth!(client.operator(), client.remove_trusted_chain(&chain));

    goldie::assert!(events::fmt_last_emitted_event::<TrustedChainRemovedEvent>(
        &env
    ));

    assert!(!client.is_trusted_chain(&chain));
}

#[test]
fn remove_trusted_chain_fails_if_not_operator() {
    let (env, client, _, _, _) = setup_env();

    let not_operator = Address::generate(&env);
    let chain = String::from_str(&env, "chain");

    assert_auth_err!(not_operator, client.remove_trusted_chain(&chain));
    assert_auth_err!(client.owner(), client.remove_trusted_chain(&chain));
}

#[test]
fn remove_trusted_chain_fails_if_not_set() {
    let (env, client, _, _, _) = setup_env();

    let chain = String::from_str(&env, "chain");

    assert!(!client.is_trusted_chain(&chain));

    assert_contract_err!(
        client.mock_all_auths().try_remove_trusted_chain(&chain),
        ContractError::TrustedChainNotSet
    );
}