Skip to content

Commit

Permalink
feat(its)!: add chain name to token id derivation (#236)
Browse files Browse the repository at this point in the history
  • Loading branch information
Foivos authored Jan 27, 2025
1 parent c296518 commit 10f6690
Show file tree
Hide file tree
Showing 10 changed files with 189 additions and 89 deletions.
50 changes: 40 additions & 10 deletions move/interchain_token_service/sources/interchain_token_service.move
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ use interchain_token_service::coin_management::CoinManagement;
use interchain_token_service::interchain_transfer_ticket::{Self, InterchainTransferTicket};
use interchain_token_service::interchain_token_service_v0::{Self, InterchainTokenService_v0};
use interchain_token_service::owner_cap::{Self, OwnerCap};
use interchain_token_service::creator_cap::{Self, CreatorCap};
use interchain_token_service::operator_cap::{Self, OperatorCap};
use interchain_token_service::token_id::TokenId;
use interchain_token_service::trusted_addresses::TrustedAddresses;
Expand Down Expand Up @@ -37,10 +38,28 @@ public struct InterchainTokenService has key {
// Setup
// -----
fun init(ctx: &mut TxContext) {
transfer::public_transfer(
owner_cap::create(ctx),
ctx.sender(),
);

transfer::public_transfer(
operator_cap::create(ctx),
ctx.sender(),
);

transfer::public_transfer(
creator_cap::create(ctx),
ctx.sender(),
);
}

public fun setup(creator_cap: CreatorCap, chain_name: String, ctx: &mut TxContext) {
let inner = versioned::create(
DATA_VERSION,
interchain_token_service_v0::new(
version_control(),
chain_name,
ctx,
),
ctx,
Expand All @@ -52,15 +71,7 @@ fun init(ctx: &mut TxContext) {
inner,
});

transfer::public_transfer(
owner_cap::create(ctx),
ctx.sender(),
);

transfer::public_transfer(
operator_cap::create(ctx),
ctx.sender(),
);
creator_cap.destroy();
}

// ------
Expand Down Expand Up @@ -412,6 +423,7 @@ public fun create_for_testing(ctx: &mut TxContext): InterchainTokenService {

let mut value = interchain_token_service_v0::new(
version_control,
b"chain name".to_ascii_string(),
ctx,
);
value.set_trusted_address(
Expand Down Expand Up @@ -976,8 +988,26 @@ fun test_init() {
ts.next_tx(@0x0);

let owner_cap = ts.take_from_sender<OwnerCap>();
let its = ts.take_shared<InterchainTokenService>();
let operator_cap = ts.take_from_sender<OperatorCap>();

ts.return_to_sender(owner_cap);
ts.return_to_sender(operator_cap);
ts.end();
}

#[test]
fun test_setup() {
let mut ts = sui::test_scenario::begin(@0x0);
let creator_cap = creator_cap::create(ts.ctx());
let chain_name = b"chain name".to_ascii_string();

setup(creator_cap, chain_name, ts.ctx());
ts.next_tx(@0x0);

let its = ts.take_shared<InterchainTokenService>();
let chain_name_hash = axelar_gateway::bytes32::from_bytes(sui::hash::keccak256(&chain_name.into_bytes()));
assert!(its.value!(b"send_interchain_transfer").chain_name_hash() == chain_name_hash);

sui::test_scenario::return_shared(its);
ts.end();
}
Expand Down
19 changes: 19 additions & 0 deletions move/interchain_token_service/sources/types/creator_cap.move
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
module interchain_token_service::creator_cap;

// -----
// Types
// -----
public struct CreatorCap has key, store {
id: UID,
}

public(package) fun create(ctx: &mut TxContext): CreatorCap {
CreatorCap {
id: object::new(ctx),
}
}

public(package) fun destroy(self: CreatorCap) {
let CreatorCap { id } = self;
id.delete();
}
5 changes: 5 additions & 0 deletions move/interchain_token_service/sources/types/token_id.move
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
module interchain_token_service::token_id;

use axelar_gateway::bytes32::Bytes32;
use interchain_token_service::coin_info::CoinInfo;
use interchain_token_service::coin_management::CoinManagement;
use std::ascii;
Expand Down Expand Up @@ -34,13 +35,15 @@ public fun to_u256(token_id: &TokenId): u256 {
}

public fun from_info<T>(
chain_name_hash: &Bytes32,
name: &String,
symbol: &ascii::String,
decimals: &u8,
has_metadata: &bool,
has_treasury: &bool,
): TokenId {
let mut vec = address::from_u256(PREFIX_SUI_TOKEN_ID).to_bytes();
vec.append(bcs::to_bytes(chain_name_hash));
vec.append(bcs::to_bytes(&type_name::get<T>()));
vec.append(bcs::to_bytes(name));
vec.append(bcs::to_bytes(symbol));
Expand All @@ -51,10 +54,12 @@ public fun from_info<T>(
}

public(package) fun from_coin_data<T>(
chain_name_hash: &Bytes32,
coin_info: &CoinInfo<T>,
coin_management: &CoinManagement<T>,
): TokenId {
from_info<T>(
chain_name_hash,
&coin_info.name(),
&coin_info.symbol(),
&coin_info.decimals(),
Expand Down
Loading

0 comments on commit 10f6690

Please sign in to comment.