axelar-cgp-sui

Module 0xa6::discovery

use 0x1::ascii;
use 0x1::type_name;
use 0x1::vector;
use 0x2::bcs;
use 0x2::object;
use 0x2::versioned;
use 0xa1::channel;
use 0xa1::gateway;
use 0xa2::discovery;
use 0xa2::transaction;
use 0xa5::discovery;
use 0xa5::its;
use 0xa5::token_id;
use 0xa6::deepbook_v3;
use 0xa6::squid;
use 0xa6::squid_v0;
use 0xa6::transfers;
use 0xb0::version_control;

Constants

const EInvalidSwapType: u64 = 0;

const SWAP_TYPE_DEEPBOOK_V3: u8 = 1;

const SWAP_TYPE_ITS_TRANSFER: u8 = 3;

const SWAP_TYPE_SUI_TRANSFER: u8 = 2;

Function register_transaction

public fun register_transaction(squid: &squid::Squid, its: &its::ITS, gateway: &gateway::Gateway, relayer_discovery: &mut discovery::RelayerDiscovery)
Implementation
public fun register_transaction(
    squid: &Squid,
    its: &ITS,
    gateway: &Gateway,
    relayer_discovery: &mut RelayerDiscovery,
) {
    let mut squid_arg = vector[0];
    squid_arg.append(object::id(squid).id_to_bytes());

    let mut its_arg = vector[0];
    its_arg.append(object::id(its).id_to_bytes());

    let mut gateway_arg = vector[0];
    gateway_arg.append(object::id(gateway).id_to_bytes());

    let transaction = transaction::new_transaction(
        false,
        vector[
            transaction::new_move_call(
                transaction::new_function(
                    transaction::package_id<Squid>(),
                    ascii::string(b"discovery"),
                    ascii::string(b"get_transaction"),
                ),
                vector[squid_arg, its_arg, gateway_arg, vector[3]],
                vector[],
            ),
        ],
    );

    relayer_discovery.register_transaction(
        squid.value!(b"register_transaction").channel(),
        transaction,
    )
}

Function transaction

public fun transaction(squid: &squid::Squid, its: &its::ITS, gateway: &gateway::Gateway, payload: vector<u8>): transaction::Transaction
Implementation
public fun transaction(
    squid: &Squid,
    its: &ITS,
    gateway: &Gateway,
    payload: vector<u8>,
): Transaction {
    let (token_id, _, _, data) = its::discovery::interchain_transfer_info(
        payload,
    );
    let type_in = (*its.registered_coin_type(token_id)).into_string();
    let package_id = transaction::package_id<Squid>();
    let swap_data = bcs::new(data).peel_vec_vec_u8();

    let mut squid_arg = vector[0];
    squid_arg.append(object::id(squid).id_to_bytes());

    let mut its_arg = vector[0];
    its_arg.append(object::id(its).id_to_bytes());

    let mut gateway_arg = vector[0];
    gateway_arg.append(object::id(gateway).id_to_bytes());

    let swap_info_arg = vector[4, 0, 0];

    let mut move_calls = vector[
        start_swap(package_id, squid_arg, its_arg, type_in),
    ];

    let mut i = 0;
    while (i < swap_data.length()) {
        let mut bcs = bcs::new(swap_data[i]);
        let swap_type = bcs.peel_u8();

        if (swap_type == SWAP_TYPE_DEEPBOOK_V3) {
            move_calls.push_back(
                deepbook_v3::estimate_move_call(
                    package_id,
                    bcs,
                    swap_info_arg,
                ),
            );
        } else if (swap_type == SWAP_TYPE_SUI_TRANSFER) {
            move_calls.push_back(
                transfers::sui_estimate_move_call(
                    package_id,
                    bcs,
                    swap_info_arg,
                ),
            );
        } else {
            assert!(swap_type == SWAP_TYPE_ITS_TRANSFER, EInvalidSwapType);
            move_calls.push_back(
                transfers::its_estimate_move_call(
                    package_id,
                    bcs,
                    swap_info_arg,
                ),
            );
        };

        i = i + 1;
    };

    i = 0;
    while (i < swap_data.length()) {
        let mut bcs = bcs::new(swap_data[i]);
        let swap_type = bcs.peel_u8();

        if (swap_type == SWAP_TYPE_DEEPBOOK_V3) {
            move_calls.push_back(
                deepbook_v3::swap_move_call(
                    package_id,
                    bcs,
                    swap_info_arg,
                    squid_arg,
                ),
            );
        } else if (swap_type == SWAP_TYPE_SUI_TRANSFER) {
            move_calls.push_back(
                transfers::sui_transfer_move_call(
                    package_id,
                    bcs,
                    swap_info_arg,
                ),
            );
        } else {
            assert!(swap_type == SWAP_TYPE_ITS_TRANSFER, EInvalidSwapType);
            move_calls.push_back(
                transfers::its_transfer_move_call(
                    package_id,
                    bcs,
                    swap_info_arg,
                    squid_arg,
                    gateway_arg,
                    its_arg,
                ),
            );
        };

        i = i + 1;
    };

    move_calls.push_back(finalize(package_id, swap_info_arg));

    transaction::new_transaction(
        true,
        move_calls,
    )
}

Function start_swap

fun start_swap(package_id: address, squid_arg: vector<u8>, its_arg: vector<u8>, type_in: ascii::String): transaction::MoveCall
Implementation
fun start_swap(
    package_id: address,
    squid_arg: vector<u8>,
    its_arg: vector<u8>,
    type_in: String,
): MoveCall {
    transaction::new_move_call(
        transaction::new_function(
            package_id,
            ascii::string(b"squid"),
            ascii::string(b"start_swap"),
        ),
        vector[squid_arg, its_arg, vector[2], vector[0, 6]],
        vector[type_in],
    )
}

Function finalize

fun finalize(package_id: address, swap_info_arg: vector<u8>): transaction::MoveCall
Implementation
fun finalize(package_id: address, swap_info_arg: vector<u8>): MoveCall {
    transaction::new_move_call(
        transaction::new_function(
            package_id,
            ascii::string(b"squid"),
            ascii::string(b"finalize"),
        ),
        vector[swap_info_arg],
        vector[],
    )
}