pallet-ibc 2.0.0-pre.2

An IBC implementation on Substrate.
use crate::{mock::*, ChannelOrder, ClientType, grandpa::consensus_state::ConsensusState, Error, Packet};
use frame_support::{assert_err, assert_ok, dispatch};
use sp_core::{Blake2Hasher, Hasher, H256};

fn create_client_func() {
	let identifier1 = Blake2Hasher::hash("appia".as_bytes());
	let identifier2 = Blake2Hasher::hash("flaminia".as_bytes());
	let height = 0;
	let consensus_state = ConsensusState {
		root: Blake2Hasher::hash("root".as_bytes()),
                height: 0,
		set_id: 0,
		authorities: vec![],
	};

	assert_ok!(IbcModule::create_client(identifier1, ClientType::GRANDPA, height.clone(), consensus_state.clone()));
	assert_ok!(IbcModule::create_client(identifier2, ClientType::GRANDPA, height.clone(), consensus_state.clone()));
	assert_err!(IbcModule::create_client(identifier1, ClientType::GRANDPA, height.clone(), consensus_state), Error::<Test>::ClientIdExist);
}

#[test]
fn create_client_should_work() {
	new_test_ext().execute_with(|| {
		create_client_func()
	});
}

fn bind_port_func() {
	let identifier = "bank".as_bytes().to_vec();
	let module_index = 45 as u8;
	assert_ok!(IbcModule::bind_port(identifier.clone(), module_index));
	assert_err!(IbcModule::bind_port(identifier.clone(), module_index), Error::<Test>::PortIdBinded);
}

#[test]
fn bind_port_should_work() {
	new_test_ext().execute_with(|| {
		bind_port_func();
	});
}

fn conn_open_init_func() {
    let identifier = Blake2Hasher::hash("appia-connection".as_bytes());
    let desired_counterparty_connection_identifier =
        Blake2Hasher::hash("flaminia-connection".as_bytes());
    let client_id =
        hex::decode("53a954d6a7b1c595e025226e5f2a1782fdea30cd8b0d207ed4cdb040af3bfa10").unwrap();
    let client_id = H256::from_slice(&client_id);
    let counterparty_client_id =
        hex::decode("779ca65108d1d515c3e4bc2e9f6d2f90e27b33b147864d1cd422d9f92ce08e03").unwrap();
    let counterparty_client_id = H256::from_slice(&counterparty_client_id);

    assert_err!(
        IbcModule::conn_open_init(
            identifier,
            desired_counterparty_connection_identifier,
            client_id,
            counterparty_client_id
        ),
        Error::<Test>::ClientIdNotExist
    );

    let identifier1 = Blake2Hasher::hash("appia".as_bytes());
    let height = 0;
    let consensus_state = ConsensusState {
        root: Blake2Hasher::hash("root".as_bytes()),
        height: 0,
        set_id: 0,
        authorities: vec![],
    };
    IbcModule::create_client(identifier1, ClientType::GRANDPA, height, consensus_state);

    assert_ok!(IbcModule::conn_open_init(
        identifier,
        desired_counterparty_connection_identifier,
        client_id,
        counterparty_client_id
    ));
    assert_err!(
        IbcModule::conn_open_init(
            identifier,
            desired_counterparty_connection_identifier,
            client_id,
            counterparty_client_id
        ),
        Error::<Test>::ConnectionIdExist
    );
}

#[test]
fn conn_open_init_should_work() {
    new_test_ext().execute_with(|| {
        conn_open_init_func();
    });
}

fn chan_open_init_func() {
    let module_index = 45 as u8;
    let order = ChannelOrder::Unordered;
    let connection_identifier =
        hex::decode("d93fc49e1b2087234a1e2fc204b500da5d16874e631e761bdab932b37907bd11").unwrap();
    let connection_identifier = H256::from_slice(&connection_identifier);
    let connection_hops = vec![connection_identifier];
    let port_identifier = "bank".as_bytes().to_vec();
    let channel_identifier = Blake2Hasher::hash(b"appia-channel");
    let counterparty_port_identifier = "bank".as_bytes().to_vec();
    let counterparty_channel_identifier = Blake2Hasher::hash(b"flaminia-channel");

    assert_err!(
        IbcModule::chan_open_init(
            module_index,
            order.clone(),
            connection_hops.clone(),
            port_identifier.clone(),
            channel_identifier,
            counterparty_port_identifier.clone(),
            counterparty_channel_identifier,
            vec![]
        ),
        Error::<Test>::ConnectionIdNotExist
    );

    let identifier1 = Blake2Hasher::hash("appia".as_bytes());
    let height = 0;
    let consensus_state = ConsensusState {
        root: Blake2Hasher::hash("root".as_bytes()),
        height: 0,
        set_id: 0,
        authorities: vec![],
    };
    IbcModule::create_client(identifier1, ClientType::GRANDPA, height, consensus_state);

    let identifier = Blake2Hasher::hash("appia-connection".as_bytes());
    let desired_counterparty_connection_identifier =
        Blake2Hasher::hash("flaminia-connection".as_bytes());
    let client_id =
        hex::decode("53a954d6a7b1c595e025226e5f2a1782fdea30cd8b0d207ed4cdb040af3bfa10").unwrap();
    let client_id = H256::from_slice(&client_id);
    let counterparty_client_id =
        hex::decode("779ca65108d1d515c3e4bc2e9f6d2f90e27b33b147864d1cd422d9f92ce08e03").unwrap();
    let counterparty_client_id = H256::from_slice(&counterparty_client_id);

    IbcModule::conn_open_init(
        identifier,
        desired_counterparty_connection_identifier,
        client_id,
        counterparty_client_id,
    );

    assert_err!(
        IbcModule::chan_open_init(
            module_index,
            order.clone(),
            connection_hops.clone(),
            port_identifier.clone(),
            channel_identifier,
            counterparty_port_identifier.clone(),
            counterparty_channel_identifier,
            vec![]
        ),
        Error::<Test>::PortIdNotMatch
    );

    IbcModule::bind_port("bank".as_bytes().to_vec(), module_index);

    assert_err!(
        IbcModule::chan_open_init(
            module_index,
            order.clone(),
            vec![],
            port_identifier.clone(),
            channel_identifier,
            counterparty_port_identifier.clone(),
            counterparty_channel_identifier,
            vec![]
        ),
        Error::<Test>::OnlyOneHopAllowedV1
    );

    assert_ok!(IbcModule::chan_open_init(
        module_index,
        order.clone(),
        connection_hops.clone(),
        port_identifier.clone(),
        channel_identifier,
        counterparty_port_identifier.clone(),
        counterparty_channel_identifier,
        vec![]
    ));

    assert_err!(
        IbcModule::chan_open_init(
            module_index,
            order.clone(),
            connection_hops.clone(),
            port_identifier.clone(),
            channel_identifier,
            counterparty_port_identifier.clone(),
            counterparty_channel_identifier,
            vec![]
        ),
        Error::<Test>::ChannelIdExist
    );
}

