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_gas_service::testutils::setup_gas_token;
use stellar_axelar_std::testutils::Address as _;
use stellar_axelar_std::{assert_auth_err, assert_contract_err, events, Address, String};

use super::utils::setup_env;
use crate::error::ContractError;
use crate::event::TokenMetadataRegisteredEvent;

pub const REGISTER_TOKEN_METADATA_EVENT_IDX: i32 = -1;

#[test]
fn register_token_metadata_succeeds() {
    let (env, client, _, _, _) = setup_env();
    let owner = Address::generate(&env);
    let token = &env.register_stellar_asset_contract_v2(owner);
    let spender = Address::generate(&env);
    let gas_token = setup_gas_token(&env, &spender);

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

    client.mock_all_auths().set_trusted_chain(&its_hub_chain);

    client
        .mock_all_auths()
        .register_token_metadata(&token.address(), &spender, &Some(gas_token));

    goldie::assert!(events::fmt_emitted_event_at_idx::<
        TokenMetadataRegisteredEvent,
    >(&env, REGISTER_TOKEN_METADATA_EVENT_IDX));
}

#[test]
fn register_token_metadata_fails_when_paused() {
    let (env, client, _, _, _) = setup_env();
    let owner = Address::generate(&env);
    let token = &env.register_stellar_asset_contract_v2(owner);
    let spender = Address::generate(&env);
    let gas_token = setup_gas_token(&env, &spender);

    client.mock_all_auths().pause();

    assert_contract_err!(
        client.try_register_token_metadata(&token.address(), &spender, &Some(gas_token)),
        ContractError::ContractPaused
    );
}

#[test]
fn register_token_metadata_fails_with_invalid_token() {
    let (env, client, _, _, _) = setup_env();
    let spender = Address::generate(&env);
    let gas_token = setup_gas_token(&env, &spender);
    let token_address = Address::generate(&env);

    assert_contract_err!(
        client.mock_all_auths().try_register_token_metadata(
            &token_address,
            &spender,
            &Some(gas_token)
        ),
        ContractError::InvalidTokenAddress
    );
}

#[test]
#[allow(clippy::redundant_clone)]
fn register_token_metadata_fails_with_unauthorized() {
    let (env, client, _, _, _) = setup_env();
    let owner = Address::generate(&env);
    let token = &env.register_stellar_asset_contract_v2(owner);
    let spender = Address::generate(&env);
    let gas_token = setup_gas_token(&env, &spender);

    assert_auth_err!(
        spender,
        client.register_token_metadata(&token.address(), &spender, &Some(gas_token.clone()))
    );
}