From 3ce88d08b8ce186f0c9198863ec1a70d4c84db7b Mon Sep 17 00:00:00 2001 From: beer-1 Date: Tue, 29 Oct 2024 18:22:25 +0900 Subject: [PATCH 1/6] remove unnecessary cosmos message types; use stargate for all types --- crates/e2e-move-tests/Cargo.toml | 1 + crates/e2e-move-tests/src/tests/cosmos.rs | 214 ++-- crates/gas/src/initia_stdlib.rs | 17 +- crates/json/src/json_to_value.rs | 1 + crates/json/src/move_to_json.rs | 1 + crates/natives/src/cosmos.rs | 440 +------- crates/natives/src/helpers.rs | 6 +- crates/types/src/cosmos.rs | 118 +-- precompile/binaries/minlib/collection.mv | Bin 4708 -> 5001 bytes precompile/binaries/minlib/cosmos.mv | Bin 2917 -> 3352 bytes precompile/binaries/stdlib/collection.mv | Bin 4708 -> 5001 bytes precompile/binaries/stdlib/cosmos.mv | Bin 2917 -> 3352 bytes precompile/binaries/stdlib/minitswap.mv | Bin 20756 -> 20756 bytes precompile/binaries/stdlib/staking.mv | Bin 11782 -> 11782 bytes .../modules/initia_stdlib/sources/cosmos.move | 384 ++++--- .../modules/initia_stdlib/sources/json.move | 9 +- .../sources/token/collection.move | 17 + .../minitia_stdlib/sources/cosmos.move | 384 ++++--- .../modules/minitia_stdlib/sources/json.move | 9 +- .../sources/token/collection.move | 17 + tools/generate-bcs-go/src/main.rs | 10 +- types/bcs.go | 953 +----------------- 22 files changed, 744 insertions(+), 1837 deletions(-) diff --git a/crates/e2e-move-tests/Cargo.toml b/crates/e2e-move-tests/Cargo.toml index d468b3a1..c900b90a 100644 --- a/crates/e2e-move-tests/Cargo.toml +++ b/crates/e2e-move-tests/Cargo.toml @@ -21,6 +21,7 @@ once_cell = { workspace = true } sha3 = { workspace = true } bytes = { workspace = true } bigdecimal = { workspace = true } +bech32 = { workspace = true } initia-move-types = { workspace = true } initia-move-vm = { workspace = true } diff --git a/crates/e2e-move-tests/src/tests/cosmos.rs b/crates/e2e-move-tests/src/tests/cosmos.rs index 9823e27b..db6824ba 100644 --- a/crates/e2e-move-tests/src/tests/cosmos.rs +++ b/crates/e2e-move-tests/src/tests/cosmos.rs @@ -1,12 +1,13 @@ +use core::str; + use crate::tests::common::ExpectedOutput; use crate::MoveHarness; -use initia_move_types::cosmos::{ - CosmosCoin, CosmosMessage, DistributionMessage, IBCFee, IBCHeight, IBCMessage, MoveMessage, - StakingMessage, StargateCallback, StargateMessage, -}; +use initia_move_types::cosmos::{CosmosCallback, CosmosMessage}; use move_core_types::account_address::AccountAddress; use move_core_types::language_storage::TypeTag; use move_core_types::vm_status::VMStatus; + +use bech32::{Bech32, Hrp}; use sha3::{Digest, Sha3_256}; const STAKING_SYMBOL: &[u8] = b"ustake"; @@ -104,6 +105,13 @@ fn test_cosmos_delegate() { ); tests.push(test_initialize_coin); + let staking_denom = str::from_utf8(STAKING_SYMBOL).unwrap(); + let delegator_cosmos_addr = bech32::encode::( + Hrp::parse_unchecked("init"), + &delegator_address.into_bytes(), + ) + .unwrap(); + let expected_data = format!("{{\"@type\":\"/initia.mstaking.v1.MsgDelegate\",\"amount\":[{{\"amount\":\"{amount}\",\"denom\":\"{staking_denom}\"}}],\"delegator_address\":\"{delegator_cosmos_addr}\",\"validator_address\":\"{validator_address}\"}}"); let test_delegate = ( delegator_address, "0x1::cosmos::delegate", @@ -117,11 +125,12 @@ fn test_cosmos_delegate() { VMStatus::Executed, None, None, - Some(vec![CosmosMessage::Staking(StakingMessage::Delegate { - delegator_address, - validator_address, - amount: CosmosCoin { amount, metadata }, - })]), + Some(vec![CosmosMessage { + sender: delegator_address, + data: expected_data.into_bytes(), + allow_failure: false, + callback: None, + }]), ), ); tests.push(test_delegate); @@ -152,6 +161,12 @@ fn test_cosmos_fund_community_pool() { ); tests.push(test_initialize_coin); + let denom = str::from_utf8(STAKING_SYMBOL).unwrap(); + let depositor_cosmos_addr = + bech32::encode::(Hrp::parse_unchecked("init"), &sender_address.into_bytes()) + .unwrap(); + let expected_data = format!("{{\"@type\":\"/cosmos.distribution.v1beta1.MsgFundCommunityPool\",\"amount\":[{{\"amount\":\"{amount}\",\"denom\":\"{denom}\"}}],\"depositor\":\"{depositor_cosmos_addr}\"}}"); + let test_fund_community_pool = ( sender_address, "0x1::cosmos::fund_community_pool", @@ -161,12 +176,12 @@ fn test_cosmos_fund_community_pool() { VMStatus::Executed, None, None, - Some(vec![CosmosMessage::Distribution( - DistributionMessage::FundCommunityPool { - sender_address, - amount: CosmosCoin { amount, metadata }, - }, - )]), + Some(vec![CosmosMessage { + sender: sender_address, + data: expected_data.into_bytes(), + allow_failure: false, + callback: None, + }]), ), ); tests.push(test_fund_community_pool); @@ -204,6 +219,11 @@ fn test_cosmos_transfer() { ); tests.push(test_initialize_coin); + let denom = str::from_utf8(STAKING_SYMBOL).unwrap(); + let sender_cosmos_addr = + bech32::encode::(Hrp::parse_unchecked("init"), &sender.into_bytes()).unwrap(); + let expected_data = format!("{{\"@type\":\"/ibc.applications.transfer.v1.MsgTransfer\",\"memo\":\"{memo}\",\"receiver\":\"{receiver}\",\"sender\":\"{sender_cosmos_addr}\",\"source_channel\":\"{source_channel}\",\"source_port\":\"{source_port}\",\"timeout_height\":{{\"revision_height\":\"{revision_height}\",\"revision_number\":\"{revision_number}\"}},\"timeout_timestamp\":\"{timeout_timestamp}\",\"token\":{{\"amount\":\"{amount}\",\"denom\":\"{denom}\"}}}}"); + let test_transfer = ( sender, "0x1::cosmos::transfer", @@ -223,19 +243,12 @@ fn test_cosmos_transfer() { VMStatus::Executed, None, None, - Some(vec![CosmosMessage::IBC(IBCMessage::Transfer { - source_port, - source_channel, - token: CosmosCoin { amount, metadata }, - sender, - receiver, - timeout_height: IBCHeight { - revision_height, - revision_number, - }, - timeout_timestamp, - memo, - })]), + Some(vec![CosmosMessage { + sender: sender, + data: expected_data.into_bytes(), + allow_failure: false, + callback: None, + }]), ), ); tests.push(test_transfer); @@ -278,6 +291,11 @@ fn test_cosmos_nft_transfer() { ); tests.push(test_create_collection); + let class_id = str::from_utf8(COLLECTION_NAME).unwrap(); + let sender_cosmos_addr = + bech32::encode::(Hrp::parse_unchecked("init"), &sender.into_bytes()).unwrap(); + let expected_data = format!("{{\"@type\":\"/ibc.applications.nft_transfer.v1.MsgTransfer\",\"class_id\":\"{class_id}\",\"memo\":\"{memo}\",\"receiver\":\"{receiver}\",\"sender\":\"{sender_cosmos_addr}\",\"source_channel\":\"{source_channel}\",\"source_port\":\"{source_port}\",\"timeout_height\":{{\"revision_height\":\"{revision_height}\",\"revision_number\":\"{revision_number}\"}},\"timeout_timestamp\":\"{timeout_timestamp}\",\"token_ids\":[\"id1\",\"id2\"]}}"); + let test_nft_transfer = ( sender, "0x1::cosmos::nft_transfer", @@ -297,20 +315,12 @@ fn test_cosmos_nft_transfer() { VMStatus::Executed, None, None, - Some(vec![CosmosMessage::IBC(IBCMessage::NFTTransfer { - source_port, - source_channel, - collection, - token_ids, - sender, - receiver, - timeout_height: IBCHeight { - revision_height, - revision_number, - }, - timeout_timestamp, - memo, - })]), + Some(vec![CosmosMessage { + sender: sender, + data: expected_data.into_bytes(), + allow_failure: false, + callback: None, + }]), ), ); tests.push(test_nft_transfer); @@ -379,6 +389,13 @@ fn test_cosmos_pay_fee() { ); tests.push(test_initialize_coin); + let recv_fee_denom = str::from_utf8(STAKING_SYMBOL).unwrap(); + let ack_fee_denom = str::from_utf8(FEE_A_SYMBOL).unwrap(); + let timeout_fee_denom = str::from_utf8(FEE_B_SYMBOL).unwrap(); + let sender_cosmos_addr = + bech32::encode::(Hrp::parse_unchecked("init"), &sender.into_bytes()).unwrap(); + let expected_data = format!("{{\"@type\":\"/ibc.applications.fee.v1.MsgPayPacketFee\",\"fee\":{{\"ack_fee\":[{{\"amount\":\"{ack_fee_amount}\",\"denom\":\"{ack_fee_denom}\"}}],\"recv_fee\":[{{\"amount\":\"{recv_fee_amount}\",\"denom\":\"{recv_fee_denom}\"}}],\"timeout_fee\":[{{\"amount\":\"{timeout_fee_amount}\",\"denom\":\"{timeout_fee_denom}\"}}]}},\"relayers\":[],\"signer\":\"{sender_cosmos_addr}\",\"source_channel\":\"{source_channel}\",\"source_port\":\"{source_port}\"}}"); + let test_pay_fee = ( sender, "0x1::cosmos::pay_fee", @@ -397,25 +414,12 @@ fn test_cosmos_pay_fee() { VMStatus::Executed, None, None, - Some(vec![CosmosMessage::IBC(IBCMessage::PayFee { - signer: sender, - source_port, - source_channel, - fee: IBCFee { - recv_fee: CosmosCoin { - metadata: recv_fee_metadata, - amount: recv_fee_amount, - }, - ack_fee: CosmosCoin { - metadata: ack_fee_metadata, - amount: ack_fee_amount, - }, - timeout_fee: CosmosCoin { - metadata: timeout_fee_metadata, - amount: timeout_fee_amount, - }, - }, - })]), + Some(vec![CosmosMessage { + sender: sender, + data: expected_data.into_bytes(), + allow_failure: false, + callback: None, + }]), ), ); tests.push(test_pay_fee); @@ -435,6 +439,12 @@ fn test_cosmos_move_execute() { let arg1 = vec![1, 2, 3]; let arg2 = vec![4, 5, 6]; + let arg1_hex = hex::encode(arg1.clone()); + let arg2_hex = hex::encode(arg2.clone()); + let sender_cosmos_addr = + bech32::encode::(Hrp::parse_unchecked("init"), &sender.into_bytes()).unwrap(); + let expected_data = format!("{{\"@type\":\"/initia.move.v1.MsgExecute\",\"args\":[\"{arg1_hex}\",\"{arg2_hex}\"],\"function_name\":\"{function_name}\",\"module_address\":\"{module_address}\",\"module_name\":\"{module_name}\",\"sender\":\"{sender_cosmos_addr}\",\"type_args\":[\"{type_arg1}\",\"{type_arg2}\"]}}"); + let test_move_execute = ( sender, "0x1::cosmos::move_execute", @@ -450,15 +460,12 @@ fn test_cosmos_move_execute() { VMStatus::Executed, None, None, - Some(vec![CosmosMessage::Move(MoveMessage::Execute { - sender, - module_address, - module_name, - function_name, - type_args: vec![type_arg1, type_arg2], - args: vec![arg1, arg2], - is_json: false, - })]), + Some(vec![CosmosMessage { + sender: sender, + data: expected_data.into_bytes(), + allow_failure: false, + callback: None, + }]), ), ); tests.push(test_move_execute); @@ -478,6 +485,10 @@ fn test_cosmos_move_execute_with_json() { let arg1 = b"\"hello\"".to_vec(); let arg2 = b"\"world\"".to_vec(); + let sender_cosmos_addr = + bech32::encode::(Hrp::parse_unchecked("init"), &sender.into_bytes()).unwrap(); + let expected_data = format!("{{\"@type\":\"/initia.move.v1.MsgExecuteJSON\",\"args\":[\"\\\"hello\\\"\",\"\\\"world\\\"\"],\"function_name\":\"{function_name}\",\"module_address\":\"{module_address}\",\"module_name\":\"{module_name}\",\"sender\":\"{sender_cosmos_addr}\",\"type_args\":[\"{type_arg1}\",\"{type_arg2}\"]}}"); + let test_move_execute = ( sender, "0x1::cosmos::move_execute_with_json", @@ -493,15 +504,12 @@ fn test_cosmos_move_execute_with_json() { VMStatus::Executed, None, None, - Some(vec![CosmosMessage::Move(MoveMessage::Execute { - sender, - module_address, - module_name, - function_name, - type_args: vec![type_arg1, type_arg2], - args: vec![arg1, arg2], - is_json: true, - })]), + Some(vec![CosmosMessage { + sender: sender, + data: expected_data.into_bytes(), + allow_failure: false, + callback: None, + }]), ), ); tests.push(test_move_execute); @@ -519,6 +527,13 @@ fn test_cosmos_move_script() { let arg1 = vec![1, 2, 3]; let arg2 = vec![4, 5, 6]; + let code_bytes_hex = hex::encode(code_bytes.clone()); + let arg1_hex = hex::encode(arg1.clone()); + let arg2_hex = hex::encode(arg2.clone()); + let sender_cosmos_addr = + bech32::encode::(Hrp::parse_unchecked("init"), &sender.into_bytes()).unwrap(); + let expected_data = format!("{{\"@type\":\"/initia.move.v1.MsgScript\",\"args\":[\"{arg1_hex}\",\"{arg2_hex}\"],\"code_bytes\":\"{code_bytes_hex}\",\"sender\":\"{sender_cosmos_addr}\",\"type_args\":[\"{type_arg1}\",\"{type_arg2}\"]}}"); + let test_move_script = ( sender, "0x1::cosmos::move_script", @@ -532,13 +547,12 @@ fn test_cosmos_move_script() { VMStatus::Executed, None, None, - Some(vec![CosmosMessage::Move(MoveMessage::Script { - sender, - code_bytes, - type_args: vec![type_arg1, type_arg2], - args: vec![arg1, arg2], - is_json: false, - })]), + Some(vec![CosmosMessage { + sender: sender, + data: expected_data.into_bytes(), + allow_failure: false, + callback: None, + }]), ), ); tests.push(test_move_script); @@ -556,6 +570,11 @@ fn test_cosmos_move_script_with_json() { let arg1 = b"\"hello\"".to_vec(); let arg2 = b"\"world\"".to_vec(); + let code_bytes_hex = hex::encode(code_bytes.clone()); + let sender_cosmos_addr = + bech32::encode::(Hrp::parse_unchecked("init"), &sender.into_bytes()).unwrap(); + let expected_data = format!("{{\"@type\":\"/initia.move.v1.MsgScriptJSON\",\"args\":[\"\\\"hello\\\"\",\"\\\"world\\\"\"],\"code_bytes\":\"{code_bytes_hex}\",\"sender\":\"{sender_cosmos_addr}\",\"type_args\":[\"{type_arg1}\",\"{type_arg2}\"]}}"); + let test_move_script = ( sender, "0x1::cosmos::move_script_with_json", @@ -569,13 +588,12 @@ fn test_cosmos_move_script_with_json() { VMStatus::Executed, None, None, - Some(vec![CosmosMessage::Move(MoveMessage::Script { - sender, - code_bytes, - type_args: vec![type_arg1, type_arg2], - args: vec![arg1, arg2], - is_json: true, - })]), + Some(vec![CosmosMessage { + sender: sender, + data: expected_data.into_bytes(), + allow_failure: false, + callback: None, + }]), ), ); tests.push(test_move_script); @@ -598,12 +616,12 @@ fn test_cosmos_stargate() { VMStatus::Executed, None, None, - Some(vec![CosmosMessage::Stargate(StargateMessage { + Some(vec![CosmosMessage { sender, data: data.as_bytes().to_vec(), allow_failure: false, callback: None, - })]), + }]), ), ); tests.push(test_stargate); @@ -622,17 +640,17 @@ fn test_cosmos_stargate() { VMStatus::Executed, None, None, - Some(vec![CosmosMessage::Stargate(StargateMessage { + Some(vec![CosmosMessage { sender, data: data.as_bytes().to_vec(), allow_failure: false, - callback: Some(StargateCallback { + callback: Some(CosmosCallback { id: 123, module_address: AccountAddress::from_hex_literal("0xcafe").unwrap(), module_name: "test".to_string(), function_name: "callback".to_string(), }), - })]), + }]), ), ); tests.push(test_stargate); diff --git a/crates/gas/src/initia_stdlib.rs b/crates/gas/src/initia_stdlib.rs index 62ffc0b5..679d73d9 100644 --- a/crates/gas/src/initia_stdlib.rs +++ b/crates/gas/src/initia_stdlib.rs @@ -85,22 +85,7 @@ crate::macros::define_gas_parameters!( // These functions will consume gas after move execution finished, // so don't need to charge a lot here. [cosmos_stargate_base: InternalGas, "cosmos.stargate.base", 1000 * SCALING], - [cosmos_stargate_per_byte: InternalGasPerByte, "cosmos.stargate.per_byte", 7], - [cosmos_move_execute_base: InternalGas, "cosmos.move_execute.base", 1000 * SCALING], - [cosmos_move_execute_per_byte: InternalGasPerByte, "cosmos.move_execute.per_byte", 18], - [cosmos_move_script_base: InternalGas, "cosmos.move_script.base", 1000 * SCALING], - [cosmos_move_script_per_byte: InternalGasPerByte, "cosmos.move_script.per_byte", 18], - [cosmos_delegate_base: InternalGas, "cosmos.delegate.base", 1000 * SCALING], - [cosmos_delegate_per_byte: InternalGasPerByte, "cosmos.delegate.per_byte", 18], - [cosmos_fund_community_pool_base: InternalGas, "cosmos.fund_community_pool.base", 1000 * SCALING], - [cosmos_fund_community_pool_per_byte: InternalGasPerByte, "cosmos.fund_community_pool.per_byte", 18], - [cosmos_transfer_base: InternalGas, "cosmos.transfer.base", 1000 * SCALING], - [cosmos_transfer_per_byte: InternalGasPerByte, "cosmos.transfer.per_byte", 18], - [cosmos_nft_transfer_base: InternalGas, "cosmos.nft_transfer.base", 1000 * SCALING], - [cosmos_nft_transfer_per_token: InternalGasPerArg, "cosmos.nft_transfer.per_token", 10 * SCALING], - [cosmos_nft_transfer_per_byte: InternalGasPerByte, "cosmos.nft_transfer.per_byte", 18], - [cosmos_pay_fee_base: InternalGas, "cosmos.pay_fee.base", 1000 * SCALING], - [cosmos_pay_fee_per_byte: InternalGasPerByte, "cosmos.pay_fee.per_byte", 18], + [cosmos_stargate_per_byte: InternalGasPerByte, "cosmos.stargate.per_byte", 18], [query_custom_base: InternalGas, "query.custom.base", 100 * SCALING], [query_custom_per_byte: InternalGasPerByte, "query.custom.per_byte", 18], diff --git a/crates/json/src/json_to_value.rs b/crates/json/src/json_to_value.rs index ded2dc38..e5a0a62b 100644 --- a/crates/json/src/json_to_value.rs +++ b/crates/json/src/json_to_value.rs @@ -252,6 +252,7 @@ pub fn convert_json_value_to_value( let field_name = match f.name.as_str() { "_type_" => "@type", "_move_" => "move", + "_signer_" => "signer", v => v, }; diff --git a/crates/json/src/move_to_json.rs b/crates/json/src/move_to_json.rs index 737b54dc..1403782f 100644 --- a/crates/json/src/move_to_json.rs +++ b/crates/json/src/move_to_json.rs @@ -103,6 +103,7 @@ fn convert_move_value_to_json_value(val: &MoveValue, depth: usize) -> VMResult "@type", "_move_" => "move", + "_signer_" => "signer", v => v, }; diff --git a/crates/natives/src/cosmos.rs b/crates/natives/src/cosmos.rs index ec7fc877..c2902037 100644 --- a/crates/natives/src/cosmos.rs +++ b/crates/natives/src/cosmos.rs @@ -1,24 +1,18 @@ use better_any::{Tid, TidAble}; -use initia_move_gas::NumArgs; -use initia_move_types::cosmos::{ - CosmosCoin, CosmosMessage, CosmosMessages, DistributionMessage, IBCFee, IBCHeight, IBCMessage, - MoveMessage, StakingMessage, StargateMessage, -}; +use initia_move_types::cosmos::{CosmosMessage, CosmosMessages}; use move_core_types::{account_address::AccountAddress, gas_algebra::NumBytes}; use move_vm_runtime::native_functions::NativeFunction; use move_vm_types::{ loaded_data::runtime_types::Type, - values::{Struct, StructRef, Value, Vector}, + values::{Struct, Value, Vector}, }; use smallvec::{smallvec, SmallVec}; use std::{cell::RefCell, collections::VecDeque}; use crate::{ - helpers::{get_metadata_address, get_stargate_options, partial_extension_error}, - interface::{ - RawSafeNative, SafeNativeBuilder, SafeNativeContext, SafeNativeError, SafeNativeResult, - }, - safely_pop_arg, safely_pop_vec_arg, + helpers::get_stargate_options, + interface::{RawSafeNative, SafeNativeBuilder, SafeNativeContext, SafeNativeResult}, + safely_pop_arg, }; /*************************************************************************************************** @@ -72,201 +66,12 @@ fn native_stargate( context.charge(gas_params.cosmos_stargate_per_byte * NumBytes::new(data.len() as u64))?; let sender: AccountAddress = safely_pop_arg!(arguments, AccountAddress); - let message = CosmosMessage::Stargate(StargateMessage { + let message = CosmosMessage { sender, data, callback, allow_failure, - }); - - // build cosmos message - let cosmos_context = context.extensions().get::(); - cosmos_context.messages.borrow_mut().push(message); - - Ok(smallvec![]) -} - -fn native_move_execute( - context: &mut SafeNativeContext, - ty_args: Vec, - mut arguments: VecDeque, -) -> SafeNativeResult> { - let gas_params = &context.native_gas_params.initia_stdlib; - context.charge(gas_params.cosmos_move_execute_base)?; - - debug_assert!(ty_args.is_empty()); - debug_assert!(arguments.len() == 7); - - let is_json = safely_pop_arg!(arguments, bool); - - let mut msg_args: Vec> = vec![]; - for msg_arg in safely_pop_vec_arg!(arguments, Vec) { - context.charge( - gas_params.cosmos_move_execute_per_byte * NumBytes::new(msg_arg.len() as u64), - )?; - - msg_args.push(msg_arg); - } - - let mut msg_type_args: Vec = vec![]; - for msg_type_arg in safely_pop_vec_arg!(arguments, Vec) { - context.charge( - gas_params.cosmos_move_execute_per_byte * NumBytes::new(msg_type_arg.len() as u64), - )?; - - let msg_type_arg = std::str::from_utf8(&msg_type_arg) - .map_err(|_| partial_extension_error("failed to deserialize type args"))? - .to_string(); - msg_type_args.push(msg_type_arg); - } - - let function_name = safely_pop_arg!(arguments, Vector).to_vec_u8()?; - context.charge( - gas_params.cosmos_move_execute_per_byte * NumBytes::new(function_name.len() as u64), - )?; - - let module_name = safely_pop_arg!(arguments, Vector).to_vec_u8()?; - context.charge( - gas_params.cosmos_move_execute_per_byte * NumBytes::new(module_name.len() as u64), - )?; - - let module_address = safely_pop_arg!(arguments, AccountAddress); - let sender: AccountAddress = safely_pop_arg!(arguments, AccountAddress); - - let function_name = std::str::from_utf8(&function_name) - .map_err(|_| partial_extension_error("failed to deserialize function_name"))? - .to_string(); - - let module_name = std::str::from_utf8(&module_name) - .map_err(|_| partial_extension_error("failed to deserialize module_name"))? - .to_string(); - - let message = CosmosMessage::Move(MoveMessage::Execute { - sender, - module_address, - module_name, - function_name, - type_args: msg_type_args, - args: msg_args, - is_json, - }); - - // build cosmos message - let cosmos_context = context.extensions().get::(); - cosmos_context.messages.borrow_mut().push(message); - - Ok(smallvec![]) -} - -fn native_move_script( - context: &mut SafeNativeContext, - ty_args: Vec, - mut arguments: VecDeque, -) -> SafeNativeResult> { - let gas_params = &context.native_gas_params.initia_stdlib; - context.charge(gas_params.cosmos_move_script_base)?; - - debug_assert!(ty_args.is_empty()); - debug_assert!(arguments.len() == 5); - - let is_json = safely_pop_arg!(arguments, bool); - - let mut msg_args: Vec> = vec![]; - for msg_arg in safely_pop_vec_arg!(arguments, Vec) { - context - .charge(gas_params.cosmos_move_script_per_byte * NumBytes::new(msg_arg.len() as u64))?; - - msg_args.push(msg_arg); - } - - let mut msg_type_args: Vec = vec![]; - for msg_type_arg in safely_pop_vec_arg!(arguments, Vec) { - context.charge( - gas_params.cosmos_move_script_per_byte * NumBytes::new(msg_type_arg.len() as u64), - )?; - - let msg_type_arg = std::str::from_utf8(&msg_type_arg) - .map_err(|_| partial_extension_error("failed to deserialize type args"))? - .to_string(); - msg_type_args.push(msg_type_arg); - } - - let code_bytes = safely_pop_arg!(arguments, Vector).to_vec_u8()?; - context - .charge(gas_params.cosmos_move_script_per_byte * NumBytes::new(code_bytes.len() as u64))?; - - let sender: AccountAddress = safely_pop_arg!(arguments, AccountAddress); - let message = CosmosMessage::Move(MoveMessage::Script { - sender, - code_bytes, - type_args: msg_type_args, - args: msg_args, - is_json, - }); - - // build cosmos message - let cosmos_context = context.extensions().get::(); - cosmos_context.messages.borrow_mut().push(message); - - Ok(smallvec![]) -} - -fn native_delegate( - context: &mut SafeNativeContext, - ty_args: Vec, - mut arguments: VecDeque, -) -> SafeNativeResult> { - let gas_params = &context.native_gas_params.initia_stdlib; - context.charge(gas_params.cosmos_delegate_base)?; - - debug_assert!(ty_args.is_empty()); - debug_assert!(arguments.len() == 4); - - let amount = safely_pop_arg!(arguments, u64); - let metadata = get_metadata_address(&safely_pop_arg!(arguments, StructRef))?; - let validator_address = safely_pop_arg!(arguments, Vector).to_vec_u8()?; - context.charge( - gas_params.cosmos_delegate_per_byte * NumBytes::new(validator_address.len() as u64), - )?; - - let delegator_address: AccountAddress = safely_pop_arg!(arguments, AccountAddress); - - // convert string - let validator_address = std::str::from_utf8(&validator_address) - .map_err(|_| partial_extension_error("failed to deserialize validator_address"))? - .to_string(); - let message = CosmosMessage::Staking(StakingMessage::Delegate { - delegator_address, - validator_address, - amount: CosmosCoin { amount, metadata }, - }); - - // build cosmos message - let cosmos_context = context.extensions().get::(); - cosmos_context.messages.borrow_mut().push(message); - - Ok(smallvec![]) -} - -fn native_fund_community_pool( - context: &mut SafeNativeContext, - ty_args: Vec, - mut arguments: VecDeque, -) -> SafeNativeResult> { - let gas_params = &context.native_gas_params.initia_stdlib; - context.charge(gas_params.cosmos_fund_community_pool_base)?; - - debug_assert!(ty_args.is_empty()); - debug_assert!(arguments.len() == 3); - - let amount = safely_pop_arg!(arguments, u64); - let metadata = get_metadata_address(&safely_pop_arg!(arguments, StructRef))?; - let sender_address: AccountAddress = safely_pop_arg!(arguments, AccountAddress); - - let message = CosmosMessage::Distribution(DistributionMessage::FundCommunityPool { - sender_address, - amount: CosmosCoin { amount, metadata }, - }); + }; // build cosmos message let cosmos_context = context.extensions().get::(); @@ -275,226 +80,6 @@ fn native_fund_community_pool( Ok(smallvec![]) } -fn native_transfer( - context: &mut SafeNativeContext, - ty_args: Vec, - mut arguments: VecDeque, -) -> SafeNativeResult> { - let gas_params = &context.native_gas_params.initia_stdlib; - context.charge(gas_params.cosmos_transfer_base)?; - - debug_assert!(ty_args.is_empty()); - debug_assert!(arguments.len() == 10); - - let memo = safely_pop_arg!(arguments, Vector).to_vec_u8()?; - context.charge(gas_params.cosmos_transfer_per_byte * NumBytes::new(memo.len() as u64))?; - - let timeout_timestamp = safely_pop_arg!(arguments, u64); - let revision_height = safely_pop_arg!(arguments, u64); - let revision_number = safely_pop_arg!(arguments, u64); - let source_channel = safely_pop_arg!(arguments, Vector).to_vec_u8()?; - context - .charge(gas_params.cosmos_transfer_per_byte * NumBytes::new(source_channel.len() as u64))?; - - let source_port = safely_pop_arg!(arguments, Vector).to_vec_u8()?; - context - .charge(gas_params.cosmos_transfer_per_byte * NumBytes::new(source_channel.len() as u64))?; - - let token_amount = safely_pop_arg!(arguments, u64); - let metadata = get_metadata_address(&safely_pop_arg!(arguments, StructRef))?; - let receiver = safely_pop_arg!(arguments, Vector).to_vec_u8()?; - context.charge(gas_params.cosmos_transfer_per_byte * NumBytes::new(receiver.len() as u64))?; - - let sender: AccountAddress = safely_pop_arg!(arguments, AccountAddress); - - // convert to string - let memo = std::str::from_utf8(&memo) - .map_err(|_| partial_extension_error("failed to deserialize memo"))? - .to_string(); - let source_channel = std::str::from_utf8(&source_channel) - .map_err(|_| partial_extension_error("failed to deserialize source_channel"))? - .to_string(); - let source_port = std::str::from_utf8(&source_port) - .map_err(|_| partial_extension_error("failed to deserialize source_port"))? - .to_string(); - let receiver = std::str::from_utf8(&receiver) - .map_err(|_| partial_extension_error("failed to deserialize receiver"))? - .to_string(); - - // build cosmos message - let message = CosmosMessage::IBC(IBCMessage::Transfer { - source_port, - source_channel, - token: CosmosCoin { - metadata, - amount: token_amount, - }, - sender, - receiver, - timeout_height: IBCHeight { - revision_number, - revision_height, - }, - timeout_timestamp, - memo, - }); - - let cosmos_context = context.extensions().get::(); - cosmos_context.messages.borrow_mut().push(message); - - Ok(smallvec![]) -} - -fn native_nft_transfer( - context: &mut SafeNativeContext, - ty_args: Vec, - mut arguments: VecDeque, -) -> SafeNativeResult> { - let gas_params = &context.native_gas_params.initia_stdlib; - context.charge(gas_params.cosmos_nft_transfer_base)?; - - debug_assert!(ty_args.is_empty()); - debug_assert!(arguments.len() == 10); - - let memo = safely_pop_arg!(arguments, Vector).to_vec_u8()?; - context.charge(gas_params.cosmos_nft_transfer_per_byte * NumBytes::new(memo.len() as u64))?; - - let timeout_timestamp = safely_pop_arg!(arguments, u64); - let revision_height = safely_pop_arg!(arguments, u64); - let revision_number = safely_pop_arg!(arguments, u64); - let source_channel = safely_pop_arg!(arguments, Vector).to_vec_u8()?; - context.charge( - gas_params.cosmos_nft_transfer_per_byte * NumBytes::new(source_channel.len() as u64), - )?; - - let source_port = safely_pop_arg!(arguments, Vector).to_vec_u8()?; - context.charge( - gas_params.cosmos_nft_transfer_per_byte * NumBytes::new(source_port.len() as u64), - )?; - - let token_ids = safely_pop_vec_arg!(arguments, Vec); - context.charge( - gas_params.cosmos_nft_transfer_per_byte - * NumBytes::new(token_ids.iter().map(|v| v.len()).sum::() as u64), - )?; - context - .charge(gas_params.cosmos_nft_transfer_per_token * NumArgs::new(token_ids.len() as u64))?; - - let collection = get_metadata_address(&safely_pop_arg!(arguments, StructRef))?; - let receiver = safely_pop_arg!(arguments, Vector).to_vec_u8()?; - context - .charge(gas_params.cosmos_nft_transfer_per_byte * NumBytes::new(receiver.len() as u64))?; - - let sender: AccountAddress = safely_pop_arg!(arguments, AccountAddress); - - // convert to string - let memo = std::str::from_utf8(&memo) - .map_err(|_| partial_extension_error("failed to deserialize memo"))? - .to_string(); - let source_channel = std::str::from_utf8(&source_channel) - .map_err(|_| partial_extension_error("failed to deserialize source_channel"))? - .to_string(); - let source_port = std::str::from_utf8(&source_port) - .map_err(|_| partial_extension_error("failed to deserialize source_port"))? - .to_string(); - let receiver = std::str::from_utf8(&receiver) - .map_err(|_| partial_extension_error("failed to deserialize receiver"))? - .to_string(); - - let token_ids = token_ids - .iter() - .map(|v| { - std::str::from_utf8(v).map(|v| v.to_string()).map_err(|_| { - SafeNativeError::InvariantViolation(partial_extension_error( - "failed to deserialize receiver", - )) - }) - }) - .collect::>>()?; - - // build cosmos message - let message = CosmosMessage::IBC(IBCMessage::NFTTransfer { - source_port, - source_channel, - collection, - token_ids, - sender, - receiver, - timeout_height: IBCHeight { - revision_number, - revision_height, - }, - timeout_timestamp, - memo, - }); - - let cosmos_context = context.extensions().get::(); - cosmos_context.messages.borrow_mut().push(message); - - Ok(smallvec![]) -} - -fn native_pay_fee( - context: &mut SafeNativeContext, - ty_args: Vec, - mut arguments: VecDeque, -) -> SafeNativeResult> { - let gas_params = &context.native_gas_params.initia_stdlib; - context.charge(gas_params.cosmos_pay_fee_base)?; - - debug_assert!(ty_args.is_empty()); - debug_assert!(arguments.len() == 9); - - let timeout_fee_amount = safely_pop_arg!(arguments, u64); - let timeout_fee_metadata = get_metadata_address(&safely_pop_arg!(arguments, StructRef))?; - let ack_fee_amount = safely_pop_arg!(arguments, u64); - let ack_fee_metadata = get_metadata_address(&safely_pop_arg!(arguments, StructRef))?; - let recv_fee_amount = safely_pop_arg!(arguments, u64); - let recv_fee_metadata = get_metadata_address(&safely_pop_arg!(arguments, StructRef))?; - let source_channel = safely_pop_arg!(arguments, Vector).to_vec_u8()?; - context - .charge(gas_params.cosmos_pay_fee_per_byte * NumBytes::new(source_channel.len() as u64))?; - - let source_port = safely_pop_arg!(arguments, Vector).to_vec_u8()?; - context.charge(gas_params.cosmos_pay_fee_per_byte * NumBytes::new(source_port.len() as u64))?; - - let sender: AccountAddress = safely_pop_arg!(arguments, AccountAddress); - - // convert to string - let source_channel = std::str::from_utf8(&source_channel) - .map_err(|_| partial_extension_error("failed to deserialize source_channel"))? - .to_string(); - let source_port = std::str::from_utf8(&source_port) - .map_err(|_| partial_extension_error("failed to deserialize source_port"))? - .to_string(); - - // build cosmos message - let message = CosmosMessage::IBC(IBCMessage::PayFee { - signer: sender, - source_channel, - source_port, - fee: IBCFee { - recv_fee: CosmosCoin { - metadata: recv_fee_metadata, - amount: recv_fee_amount, - }, - ack_fee: CosmosCoin { - metadata: ack_fee_metadata, - amount: ack_fee_amount, - }, - timeout_fee: CosmosCoin { - metadata: timeout_fee_metadata, - amount: timeout_fee_amount, - }, - }, - }); - - let cosmos_context = context.extensions().get::(); - cosmos_context.messages.borrow_mut().push(message); - - Ok(smallvec![]) -} - /*************************************************************************************************** * module * @@ -502,16 +87,7 @@ fn native_pay_fee( pub fn make_all( builder: &SafeNativeBuilder, ) -> impl Iterator + '_ { - let natives = vec![ - ("stargate_internal", native_stargate as RawSafeNative), - ("move_execute_internal", native_move_execute), - ("move_script_internal", native_move_script), - ("delegate_internal", native_delegate), - ("fund_community_pool_internal", native_fund_community_pool), - ("transfer_internal", native_transfer), - ("nft_transfer_internal", native_nft_transfer), - ("pay_fee_internal", native_pay_fee), - ]; + let natives = vec![("stargate_internal", native_stargate as RawSafeNative)]; builder.make_named_natives(natives) } diff --git a/crates/natives/src/helpers.rs b/crates/natives/src/helpers.rs index f0a1b727..d1aa48b9 100644 --- a/crates/natives/src/helpers.rs +++ b/crates/natives/src/helpers.rs @@ -1,6 +1,6 @@ use std::str::from_utf8; -use initia_move_types::cosmos::StargateCallback; +use initia_move_types::cosmos::CosmosCallback; use move_binary_format::errors::{PartialVMError, PartialVMResult}; use move_core_types::{account_address::AccountAddress, vm_status::StatusCode}; use move_vm_types::values::{Reference, Struct, StructRef, Value, Vector}; @@ -30,7 +30,7 @@ pub fn get_string(v: Struct) -> PartialVMResult> { ) } -pub fn get_stargate_options(v: Struct) -> PartialVMResult<(bool, Option)> { +pub fn get_stargate_options(v: Struct) -> PartialVMResult<(bool, Option)> { let mut vals: Vec = v .unpack() .map_err(|_| partial_extension_error("failed to deserialize arg"))? @@ -71,7 +71,7 @@ pub fn get_stargate_options(v: Struct) -> PartialVMResult<(bool, Option, pub allow_failure: bool, - pub callback: Option, + pub callback: Option, +} + +impl Debug for CosmosMessage { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("CosmosMessage") + .field("sender", &self.sender) + .field("data", &str::from_utf8(&self.data).unwrap()) + .field("allow_failure", &self.allow_failure) + .field("callback", &self.callback) + .finish() + } } #[derive(Clone, Debug, Hash, Eq, PartialEq, Serialize, Deserialize)] -pub struct StargateCallback { +pub struct CosmosCallback { pub id: u64, pub module_address: AccountAddress, pub module_name: String, pub function_name: String, } - -#[derive(Clone, Debug, Hash, Eq, PartialEq, Serialize, Deserialize)] -pub enum MoveMessage { - Execute { - sender: AccountAddress, - module_address: AccountAddress, - module_name: String, - function_name: String, - type_args: Vec, - args: Vec>, - is_json: bool, - }, - Script { - sender: AccountAddress, - code_bytes: Vec, - type_args: Vec, - args: Vec>, - is_json: bool, - }, -} - -#[derive(Clone, Debug, Hash, Eq, PartialEq, Serialize, Deserialize)] -pub enum StakingMessage { - Delegate { - delegator_address: AccountAddress, - validator_address: String, - amount: CosmosCoin, - }, -} - -#[derive(Clone, Debug, Hash, Eq, PartialEq, Serialize, Deserialize)] -pub enum DistributionMessage { - FundCommunityPool { - sender_address: AccountAddress, - amount: CosmosCoin, - }, -} - -#[derive(Clone, Debug, Hash, Eq, PartialEq, Serialize, Deserialize)] -pub enum IBCMessage { - Transfer { - source_port: String, - source_channel: String, - token: CosmosCoin, - sender: AccountAddress, - receiver: String, - timeout_height: IBCHeight, - timeout_timestamp: u64, - memo: String, - }, - NFTTransfer { - source_port: String, - source_channel: String, - collection: AccountAddress, - token_ids: Vec, - sender: AccountAddress, - receiver: String, - timeout_height: IBCHeight, - timeout_timestamp: u64, - memo: String, - }, - PayFee { - fee: IBCFee, - source_port: String, - source_channel: String, - signer: AccountAddress, - }, -} - -#[derive(Clone, Debug, Hash, Eq, PartialEq, Serialize, Deserialize)] -pub struct CosmosCoin { - pub metadata: AccountAddress, - pub amount: u64, -} - -#[derive(Clone, Debug, Hash, Eq, PartialEq, Serialize, Deserialize)] -pub struct IBCHeight { - pub revision_number: u64, - pub revision_height: u64, -} - -#[derive(Clone, Debug, Hash, Eq, PartialEq, Serialize, Deserialize)] -pub struct IBCFee { - pub recv_fee: CosmosCoin, - pub ack_fee: CosmosCoin, - pub timeout_fee: CosmosCoin, -} diff --git a/precompile/binaries/minlib/collection.mv b/precompile/binaries/minlib/collection.mv index 7ddcbb9c37b09bf7a3b2573d49a9000f21c4c2d5..55ab3410a0a571d191febbbe61cf2b11fe362377 100644 GIT binary patch delta 1343 zcmZ{k%WoV-5QnRKx~FHlx_cfwUdQXTcm0U%^)rc+c;Y0)fe^?OI|T6*PO@3W3634H z76J(=2Luu)6z0I03lb722utLE#FYaFE=c?X9FTw;H-tpZ8l+s9Lrqn8b=B9u?wMc4 zKb(Bw)B11d1At{v<<*PcjgPtbljrga?<1kURX?cUgQ)3$7M+cMkA9WdU~R<@mJ#^sgHK+$4~zx=!Ai_PEoKbZ;XVm) zq+b9WjbiYY_K}BW64=tRJjwu$4b;FpF-Ybl4ncToSO8yHsLs{ZU$4d7g9&d=U&09=@pz%R}(a1Y>8>0dr1OWz$n!UF!>(IpD_ z+R|wGy0UbvoO=E^)wxQB>ifPQSY~4(>qCvtVEkB-aMaI4W8Y5Dc3M)SaQ zqq*p_*~VOBzR^6v5LpN;D1K(EbId2#*PN?>cBp$(Qu=|A6zvTLWg{}a++F1FdMnlT z_U2}%y>okeYkg;Xy}fz8+g-nX)4S2`1{B|TXQ$KkHac&|ovrrv%}$xq-Ffr&)-C_~ zy?dRlo4XI?cT}=jtf^{oO(_FFt$cZR`>oDGaaWyVyStCnI%lfr*USC?({A^&?lQ@| z>bx!<>5=nBXc4nau@NzVB8H5kU=DIHQt`wX-^pAW|oQFgJ7|uydlR8$=rXtt!4NMtLqI0K8lBjSls_js;h#Aq^cNIV-Zu-N0-z<}?kPi&^M z$5Yz_q7uv~VGVjFO}Id^sDfei*Mp{SNf41j+&OrDe@X!$}}_GGb^ xtj>FMUp*t}oMkLBQdJO>uUYEngD4|G^%$x?eqe9OkI5<%MKi6j!Qyz@`Um`Ss$Kv9 delta 1129 zcmZ9KJ!~9B6vyAp&dl!4o0*;6+q?6f*Eu_PIp^%V5GQA6ZSvuK@L`;wfP{zu#X%9m zf+kWVDnu$IA_@rGfT*AXS~pbCP^Y3m(9%Uh6qE?@_ADfeEoSGvH}Cy_^WS~A{QKag zuZkzA0KhWHcy>Lw{WlZ8@(uZE@JA5-qdpF!hi*}Q>*oDW?y=OL<+shB`R9rKXwXf* z9&qXu;9&uJ(1&#>;liU=ww0P9@E0C^`Pzeq063j^2-b4iAutw!tygv?X#$*WwISG; zqvafSA>5o7z_;WA4}^UBSdW1`A9DuLMJ^eamtsko?c)q1%$Dgd5Y zk-(o_9rFO-xqAQnQ+u)w+}ary@tw0%3i$4{SHG@LH|o-jlIFZf3(Z$bMV49F=@i}0 ze5Y7k=yaEkEy-bbI6qt%s?MM&Cc~mQt=P$8RIC)mX7z;KGSnF{uB7Hn9o*yZ2M1&I z1FM?R4*TL@FWRGY^`qW8Xy83&K}rY6QlF+gs}}7@h@3ZQGiJWJVMkG(^CklrR3F%W z>`kZv!?aa>XD3Wnzu4UeZIimxWC-b;Y3PQ@(HN$!k(iifsZ0xVWGJzTtt>EYondF2vSYSnoL{F$QmSTUL^wok*sMDU4yK#MCUM?(Y=nAQBk{?=w zzTDw)RyL~-(@X6mvAk8EUS`08bJcI@&dV)iYrLc@Z?BU>v&UF%$~m#(?B#XM`zDm* zn2ZX=CgnTU8kc9G@pLbLZC##6!{i0IgqE+?W4EgJvYV$^YD{2+ky?6@lhuNllxCSK dyC@Su^B9IrK0a*uE4x|nBQ5fOE!CaI=wH7NdB6Yw diff --git a/precompile/binaries/minlib/cosmos.mv b/precompile/binaries/minlib/cosmos.mv index d4cbf4d3b8e5161da6ffe6088cfc3e0c82c8eb06..ee9e86d5982f2824c9ff36ab64a3c4b04c1ed4c4 100644 GIT binary patch literal 3352 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 delta 1129 zcmZ9KJ!~9B6vyAp&dl!4o0*;6+q?6f*Eu_PIp^%V5GQA6ZSvuK@L`;wfP{zu#X%9m zf+kWVDnu$IA_@rGfT*AXS~pbCP^Y3m(9%Uh6qE?@_ADfeEoSGvH}Cy_^WS~A{QKag zuZkzA0KhWHcy>Lw{WlZ8@(uZE@JA5-qdpF!hi*}Q>*oDW?y=OL<+shB`R9rKXwXf* z9&qXu;9&uJ(1&#>;liU=ww0P9@E0C^`Pzeq063j^2-b4iAutw!tygv?X#$*WwISG; zqvafSA>5o7z_;WA4}^UBSdW1`A9DuLMJ^eamtsko?c)q1%$Dgd5Y zk-(o_9rFO-xqAQnQ+u)w+}ary@tw0%3i$4{SHG@LH|o-jlIFZf3(Z$bMV49F=@i}0 ze5Y7k=yaEkEy-bbI6qt%s?MM&Cc~mQt=P$8RIC)mX7z;KGSnF{uB7Hn9o*yZ2M1&I z1FM?R4*TL@FWRGY^`qW8Xy83&K}rY6QlF+gs}}7@h@3ZQGiJWJVMkG(^CklrR3F%W z>`kZv!?aa>XD3Wnzu4UeZIimxWC-b;Y3PQ@(HN$!k(iifsZ0xVWGJzTtt>EYondF2vSYSnoL{F$QmSTUL^wok*sMDU4yK#MCUM?(Y=nAQBk{?=w zzTDw)RyL~-(@X6mvAk8EUS`08bJcI@&dV)iYrLc@Z?BU>v&UF%$~m#(?B#XM`zDm* zn2ZX=CgnTU8kc9G@pLbLZC##6!{i0IgqE+?W4EgJvYV$^YD{2+ky?6@lhuNllxCSK dyC@Su^B9IrK0a*uE4x|nBQ5fOE!CaI=wH7NdB6Yw diff --git a/precompile/binaries/stdlib/cosmos.mv b/precompile/binaries/stdlib/cosmos.mv index d4cbf4d3b8e5161da6ffe6088cfc3e0c82c8eb06..ee9e86d5982f2824c9ff36ab64a3c4b04c1ed4c4 100644 GIT binary patch literal 3352 zcmbVPNpsxB748KMG|)Ym!En_^%93m?wn$0N!YCVMN{l6Ii=`;ZB`9#FNy3@|CIE&G z&&hAdJyog7HK$Y#`6W5}nm>@rDId1sP?U2BYP!+=-uL#`0On5@|D|j~h@xbXEk5DD z`2)4Sq08dm^c&{<)B1;$f9zbg|JL~r>;1J?cz+Il&-7mw{$7e$WQ*Jr@@k1%dwe1frwahDVJeTPE$2a33_Bq84;*!_@k zV*S_>MEq26Vn2XdXUAofk%t~7rW{WQgp>*Z0wbBnyc5Zi#5sqo>^LCH z2GuDQx|Fe!#i@-M>OICe7~IyiT`Fy?CFn39N?jg)rKnZXt<&_<2ruc-0q5aI1J>|S z>KUoTsgk5-js}3vxf+x~x`@!JeXe-Y@t6xKY-;c3XDU5FOD&a~5>9gAG3nwbgsl-~ zl?0zjAFR?l>Dq%dAE&vuQ{8sbI1xjWq+|P4k;Tb@o!7T$oKBOX`_PQcK~$J8&2OhB zFYK^5o|rHg*5ot`qv0?!c^(`^qj(qfe9yRR`|_&a2O?t8TqZ@LlYky7M<6%AD>sdpk_5f^KGx;=IcBbi8M>lYJdR_npLuDh=vQI_m~C$x1bSwt zRYY=ZiU{2h$)-_^{bKJcGbrq|y2)n^-$%U<;=QsN^4t{GwAkOW>$tq8v%+-WX_j`8 zhWYTVH9*q_t%(rCs)4Pq@-%VAQI;P@BZ(|$W#h`CDer|-Ne;h`i^H(Zt}t1aX1zG6 zx;TX7bZnAB#(8MQlj2xZ>FW(+#5z~0wRZ`pwJspIVK`_T5M7gw^f)~-p{b9?^8BWj zEn~oe04A>rxiq&vLFi<^2;0DLl1C%t7L`P;+vW1fvdmE1%g!V^F3(2L<|m93)Gdid zof)O9bZm;y)N zV=K#TJ`U2O22q~KMYP!@9#!cK+oRzUesAMWITq@o+`r$l!lOIe3~%De*@K-g!p9E@Yq(2ixw~NFVvI>DIAfNBcaWqmc6cLm=3uWR)uJP*FKHLA zs2+y(eul>c;|ma6#8|?x8Ha+ETARbXTH85E&r5m%dM-+ONzyebFY^yzmGP_e8vhWl zUSes_!Np7K-=ir@#KLY5zm)wSJgSAB=MU@pVO8TXnc zfNgyXyz4#<6xX6_w-pCXf~XfYR|KIrtW#NVXF5(<@c%Ch?r95MB;(u?lEED|O9n+I z*?cDZLR-GI#gI|11VZmY>|!ZqJN!gUF|d)fKG%-#Y;k;b*-8Q)0KQ(st@prL1-EAK zKHygts`84{@V=*oFSdlHutTAF0niU?sQnJqt)TdfZJ>*Q-deBf?#!TU%Q>leRqHB( zrs8&0aXG8_GF05Y4i)ItnF@|M5+m9Suit>7uK3dX&zxJ)hhzvLiBXd@*Nxrp zvH2?|^f&yiY5h)rp!`p<#lDm4&7Wl^epKt~7xkA76F6!h54F%5x`pl`Y#>Apge?mZ z*TV4Ll!)Er2ssENvrWL(F)2b_h7sz42U_7E2o?yfDuL*_1D+eEi_oUlT>>4t+ys{^ z9*C_Lh^t)?*H%DmuYuTE2XTE9#Er`!ZeIbhdlkf;Yas6KfcWS-h`pOo&wjgutoygy zn4kxDFxtFjGR28BFgKwzrZB~f6U+oLsUWN{hz~xTaAFt+C!%I1LhHa?z^I%h2*n&> zLckdt7;6V?Fja&!=pr^_it3;OZg7B`6N^G{_{(qXu)?MTKu`2u1KN~{X9)nyXmSm47W;`vjAw%gak)hlU^=O zL0Td0oSc%rLRY>O&$`q(Dbb(}n8y*^lrja2qSu9E%xusB@31u5&iZjWiBs#ICC){N5i1(RiMOvJbDvLH{d18mMYKj0W;eoQ1E$ujgT!F+V$f0xEnnXA)&63wzsZCuSOq7@EBm3o?*4l}>x zNF2uFF)RZ#f#_GmZr!B{XU&3Be;9_%#j`T-Gy~pXO}%nZnVd?ayTP1i!-u9W!kPq0 z`ZgGMD|-&BXqFTX+>0(~D6g+xVn*5V{j|rTb`PKRK>B~0<&z~OohX>D}KRGyj=080`WMS=|w|)j@xQGEq zo?*f{MJSwEwgE?jG+LxF*dUZpQo#W#m6Vc6 zOL8eZ*xXPird)r%^6RlIM=eD3C#JC~P-WdQDfpJiJbn`@unk2Uti%I4o|mNziKGER z48SV#EOr%VDGPiy|3wyiIg8SyumZj$ow>cPNvGZ}Ymw5+e5;q5{w10*`wUp3gL%&*{E&RfDVM0#8FW0Z#|8Y#rrTid_wf zMUBe*Kg_&sg#ap*auh^SP2mW&ZQc+AAI8)xR8`_9MjcfMZc+I6^g z9j-nD6JNE~8j!|zd<$<0g5av!g3~Ebz=q=xt#N2VWyTn5Ls3Ou(g?sTc+?y&wvKlZa?16P zw@ZuZEwgB)>hyo}?qx9wFTUE83!G}WZ_{oaDp^dYUguD>Cd*DihAdb8M%UtIsm;-6 zbsiC{y*Gfj0S^K9hgj~%fbS&Jd)V<18Un=3btU@KDL4eKWlA4AQu;6nQJQioEw?e>UC(mL%m5F=tKT?2b$&n5=e(6{v$Wmr%t1( zLdtsk)}sASZX^wz`9ItVQVzdRD(=grSD@_wDxDf^Zy{s|yAvHskuGZftPDf9za)Dj z{1-Vk5H~jf+|)cgYGapie11py0!aQ%*`PmP8_U0~{0{lowR^QqmPslj?xJbxMmG~7 zd!n4BM`3p7NImz+@O>$|CXoc5H@&l2ytBdWf??zo#hREUEbv3VTAKM zGJ>G_{Eg=LvRvq_>7DjN{gF;<@3Fi^Z*vUcX7Kaq*ngdVV6?GWG?ihxX{Kol=tH2L z4=NK6Dw7?G#lUFytE2<*@nDn}Azb?I^%fIEh9%NH6g&7B=o6q%fj$Ge1auj6J1bWJ zVx^x0UR3B8(Ed|sqWlk3kyEj_{NCsqL7KNFZfB7B@!6ljRn{3EsGP@DJc1N2~kIAmPHybai)C*RSeV)zdd` z!OdH6<8?UjU3;mfqi90Ltc<;J6z#((dR5l*6zSKJ+xLF~SjblK4pnTT)4~A6Y}uk0 zZccCee{)G+e%q3mbPAA?tO^7ihm&ZKOL4+cP>Bf=R^T@VzzZ(+0r6Cd#6caiCe|Y4 zBS07c++y+ zS>{8=E_4JuDTZ0VRGfVp3GtTFm1CvLT}KUQlF!2kFh;Y3tU-bdxGs-Y)=a5ef9p6 z-6-pkT69`1v3&t?*>kSF%j;{XPO}x|8Mf~U(peen5SDpxC{Kj#AkzD6&&hQ;&%?tA z7kFd@LE^dF^-V2%vD>DPI*aPYF2zsSen1~`IKp*r=h3lejc#DHwvv-dFkVsPv7viKjQ4yATbJsCS8^-C?;W$SdF{xqH2N1(Bgi(vQ3sp96gX^d-<&Kv#jTfplr^ zIzY(uYrrew`VDj*g*v9saTU+WkX-h7bWxs-tUd7{0qr);{04FM&&, + args: vector> + } + public entry fun move_execute( sender: &signer, module_address: address, @@ -76,17 +89,32 @@ module initia_std::cosmos { type_args: vector, args: vector> ) { - move_execute_internal( - signer::address_of(sender), - module_address, - *string::bytes(&module_name), - *string::bytes(&function_name), - vector::map_ref(&type_args, |v| *string::bytes(v)), - args, - false + stargate( + sender, + json::marshal( + &ExecuteRequest { + _type_: string::utf8(b"/initia.move.v1.MsgExecute"), + sender: address::to_sdk(signer::address_of(sender)), + module_address, + module_name, + function_name, + type_args, + args + } + ) ) } + struct ExecuteJSONRequest has copy, drop { + _type_: String, + sender: String, + module_address: address, + module_name: String, + function_name: String, + type_args: vector, + args: vector + } + public entry fun move_execute_with_json( sender: &signer, module_address: address, @@ -95,65 +123,155 @@ module initia_std::cosmos { type_args: vector, args: vector ) { - move_execute_internal( - signer::address_of(sender), - module_address, - *string::bytes(&module_name), - *string::bytes(&function_name), - vector::map_ref(&type_args, |v| *string::bytes(v)), - vector::map_ref(&args, |v| *string::bytes(v)), - true + stargate( + sender, + json::marshal( + &ExecuteJSONRequest { + _type_: string::utf8(b"/initia.move.v1.MsgExecuteJSON"), + sender: address::to_sdk(signer::address_of(sender)), + module_address, + module_name, + function_name, + type_args, + args + } + ) ) } + struct ScriptRequest has copy, drop { + _type_: String, + sender: String, + code_bytes: vector, + type_args: vector, + args: vector> + } + public entry fun move_script( sender: &signer, code_bytes: vector, type_args: vector, args: vector> ) { - move_script_internal( - signer::address_of(sender), - code_bytes, - vector::map_ref(&type_args, |v| *string::bytes(v)), - args, - false + stargate( + sender, + json::marshal( + &ScriptRequest { + _type_: string::utf8(b"/initia.move.v1.MsgScript"), + sender: address::to_sdk(signer::address_of(sender)), + code_bytes, + type_args, + args + } + ) ) } + struct ScriptJSONRequest has copy, drop { + _type_: String, + sender: String, + code_bytes: vector, + type_args: vector, + args: vector + } + public entry fun move_script_with_json( sender: &signer, code_bytes: vector, type_args: vector, args: vector ) { - move_script_internal( - signer::address_of(sender), - code_bytes, - vector::map_ref(&type_args, |v| *string::bytes(v)), - vector::map_ref(&args, |v| *string::bytes(v)), - true + stargate( + sender, + json::marshal( + &ScriptJSONRequest { + _type_: string::utf8(b"/initia.move.v1.MsgScriptJSON"), + sender: address::to_sdk(signer::address_of(sender)), + code_bytes, + type_args, + args + } + ) ) } + struct DelegateRequest has copy, drop { + _type_: String, + delegator_address: String, + validator_address: String, + amount: vector, + } + + struct CosmosCoin has copy, drop { + denom: String, + amount: u64 + } + public entry fun delegate( delegator: &signer, validator: String, metadata: Object, amount: u64 ) { - delegate_internal( - signer::address_of(delegator), - *string::bytes(&validator), - &metadata, - amount + stargate( + delegator, + json::marshal( + &DelegateRequest { + _type_: string::utf8(b"/initia.mstaking.v1.MsgDelegate"), + delegator_address: address::to_sdk(signer::address_of(delegator)), + validator_address: validator, + amount: vector[ + CosmosCoin { + denom: metadata_to_denom(metadata), + amount + } + ] + } + ) ) } + struct FuncCommunityPoolRequest has copy, drop { + _type_: String, + depositor: String, + amount: vector + } + public entry fun fund_community_pool( sender: &signer, metadata: Object, amount: u64 ) { - fund_community_pool_internal(signer::address_of(sender), &metadata, amount) + stargate( + sender, + json::marshal( + &FuncCommunityPoolRequest { + _type_: string::utf8(b"/cosmos.distribution.v1beta1.MsgFundCommunityPool"), + depositor: address::to_sdk(signer::address_of(sender)), + amount: vector[ + CosmosCoin { + denom: metadata_to_denom(metadata), + amount + } + ] + } + ) + ) + } + + struct TransferRequest has copy, drop { + _type_: String, + source_port: String, + source_channel: String, + sender: String, + receiver: String, + token: CosmosCoin, + timeout_height: TimeoutHeight, + timeout_timestamp: u64, + memo: String + } + + struct TimeoutHeight has copy, drop { + revision_number: u64, + revision_height: u64 } /// ICS20 ibc transfer @@ -170,20 +288,43 @@ module initia_std::cosmos { timeout_timestamp: u64, memo: String ) { - transfer_internal( - signer::address_of(sender), - *string::bytes(&receiver), - &metadata, - token_amount, - *string::bytes(&source_port), - *string::bytes(&source_channel), - revision_number, - revision_height, - timeout_timestamp, - *string::bytes(&memo) + stargate( + sender, + json::marshal( + &TransferRequest { + _type_: string::utf8(b"/ibc.applications.transfer.v1.MsgTransfer"), + source_port, + source_channel, + sender: address::to_sdk(signer::address_of(sender)), + receiver, + token: CosmosCoin { + denom: metadata_to_denom(metadata), + amount: token_amount + }, + timeout_height: TimeoutHeight { + revision_number, + revision_height + }, + timeout_timestamp, + memo + } + ) ) } + struct NFTTransferRequest has copy, drop { + _type_: String, + sender: String, + receiver: String, + class_id: String, + token_ids: vector, + source_port: String, + source_channel: String, + timeout_height: TimeoutHeight, + timeout_timestamp: u64, + memo: String, + } + /// ICS721 ibc nft_transfer /// https://github.com/cosmos/ibc/tree/main/spec/app/ics-721-nft-transfer public entry fun nft_transfer( @@ -198,20 +339,43 @@ module initia_std::cosmos { timeout_timestamp: u64, memo: String ) { - nft_transfer_internal( - signer::address_of(sender), - *string::bytes(&receiver), - &collection, - vector::map_ref(&token_ids, |v| *string::bytes(v)), - *string::bytes(&source_port), - *string::bytes(&source_channel), - revision_number, - revision_height, - timeout_timestamp, - *string::bytes(&memo) + stargate( + sender, + json::marshal( + &NFTTransferRequest { + _type_: string::utf8(b"/ibc.applications.nft_transfer.v1.MsgTransfer"), + sender: address::to_sdk(signer::address_of(sender)), + receiver, + class_id: collection_to_class_id(collection), + token_ids, + source_port, + source_channel, + timeout_height: TimeoutHeight { + revision_number, + revision_height + }, + timeout_timestamp, + memo + } + ) ) } + struct Fee has copy, drop { + recv_fee: vector, + ack_fee: vector, + timeout_fee: vector, + } + + struct PayFeeRequest has copy, drop { + _type_: String, + _signer_: String, + source_port: String, + source_channel: String, + fee: Fee, + relayers: vector, + } + /// ICS29 ibc relayer fee /// https://github.com/cosmos/ibc/tree/main/spec/app/ics-029-fee-payment public entry fun pay_fee( @@ -225,16 +389,37 @@ module initia_std::cosmos { timeout_fee_metadata: Object, timeout_fee_amount: u64 ) { - pay_fee_internal( - signer::address_of(sender), - *string::bytes(&source_port), - *string::bytes(&source_channel), - &recv_fee_metadata, - recv_fee_amount, - &ack_fee_metadata, - ack_fee_amount, - &timeout_fee_metadata, - timeout_fee_amount + stargate( + sender, + json::marshal( + &PayFeeRequest { + _type_: string::utf8(b"/ibc.applications.fee.v1.MsgPayPacketFee"), + _signer_: address::to_sdk(signer::address_of(sender)), + source_port, + source_channel, + fee: Fee { + recv_fee: vector[ + CosmosCoin { + denom: metadata_to_denom(recv_fee_metadata), + amount: recv_fee_amount + } + ], + ack_fee: vector[ + CosmosCoin { + denom: metadata_to_denom(ack_fee_metadata), + amount: ack_fee_amount + } + ], + timeout_fee: vector[ + CosmosCoin { + denom: metadata_to_denom(timeout_fee_metadata), + amount: timeout_fee_amount + } + ], + }, + relayers: vector::empty() + } + ) ) } @@ -242,73 +427,6 @@ module initia_std::cosmos { sender: address, data: vector, option: Options ); - native fun move_execute_internal( - sender: address, - module_address: address, - module_name: vector, - function_name: vector, - type_args: vector>, - args: vector>, - is_json: bool - ); - - native fun move_script_internal( - sender: address, - code_bytes: vector, - type_args: vector>, - args: vector>, - is_json: bool - ); - - native fun delegate_internal( - delegator: address, - validator: vector, - metadata: &Object, - amount: u64 - ); - - native fun fund_community_pool_internal( - sender: address, metadata: &Object, amount: u64 - ); - - native fun transfer_internal( - sender: address, - receiver: vector, - metadata: &Object, - token_amount: u64, - source_port: vector, - source_channel: vector, - revision_number: u64, - revision_height: u64, - timeout_timestamp: u64, - memo: vector - ); - - native fun nft_transfer_internal( - sender: address, - receiver: vector, - collection: &Object, - token_ids: vector>, - source_port: vector, - source_channel: vector, - revision_number: u64, - revision_height: u64, - timeout_timestamp: u64, - memo: vector - ); - - native fun pay_fee_internal( - sender: address, - source_port: vector, - source_channel: vector, - recv_fee_metadata: &Object, - recv_fee_amount: u64, - ack_fee_metadata: &Object, - ack_fee_amount: u64, - timeout_fee_metadata: &Object, - timeout_fee_amount: u64 - ); - // ================================================== Options ================================================= /// Options for stargate message diff --git a/precompile/modules/initia_stdlib/sources/json.move b/precompile/modules/initia_stdlib/sources/json.move index 0afb4b60..6e597f36 100644 --- a/precompile/modules/initia_stdlib/sources/json.move +++ b/precompile/modules/initia_stdlib/sources/json.move @@ -87,6 +87,7 @@ module initia_std::json { /// /// NOTE: key `_type_` is converted to `@type` /// NOTE: key `_move_` is converted to `move` + /// NOTE: key `_signer_` is converted to `signer` public fun marshal(value: &T): vector { marshal_internal(value) } @@ -95,6 +96,7 @@ module initia_std::json { /// /// NOTE: key `_type_` is converted to `@type` /// NOTE: key `_move_` is converted to `move` + /// /// NOTE: key `_signer_` is converted to `signer` public fun marshal_to_string(value: &T): String { marshal_to_string_internal(value) } @@ -103,6 +105,7 @@ module initia_std::json { /// /// NOTE: key `@type` is converted to `_type_` /// NOTE: key `move` is converted to `_move_` + /// NOTE: key `signer` is converted to `_signer_` public fun unmarshal(json: vector): T { unmarshal_internal(json) } @@ -127,6 +130,7 @@ module initia_std::json { f: Option, _type_: String, _move_: String, + _signer_: String, biguint: BigUint, bigdecimal: BigDecimal } @@ -179,6 +183,7 @@ module initia_std::json { f: option::none(), _type_: string::utf8(b"/cosmos.gov.v1.MsgVote"), _move_: string::utf8(b"move"), + _signer_: string::utf8(b"signer"), biguint: biguint::from_u64(42), bigdecimal: bigdecimal::from_ratio_u64(123, 10000) }; @@ -186,7 +191,7 @@ module initia_std::json { let json = marshal(&obj); assert!( json - == b"{\"@type\":\"/cosmos.gov.v1.MsgVote\",\"a\":\"42\",\"b\":true,\"bigdecimal\":\"0.0123\",\"biguint\":\"42\",\"c\":\"010203\",\"d\":\"0x1\",\"e\":{\"a\":\"42\",\"b\":true,\"c\":\"010203\"},\"f\":null,\"move\":\"move\"}", + == b"{\"@type\":\"/cosmos.gov.v1.MsgVote\",\"a\":\"42\",\"b\":true,\"bigdecimal\":\"0.0123\",\"biguint\":\"42\",\"c\":\"010203\",\"d\":\"0x1\",\"e\":{\"a\":\"42\",\"b\":true,\"c\":\"010203\"},\"f\":null,\"move\":\"move\",\"signer\":\"signer\"}", 1 ); @@ -242,7 +247,7 @@ module initia_std::json { let json5 = marshal(&json_obj); assert!( json5 - == b"{\"@type\":\"/cosmos.gov.v1.MsgVote\",\"a\":\"42\",\"b\":true,\"bigdecimal\":\"0.0123\",\"biguint\":\"42\",\"c\":\"hello\",\"d\":\"0x1\",\"e\":{\"a\":\"42\",\"b\":true,\"c\":\"010203\"},\"f\":null,\"move\":\"move\"}", + == b"{\"@type\":\"/cosmos.gov.v1.MsgVote\",\"a\":\"42\",\"b\":true,\"bigdecimal\":\"0.0123\",\"biguint\":\"42\",\"c\":\"hello\",\"d\":\"0x1\",\"e\":{\"a\":\"42\",\"b\":true,\"c\":\"010203\"},\"f\":null,\"move\":\"move\",\"signer\":\"signer\"}", 9 ); } diff --git a/precompile/modules/initia_stdlib/sources/token/collection.move b/precompile/modules/initia_stdlib/sources/token/collection.move index 5d2b7144..278da9c8 100644 --- a/precompile/modules/initia_stdlib/sources/token/collection.move +++ b/precompile/modules/initia_stdlib/sources/token/collection.move @@ -22,9 +22,11 @@ module initia_std::collection { use std::signer; use std::string::{Self, String}; use std::vector; + use std::bcs; use initia_std::event; use initia_std::object::{Self, ConstructorRef, Object}; use initia_std::table::{Self, Table}; + use initia_std::hex; use initia_std::royalty::{Self, Royalty}; @@ -387,6 +389,21 @@ module initia_std::collection { borrow(collection).uri } + #[view] + public fun collection_to_class_id(collection: Object): String acquires Collection { + let col = borrow(collection); + if (col.creator == @initia_std) { + return col.name + }; + + let metadata_addr = object::object_address(&collection); + let denom = string::utf8(b"move/"); + let addr_bytes = bcs::to_bytes(&metadata_addr); + let addr_string = hex::encode_to_string(&addr_bytes); + string::append(&mut denom, addr_string); + return denom + } + #[view] /// get nft list from collection /// if `start_after` is not none, seach nfts in range (start_after, ...] diff --git a/precompile/modules/minitia_stdlib/sources/cosmos.move b/precompile/modules/minitia_stdlib/sources/cosmos.move index bc78d77d..6bbead19 100644 --- a/precompile/modules/minitia_stdlib/sources/cosmos.move +++ b/precompile/modules/minitia_stdlib/sources/cosmos.move @@ -1,6 +1,7 @@ /// This module provides interfaces to allow CosmosMessage /// execution after the move execution finished. module minitia_std::cosmos { + use std::address; use std::signer; use std::vector; use std::string::{Self, String}; @@ -8,6 +9,8 @@ module minitia_std::cosmos { use std::fungible_asset::Metadata; use std::collection::{Collection}; use std::error; + use std::coin::metadata_to_denom; + use std::collection::collection_to_class_id; use minitia_std::json; @@ -68,6 +71,16 @@ module minitia_std::cosmos { stargate_internal(signer::address_of(sender), data, options) } + struct ExecuteRequest has copy, drop { + _type_: String, + sender: String, + module_address: address, + module_name: String, + function_name: String, + type_args: vector, + args: vector> + } + public entry fun move_execute( sender: &signer, module_address: address, @@ -76,17 +89,32 @@ module minitia_std::cosmos { type_args: vector, args: vector> ) { - move_execute_internal( - signer::address_of(sender), - module_address, - *string::bytes(&module_name), - *string::bytes(&function_name), - vector::map_ref(&type_args, |v| *string::bytes(v)), - args, - false + stargate( + sender, + json::marshal( + &ExecuteRequest { + _type_: string::utf8(b"/initia.move.v1.MsgExecute"), + sender: address::to_sdk(signer::address_of(sender)), + module_address, + module_name, + function_name, + type_args, + args + } + ) ) } + struct ExecuteJSONRequest has copy, drop { + _type_: String, + sender: String, + module_address: address, + module_name: String, + function_name: String, + type_args: vector, + args: vector + } + public entry fun move_execute_with_json( sender: &signer, module_address: address, @@ -95,65 +123,155 @@ module minitia_std::cosmos { type_args: vector, args: vector ) { - move_execute_internal( - signer::address_of(sender), - module_address, - *string::bytes(&module_name), - *string::bytes(&function_name), - vector::map_ref(&type_args, |v| *string::bytes(v)), - vector::map_ref(&args, |v| *string::bytes(v)), - true + stargate( + sender, + json::marshal( + &ExecuteJSONRequest { + _type_: string::utf8(b"/initia.move.v1.MsgExecuteJSON"), + sender: address::to_sdk(signer::address_of(sender)), + module_address, + module_name, + function_name, + type_args, + args + } + ) ) } + struct ScriptRequest has copy, drop { + _type_: String, + sender: String, + code_bytes: vector, + type_args: vector, + args: vector> + } + public entry fun move_script( sender: &signer, code_bytes: vector, type_args: vector, args: vector> ) { - move_script_internal( - signer::address_of(sender), - code_bytes, - vector::map_ref(&type_args, |v| *string::bytes(v)), - args, - false + stargate( + sender, + json::marshal( + &ScriptRequest { + _type_: string::utf8(b"/initia.move.v1.MsgScript"), + sender: address::to_sdk(signer::address_of(sender)), + code_bytes, + type_args, + args + } + ) ) } + struct ScriptJSONRequest has copy, drop { + _type_: String, + sender: String, + code_bytes: vector, + type_args: vector, + args: vector + } + public entry fun move_script_with_json( sender: &signer, code_bytes: vector, type_args: vector, args: vector ) { - move_script_internal( - signer::address_of(sender), - code_bytes, - vector::map_ref(&type_args, |v| *string::bytes(v)), - vector::map_ref(&args, |v| *string::bytes(v)), - true + stargate( + sender, + json::marshal( + &ScriptJSONRequest { + _type_: string::utf8(b"/initia.move.v1.MsgScriptJSON"), + sender: address::to_sdk(signer::address_of(sender)), + code_bytes, + type_args, + args + } + ) ) } + struct DelegateRequest has copy, drop { + _type_: String, + delegator_address: String, + validator_address: String, + amount: vector, + } + + struct CosmosCoin has copy, drop { + denom: String, + amount: u64 + } + public entry fun delegate( delegator: &signer, validator: String, metadata: Object, amount: u64 ) { - delegate_internal( - signer::address_of(delegator), - *string::bytes(&validator), - &metadata, - amount + stargate( + delegator, + json::marshal( + &DelegateRequest { + _type_: string::utf8(b"/initia.mstaking.v1.MsgDelegate"), + delegator_address: address::to_sdk(signer::address_of(delegator)), + validator_address: validator, + amount: vector[ + CosmosCoin { + denom: metadata_to_denom(metadata), + amount + } + ] + } + ) ) } + struct FuncCommunityPoolRequest has copy, drop { + _type_: String, + depositor: String, + amount: vector + } + public entry fun fund_community_pool( sender: &signer, metadata: Object, amount: u64 ) { - fund_community_pool_internal(signer::address_of(sender), &metadata, amount) + stargate( + sender, + json::marshal( + &FuncCommunityPoolRequest { + _type_: string::utf8(b"/cosmos.distribution.v1beta1.MsgFundCommunityPool"), + depositor: address::to_sdk(signer::address_of(sender)), + amount: vector[ + CosmosCoin { + denom: metadata_to_denom(metadata), + amount + } + ] + } + ) + ) + } + + struct TransferRequest has copy, drop { + _type_: String, + source_port: String, + source_channel: String, + sender: String, + receiver: String, + token: CosmosCoin, + timeout_height: TimeoutHeight, + timeout_timestamp: u64, + memo: String + } + + struct TimeoutHeight has copy, drop { + revision_number: u64, + revision_height: u64 } /// ICS20 ibc transfer @@ -170,20 +288,43 @@ module minitia_std::cosmos { timeout_timestamp: u64, memo: String ) { - transfer_internal( - signer::address_of(sender), - *string::bytes(&receiver), - &metadata, - token_amount, - *string::bytes(&source_port), - *string::bytes(&source_channel), - revision_number, - revision_height, - timeout_timestamp, - *string::bytes(&memo) + stargate( + sender, + json::marshal( + &TransferRequest { + _type_: string::utf8(b"/ibc.applications.transfer.v1.MsgTransfer"), + source_port, + source_channel, + sender: address::to_sdk(signer::address_of(sender)), + receiver, + token: CosmosCoin { + denom: metadata_to_denom(metadata), + amount: token_amount + }, + timeout_height: TimeoutHeight { + revision_number, + revision_height + }, + timeout_timestamp, + memo + } + ) ) } + struct NFTTransferRequest has copy, drop { + _type_: String, + sender: String, + receiver: String, + class_id: String, + token_ids: vector, + source_port: String, + source_channel: String, + timeout_height: TimeoutHeight, + timeout_timestamp: u64, + memo: String, + } + /// ICS721 ibc nft_transfer /// https://github.com/cosmos/ibc/tree/main/spec/app/ics-721-nft-transfer public entry fun nft_transfer( @@ -198,20 +339,43 @@ module minitia_std::cosmos { timeout_timestamp: u64, memo: String ) { - nft_transfer_internal( - signer::address_of(sender), - *string::bytes(&receiver), - &collection, - vector::map_ref(&token_ids, |v| *string::bytes(v)), - *string::bytes(&source_port), - *string::bytes(&source_channel), - revision_number, - revision_height, - timeout_timestamp, - *string::bytes(&memo) + stargate( + sender, + json::marshal( + &NFTTransferRequest { + _type_: string::utf8(b"/ibc.applications.nft_transfer.v1.MsgTransfer"), + sender: address::to_sdk(signer::address_of(sender)), + receiver, + class_id: collection_to_class_id(collection), + token_ids, + source_port, + source_channel, + timeout_height: TimeoutHeight { + revision_number, + revision_height + }, + timeout_timestamp, + memo + } + ) ) } + struct Fee has copy, drop { + recv_fee: vector, + ack_fee: vector, + timeout_fee: vector, + } + + struct PayFeeRequest has copy, drop { + _type_: String, + _signer_: String, + source_port: String, + source_channel: String, + fee: Fee, + relayers: vector, + } + /// ICS29 ibc relayer fee /// https://github.com/cosmos/ibc/tree/main/spec/app/ics-029-fee-payment public entry fun pay_fee( @@ -225,16 +389,37 @@ module minitia_std::cosmos { timeout_fee_metadata: Object, timeout_fee_amount: u64 ) { - pay_fee_internal( - signer::address_of(sender), - *string::bytes(&source_port), - *string::bytes(&source_channel), - &recv_fee_metadata, - recv_fee_amount, - &ack_fee_metadata, - ack_fee_amount, - &timeout_fee_metadata, - timeout_fee_amount + stargate( + sender, + json::marshal( + &PayFeeRequest { + _type_: string::utf8(b"/ibc.applications.fee.v1.MsgPayPacketFee"), + _signer_: address::to_sdk(signer::address_of(sender)), + source_port, + source_channel, + fee: Fee { + recv_fee: vector[ + CosmosCoin { + denom: metadata_to_denom(recv_fee_metadata), + amount: recv_fee_amount + } + ], + ack_fee: vector[ + CosmosCoin { + denom: metadata_to_denom(ack_fee_metadata), + amount: ack_fee_amount + } + ], + timeout_fee: vector[ + CosmosCoin { + denom: metadata_to_denom(timeout_fee_metadata), + amount: timeout_fee_amount + } + ], + }, + relayers: vector::empty() + } + ) ) } @@ -242,73 +427,6 @@ module minitia_std::cosmos { sender: address, data: vector, option: Options ); - native fun move_execute_internal( - sender: address, - module_address: address, - module_name: vector, - function_name: vector, - type_args: vector>, - args: vector>, - is_json: bool - ); - - native fun move_script_internal( - sender: address, - code_bytes: vector, - type_args: vector>, - args: vector>, - is_json: bool - ); - - native fun delegate_internal( - delegator: address, - validator: vector, - metadata: &Object, - amount: u64 - ); - - native fun fund_community_pool_internal( - sender: address, metadata: &Object, amount: u64 - ); - - native fun transfer_internal( - sender: address, - receiver: vector, - metadata: &Object, - token_amount: u64, - source_port: vector, - source_channel: vector, - revision_number: u64, - revision_height: u64, - timeout_timestamp: u64, - memo: vector - ); - - native fun nft_transfer_internal( - sender: address, - receiver: vector, - collection: &Object, - token_ids: vector>, - source_port: vector, - source_channel: vector, - revision_number: u64, - revision_height: u64, - timeout_timestamp: u64, - memo: vector - ); - - native fun pay_fee_internal( - sender: address, - source_port: vector, - source_channel: vector, - recv_fee_metadata: &Object, - recv_fee_amount: u64, - ack_fee_metadata: &Object, - ack_fee_amount: u64, - timeout_fee_metadata: &Object, - timeout_fee_amount: u64 - ); - // ================================================== Options ================================================= /// Options for stargate message diff --git a/precompile/modules/minitia_stdlib/sources/json.move b/precompile/modules/minitia_stdlib/sources/json.move index 0bdc748f..bae8792a 100644 --- a/precompile/modules/minitia_stdlib/sources/json.move +++ b/precompile/modules/minitia_stdlib/sources/json.move @@ -87,6 +87,7 @@ module minitia_std::json { /// /// NOTE: key `_type_` is converted to `@type` /// NOTE: key `_move_` is converted to `move` + /// NOTE: key `_signer_` is converted to `signer` public fun marshal(value: &T): vector { marshal_internal(value) } @@ -95,6 +96,7 @@ module minitia_std::json { /// /// NOTE: key `_type_` is converted to `@type` /// NOTE: key `_move_` is converted to `move` + /// /// NOTE: key `_signer_` is converted to `signer` public fun marshal_to_string(value: &T): String { marshal_to_string_internal(value) } @@ -103,6 +105,7 @@ module minitia_std::json { /// /// NOTE: key `@type` is converted to `_type_` /// NOTE: key `move` is converted to `_move_` + /// NOTE: key `signer` is converted to `_signer_` public fun unmarshal(json: vector): T { unmarshal_internal(json) } @@ -127,6 +130,7 @@ module minitia_std::json { f: Option, _type_: String, _move_: String, + _signer_: String, biguint: BigUint, bigdecimal: BigDecimal } @@ -179,6 +183,7 @@ module minitia_std::json { f: option::none(), _type_: string::utf8(b"/cosmos.gov.v1.MsgVote"), _move_: string::utf8(b"move"), + _signer_: string::utf8(b"signer"), biguint: biguint::from_u64(42), bigdecimal: bigdecimal::from_ratio_u64(123, 10000) }; @@ -186,7 +191,7 @@ module minitia_std::json { let json = marshal(&obj); assert!( json - == b"{\"@type\":\"/cosmos.gov.v1.MsgVote\",\"a\":\"42\",\"b\":true,\"bigdecimal\":\"0.0123\",\"biguint\":\"42\",\"c\":\"010203\",\"d\":\"0x1\",\"e\":{\"a\":\"42\",\"b\":true,\"c\":\"010203\"},\"f\":null,\"move\":\"move\"}", + == b"{\"@type\":\"/cosmos.gov.v1.MsgVote\",\"a\":\"42\",\"b\":true,\"bigdecimal\":\"0.0123\",\"biguint\":\"42\",\"c\":\"010203\",\"d\":\"0x1\",\"e\":{\"a\":\"42\",\"b\":true,\"c\":\"010203\"},\"f\":null,\"move\":\"move\",\"signer\":\"signer\"}", 1 ); @@ -242,7 +247,7 @@ module minitia_std::json { let json5 = marshal(&json_obj); assert!( json5 - == b"{\"@type\":\"/cosmos.gov.v1.MsgVote\",\"a\":\"42\",\"b\":true,\"bigdecimal\":\"0.0123\",\"biguint\":\"42\",\"c\":\"hello\",\"d\":\"0x1\",\"e\":{\"a\":\"42\",\"b\":true,\"c\":\"010203\"},\"f\":null,\"move\":\"move\"}", + == b"{\"@type\":\"/cosmos.gov.v1.MsgVote\",\"a\":\"42\",\"b\":true,\"bigdecimal\":\"0.0123\",\"biguint\":\"42\",\"c\":\"hello\",\"d\":\"0x1\",\"e\":{\"a\":\"42\",\"b\":true,\"c\":\"010203\"},\"f\":null,\"move\":\"move\",\"signer\":\"signer\"}", 9 ); } diff --git a/precompile/modules/minitia_stdlib/sources/token/collection.move b/precompile/modules/minitia_stdlib/sources/token/collection.move index 9c38847e..a069604e 100644 --- a/precompile/modules/minitia_stdlib/sources/token/collection.move +++ b/precompile/modules/minitia_stdlib/sources/token/collection.move @@ -22,9 +22,11 @@ module minitia_std::collection { use std::signer; use std::string::{Self, String}; use std::vector; + use std::bcs; use minitia_std::event; use minitia_std::object::{Self, ConstructorRef, Object}; use minitia_std::table::{Self, Table}; + use minitia_std::hex; use minitia_std::royalty::{Self, Royalty}; @@ -387,6 +389,21 @@ module minitia_std::collection { borrow(collection).uri } + #[view] + public fun collection_to_class_id(collection: Object): String acquires Collection { + let col = borrow(collection); + if (col.creator == @minitia_std) { + return col.name + }; + + let metadata_addr = object::object_address(&collection); + let denom = string::utf8(b"move/"); + let addr_bytes = bcs::to_bytes(&metadata_addr); + let addr_string = hex::encode_to_string(&addr_bytes); + string::append(&mut denom, addr_string); + return denom + } + #[view] /// get nft list from collection /// if `start_after` is not none, seach nfts in range (start_after, ...] diff --git a/tools/generate-bcs-go/src/main.rs b/tools/generate-bcs-go/src/main.rs index 5875d9e0..5fcd8054 100644 --- a/tools/generate-bcs-go/src/main.rs +++ b/tools/generate-bcs-go/src/main.rs @@ -10,9 +10,7 @@ use initia_move_types::{ CompilerCoverageSourceOptions, CompilerCoverageSummaryOptions, CompilerDocgenOptions, CompilerTestOptions, }, - cosmos::{ - CosmosCoin, CosmosMessage, IBCFee, IBCHeight, IBCMessage, MoveMessage, StakingMessage, - }, + cosmos::CosmosMessage, entry_function::EntryFunction, env::Env, gas_usage::GasUsage, @@ -39,12 +37,6 @@ fn main() { tracer.trace_simple_type::().unwrap(); tracer.trace_simple_type::().unwrap(); tracer.trace_simple_type::().unwrap(); - tracer.trace_simple_type::().unwrap(); - tracer.trace_simple_type::().unwrap(); - tracer.trace_simple_type::().unwrap(); - tracer.trace_simple_type::().unwrap(); - tracer.trace_simple_type::().unwrap(); - tracer.trace_simple_type::().unwrap(); tracer.trace_simple_type::().unwrap(); tracer.trace_simple_type::().unwrap(); tracer.trace_simple_type::().unwrap(); diff --git a/types/bcs.go b/types/bcs.go index 7a29448b..adbecfdf 100644 --- a/types/bcs.go +++ b/types/bcs.go @@ -458,20 +458,24 @@ func BcsDeserializeCompilerTestOptions(input []byte) (CompilerTestOptions, error return obj, err } -type CosmosCoin struct { - Metadata AccountAddress - Amount uint64 +type CosmosCallback struct { + Id uint64 + ModuleAddress AccountAddress + ModuleName string + FunctionName string } -func (obj *CosmosCoin) Serialize(serializer serde.Serializer) error { +func (obj *CosmosCallback) Serialize(serializer serde.Serializer) error { if err := serializer.IncreaseContainerDepth(); err != nil { return err } - if err := obj.Metadata.Serialize(serializer); err != nil { return err } - if err := serializer.SerializeU64(obj.Amount); err != nil { return err } + if err := serializer.SerializeU64(obj.Id); err != nil { return err } + if err := obj.ModuleAddress.Serialize(serializer); err != nil { return err } + if err := serializer.SerializeStr(obj.ModuleName); err != nil { return err } + if err := serializer.SerializeStr(obj.FunctionName); err != nil { return err } serializer.DecreaseContainerDepth() return nil } -func (obj *CosmosCoin) BcsSerialize() ([]byte, error) { +func (obj *CosmosCallback) BcsSerialize() ([]byte, error) { if obj == nil { return nil, fmt.Errorf("Cannot serialize null object") } @@ -480,231 +484,48 @@ func (obj *CosmosCoin) BcsSerialize() ([]byte, error) { return serializer.GetBytes(), nil } -func DeserializeCosmosCoin(deserializer serde.Deserializer) (CosmosCoin, error) { - var obj CosmosCoin +func DeserializeCosmosCallback(deserializer serde.Deserializer) (CosmosCallback, error) { + var obj CosmosCallback if err := deserializer.IncreaseContainerDepth(); err != nil { return obj, err } - if val, err := DeserializeAccountAddress(deserializer); err == nil { obj.Metadata = val } else { return obj, err } - if val, err := deserializer.DeserializeU64(); err == nil { obj.Amount = val } else { return obj, err } + if val, err := deserializer.DeserializeU64(); err == nil { obj.Id = val } else { return obj, err } + if val, err := DeserializeAccountAddress(deserializer); err == nil { obj.ModuleAddress = val } else { return obj, err } + if val, err := deserializer.DeserializeStr(); err == nil { obj.ModuleName = val } else { return obj, err } + if val, err := deserializer.DeserializeStr(); err == nil { obj.FunctionName = val } else { return obj, err } deserializer.DecreaseContainerDepth() return obj, nil } -func BcsDeserializeCosmosCoin(input []byte) (CosmosCoin, error) { - if input == nil { - var obj CosmosCoin - return obj, fmt.Errorf("Cannot deserialize null array") - } - deserializer := bcs.NewDeserializer(input); - obj, err := DeserializeCosmosCoin(deserializer) - if err == nil && deserializer.GetBufferOffset() < uint64(len(input)) { - return obj, fmt.Errorf("Some input bytes were not read") - } - return obj, err -} - -type CosmosMessage interface { - isCosmosMessage() - Serialize(serializer serde.Serializer) error - BcsSerialize() ([]byte, error) -} - -func DeserializeCosmosMessage(deserializer serde.Deserializer) (CosmosMessage, error) { - index, err := deserializer.DeserializeVariantIndex() - if err != nil { return nil, err } - - switch index { - case 0: - if val, err := load_CosmosMessage__Move(deserializer); err == nil { - return &val, nil - } else { - return nil, err - } - - case 1: - if val, err := load_CosmosMessage__Staking(deserializer); err == nil { - return &val, nil - } else { - return nil, err - } - - case 2: - if val, err := load_CosmosMessage__Distribution(deserializer); err == nil { - return &val, nil - } else { - return nil, err - } - - case 3: - if val, err := load_CosmosMessage__Ibc(deserializer); err == nil { - return &val, nil - } else { - return nil, err - } - - case 4: - if val, err := load_CosmosMessage__Stargate(deserializer); err == nil { - return &val, nil - } else { - return nil, err - } - - default: - return nil, fmt.Errorf("Unknown variant index for CosmosMessage: %d", index) - } -} - -func BcsDeserializeCosmosMessage(input []byte) (CosmosMessage, error) { +func BcsDeserializeCosmosCallback(input []byte) (CosmosCallback, error) { if input == nil { - var obj CosmosMessage + var obj CosmosCallback return obj, fmt.Errorf("Cannot deserialize null array") } deserializer := bcs.NewDeserializer(input); - obj, err := DeserializeCosmosMessage(deserializer) + obj, err := DeserializeCosmosCallback(deserializer) if err == nil && deserializer.GetBufferOffset() < uint64(len(input)) { return obj, fmt.Errorf("Some input bytes were not read") } return obj, err } -type CosmosMessage__Move struct { - Value MoveMessage -} - -func (*CosmosMessage__Move) isCosmosMessage() {} - -func (obj *CosmosMessage__Move) Serialize(serializer serde.Serializer) error { - if err := serializer.IncreaseContainerDepth(); err != nil { return err } - serializer.SerializeVariantIndex(0) - if err := obj.Value.Serialize(serializer); err != nil { return err } - serializer.DecreaseContainerDepth() - return nil -} - -func (obj *CosmosMessage__Move) BcsSerialize() ([]byte, error) { - if obj == nil { - return nil, fmt.Errorf("Cannot serialize null object") - } - serializer := bcs.NewSerializer(); - if err := obj.Serialize(serializer); err != nil { return nil, err } - return serializer.GetBytes(), nil -} - -func load_CosmosMessage__Move(deserializer serde.Deserializer) (CosmosMessage__Move, error) { - var obj CosmosMessage__Move - if err := deserializer.IncreaseContainerDepth(); err != nil { return obj, err } - if val, err := DeserializeMoveMessage(deserializer); err == nil { obj.Value = val } else { return obj, err } - deserializer.DecreaseContainerDepth() - return obj, nil -} - -type CosmosMessage__Staking struct { - Value StakingMessage -} - -func (*CosmosMessage__Staking) isCosmosMessage() {} - -func (obj *CosmosMessage__Staking) Serialize(serializer serde.Serializer) error { - if err := serializer.IncreaseContainerDepth(); err != nil { return err } - serializer.SerializeVariantIndex(1) - if err := obj.Value.Serialize(serializer); err != nil { return err } - serializer.DecreaseContainerDepth() - return nil -} - -func (obj *CosmosMessage__Staking) BcsSerialize() ([]byte, error) { - if obj == nil { - return nil, fmt.Errorf("Cannot serialize null object") - } - serializer := bcs.NewSerializer(); - if err := obj.Serialize(serializer); err != nil { return nil, err } - return serializer.GetBytes(), nil -} - -func load_CosmosMessage__Staking(deserializer serde.Deserializer) (CosmosMessage__Staking, error) { - var obj CosmosMessage__Staking - if err := deserializer.IncreaseContainerDepth(); err != nil { return obj, err } - if val, err := DeserializeStakingMessage(deserializer); err == nil { obj.Value = val } else { return obj, err } - deserializer.DecreaseContainerDepth() - return obj, nil -} - -type CosmosMessage__Distribution struct { - Value DistributionMessage -} - -func (*CosmosMessage__Distribution) isCosmosMessage() {} - -func (obj *CosmosMessage__Distribution) Serialize(serializer serde.Serializer) error { - if err := serializer.IncreaseContainerDepth(); err != nil { return err } - serializer.SerializeVariantIndex(2) - if err := obj.Value.Serialize(serializer); err != nil { return err } - serializer.DecreaseContainerDepth() - return nil -} - -func (obj *CosmosMessage__Distribution) BcsSerialize() ([]byte, error) { - if obj == nil { - return nil, fmt.Errorf("Cannot serialize null object") - } - serializer := bcs.NewSerializer(); - if err := obj.Serialize(serializer); err != nil { return nil, err } - return serializer.GetBytes(), nil -} - -func load_CosmosMessage__Distribution(deserializer serde.Deserializer) (CosmosMessage__Distribution, error) { - var obj CosmosMessage__Distribution - if err := deserializer.IncreaseContainerDepth(); err != nil { return obj, err } - if val, err := DeserializeDistributionMessage(deserializer); err == nil { obj.Value = val } else { return obj, err } - deserializer.DecreaseContainerDepth() - return obj, nil -} - -type CosmosMessage__Ibc struct { - Value IBCMessage -} - -func (*CosmosMessage__Ibc) isCosmosMessage() {} - -func (obj *CosmosMessage__Ibc) Serialize(serializer serde.Serializer) error { - if err := serializer.IncreaseContainerDepth(); err != nil { return err } - serializer.SerializeVariantIndex(3) - if err := obj.Value.Serialize(serializer); err != nil { return err } - serializer.DecreaseContainerDepth() - return nil -} - -func (obj *CosmosMessage__Ibc) BcsSerialize() ([]byte, error) { - if obj == nil { - return nil, fmt.Errorf("Cannot serialize null object") - } - serializer := bcs.NewSerializer(); - if err := obj.Serialize(serializer); err != nil { return nil, err } - return serializer.GetBytes(), nil -} - -func load_CosmosMessage__Ibc(deserializer serde.Deserializer) (CosmosMessage__Ibc, error) { - var obj CosmosMessage__Ibc - if err := deserializer.IncreaseContainerDepth(); err != nil { return obj, err } - if val, err := DeserializeIBCMessage(deserializer); err == nil { obj.Value = val } else { return obj, err } - deserializer.DecreaseContainerDepth() - return obj, nil -} - -type CosmosMessage__Stargate struct { - Value StargateMessage +type CosmosMessage struct { + Sender AccountAddress + Data []uint8 + AllowFailure bool + Callback *CosmosCallback } -func (*CosmosMessage__Stargate) isCosmosMessage() {} - -func (obj *CosmosMessage__Stargate) Serialize(serializer serde.Serializer) error { +func (obj *CosmosMessage) Serialize(serializer serde.Serializer) error { if err := serializer.IncreaseContainerDepth(); err != nil { return err } - serializer.SerializeVariantIndex(4) - if err := obj.Value.Serialize(serializer); err != nil { return err } + if err := obj.Sender.Serialize(serializer); err != nil { return err } + if err := serialize_vector_u8(obj.Data, serializer); err != nil { return err } + if err := serializer.SerializeBool(obj.AllowFailure); err != nil { return err } + if err := serialize_option_CosmosCallback(obj.Callback, serializer); err != nil { return err } serializer.DecreaseContainerDepth() return nil } -func (obj *CosmosMessage__Stargate) BcsSerialize() ([]byte, error) { +func (obj *CosmosMessage) BcsSerialize() ([]byte, error) { if obj == nil { return nil, fmt.Errorf("Cannot serialize null object") } @@ -713,84 +534,30 @@ func (obj *CosmosMessage__Stargate) BcsSerialize() ([]byte, error) { return serializer.GetBytes(), nil } -func load_CosmosMessage__Stargate(deserializer serde.Deserializer) (CosmosMessage__Stargate, error) { - var obj CosmosMessage__Stargate +func DeserializeCosmosMessage(deserializer serde.Deserializer) (CosmosMessage, error) { + var obj CosmosMessage if err := deserializer.IncreaseContainerDepth(); err != nil { return obj, err } - if val, err := DeserializeStargateMessage(deserializer); err == nil { obj.Value = val } else { return obj, err } + if val, err := DeserializeAccountAddress(deserializer); err == nil { obj.Sender = val } else { return obj, err } + if val, err := deserialize_vector_u8(deserializer); err == nil { obj.Data = val } else { return obj, err } + if val, err := deserializer.DeserializeBool(); err == nil { obj.AllowFailure = val } else { return obj, err } + if val, err := deserialize_option_CosmosCallback(deserializer); err == nil { obj.Callback = val } else { return obj, err } deserializer.DecreaseContainerDepth() return obj, nil } -type DistributionMessage interface { - isDistributionMessage() - Serialize(serializer serde.Serializer) error - BcsSerialize() ([]byte, error) -} - -func DeserializeDistributionMessage(deserializer serde.Deserializer) (DistributionMessage, error) { - index, err := deserializer.DeserializeVariantIndex() - if err != nil { return nil, err } - - switch index { - case 0: - if val, err := load_DistributionMessage__FundCommunityPool(deserializer); err == nil { - return &val, nil - } else { - return nil, err - } - - default: - return nil, fmt.Errorf("Unknown variant index for DistributionMessage: %d", index) - } -} - -func BcsDeserializeDistributionMessage(input []byte) (DistributionMessage, error) { +func BcsDeserializeCosmosMessage(input []byte) (CosmosMessage, error) { if input == nil { - var obj DistributionMessage + var obj CosmosMessage return obj, fmt.Errorf("Cannot deserialize null array") } deserializer := bcs.NewDeserializer(input); - obj, err := DeserializeDistributionMessage(deserializer) + obj, err := DeserializeCosmosMessage(deserializer) if err == nil && deserializer.GetBufferOffset() < uint64(len(input)) { return obj, fmt.Errorf("Some input bytes were not read") } return obj, err } -type DistributionMessage__FundCommunityPool struct { - SenderAddress AccountAddress - Amount CosmosCoin -} - -func (*DistributionMessage__FundCommunityPool) isDistributionMessage() {} - -func (obj *DistributionMessage__FundCommunityPool) Serialize(serializer serde.Serializer) error { - if err := serializer.IncreaseContainerDepth(); err != nil { return err } - serializer.SerializeVariantIndex(0) - if err := obj.SenderAddress.Serialize(serializer); err != nil { return err } - if err := obj.Amount.Serialize(serializer); err != nil { return err } - serializer.DecreaseContainerDepth() - return nil -} - -func (obj *DistributionMessage__FundCommunityPool) BcsSerialize() ([]byte, error) { - if obj == nil { - return nil, fmt.Errorf("Cannot serialize null object") - } - serializer := bcs.NewSerializer(); - if err := obj.Serialize(serializer); err != nil { return nil, err } - return serializer.GetBytes(), nil -} - -func load_DistributionMessage__FundCommunityPool(deserializer serde.Deserializer) (DistributionMessage__FundCommunityPool, error) { - var obj DistributionMessage__FundCommunityPool - if err := deserializer.IncreaseContainerDepth(); err != nil { return obj, err } - if val, err := DeserializeAccountAddress(deserializer); err == nil { obj.SenderAddress = val } else { return obj, err } - if val, err := DeserializeCosmosCoin(deserializer); err == nil { obj.Amount = val } else { return obj, err } - deserializer.DecreaseContainerDepth() - return obj, nil -} - type EntryFunction struct { Module ModuleId Function Identifier @@ -994,294 +761,6 @@ func BcsDeserializeGasUsage(input []byte) (GasUsage, error) { return obj, err } -type IBCFee struct { - RecvFee CosmosCoin - AckFee CosmosCoin - TimeoutFee CosmosCoin -} - -func (obj *IBCFee) Serialize(serializer serde.Serializer) error { - if err := serializer.IncreaseContainerDepth(); err != nil { return err } - if err := obj.RecvFee.Serialize(serializer); err != nil { return err } - if err := obj.AckFee.Serialize(serializer); err != nil { return err } - if err := obj.TimeoutFee.Serialize(serializer); err != nil { return err } - serializer.DecreaseContainerDepth() - return nil -} - -func (obj *IBCFee) BcsSerialize() ([]byte, error) { - if obj == nil { - return nil, fmt.Errorf("Cannot serialize null object") - } - serializer := bcs.NewSerializer(); - if err := obj.Serialize(serializer); err != nil { return nil, err } - return serializer.GetBytes(), nil -} - -func DeserializeIBCFee(deserializer serde.Deserializer) (IBCFee, error) { - var obj IBCFee - if err := deserializer.IncreaseContainerDepth(); err != nil { return obj, err } - if val, err := DeserializeCosmosCoin(deserializer); err == nil { obj.RecvFee = val } else { return obj, err } - if val, err := DeserializeCosmosCoin(deserializer); err == nil { obj.AckFee = val } else { return obj, err } - if val, err := DeserializeCosmosCoin(deserializer); err == nil { obj.TimeoutFee = val } else { return obj, err } - deserializer.DecreaseContainerDepth() - return obj, nil -} - -func BcsDeserializeIBCFee(input []byte) (IBCFee, error) { - if input == nil { - var obj IBCFee - return obj, fmt.Errorf("Cannot deserialize null array") - } - deserializer := bcs.NewDeserializer(input); - obj, err := DeserializeIBCFee(deserializer) - if err == nil && deserializer.GetBufferOffset() < uint64(len(input)) { - return obj, fmt.Errorf("Some input bytes were not read") - } - return obj, err -} - -type IBCHeight struct { - RevisionNumber uint64 - RevisionHeight uint64 -} - -func (obj *IBCHeight) Serialize(serializer serde.Serializer) error { - if err := serializer.IncreaseContainerDepth(); err != nil { return err } - if err := serializer.SerializeU64(obj.RevisionNumber); err != nil { return err } - if err := serializer.SerializeU64(obj.RevisionHeight); err != nil { return err } - serializer.DecreaseContainerDepth() - return nil -} - -func (obj *IBCHeight) BcsSerialize() ([]byte, error) { - if obj == nil { - return nil, fmt.Errorf("Cannot serialize null object") - } - serializer := bcs.NewSerializer(); - if err := obj.Serialize(serializer); err != nil { return nil, err } - return serializer.GetBytes(), nil -} - -func DeserializeIBCHeight(deserializer serde.Deserializer) (IBCHeight, error) { - var obj IBCHeight - if err := deserializer.IncreaseContainerDepth(); err != nil { return obj, err } - if val, err := deserializer.DeserializeU64(); err == nil { obj.RevisionNumber = val } else { return obj, err } - if val, err := deserializer.DeserializeU64(); err == nil { obj.RevisionHeight = val } else { return obj, err } - deserializer.DecreaseContainerDepth() - return obj, nil -} - -func BcsDeserializeIBCHeight(input []byte) (IBCHeight, error) { - if input == nil { - var obj IBCHeight - return obj, fmt.Errorf("Cannot deserialize null array") - } - deserializer := bcs.NewDeserializer(input); - obj, err := DeserializeIBCHeight(deserializer) - if err == nil && deserializer.GetBufferOffset() < uint64(len(input)) { - return obj, fmt.Errorf("Some input bytes were not read") - } - return obj, err -} - -type IBCMessage interface { - isIBCMessage() - Serialize(serializer serde.Serializer) error - BcsSerialize() ([]byte, error) -} - -func DeserializeIBCMessage(deserializer serde.Deserializer) (IBCMessage, error) { - index, err := deserializer.DeserializeVariantIndex() - if err != nil { return nil, err } - - switch index { - case 0: - if val, err := load_IBCMessage__Transfer(deserializer); err == nil { - return &val, nil - } else { - return nil, err - } - - case 1: - if val, err := load_IBCMessage__NftTransfer(deserializer); err == nil { - return &val, nil - } else { - return nil, err - } - - case 2: - if val, err := load_IBCMessage__PayFee(deserializer); err == nil { - return &val, nil - } else { - return nil, err - } - - default: - return nil, fmt.Errorf("Unknown variant index for IBCMessage: %d", index) - } -} - -func BcsDeserializeIBCMessage(input []byte) (IBCMessage, error) { - if input == nil { - var obj IBCMessage - return obj, fmt.Errorf("Cannot deserialize null array") - } - deserializer := bcs.NewDeserializer(input); - obj, err := DeserializeIBCMessage(deserializer) - if err == nil && deserializer.GetBufferOffset() < uint64(len(input)) { - return obj, fmt.Errorf("Some input bytes were not read") - } - return obj, err -} - -type IBCMessage__Transfer struct { - SourcePort string - SourceChannel string - Token CosmosCoin - Sender AccountAddress - Receiver string - TimeoutHeight IBCHeight - TimeoutTimestamp uint64 - Memo string -} - -func (*IBCMessage__Transfer) isIBCMessage() {} - -func (obj *IBCMessage__Transfer) Serialize(serializer serde.Serializer) error { - if err := serializer.IncreaseContainerDepth(); err != nil { return err } - serializer.SerializeVariantIndex(0) - if err := serializer.SerializeStr(obj.SourcePort); err != nil { return err } - if err := serializer.SerializeStr(obj.SourceChannel); err != nil { return err } - if err := obj.Token.Serialize(serializer); err != nil { return err } - if err := obj.Sender.Serialize(serializer); err != nil { return err } - if err := serializer.SerializeStr(obj.Receiver); err != nil { return err } - if err := obj.TimeoutHeight.Serialize(serializer); err != nil { return err } - if err := serializer.SerializeU64(obj.TimeoutTimestamp); err != nil { return err } - if err := serializer.SerializeStr(obj.Memo); err != nil { return err } - serializer.DecreaseContainerDepth() - return nil -} - -func (obj *IBCMessage__Transfer) BcsSerialize() ([]byte, error) { - if obj == nil { - return nil, fmt.Errorf("Cannot serialize null object") - } - serializer := bcs.NewSerializer(); - if err := obj.Serialize(serializer); err != nil { return nil, err } - return serializer.GetBytes(), nil -} - -func load_IBCMessage__Transfer(deserializer serde.Deserializer) (IBCMessage__Transfer, error) { - var obj IBCMessage__Transfer - if err := deserializer.IncreaseContainerDepth(); err != nil { return obj, err } - if val, err := deserializer.DeserializeStr(); err == nil { obj.SourcePort = val } else { return obj, err } - if val, err := deserializer.DeserializeStr(); err == nil { obj.SourceChannel = val } else { return obj, err } - if val, err := DeserializeCosmosCoin(deserializer); err == nil { obj.Token = val } else { return obj, err } - if val, err := DeserializeAccountAddress(deserializer); err == nil { obj.Sender = val } else { return obj, err } - if val, err := deserializer.DeserializeStr(); err == nil { obj.Receiver = val } else { return obj, err } - if val, err := DeserializeIBCHeight(deserializer); err == nil { obj.TimeoutHeight = val } else { return obj, err } - if val, err := deserializer.DeserializeU64(); err == nil { obj.TimeoutTimestamp = val } else { return obj, err } - if val, err := deserializer.DeserializeStr(); err == nil { obj.Memo = val } else { return obj, err } - deserializer.DecreaseContainerDepth() - return obj, nil -} - -type IBCMessage__NftTransfer struct { - SourcePort string - SourceChannel string - Collection AccountAddress - TokenIds []string - Sender AccountAddress - Receiver string - TimeoutHeight IBCHeight - TimeoutTimestamp uint64 - Memo string -} - -func (*IBCMessage__NftTransfer) isIBCMessage() {} - -func (obj *IBCMessage__NftTransfer) Serialize(serializer serde.Serializer) error { - if err := serializer.IncreaseContainerDepth(); err != nil { return err } - serializer.SerializeVariantIndex(1) - if err := serializer.SerializeStr(obj.SourcePort); err != nil { return err } - if err := serializer.SerializeStr(obj.SourceChannel); err != nil { return err } - if err := obj.Collection.Serialize(serializer); err != nil { return err } - if err := serialize_vector_str(obj.TokenIds, serializer); err != nil { return err } - if err := obj.Sender.Serialize(serializer); err != nil { return err } - if err := serializer.SerializeStr(obj.Receiver); err != nil { return err } - if err := obj.TimeoutHeight.Serialize(serializer); err != nil { return err } - if err := serializer.SerializeU64(obj.TimeoutTimestamp); err != nil { return err } - if err := serializer.SerializeStr(obj.Memo); err != nil { return err } - serializer.DecreaseContainerDepth() - return nil -} - -func (obj *IBCMessage__NftTransfer) BcsSerialize() ([]byte, error) { - if obj == nil { - return nil, fmt.Errorf("Cannot serialize null object") - } - serializer := bcs.NewSerializer(); - if err := obj.Serialize(serializer); err != nil { return nil, err } - return serializer.GetBytes(), nil -} - -func load_IBCMessage__NftTransfer(deserializer serde.Deserializer) (IBCMessage__NftTransfer, error) { - var obj IBCMessage__NftTransfer - if err := deserializer.IncreaseContainerDepth(); err != nil { return obj, err } - if val, err := deserializer.DeserializeStr(); err == nil { obj.SourcePort = val } else { return obj, err } - if val, err := deserializer.DeserializeStr(); err == nil { obj.SourceChannel = val } else { return obj, err } - if val, err := DeserializeAccountAddress(deserializer); err == nil { obj.Collection = val } else { return obj, err } - if val, err := deserialize_vector_str(deserializer); err == nil { obj.TokenIds = val } else { return obj, err } - if val, err := DeserializeAccountAddress(deserializer); err == nil { obj.Sender = val } else { return obj, err } - if val, err := deserializer.DeserializeStr(); err == nil { obj.Receiver = val } else { return obj, err } - if val, err := DeserializeIBCHeight(deserializer); err == nil { obj.TimeoutHeight = val } else { return obj, err } - if val, err := deserializer.DeserializeU64(); err == nil { obj.TimeoutTimestamp = val } else { return obj, err } - if val, err := deserializer.DeserializeStr(); err == nil { obj.Memo = val } else { return obj, err } - deserializer.DecreaseContainerDepth() - return obj, nil -} - -type IBCMessage__PayFee struct { - Fee IBCFee - SourcePort string - SourceChannel string - Signer AccountAddress -} - -func (*IBCMessage__PayFee) isIBCMessage() {} - -func (obj *IBCMessage__PayFee) Serialize(serializer serde.Serializer) error { - if err := serializer.IncreaseContainerDepth(); err != nil { return err } - serializer.SerializeVariantIndex(2) - if err := obj.Fee.Serialize(serializer); err != nil { return err } - if err := serializer.SerializeStr(obj.SourcePort); err != nil { return err } - if err := serializer.SerializeStr(obj.SourceChannel); err != nil { return err } - if err := obj.Signer.Serialize(serializer); err != nil { return err } - serializer.DecreaseContainerDepth() - return nil -} - -func (obj *IBCMessage__PayFee) BcsSerialize() ([]byte, error) { - if obj == nil { - return nil, fmt.Errorf("Cannot serialize null object") - } - serializer := bcs.NewSerializer(); - if err := obj.Serialize(serializer); err != nil { return nil, err } - return serializer.GetBytes(), nil -} - -func load_IBCMessage__PayFee(deserializer serde.Deserializer) (IBCMessage__PayFee, error) { - var obj IBCMessage__PayFee - if err := deserializer.IncreaseContainerDepth(); err != nil { return obj, err } - if val, err := DeserializeIBCFee(deserializer); err == nil { obj.Fee = val } else { return obj, err } - if val, err := deserializer.DeserializeStr(); err == nil { obj.SourcePort = val } else { return obj, err } - if val, err := deserializer.DeserializeStr(); err == nil { obj.SourceChannel = val } else { return obj, err } - if val, err := DeserializeAccountAddress(deserializer); err == nil { obj.Signer = val } else { return obj, err } - deserializer.DecreaseContainerDepth() - return obj, nil -} - type Identifier string func (obj *Identifier) Serialize(serializer serde.Serializer) error { @@ -1532,141 +1011,6 @@ func BcsDeserializeModuleId(input []byte) (ModuleId, error) { return obj, err } -type MoveMessage interface { - isMoveMessage() - Serialize(serializer serde.Serializer) error - BcsSerialize() ([]byte, error) -} - -func DeserializeMoveMessage(deserializer serde.Deserializer) (MoveMessage, error) { - index, err := deserializer.DeserializeVariantIndex() - if err != nil { return nil, err } - - switch index { - case 0: - if val, err := load_MoveMessage__Execute(deserializer); err == nil { - return &val, nil - } else { - return nil, err - } - - case 1: - if val, err := load_MoveMessage__Script(deserializer); err == nil { - return &val, nil - } else { - return nil, err - } - - default: - return nil, fmt.Errorf("Unknown variant index for MoveMessage: %d", index) - } -} - -func BcsDeserializeMoveMessage(input []byte) (MoveMessage, error) { - if input == nil { - var obj MoveMessage - return obj, fmt.Errorf("Cannot deserialize null array") - } - deserializer := bcs.NewDeserializer(input); - obj, err := DeserializeMoveMessage(deserializer) - if err == nil && deserializer.GetBufferOffset() < uint64(len(input)) { - return obj, fmt.Errorf("Some input bytes were not read") - } - return obj, err -} - -type MoveMessage__Execute struct { - Sender AccountAddress - ModuleAddress AccountAddress - ModuleName string - FunctionName string - TypeArgs []string - Args [][]uint8 - IsJson bool -} - -func (*MoveMessage__Execute) isMoveMessage() {} - -func (obj *MoveMessage__Execute) Serialize(serializer serde.Serializer) error { - if err := serializer.IncreaseContainerDepth(); err != nil { return err } - serializer.SerializeVariantIndex(0) - if err := obj.Sender.Serialize(serializer); err != nil { return err } - if err := obj.ModuleAddress.Serialize(serializer); err != nil { return err } - if err := serializer.SerializeStr(obj.ModuleName); err != nil { return err } - if err := serializer.SerializeStr(obj.FunctionName); err != nil { return err } - if err := serialize_vector_str(obj.TypeArgs, serializer); err != nil { return err } - if err := serialize_vector_vector_u8(obj.Args, serializer); err != nil { return err } - if err := serializer.SerializeBool(obj.IsJson); err != nil { return err } - serializer.DecreaseContainerDepth() - return nil -} - -func (obj *MoveMessage__Execute) BcsSerialize() ([]byte, error) { - if obj == nil { - return nil, fmt.Errorf("Cannot serialize null object") - } - serializer := bcs.NewSerializer(); - if err := obj.Serialize(serializer); err != nil { return nil, err } - return serializer.GetBytes(), nil -} - -func load_MoveMessage__Execute(deserializer serde.Deserializer) (MoveMessage__Execute, error) { - var obj MoveMessage__Execute - if err := deserializer.IncreaseContainerDepth(); err != nil { return obj, err } - if val, err := DeserializeAccountAddress(deserializer); err == nil { obj.Sender = val } else { return obj, err } - if val, err := DeserializeAccountAddress(deserializer); err == nil { obj.ModuleAddress = val } else { return obj, err } - if val, err := deserializer.DeserializeStr(); err == nil { obj.ModuleName = val } else { return obj, err } - if val, err := deserializer.DeserializeStr(); err == nil { obj.FunctionName = val } else { return obj, err } - if val, err := deserialize_vector_str(deserializer); err == nil { obj.TypeArgs = val } else { return obj, err } - if val, err := deserialize_vector_vector_u8(deserializer); err == nil { obj.Args = val } else { return obj, err } - if val, err := deserializer.DeserializeBool(); err == nil { obj.IsJson = val } else { return obj, err } - deserializer.DecreaseContainerDepth() - return obj, nil -} - -type MoveMessage__Script struct { - Sender AccountAddress - CodeBytes []uint8 - TypeArgs []string - Args [][]uint8 - IsJson bool -} - -func (*MoveMessage__Script) isMoveMessage() {} - -func (obj *MoveMessage__Script) Serialize(serializer serde.Serializer) error { - if err := serializer.IncreaseContainerDepth(); err != nil { return err } - serializer.SerializeVariantIndex(1) - if err := obj.Sender.Serialize(serializer); err != nil { return err } - if err := serialize_vector_u8(obj.CodeBytes, serializer); err != nil { return err } - if err := serialize_vector_str(obj.TypeArgs, serializer); err != nil { return err } - if err := serialize_vector_vector_u8(obj.Args, serializer); err != nil { return err } - if err := serializer.SerializeBool(obj.IsJson); err != nil { return err } - serializer.DecreaseContainerDepth() - return nil -} - -func (obj *MoveMessage__Script) BcsSerialize() ([]byte, error) { - if obj == nil { - return nil, fmt.Errorf("Cannot serialize null object") - } - serializer := bcs.NewSerializer(); - if err := obj.Serialize(serializer); err != nil { return nil, err } - return serializer.GetBytes(), nil -} - -func load_MoveMessage__Script(deserializer serde.Deserializer) (MoveMessage__Script, error) { - var obj MoveMessage__Script - if err := deserializer.IncreaseContainerDepth(); err != nil { return obj, err } - if val, err := DeserializeAccountAddress(deserializer); err == nil { obj.Sender = val } else { return obj, err } - if val, err := deserialize_vector_u8(deserializer); err == nil { obj.CodeBytes = val } else { return obj, err } - if val, err := deserialize_vector_str(deserializer); err == nil { obj.TypeArgs = val } else { return obj, err } - if val, err := deserialize_vector_vector_u8(deserializer); err == nil { obj.Args = val } else { return obj, err } - if val, err := deserializer.DeserializeBool(); err == nil { obj.IsJson = val } else { return obj, err } - deserializer.DecreaseContainerDepth() - return obj, nil -} - type ResourceKey struct { Address AccountAddress Type StructTag @@ -1811,179 +1155,6 @@ func BcsDeserializeStakingDelta(input []byte) (StakingDelta, error) { return obj, err } -type StakingMessage interface { - isStakingMessage() - Serialize(serializer serde.Serializer) error - BcsSerialize() ([]byte, error) -} - -func DeserializeStakingMessage(deserializer serde.Deserializer) (StakingMessage, error) { - index, err := deserializer.DeserializeVariantIndex() - if err != nil { return nil, err } - - switch index { - case 0: - if val, err := load_StakingMessage__Delegate(deserializer); err == nil { - return &val, nil - } else { - return nil, err - } - - default: - return nil, fmt.Errorf("Unknown variant index for StakingMessage: %d", index) - } -} - -func BcsDeserializeStakingMessage(input []byte) (StakingMessage, error) { - if input == nil { - var obj StakingMessage - return obj, fmt.Errorf("Cannot deserialize null array") - } - deserializer := bcs.NewDeserializer(input); - obj, err := DeserializeStakingMessage(deserializer) - if err == nil && deserializer.GetBufferOffset() < uint64(len(input)) { - return obj, fmt.Errorf("Some input bytes were not read") - } - return obj, err -} - -type StakingMessage__Delegate struct { - DelegatorAddress AccountAddress - ValidatorAddress string - Amount CosmosCoin -} - -func (*StakingMessage__Delegate) isStakingMessage() {} - -func (obj *StakingMessage__Delegate) Serialize(serializer serde.Serializer) error { - if err := serializer.IncreaseContainerDepth(); err != nil { return err } - serializer.SerializeVariantIndex(0) - if err := obj.DelegatorAddress.Serialize(serializer); err != nil { return err } - if err := serializer.SerializeStr(obj.ValidatorAddress); err != nil { return err } - if err := obj.Amount.Serialize(serializer); err != nil { return err } - serializer.DecreaseContainerDepth() - return nil -} - -func (obj *StakingMessage__Delegate) BcsSerialize() ([]byte, error) { - if obj == nil { - return nil, fmt.Errorf("Cannot serialize null object") - } - serializer := bcs.NewSerializer(); - if err := obj.Serialize(serializer); err != nil { return nil, err } - return serializer.GetBytes(), nil -} - -func load_StakingMessage__Delegate(deserializer serde.Deserializer) (StakingMessage__Delegate, error) { - var obj StakingMessage__Delegate - if err := deserializer.IncreaseContainerDepth(); err != nil { return obj, err } - if val, err := DeserializeAccountAddress(deserializer); err == nil { obj.DelegatorAddress = val } else { return obj, err } - if val, err := deserializer.DeserializeStr(); err == nil { obj.ValidatorAddress = val } else { return obj, err } - if val, err := DeserializeCosmosCoin(deserializer); err == nil { obj.Amount = val } else { return obj, err } - deserializer.DecreaseContainerDepth() - return obj, nil -} - -type StargateCallback struct { - Id uint64 - ModuleAddress AccountAddress - ModuleName string - FunctionName string -} - -func (obj *StargateCallback) Serialize(serializer serde.Serializer) error { - if err := serializer.IncreaseContainerDepth(); err != nil { return err } - if err := serializer.SerializeU64(obj.Id); err != nil { return err } - if err := obj.ModuleAddress.Serialize(serializer); err != nil { return err } - if err := serializer.SerializeStr(obj.ModuleName); err != nil { return err } - if err := serializer.SerializeStr(obj.FunctionName); err != nil { return err } - serializer.DecreaseContainerDepth() - return nil -} - -func (obj *StargateCallback) BcsSerialize() ([]byte, error) { - if obj == nil { - return nil, fmt.Errorf("Cannot serialize null object") - } - serializer := bcs.NewSerializer(); - if err := obj.Serialize(serializer); err != nil { return nil, err } - return serializer.GetBytes(), nil -} - -func DeserializeStargateCallback(deserializer serde.Deserializer) (StargateCallback, error) { - var obj StargateCallback - if err := deserializer.IncreaseContainerDepth(); err != nil { return obj, err } - if val, err := deserializer.DeserializeU64(); err == nil { obj.Id = val } else { return obj, err } - if val, err := DeserializeAccountAddress(deserializer); err == nil { obj.ModuleAddress = val } else { return obj, err } - if val, err := deserializer.DeserializeStr(); err == nil { obj.ModuleName = val } else { return obj, err } - if val, err := deserializer.DeserializeStr(); err == nil { obj.FunctionName = val } else { return obj, err } - deserializer.DecreaseContainerDepth() - return obj, nil -} - -func BcsDeserializeStargateCallback(input []byte) (StargateCallback, error) { - if input == nil { - var obj StargateCallback - return obj, fmt.Errorf("Cannot deserialize null array") - } - deserializer := bcs.NewDeserializer(input); - obj, err := DeserializeStargateCallback(deserializer) - if err == nil && deserializer.GetBufferOffset() < uint64(len(input)) { - return obj, fmt.Errorf("Some input bytes were not read") - } - return obj, err -} - -type StargateMessage struct { - Sender AccountAddress - Data []uint8 - AllowFailure bool - Callback *StargateCallback -} - -func (obj *StargateMessage) Serialize(serializer serde.Serializer) error { - if err := serializer.IncreaseContainerDepth(); err != nil { return err } - if err := obj.Sender.Serialize(serializer); err != nil { return err } - if err := serialize_vector_u8(obj.Data, serializer); err != nil { return err } - if err := serializer.SerializeBool(obj.AllowFailure); err != nil { return err } - if err := serialize_option_StargateCallback(obj.Callback, serializer); err != nil { return err } - serializer.DecreaseContainerDepth() - return nil -} - -func (obj *StargateMessage) BcsSerialize() ([]byte, error) { - if obj == nil { - return nil, fmt.Errorf("Cannot serialize null object") - } - serializer := bcs.NewSerializer(); - if err := obj.Serialize(serializer); err != nil { return nil, err } - return serializer.GetBytes(), nil -} - -func DeserializeStargateMessage(deserializer serde.Deserializer) (StargateMessage, error) { - var obj StargateMessage - if err := deserializer.IncreaseContainerDepth(); err != nil { return obj, err } - if val, err := DeserializeAccountAddress(deserializer); err == nil { obj.Sender = val } else { return obj, err } - if val, err := deserialize_vector_u8(deserializer); err == nil { obj.Data = val } else { return obj, err } - if val, err := deserializer.DeserializeBool(); err == nil { obj.AllowFailure = val } else { return obj, err } - if val, err := deserialize_option_StargateCallback(deserializer); err == nil { obj.Callback = val } else { return obj, err } - deserializer.DecreaseContainerDepth() - return obj, nil -} - -func BcsDeserializeStargateMessage(input []byte) (StargateMessage, error) { - if input == nil { - var obj StargateMessage - return obj, fmt.Errorf("Cannot deserialize null array") - } - deserializer := bcs.NewDeserializer(input); - obj, err := DeserializeStargateMessage(deserializer) - if err == nil && deserializer.GetBufferOffset() < uint64(len(input)) { - return obj, fmt.Errorf("Some input bytes were not read") - } - return obj, err -} - type StructTag struct { Address AccountAddress Module Identifier @@ -2609,7 +1780,7 @@ func deserialize_array32_u8_array(deserializer serde.Deserializer) ([32]uint8, e return obj, nil } -func serialize_option_StargateCallback(value *StargateCallback, serializer serde.Serializer) error { +func serialize_option_CosmosCallback(value *CosmosCallback, serializer serde.Serializer) error { if value != nil { if err := serializer.SerializeOptionTag(true); err != nil { return err } if err := (*value).Serialize(serializer); err != nil { return err } @@ -2619,12 +1790,12 @@ func serialize_option_StargateCallback(value *StargateCallback, serializer serde return nil } -func deserialize_option_StargateCallback(deserializer serde.Deserializer) (*StargateCallback, error) { +func deserialize_option_CosmosCallback(deserializer serde.Deserializer) (*CosmosCallback, error) { tag, err := deserializer.DeserializeOptionTag() if err != nil { return nil, err } if tag { - value := new(StargateCallback) - if val, err := DeserializeStargateCallback(deserializer); err == nil { *value = val } else { return nil, err } + value := new(CosmosCallback) + if val, err := DeserializeCosmosCallback(deserializer); err == nil { *value = val } else { return nil, err } return value, nil } else { return nil, nil @@ -2810,24 +1981,6 @@ func deserialize_vector_bytes(deserializer serde.Deserializer) ([][]byte, error) return obj, nil } -func serialize_vector_str(value []string, serializer serde.Serializer) error { - if err := serializer.SerializeLen(uint64(len(value))); err != nil { return err } - for _, item := range(value) { - if err := serializer.SerializeStr(item); err != nil { return err } - } - return nil -} - -func deserialize_vector_str(deserializer serde.Deserializer) ([]string, error) { - length, err := deserializer.DeserializeLen() - if err != nil { return nil, err } - obj := make([]string, length) - for i := range(obj) { - if val, err := deserializer.DeserializeStr(); err == nil { obj[i] = val } else { return nil, err } - } - return obj, nil -} - func serialize_vector_tuple2_str_AccountAddress(value []struct {Field0 string; Field1 AccountAddress}, serializer serde.Serializer) error { if err := serializer.SerializeLen(uint64(len(value))); err != nil { return err } for _, item := range(value) { @@ -2864,21 +2017,3 @@ func deserialize_vector_u8(deserializer serde.Deserializer) ([]uint8, error) { return obj, nil } -func serialize_vector_vector_u8(value [][]uint8, serializer serde.Serializer) error { - if err := serializer.SerializeLen(uint64(len(value))); err != nil { return err } - for _, item := range(value) { - if err := serialize_vector_u8(item, serializer); err != nil { return err } - } - return nil -} - -func deserialize_vector_vector_u8(deserializer serde.Deserializer) ([][]uint8, error) { - length, err := deserializer.DeserializeLen() - if err != nil { return nil, err } - obj := make([][]uint8, length) - for i := range(obj) { - if val, err := deserialize_vector_u8(deserializer); err == nil { obj[i] = val } else { return nil, err } - } - return obj, nil -} - From 0b8d3de2ef17d575c921b9743ae0c14405a3b194 Mon Sep 17 00:00:00 2001 From: beer-1 Date: Tue, 29 Oct 2024 18:51:40 +0900 Subject: [PATCH 2/6] add test funtion for cosmos --- crates/natives/src/cosmos.rs | 32 +++++++- .../modules/initia_stdlib/sources/bech32.move | 2 +- .../modules/initia_stdlib/sources/cosmos.move | 73 ++++++++++++------- .../sources/crypto/secp256k1.move | 4 +- .../modules/initia_stdlib/sources/json.move | 1 - .../tests/json_module_permission.move | 29 ++++---- .../minitia_stdlib/sources/bech32.move | 2 +- .../minitia_stdlib/sources/cosmos.move | 73 ++++++++++++------- .../sources/crypto/secp256k1.move | 4 +- .../modules/minitia_stdlib/sources/json.move | 1 - .../tests/json_module_permission.move | 29 ++++---- .../modules/move_stdlib/sources/hash.move | 10 +-- 12 files changed, 168 insertions(+), 92 deletions(-) diff --git a/crates/natives/src/cosmos.rs b/crates/natives/src/cosmos.rs index c2902037..185772a2 100644 --- a/crates/natives/src/cosmos.rs +++ b/crates/natives/src/cosmos.rs @@ -80,6 +80,29 @@ fn native_stargate( Ok(smallvec![]) } +#[cfg(feature = "testing")] +fn native_requested_messages( + context: &mut SafeNativeContext, + ty_args: Vec, + _arguments: VecDeque, +) -> SafeNativeResult> { + let gas_params = &context.native_gas_params.initia_stdlib; + context.charge(gas_params.cosmos_stargate_base)?; + + debug_assert!(ty_args.is_empty()); + debug_assert!(_arguments.is_empty()); + + let cosmos_context = context.extensions().get::(); + let messages = cosmos_context + .messages + .borrow() + .clone() + .into_iter() + .map(|m| Value::struct_(Struct::pack(vec![Value::vector_u8(m.data)]))); + + Ok(smallvec![Value::vector_for_testing_only(messages)]) +} + /*************************************************************************************************** * module * @@ -87,7 +110,14 @@ fn native_stargate( pub fn make_all( builder: &SafeNativeBuilder, ) -> impl Iterator + '_ { - let natives = vec![("stargate_internal", native_stargate as RawSafeNative)]; + let mut natives = vec![]; + natives.extend([("stargate_internal", native_stargate as RawSafeNative)]); + + #[cfg(feature = "testing")] + natives.extend([( + "requested_messages", + native_requested_messages as RawSafeNative, + )]); builder.make_named_natives(natives) } diff --git a/precompile/modules/initia_stdlib/sources/bech32.move b/precompile/modules/initia_stdlib/sources/bech32.move index 1ff29a51..69cbb1ea 100644 --- a/precompile/modules/initia_stdlib/sources/bech32.move +++ b/precompile/modules/initia_stdlib/sources/bech32.move @@ -34,4 +34,4 @@ module initia_std::bech32 { assert!(prefix == string::utf8(b"celestia"), 2); assert!(data == x"12eafdba79c3dd7b90e3712ee475423153a722c7", 3); } -} \ No newline at end of file +} diff --git a/precompile/modules/initia_stdlib/sources/cosmos.move b/precompile/modules/initia_stdlib/sources/cosmos.move index 5130bf4a..46faa211 100644 --- a/precompile/modules/initia_stdlib/sources/cosmos.move +++ b/precompile/modules/initia_stdlib/sources/cosmos.move @@ -199,7 +199,7 @@ module initia_std::cosmos { _type_: String, delegator_address: String, validator_address: String, - amount: vector, + amount: vector } struct CosmosCoin has copy, drop { @@ -220,12 +220,7 @@ module initia_std::cosmos { _type_: string::utf8(b"/initia.mstaking.v1.MsgDelegate"), delegator_address: address::to_sdk(signer::address_of(delegator)), validator_address: validator, - amount: vector[ - CosmosCoin { - denom: metadata_to_denom(metadata), - amount - } - ] + amount: vector[CosmosCoin { denom: metadata_to_denom(metadata), amount }] } ) ) @@ -244,14 +239,11 @@ module initia_std::cosmos { sender, json::marshal( &FuncCommunityPoolRequest { - _type_: string::utf8(b"/cosmos.distribution.v1beta1.MsgFundCommunityPool"), + _type_: string::utf8( + b"/cosmos.distribution.v1beta1.MsgFundCommunityPool" + ), depositor: address::to_sdk(signer::address_of(sender)), - amount: vector[ - CosmosCoin { - denom: metadata_to_denom(metadata), - amount - } - ] + amount: vector[CosmosCoin { denom: metadata_to_denom(metadata), amount }] } ) ) @@ -301,10 +293,7 @@ module initia_std::cosmos { denom: metadata_to_denom(metadata), amount: token_amount }, - timeout_height: TimeoutHeight { - revision_number, - revision_height - }, + timeout_height: TimeoutHeight { revision_number, revision_height }, timeout_timestamp, memo } @@ -322,7 +311,7 @@ module initia_std::cosmos { source_channel: String, timeout_height: TimeoutHeight, timeout_timestamp: u64, - memo: String, + memo: String } /// ICS721 ibc nft_transfer @@ -350,10 +339,7 @@ module initia_std::cosmos { token_ids, source_port, source_channel, - timeout_height: TimeoutHeight { - revision_number, - revision_height - }, + timeout_height: TimeoutHeight { revision_number, revision_height }, timeout_timestamp, memo } @@ -364,7 +350,7 @@ module initia_std::cosmos { struct Fee has copy, drop { recv_fee: vector, ack_fee: vector, - timeout_fee: vector, + timeout_fee: vector } struct PayFeeRequest has copy, drop { @@ -373,7 +359,7 @@ module initia_std::cosmos { source_port: String, source_channel: String, fee: Fee, - relayers: vector, + relayers: vector } /// ICS29 ibc relayer fee @@ -415,7 +401,7 @@ module initia_std::cosmos { denom: metadata_to_denom(timeout_fee_metadata), amount: timeout_fee_amount } - ], + ] }, relayers: vector::empty() } @@ -427,6 +413,15 @@ module initia_std::cosmos { sender: address, data: vector, option: Options ); + #[test_only] + native public fun requested_messages(): vector; + + #[test_only] + public fun was_message_requested(msg: &String): bool { + use std::vector; + vector::contains(&requested_messages(), msg) + } + // ================================================== Options ================================================= /// Options for stargate message @@ -492,4 +487,30 @@ module initia_std::cosmos { callback_fid: *string::bytes(&fid) } } + + //=========================================== Tests =========================================== + + #[test(sender = @0xcafe)] + public fun test_stargate_vote(sender: &signer) { + use std::string::utf8; + + let voter = utf8(b"voter"); + let proposal_id = 1; + let option = 1; + let metadata = utf8(b"metadata"); + stargate_vote(sender, proposal_id, voter, option, metadata); + + let msg = + json::marshal_to_string( + &VoteRequest { + _type_: utf8(b"/cosmos.gov.v1.MsgVote"), + proposal_id, + voter: voter, + option, + metadata: metadata + } + ); + + assert!(was_message_requested(&msg), 1); + } } diff --git a/precompile/modules/initia_stdlib/sources/crypto/secp256k1.move b/precompile/modules/initia_stdlib/sources/crypto/secp256k1.move index 38c8cebe..a9efb993 100644 --- a/precompile/modules/initia_stdlib/sources/crypto/secp256k1.move +++ b/precompile/modules/initia_stdlib/sources/crypto/secp256k1.move @@ -204,7 +204,9 @@ module initia_std::secp256k1 { // Test with an incorrect signature let invalid_sig_bytes = sig_bytes; - *std::vector::borrow_mut(&mut invalid_sig_bytes, 0) = *std::vector::borrow(&invalid_sig_bytes, 0) ^ 0x1; // Corrupt the signature + *std::vector::borrow_mut(&mut invalid_sig_bytes, 0) = *std::vector::borrow( + &invalid_sig_bytes, 0 + ) ^ 0x1; // Corrupt the signature let invalid_sig = ecdsa_signature_from_bytes(invalid_sig_bytes); assert!(!verify(msg, &pk, &invalid_sig), 3); } diff --git a/precompile/modules/initia_stdlib/sources/json.move b/precompile/modules/initia_stdlib/sources/json.move index 6e597f36..dde31e8c 100644 --- a/precompile/modules/initia_stdlib/sources/json.move +++ b/precompile/modules/initia_stdlib/sources/json.move @@ -252,7 +252,6 @@ module initia_std::json { ); } - #[test_only] use std::object::{Self, ConstructorRef}; diff --git a/precompile/modules/initia_stdlib/tests/json_module_permission.move b/precompile/modules/initia_stdlib/tests/json_module_permission.move index da8a5a11..1257c734 100644 --- a/precompile/modules/initia_stdlib/tests/json_module_permission.move +++ b/precompile/modules/initia_stdlib/tests/json_module_permission.move @@ -6,28 +6,28 @@ module 0xcafe::json_module_permission_tests { use std::vector; struct MyStruct has drop { - a: u64, + a: u64 } struct HoldByOptionMyStruct has drop { - a: Option, + a: Option } struct HoldByVectorMyStruct has drop { - a: vector, + a: vector } struct HoldByOption has drop { - a: Option, + a: Option } struct HoldByVector has drop { - a: vector, + a: vector } #[test] public fun test_valid_creation() { - let my_struct = MyStruct{a: 10}; + let my_struct = MyStruct { a: 10 }; let bz = json::marshal(&my_struct); let my_struct2 = json::unmarshal(bz); @@ -37,8 +37,8 @@ module 0xcafe::json_module_permission_tests { #[test] public fun test_valid_creation_with_option() { - let my_struct = MyStruct{a: 10}; - let opt = HoldByOptionMyStruct{a: option::some(my_struct)}; + let my_struct = MyStruct { a: 10 }; + let opt = HoldByOptionMyStruct { a: option::some(my_struct) }; let bz = json::marshal(&opt); let opt2 = json::unmarshal(bz); @@ -48,13 +48,16 @@ module 0xcafe::json_module_permission_tests { #[test] public fun test_valid_creation_with_vector() { - let my_struct = MyStruct{a: 10}; - let opt = HoldByVectorMyStruct{a: vector[my_struct]}; + let my_struct = MyStruct { a: 10 }; + let opt = HoldByVectorMyStruct { a: vector[my_struct] }; let bz = json::marshal(&opt); let opt2 = json::unmarshal(bz); - assert!(vector::borrow(&opt.a, 0).a == vector::borrow(&opt2.a, 0).a, 1); + assert!( + vector::borrow(&opt.a, 0).a == vector::borrow(&opt2.a, 0).a, + 1 + ); } #[test] @@ -71,7 +74,7 @@ module 0xcafe::json_module_permission_tests { #[expected_failure(abort_code = 0x10006, location = 0x1::json)] public fun test_violate_module_permission_rule_with_option() { let ref = object::create_object(@std, true); - let opt = HoldByOption{a: option::some(ref)}; + let opt = HoldByOption { a: option::some(ref) }; let bz = json::marshal(&opt); // cannot create ConstructorRef from the other module. @@ -82,7 +85,7 @@ module 0xcafe::json_module_permission_tests { #[expected_failure(abort_code = 0x10006, location = 0x1::json)] public fun test_violate_module_permission_rule_with_vector() { let ref = object::create_object(@std, true); - let opt = HoldByVector{a: vector[ref]}; + let opt = HoldByVector { a: vector[ref] }; let bz = json::marshal(&opt); // cannot create ConstructorRef from the other module. diff --git a/precompile/modules/minitia_stdlib/sources/bech32.move b/precompile/modules/minitia_stdlib/sources/bech32.move index 0fa6da87..a17ba8dd 100644 --- a/precompile/modules/minitia_stdlib/sources/bech32.move +++ b/precompile/modules/minitia_stdlib/sources/bech32.move @@ -34,4 +34,4 @@ module minitia_std::bech32 { assert!(prefix == string::utf8(b"celestia"), 2); assert!(data == x"12eafdba79c3dd7b90e3712ee475423153a722c7", 3); } -} \ No newline at end of file +} diff --git a/precompile/modules/minitia_stdlib/sources/cosmos.move b/precompile/modules/minitia_stdlib/sources/cosmos.move index 6bbead19..045b61ec 100644 --- a/precompile/modules/minitia_stdlib/sources/cosmos.move +++ b/precompile/modules/minitia_stdlib/sources/cosmos.move @@ -199,7 +199,7 @@ module minitia_std::cosmos { _type_: String, delegator_address: String, validator_address: String, - amount: vector, + amount: vector } struct CosmosCoin has copy, drop { @@ -220,12 +220,7 @@ module minitia_std::cosmos { _type_: string::utf8(b"/initia.mstaking.v1.MsgDelegate"), delegator_address: address::to_sdk(signer::address_of(delegator)), validator_address: validator, - amount: vector[ - CosmosCoin { - denom: metadata_to_denom(metadata), - amount - } - ] + amount: vector[CosmosCoin { denom: metadata_to_denom(metadata), amount }] } ) ) @@ -244,14 +239,11 @@ module minitia_std::cosmos { sender, json::marshal( &FuncCommunityPoolRequest { - _type_: string::utf8(b"/cosmos.distribution.v1beta1.MsgFundCommunityPool"), + _type_: string::utf8( + b"/cosmos.distribution.v1beta1.MsgFundCommunityPool" + ), depositor: address::to_sdk(signer::address_of(sender)), - amount: vector[ - CosmosCoin { - denom: metadata_to_denom(metadata), - amount - } - ] + amount: vector[CosmosCoin { denom: metadata_to_denom(metadata), amount }] } ) ) @@ -301,10 +293,7 @@ module minitia_std::cosmos { denom: metadata_to_denom(metadata), amount: token_amount }, - timeout_height: TimeoutHeight { - revision_number, - revision_height - }, + timeout_height: TimeoutHeight { revision_number, revision_height }, timeout_timestamp, memo } @@ -322,7 +311,7 @@ module minitia_std::cosmos { source_channel: String, timeout_height: TimeoutHeight, timeout_timestamp: u64, - memo: String, + memo: String } /// ICS721 ibc nft_transfer @@ -350,10 +339,7 @@ module minitia_std::cosmos { token_ids, source_port, source_channel, - timeout_height: TimeoutHeight { - revision_number, - revision_height - }, + timeout_height: TimeoutHeight { revision_number, revision_height }, timeout_timestamp, memo } @@ -364,7 +350,7 @@ module minitia_std::cosmos { struct Fee has copy, drop { recv_fee: vector, ack_fee: vector, - timeout_fee: vector, + timeout_fee: vector } struct PayFeeRequest has copy, drop { @@ -373,7 +359,7 @@ module minitia_std::cosmos { source_port: String, source_channel: String, fee: Fee, - relayers: vector, + relayers: vector } /// ICS29 ibc relayer fee @@ -415,7 +401,7 @@ module minitia_std::cosmos { denom: metadata_to_denom(timeout_fee_metadata), amount: timeout_fee_amount } - ], + ] }, relayers: vector::empty() } @@ -427,6 +413,15 @@ module minitia_std::cosmos { sender: address, data: vector, option: Options ); + #[test_only] + native public fun requested_messages(): vector; + + #[test_only] + public fun was_message_requested(msg: &String): bool { + use std::vector; + vector::contains(&requested_messages(), msg) + } + // ================================================== Options ================================================= /// Options for stargate message @@ -492,4 +487,30 @@ module minitia_std::cosmos { callback_fid: *string::bytes(&fid) } } + + //=========================================== Tests =========================================== + + #[test(sender = @0xcafe)] + public fun test_stargate_vote(sender: &signer) { + use std::string::utf8; + + let voter = utf8(b"voter"); + let proposal_id = 1; + let option = 1; + let metadata = utf8(b"metadata"); + stargate_vote(sender, proposal_id, voter, option, metadata); + + let msg = + json::marshal_to_string( + &VoteRequest { + _type_: utf8(b"/cosmos.gov.v1.MsgVote"), + proposal_id, + voter: voter, + option, + metadata: metadata + } + ); + + assert!(was_message_requested(&msg), 1); + } } diff --git a/precompile/modules/minitia_stdlib/sources/crypto/secp256k1.move b/precompile/modules/minitia_stdlib/sources/crypto/secp256k1.move index 703d58df..a9f97939 100644 --- a/precompile/modules/minitia_stdlib/sources/crypto/secp256k1.move +++ b/precompile/modules/minitia_stdlib/sources/crypto/secp256k1.move @@ -204,7 +204,9 @@ module minitia_std::secp256k1 { // Test with an incorrect signature let invalid_sig_bytes = sig_bytes; - *std::vector::borrow_mut(&mut invalid_sig_bytes, 0) = *std::vector::borrow(&invalid_sig_bytes, 0) ^ 0x1; // Corrupt the signature + *std::vector::borrow_mut(&mut invalid_sig_bytes, 0) = *std::vector::borrow( + &invalid_sig_bytes, 0 + ) ^ 0x1; // Corrupt the signature let invalid_sig = ecdsa_signature_from_bytes(invalid_sig_bytes); assert!(!verify(msg, &pk, &invalid_sig), 3); } diff --git a/precompile/modules/minitia_stdlib/sources/json.move b/precompile/modules/minitia_stdlib/sources/json.move index bae8792a..2bc9db6b 100644 --- a/precompile/modules/minitia_stdlib/sources/json.move +++ b/precompile/modules/minitia_stdlib/sources/json.move @@ -252,7 +252,6 @@ module minitia_std::json { ); } - #[test_only] use std::object::{Self, ConstructorRef}; diff --git a/precompile/modules/minitia_stdlib/tests/json_module_permission.move b/precompile/modules/minitia_stdlib/tests/json_module_permission.move index da8a5a11..1257c734 100644 --- a/precompile/modules/minitia_stdlib/tests/json_module_permission.move +++ b/precompile/modules/minitia_stdlib/tests/json_module_permission.move @@ -6,28 +6,28 @@ module 0xcafe::json_module_permission_tests { use std::vector; struct MyStruct has drop { - a: u64, + a: u64 } struct HoldByOptionMyStruct has drop { - a: Option, + a: Option } struct HoldByVectorMyStruct has drop { - a: vector, + a: vector } struct HoldByOption has drop { - a: Option, + a: Option } struct HoldByVector has drop { - a: vector, + a: vector } #[test] public fun test_valid_creation() { - let my_struct = MyStruct{a: 10}; + let my_struct = MyStruct { a: 10 }; let bz = json::marshal(&my_struct); let my_struct2 = json::unmarshal(bz); @@ -37,8 +37,8 @@ module 0xcafe::json_module_permission_tests { #[test] public fun test_valid_creation_with_option() { - let my_struct = MyStruct{a: 10}; - let opt = HoldByOptionMyStruct{a: option::some(my_struct)}; + let my_struct = MyStruct { a: 10 }; + let opt = HoldByOptionMyStruct { a: option::some(my_struct) }; let bz = json::marshal(&opt); let opt2 = json::unmarshal(bz); @@ -48,13 +48,16 @@ module 0xcafe::json_module_permission_tests { #[test] public fun test_valid_creation_with_vector() { - let my_struct = MyStruct{a: 10}; - let opt = HoldByVectorMyStruct{a: vector[my_struct]}; + let my_struct = MyStruct { a: 10 }; + let opt = HoldByVectorMyStruct { a: vector[my_struct] }; let bz = json::marshal(&opt); let opt2 = json::unmarshal(bz); - assert!(vector::borrow(&opt.a, 0).a == vector::borrow(&opt2.a, 0).a, 1); + assert!( + vector::borrow(&opt.a, 0).a == vector::borrow(&opt2.a, 0).a, + 1 + ); } #[test] @@ -71,7 +74,7 @@ module 0xcafe::json_module_permission_tests { #[expected_failure(abort_code = 0x10006, location = 0x1::json)] public fun test_violate_module_permission_rule_with_option() { let ref = object::create_object(@std, true); - let opt = HoldByOption{a: option::some(ref)}; + let opt = HoldByOption { a: option::some(ref) }; let bz = json::marshal(&opt); // cannot create ConstructorRef from the other module. @@ -82,7 +85,7 @@ module 0xcafe::json_module_permission_tests { #[expected_failure(abort_code = 0x10006, location = 0x1::json)] public fun test_violate_module_permission_rule_with_vector() { let ref = object::create_object(@std, true); - let opt = HoldByVector{a: vector[ref]}; + let opt = HoldByVector { a: vector[ref] }; let bz = json::marshal(&opt); // cannot create ConstructorRef from the other module. diff --git a/precompile/modules/move_stdlib/sources/hash.move b/precompile/modules/move_stdlib/sources/hash.move index 3fdc07fd..0685856a 100644 --- a/precompile/modules/move_stdlib/sources/hash.move +++ b/precompile/modules/move_stdlib/sources/hash.move @@ -9,15 +9,12 @@ module std::hash { #[test] fun ripemd160_test() { - let inputs = vector[ - b"testing", - b"", - ]; + let inputs = vector[b"testing", b""]; // From https://www.browserling.com/tools/ripemd160-hash let outputs = vector[ - x"b89ba156b40bed29a5965684b7d244c49a3a769b", - x"9c1185a5c5e9fc54612808977ee8f548b2258d31", + x"b89ba156b40bed29a5965684b7d244c49a3a769b", + x"9c1185a5c5e9fc54612808977ee8f548b2258d31" ]; let i = 0; @@ -32,4 +29,3 @@ module std::hash { }; } } - From 09ccc6dfc8ee66ecb6e9412d9336bed3738433c4 Mon Sep 17 00:00:00 2001 From: beer-1 Date: Tue, 29 Oct 2024 19:15:14 +0900 Subject: [PATCH 3/6] fix lint --- crates/e2e-move-tests/src/tests/cosmos.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/crates/e2e-move-tests/src/tests/cosmos.rs b/crates/e2e-move-tests/src/tests/cosmos.rs index db6824ba..09a7cf1f 100644 --- a/crates/e2e-move-tests/src/tests/cosmos.rs +++ b/crates/e2e-move-tests/src/tests/cosmos.rs @@ -244,7 +244,7 @@ fn test_cosmos_transfer() { None, None, Some(vec![CosmosMessage { - sender: sender, + sender, data: expected_data.into_bytes(), allow_failure: false, callback: None, @@ -316,7 +316,7 @@ fn test_cosmos_nft_transfer() { None, None, Some(vec![CosmosMessage { - sender: sender, + sender, data: expected_data.into_bytes(), allow_failure: false, callback: None, @@ -415,7 +415,7 @@ fn test_cosmos_pay_fee() { None, None, Some(vec![CosmosMessage { - sender: sender, + sender, data: expected_data.into_bytes(), allow_failure: false, callback: None, @@ -461,7 +461,7 @@ fn test_cosmos_move_execute() { None, None, Some(vec![CosmosMessage { - sender: sender, + sender, data: expected_data.into_bytes(), allow_failure: false, callback: None, @@ -505,7 +505,7 @@ fn test_cosmos_move_execute_with_json() { None, None, Some(vec![CosmosMessage { - sender: sender, + sender, data: expected_data.into_bytes(), allow_failure: false, callback: None, @@ -548,7 +548,7 @@ fn test_cosmos_move_script() { None, None, Some(vec![CosmosMessage { - sender: sender, + sender, data: expected_data.into_bytes(), allow_failure: false, callback: None, @@ -589,7 +589,7 @@ fn test_cosmos_move_script_with_json() { None, None, Some(vec![CosmosMessage { - sender: sender, + sender, data: expected_data.into_bytes(), allow_failure: false, callback: None, From 3a1b74eaea8723644bee8a48bbb7821907e05cb0 Mon Sep 17 00:00:00 2001 From: beer-1 Date: Tue, 29 Oct 2024 19:18:52 +0900 Subject: [PATCH 4/6] prevent error at print --- crates/types/src/cosmos.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/crates/types/src/cosmos.rs b/crates/types/src/cosmos.rs index 704ff820..302efc0c 100644 --- a/crates/types/src/cosmos.rs +++ b/crates/types/src/cosmos.rs @@ -33,7 +33,10 @@ impl Debug for CosmosMessage { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("CosmosMessage") .field("sender", &self.sender) - .field("data", &str::from_utf8(&self.data).unwrap()) + .field( + "data", + &str::from_utf8(&self.data).unwrap_or(""), + ) .field("allow_failure", &self.allow_failure) .field("callback", &self.callback) .finish() From cade85113b11be1091cb4e908fb30812d16addee Mon Sep 17 00:00:00 2001 From: beer-1 Date: Tue, 29 Oct 2024 19:39:59 +0900 Subject: [PATCH 5/6] fix to print canonical string --- crates/types/src/cosmos.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/types/src/cosmos.rs b/crates/types/src/cosmos.rs index 302efc0c..875fbd46 100644 --- a/crates/types/src/cosmos.rs +++ b/crates/types/src/cosmos.rs @@ -32,7 +32,7 @@ pub struct CosmosMessage { impl Debug for CosmosMessage { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("CosmosMessage") - .field("sender", &self.sender) + .field("sender", &self.sender.to_canonical_string()) .field( "data", &str::from_utf8(&self.data).unwrap_or(""), From e4843328b6f3bc3a7ee87b87b35b8bcd8cba4117 Mon Sep 17 00:00:00 2001 From: beer-1 Date: Tue, 29 Oct 2024 20:08:35 +0900 Subject: [PATCH 6/6] fix test --- crates/e2e-move-tests/src/tests/cosmos.rs | 6 ++++-- crates/types/src/cosmos.rs | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/crates/e2e-move-tests/src/tests/cosmos.rs b/crates/e2e-move-tests/src/tests/cosmos.rs index 09a7cf1f..f0c1d2fb 100644 --- a/crates/e2e-move-tests/src/tests/cosmos.rs +++ b/crates/e2e-move-tests/src/tests/cosmos.rs @@ -441,9 +441,10 @@ fn test_cosmos_move_execute() { let arg1_hex = hex::encode(arg1.clone()); let arg2_hex = hex::encode(arg2.clone()); + let module_addr_hex = module_address.to_hex_literal(); let sender_cosmos_addr = bech32::encode::(Hrp::parse_unchecked("init"), &sender.into_bytes()).unwrap(); - let expected_data = format!("{{\"@type\":\"/initia.move.v1.MsgExecute\",\"args\":[\"{arg1_hex}\",\"{arg2_hex}\"],\"function_name\":\"{function_name}\",\"module_address\":\"{module_address}\",\"module_name\":\"{module_name}\",\"sender\":\"{sender_cosmos_addr}\",\"type_args\":[\"{type_arg1}\",\"{type_arg2}\"]}}"); + let expected_data = format!("{{\"@type\":\"/initia.move.v1.MsgExecute\",\"args\":[\"{arg1_hex}\",\"{arg2_hex}\"],\"function_name\":\"{function_name}\",\"module_address\":\"{module_addr_hex}\",\"module_name\":\"{module_name}\",\"sender\":\"{sender_cosmos_addr}\",\"type_args\":[\"{type_arg1}\",\"{type_arg2}\"]}}"); let test_move_execute = ( sender, @@ -487,7 +488,8 @@ fn test_cosmos_move_execute_with_json() { let sender_cosmos_addr = bech32::encode::(Hrp::parse_unchecked("init"), &sender.into_bytes()).unwrap(); - let expected_data = format!("{{\"@type\":\"/initia.move.v1.MsgExecuteJSON\",\"args\":[\"\\\"hello\\\"\",\"\\\"world\\\"\"],\"function_name\":\"{function_name}\",\"module_address\":\"{module_address}\",\"module_name\":\"{module_name}\",\"sender\":\"{sender_cosmos_addr}\",\"type_args\":[\"{type_arg1}\",\"{type_arg2}\"]}}"); + let module_addr_hex = module_address.to_hex_literal(); + let expected_data = format!("{{\"@type\":\"/initia.move.v1.MsgExecuteJSON\",\"args\":[\"\\\"hello\\\"\",\"\\\"world\\\"\"],\"function_name\":\"{function_name}\",\"module_address\":\"{module_addr_hex}\",\"module_name\":\"{module_name}\",\"sender\":\"{sender_cosmos_addr}\",\"type_args\":[\"{type_arg1}\",\"{type_arg2}\"]}}"); let test_move_execute = ( sender, diff --git a/crates/types/src/cosmos.rs b/crates/types/src/cosmos.rs index 875fbd46..debb1459 100644 --- a/crates/types/src/cosmos.rs +++ b/crates/types/src/cosmos.rs @@ -32,7 +32,7 @@ pub struct CosmosMessage { impl Debug for CosmosMessage { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("CosmosMessage") - .field("sender", &self.sender.to_canonical_string()) + .field("sender", &self.sender.to_standard_string()) .field( "data", &str::from_utf8(&self.data).unwrap_or(""),