wormhole/sui/token_bridge/sources/test/coin_wrapped_7.move

194 lines
6.9 KiB
Plaintext

// SPDX-License-Identifier: Apache 2
#[test_only]
module token_bridge::coin_wrapped_7 {
use sui::balance::{Balance};
use sui::coin::{CoinMetadata, TreasuryCap};
use sui::package::{UpgradeCap};
use sui::test_scenario::{Self, Scenario};
use sui::transfer::{Self};
use sui::tx_context::{Self, TxContext};
use token_bridge::asset_meta::{Self, AssetMeta};
use token_bridge::create_wrapped::{Self, WrappedAssetSetup};
use token_bridge::state::{Self};
use token_bridge::token_registry::{Self};
use token_bridge::wrapped_asset::{Self};
use token_bridge::version_control::{V__0_2_0 as V__CURRENT};
struct COIN_WRAPPED_7 has drop {}
// TODO: need to fix the emitter address
// +------------------------------------------------------------------------------+
// | Wormhole VAA v1 | nonce: 69 | time: 0 |
// | guardian set #0 | #1 | consistency: 15 |
// |------------------------------------------------------------------------------|
// | Signature: |
// | #0: 3d8fd671611d84801dc9d14a07835e8729d217b1aac77b054175d0f91294... |
// |------------------------------------------------------------------------------|
// | Emitter: 0x00000000000000000000000000000000deadbeef (Ethereum) |
// |------------------------------------------------------------------------------|
// | Token attestation |
// | decimals: 7 |
// | Token: 0x00000000000000000000000000000000deafface (Ethereum) |
// | Symbol: DEC7 |
// | Name: DECIMALS 7 |
// +------------------------------------------------------------------------------+
const VAA: vector<u8> =
x"010000000001003d8fd671611d84801dc9d14a07835e8729d217b1aac77b054175d0f91294040742a1ed6f3e732b2fbf208e64422816accf89dd0cd3ead20d2e0fb3d372ce221c010000000000000045000200000000000000000000000000000000000000000000000000000000deadbeef00000000000000010f0200000000000000000000000000000000000000000000000000000000deafface000207000000000000000000000000000000000000000000000000000000004445433700000000000000000000000000000000000000000000444543494d414c532037";
fun init(witness: COIN_WRAPPED_7, ctx: &mut TxContext) {
let (
setup,
upgrade_cap
) =
create_wrapped::new_setup_current(
witness,
7,
ctx
);
transfer::public_transfer(setup, tx_context::sender(ctx));
transfer::public_transfer(upgrade_cap, tx_context::sender(ctx));
}
#[test_only]
public fun init_test_only(ctx: &mut TxContext) {
init(COIN_WRAPPED_7 {}, ctx);
}
public fun encoded_vaa(): vector<u8> {
VAA
}
public fun token_meta(): AssetMeta {
asset_meta::deserialize_test_only(
wormhole::vaa::peel_payload_from_vaa(&VAA)
)
}
#[test_only]
/// for a test scenario, simply deploy the coin and expose `TreasuryCap`.
public fun init_and_take_treasury_cap(
scenario: &mut Scenario,
caller: address
): TreasuryCap<COIN_WRAPPED_7> {
use token_bridge::create_wrapped;
// Ignore effects.
test_scenario::next_tx(scenario, caller);
// Publish coin.
init(COIN_WRAPPED_7 {}, test_scenario::ctx(scenario));
// Ignore effects.
test_scenario::next_tx(scenario, caller);
create_wrapped::take_treasury_cap(
test_scenario::take_from_sender(scenario)
)
}
#[test_only]
/// For a test scenario, register this wrapped asset.
///
/// NOTE: Even though this module is `#[test_only]`, this method is tagged
/// with the same macro as a trick to allow another method within this
/// module to call `init` using OTW.
public fun init_and_register(
scenario: &mut Scenario,
caller: address
) {
use token_bridge::token_bridge_scenario::{return_state, take_state};
use wormhole::wormhole_scenario::{parse_and_verify_vaa};
// Ignore effects.
test_scenario::next_tx(scenario, caller);
// Publish coin.
init(COIN_WRAPPED_7 {}, test_scenario::ctx(scenario));
// Ignore effects.
test_scenario::next_tx(scenario, caller);
let token_bridge_state = take_state(scenario);
let verified_vaa = parse_and_verify_vaa(scenario, VAA);
let msg =
token_bridge::vaa::verify_only_once(
&mut token_bridge_state,
verified_vaa
);
// Ignore effects.
test_scenario::next_tx(scenario, caller);
let coin_meta =
test_scenario::take_shared<CoinMetadata<COIN_WRAPPED_7>>(scenario);
// Register the attested asset.
create_wrapped::complete_registration(
&mut token_bridge_state,
&mut coin_meta,
test_scenario::take_from_sender<
WrappedAssetSetup<COIN_WRAPPED_7, V__CURRENT>
>(
scenario
),
test_scenario::take_from_sender<UpgradeCap>(scenario),
msg
);
test_scenario::return_shared(coin_meta);
// Clean up.
return_state(token_bridge_state);
}
#[test_only]
/// NOTE: Even though this module is `#[test_only]`, this method is tagged
/// with the same macro as a trick to allow another method within this
/// module to call `init` using OTW.
public fun init_register_and_mint(
scenario: &mut Scenario,
caller: address,
amount: u64
): Balance<COIN_WRAPPED_7> {
use token_bridge::token_bridge_scenario::{return_state, take_state};
// First publish and register.
init_and_register(scenario, caller);
// Ignore effects.
test_scenario::next_tx(scenario, caller);
let token_bridge_state = take_state(scenario);
let minted =
wrapped_asset::mint_test_only(
token_registry::borrow_mut_wrapped_test_only(
state::borrow_mut_token_registry_test_only(
&mut token_bridge_state
)
),
amount
);
return_state(token_bridge_state);
minted
}
}
#[test_only]
module token_bridge::coin_wrapped_7_tests {
use token_bridge::asset_meta::{Self};
use token_bridge::coin_wrapped_7::{token_meta};
#[test]
fun test_native_decimals() {
let meta = token_meta();
assert!(asset_meta::native_decimals(&meta) == 7, 0);
asset_meta::destroy(meta);
}
}