#[test]
fn chan_open_init_should_work() {
    new_test_ext().execute_with(|| {
        chan_open_init_func();
    });
}

fn send_packet_func() {
    let sequence = 1;
    let timeout_height = 1000;
    let source_port = "bank".as_bytes().to_vec();
    let source_channel =
        hex::decode("00e2e14470ed9a017f586dfe6b76bb0871a8c91c3151778de110db3dfcc286ac").unwrap();
    let source_channel = H256::from_slice(&source_channel);
    let dest_port = "bank".as_bytes().to_vec();
    let dest_channel =
        hex::decode("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa").unwrap();
    let dest_channel = H256::from_slice(&dest_channel);
    let data: Vec<u8> = hex::decode("01020304").unwrap();

    let mut packet = Packet {
        sequence,
        timeout_height,
        source_port,
        source_channel,
        dest_port,
        dest_channel,
        data,
    };

    assert_err!(
        IbcModule::send_packet(packet.clone()),
        Error::<Test>::PortIdNotMatch
    );

    let identifier1 = Blake2Hasher::hash("appia".as_bytes());
    let height = 0;
    let consensus_state = ConsensusState {
        root: Blake2Hasher::hash("root".as_bytes()),
        height: 0,
        set_id: 0,
        authorities: vec![],
    };
    IbcModule::create_client(identifier1, ClientType::GRANDPA, height, consensus_state);

    let identifier = Blake2Hasher::hash("appia-connection".as_bytes());
    let desired_counterparty_connection_identifier =
        Blake2Hasher::hash("flaminia-connection".as_bytes());
    let client_id =
        hex::decode("53a954d6a7b1c595e025226e5f2a1782fdea30cd8b0d207ed4cdb040af3bfa10").unwrap();
    let client_id = H256::from_slice(&client_id);
    let counterparty_client_id =
        hex::decode("779ca65108d1d515c3e4bc2e9f6d2f90e27b33b147864d1cd422d9f92ce08e03").unwrap();
    let counterparty_client_id = H256::from_slice(&counterparty_client_id);
    IbcModule::conn_open_init(
        identifier,
        desired_counterparty_connection_identifier,
        client_id,
        counterparty_client_id,
    );

    let module_index = 45 as u8;
    IbcModule::bind_port("bank".as_bytes().to_vec(), module_index);

    let order = ChannelOrder::Unordered;
    let connection_identifier =
        hex::decode("d93fc49e1b2087234a1e2fc204b500da5d16874e631e761bdab932b37907bd11").unwrap();
    let connection_identifier = H256::from_slice(&connection_identifier);
    let connection_hops = vec![connection_identifier];
    let port_identifier = "bank".as_bytes().to_vec();
    let channel_identifier = Blake2Hasher::hash(b"appia-channel");
    let counterparty_port_identifier = "bank".as_bytes().to_vec();
    let counterparty_channel_identifier = Blake2Hasher::hash(b"flaminia-channel");
    IbcModule::chan_open_init(
        module_index,
        order.clone(),
        connection_hops.clone(),
        port_identifier.clone(),
        channel_identifier,
        counterparty_port_identifier.clone(),
        counterparty_channel_identifier,
        vec![],
    );

    assert_err!(
        IbcModule::send_packet(packet.clone()),
        Error::<Test>::DestChannelIdNotMatch
    );

    let dest_channel =
        hex::decode("a1611bcd0ba368e921b1bd3eb4aa66534429b14837725e8cef28182c25db601e").unwrap();
    let dest_channel = H256::from_slice(&dest_channel);
    packet.dest_channel = dest_channel;
    assert_ok!(IbcModule::send_packet(packet.clone()));

    assert_err!(
        IbcModule::send_packet(packet.clone()),
        Error::<Test>::PackedSequenceNotMatch
    );
}

#[test]
fn send_packet_should_work() {
    new_test_ext().execute_with(|| {
        send_packet_func();
    });
}