From 7083154fe0e90ddaf79e697f89f88d8cc37449c0 Mon Sep 17 00:00:00 2001 From: Michael Eberhardt Date: Tue, 27 Feb 2024 12:09:57 +0000 Subject: [PATCH] chore: restructure pallet part 1, unit tests and internal mockup --- src/lib.rs | 10 +- {tests => src}/mock.rs | 79 ++- src/tests.rs | 10 + src/tests/address.rs | 86 +++ .../assets/move-projects/balance/Move.toml | 0 .../balance/sources/Scripts.move | 0 .../move-projects/car-wash-example/Move.toml | 0 .../car-wash-example/build_all.sh | 0 .../move-projects/car-wash-example/hints.md | 0 .../car-wash-example/scripts/Scripts.move | 0 .../car-wash-example/sources/CarWash.move | 0 .../move-projects/get-resource/Move.toml | 0 .../get-resource/scripts/Count.move | 0 .../get-resource/scripts/CreateCounter.move | 0 .../get-resource/sources/Counter.move | 0 .../move-projects/move-basics/Move.toml | 0 .../move-basics/scripts/Generics.move | 0 .../move-basics/scripts/Loops.move | 0 .../move-basics/scripts/empty.move | 0 .../move-basics/sources/Empty.move | 0 .../move-basics/sources/EmptyBob.move | 0 .../move-projects/multiple-signers/Move.toml | 0 .../move-projects/multiple-signers/build.sh | 0 .../multiple-signers/estimate.sh | 0 .../multiple-signers/sources/Dorm.move | 0 .../multiple-signers/sources/Scripts.move | 0 .../move-projects/signer-scripts/Move.toml | 0 .../signer-scripts/sources/General.move | 0 .../signer-scripts/sources/Generics.move | 0 .../signer-scripts/sources/HelperModule.move | 0 .../signer-scripts/sources/Vectors.move | 0 .../assets/move-projects/smove-build-all.sh | 0 .../assets/move-projects/smove-clean-all.sh | 0 .../testing-move-stdlib/Move.toml | 0 .../testing-move-stdlib/README.md | 0 .../testing-move-stdlib/sources/ascii.move | 0 .../testing-move-stdlib/sources/bcs.move | 0 .../sources/bit_vector.move | 0 .../testing-move-stdlib/sources/error.move | 0 .../sources/fixed_point32.move | 0 .../testing-move-stdlib/sources/hash.move | 0 .../testing-move-stdlib/sources/option.move | 0 .../testing-move-stdlib/sources/signer.move | 0 .../testing-move-stdlib/sources/string.move | 0 .../sources/type_name.move | 0 .../sources/unit_test.move | 0 .../testing-move-stdlib/sources/vector.move | 0 .../testing-substrate-stdlib/Move.toml | 0 .../testing-substrate-stdlib/README.md | 0 .../sources/balance.move | 0 .../using_stdlib_natives/Move.toml | 0 .../sources/DependsOnVector.move | 0 .../using_stdlib_natives/sources/Vector.move | 0 src/tests/balance.rs | 489 ++++++++++++++++++ {tests => src/tests}/example.rs | 4 +- {tests => src/tests}/execute.rs | 10 +- {tests => src/tests}/modules.rs | 4 +- {tests => src/tests}/publish.rs | 6 +- {tests => src/tests}/signer.rs | 17 +- {tests => src/tests}/update_stdlib.rs | 24 +- tests/address.rs | 92 ---- tests/assets.rs | 35 -- tests/balance.rs | 399 -------------- 63 files changed, 669 insertions(+), 596 deletions(-) rename {tests => src}/mock.rs (78%) create mode 100644 src/tests.rs create mode 100644 src/tests/address.rs rename {tests => src/tests}/assets/move-projects/balance/Move.toml (100%) rename {tests => src/tests}/assets/move-projects/balance/sources/Scripts.move (100%) rename {tests => src/tests}/assets/move-projects/car-wash-example/Move.toml (100%) rename {tests => src/tests}/assets/move-projects/car-wash-example/build_all.sh (100%) rename {tests => src/tests}/assets/move-projects/car-wash-example/hints.md (100%) rename {tests => src/tests}/assets/move-projects/car-wash-example/scripts/Scripts.move (100%) rename {tests => src/tests}/assets/move-projects/car-wash-example/sources/CarWash.move (100%) rename {tests => src/tests}/assets/move-projects/get-resource/Move.toml (100%) rename {tests => src/tests}/assets/move-projects/get-resource/scripts/Count.move (100%) rename {tests => src/tests}/assets/move-projects/get-resource/scripts/CreateCounter.move (100%) rename {tests => src/tests}/assets/move-projects/get-resource/sources/Counter.move (100%) rename {tests => src/tests}/assets/move-projects/move-basics/Move.toml (100%) rename {tests => src/tests}/assets/move-projects/move-basics/scripts/Generics.move (100%) rename {tests => src/tests}/assets/move-projects/move-basics/scripts/Loops.move (100%) rename {tests => src/tests}/assets/move-projects/move-basics/scripts/empty.move (100%) rename {tests => src/tests}/assets/move-projects/move-basics/sources/Empty.move (100%) rename {tests => src/tests}/assets/move-projects/move-basics/sources/EmptyBob.move (100%) rename {tests => src/tests}/assets/move-projects/multiple-signers/Move.toml (100%) rename {tests => src/tests}/assets/move-projects/multiple-signers/build.sh (100%) rename {tests => src/tests}/assets/move-projects/multiple-signers/estimate.sh (100%) rename {tests => src/tests}/assets/move-projects/multiple-signers/sources/Dorm.move (100%) rename {tests => src/tests}/assets/move-projects/multiple-signers/sources/Scripts.move (100%) rename {tests => src/tests}/assets/move-projects/signer-scripts/Move.toml (100%) rename {tests => src/tests}/assets/move-projects/signer-scripts/sources/General.move (100%) rename {tests => src/tests}/assets/move-projects/signer-scripts/sources/Generics.move (100%) rename {tests => src/tests}/assets/move-projects/signer-scripts/sources/HelperModule.move (100%) rename {tests => src/tests}/assets/move-projects/signer-scripts/sources/Vectors.move (100%) rename {tests => src/tests}/assets/move-projects/smove-build-all.sh (100%) rename {tests => src/tests}/assets/move-projects/smove-clean-all.sh (100%) rename {tests => src/tests}/assets/move-projects/testing-move-stdlib/Move.toml (100%) rename {tests => src/tests}/assets/move-projects/testing-move-stdlib/README.md (100%) rename {tests => src/tests}/assets/move-projects/testing-move-stdlib/sources/ascii.move (100%) rename {tests => src/tests}/assets/move-projects/testing-move-stdlib/sources/bcs.move (100%) rename {tests => src/tests}/assets/move-projects/testing-move-stdlib/sources/bit_vector.move (100%) rename {tests => src/tests}/assets/move-projects/testing-move-stdlib/sources/error.move (100%) rename {tests => src/tests}/assets/move-projects/testing-move-stdlib/sources/fixed_point32.move (100%) rename {tests => src/tests}/assets/move-projects/testing-move-stdlib/sources/hash.move (100%) rename {tests => src/tests}/assets/move-projects/testing-move-stdlib/sources/option.move (100%) rename {tests => src/tests}/assets/move-projects/testing-move-stdlib/sources/signer.move (100%) rename {tests => src/tests}/assets/move-projects/testing-move-stdlib/sources/string.move (100%) rename {tests => src/tests}/assets/move-projects/testing-move-stdlib/sources/type_name.move (100%) rename {tests => src/tests}/assets/move-projects/testing-move-stdlib/sources/unit_test.move (100%) rename {tests => src/tests}/assets/move-projects/testing-move-stdlib/sources/vector.move (100%) rename {tests => src/tests}/assets/move-projects/testing-substrate-stdlib/Move.toml (100%) rename {tests => src/tests}/assets/move-projects/testing-substrate-stdlib/README.md (100%) rename {tests => src/tests}/assets/move-projects/testing-substrate-stdlib/sources/balance.move (100%) rename {tests => src/tests}/assets/move-projects/using_stdlib_natives/Move.toml (100%) rename {tests => src/tests}/assets/move-projects/using_stdlib_natives/sources/DependsOnVector.move (100%) rename {tests => src/tests}/assets/move-projects/using_stdlib_natives/sources/Vector.move (100%) create mode 100644 src/tests/balance.rs rename {tests => src/tests}/example.rs (99%) rename {tests => src/tests}/execute.rs (98%) rename {tests => src/tests}/modules.rs (98%) rename {tests => src/tests}/publish.rs (99%) rename {tests => src/tests}/signer.rs (96%) rename {tests => src/tests}/update_stdlib.rs (88%) delete mode 100644 tests/address.rs delete mode 100644 tests/assets.rs delete mode 100644 tests/balance.rs diff --git a/src/lib.rs b/src/lib.rs index 7e6bd79..172e5dd 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,14 +3,16 @@ pub use pallet::*; pub use weights::*; +pub mod balance; #[cfg(feature = "runtime-benchmarks")] mod benchmarking; - -pub mod balance; +#[cfg(any(test, feature = "runtime-benchmarks"))] +mod mock; +mod result; mod signer; mod storage; - -mod result; +#[cfg(test)] +mod tests; pub mod weights; // The pallet is defined below. diff --git a/tests/mock.rs b/src/mock.rs similarity index 78% rename from tests/mock.rs rename to src/mock.rs index cd41f5b..97b0c53 100644 --- a/tests/mock.rs +++ b/src/mock.rs @@ -1,3 +1,7 @@ +//! Crate internal mockup for unit tests. + +use crate as pallet_move; + use frame_support::traits::{ConstU128, ConstU16, ConstU32, ConstU64}; use move_core_types::account_address::AccountAddress; use sp_core::{crypto::Ss58Codec, sr25519::Public, H256}; @@ -62,8 +66,17 @@ impl pallet_move::Config for Test { type Currency = Balances; } +// Configure a mock runtime to test the pallet. +frame_support::construct_runtime!( + pub enum Test + { + System: frame_system, + Balances: pallet_balances, + MoveModule: pallet_move, + } +); + /// Test Externalities Builder for an easier test setup. -#[allow(dead_code)] #[derive(Default)] pub(crate) struct ExtBuilder { /// Overwrite default accounts with balances. @@ -74,7 +87,6 @@ pub(crate) struct ExtBuilder { substrate_stdlib: Option>, } -#[allow(dead_code)] impl ExtBuilder { /// Overwrites default balances on dev-test setup. pub(crate) fn with_balances(mut self, balances: Vec<(AccountId32, Balance)>) -> Self { @@ -118,7 +130,6 @@ impl ExtBuilder { } // Build genesis storage according to the mock runtime. -#[allow(dead_code)] pub fn new_test_ext() -> sp_io::TestExternalities { let mut storage = frame_system::GenesisConfig::::default() .build_storage() @@ -136,7 +147,6 @@ pub fn new_test_ext() -> sp_io::TestExternalities { } // Common constants accross the tests. -#[allow(dead_code)] pub const EMPTY_CHEQUE: u128 = 0; // Not all scripts need the `cheque_amount` parameter. pub const CAFE_ADDR: &str = "0xCAFE"; pub const BOB_ADDR: &str = "5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty"; @@ -172,18 +182,15 @@ lazy_static::lazy_static! { }; } -#[allow(dead_code)] pub fn addr32_from_ss58(ss58addr: &str) -> AccountId32 { let (pk, _) = Public::from_ss58check_with_version(ss58addr).unwrap(); pk.into() } -#[allow(dead_code)] pub fn addr32_to_move(addr32: &AccountId32) -> Result> { MoveModule::to_move_address(addr32) } -#[allow(dead_code)] pub fn addrs_from_ss58( ss58: &str, ) -> Result<(AccountId32, AccountAddress), pallet_move::Error> { @@ -192,12 +199,54 @@ pub fn addrs_from_ss58( Ok((addr_32, addr_mv)) } -// Configure a mock runtime to test the pallet. -frame_support::construct_runtime!( - pub enum Test - { - System: frame_system, - Balances: pallet_balances, - MoveModule: pallet_move, +pub mod assets { + const MOVE_PROJECTS: &str = "src/tests/assets/move-projects"; + + /// Reads bytes from a file for the given path. + /// Can panic if the file doesn't exist. + fn read_bytes(file_path: &str) -> Vec { + std::fs::read(file_path) + .unwrap_or_else(|e| panic!("Can't read {file_path}: {e} - make sure you run pallet-move/tests/assets/move-projects/smove-build-all.sh")) } -); + + /// Reads a precompiled Move module from our assets directory. + pub fn read_module_from_project(project: &str, module_name: &str) -> Vec { + let path = + format!("{MOVE_PROJECTS}/{project}/build/{project}/bytecode_modules/{module_name}.mv"); + read_bytes(&path) + } + + /// Reads a precompiled Move bundle from our assets directory. + pub fn read_bundle_from_project(project: &str, bundle_name: &str) -> Vec { + let path = format!("{MOVE_PROJECTS}/{project}/build/{project}/bundles/{bundle_name}.mvb"); + read_bytes(&path) + } + + /// Reads a precompiled Move scripts from our assets directory. + pub fn read_script_from_project(project: &str, script_name: &str) -> Vec { + let path = + format!("{MOVE_PROJECTS}/{project}/build/{project}/bytecode_scripts/{script_name}.mv"); + read_bytes(&path) + } +} + +#[macro_export] +macro_rules! script_transaction { + ($bytecode:expr, $type_args:expr, $($args:expr),*) => { + { + let transaction = ScriptTransaction { + bytecode: $bytecode, + type_args: $type_args, + args: vec![$(bcs::to_bytes($args).unwrap()),*], + }; + bcs::to_bytes(&transaction).unwrap() + } + } +} + +#[macro_export] +macro_rules! no_type_args { + () => { + vec![] + }; +} diff --git a/src/tests.rs b/src/tests.rs new file mode 100644 index 0000000..eac97b0 --- /dev/null +++ b/src/tests.rs @@ -0,0 +1,10 @@ +//! Container module for all test modules. + +pub mod address; +pub mod balance; +pub mod example; +pub mod execute; +pub mod modules; +pub mod publish; +pub mod signer; +pub mod update_stdlib; diff --git a/src/tests/address.rs b/src/tests/address.rs new file mode 100644 index 0000000..49b274d --- /dev/null +++ b/src/tests/address.rs @@ -0,0 +1,86 @@ +//! Address conversion utilities based on the Pontem address solution. +//! To properly handle Move VM addresses and Substrate addresses, we need to convert them to each other. +use crate::mock::*; + +use move_core_types::account_address::AccountAddress; +use sp_core::{crypto::Ss58Codec, sr25519::Public}; + +// This dataset contains only allowed and unprotected memory addressses. +const DATASET: &[(&str, &str); 5] = &[ + ( + "gkQ5K6EnLRgZkwozG8GiBAEnJyM6FxzbSaSmVhKJ2w8FcK7ih", + "d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d", + ), + ( + "gkNW9pAcCHxZrnoVkhLkEQtsLsW5NWTC75cdAdxAMs9LNYCYg", + "8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48", + ), + ( + "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY", + "d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d", + ), + ( + "5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty", + "8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48", + ), + ( + "5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y", + "90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22", + ), +]; + +#[test] +fn to_move_address_check() { + new_test_ext().execute_with(|| { + for pair in DATASET.iter() { + let (pk, _) = Public::from_ss58check_with_version(pair.0).unwrap(); + let addr = MoveModule::to_move_address(&pk.into()).unwrap(); + assert_eq!(pair.1, addr.to_string()); + } + }) +} + +#[test] +fn to_substrate_account_check() { + new_test_ext().execute_with(|| { + for pair in DATASET.iter() { + let pk_expected = Public::from_ss58check_with_version(pair.0) + .unwrap() + .0 + .into(); + let addr = MoveModule::to_move_address(&pk_expected).unwrap(); + let pk_decoded = MoveModule::to_native_account(&addr).expect("Cannot decode address"); + assert_eq!(pk_expected, pk_decoded); + } + }) +} + +#[test] +fn account_to_bytes_check() { + for pair in DATASET.iter() { + let (pk, _) = Public::from_ss58check_with_version(pair.0).unwrap(); + let bytes = MoveModule::to_move_address(&pk.into()) + .unwrap() + .into_bytes(); + assert_eq!(pair.1, hex::encode(bytes)); + + let bytes_expected = AccountAddress::from_hex_literal(&format!("0x{}", pair.1)) + .unwrap() + .to_vec(); + assert_eq!(bytes_expected, bytes); + } +} + +#[test] +fn check_protected_address_errors() { + new_test_ext().execute_with(|| { + // Check the one protected and prohibited memory address for an error. + // The ss58-address is equivalent to Move-address "0x1". + let prohibited = "gkKH52LJ2UumhVBim1n3mCsSj3ctj3GkV8JLVLdhJakxmEDcq"; + let pk_expected = Public::from_ss58check_with_version(prohibited) + .unwrap() + .0 + .into(); + assert!(MoveModule::to_move_address(&pk_expected).is_err()); + }); +} diff --git a/tests/assets/move-projects/balance/Move.toml b/src/tests/assets/move-projects/balance/Move.toml similarity index 100% rename from tests/assets/move-projects/balance/Move.toml rename to src/tests/assets/move-projects/balance/Move.toml diff --git a/tests/assets/move-projects/balance/sources/Scripts.move b/src/tests/assets/move-projects/balance/sources/Scripts.move similarity index 100% rename from tests/assets/move-projects/balance/sources/Scripts.move rename to src/tests/assets/move-projects/balance/sources/Scripts.move diff --git a/tests/assets/move-projects/car-wash-example/Move.toml b/src/tests/assets/move-projects/car-wash-example/Move.toml similarity index 100% rename from tests/assets/move-projects/car-wash-example/Move.toml rename to src/tests/assets/move-projects/car-wash-example/Move.toml diff --git a/tests/assets/move-projects/car-wash-example/build_all.sh b/src/tests/assets/move-projects/car-wash-example/build_all.sh similarity index 100% rename from tests/assets/move-projects/car-wash-example/build_all.sh rename to src/tests/assets/move-projects/car-wash-example/build_all.sh diff --git a/tests/assets/move-projects/car-wash-example/hints.md b/src/tests/assets/move-projects/car-wash-example/hints.md similarity index 100% rename from tests/assets/move-projects/car-wash-example/hints.md rename to src/tests/assets/move-projects/car-wash-example/hints.md diff --git a/tests/assets/move-projects/car-wash-example/scripts/Scripts.move b/src/tests/assets/move-projects/car-wash-example/scripts/Scripts.move similarity index 100% rename from tests/assets/move-projects/car-wash-example/scripts/Scripts.move rename to src/tests/assets/move-projects/car-wash-example/scripts/Scripts.move diff --git a/tests/assets/move-projects/car-wash-example/sources/CarWash.move b/src/tests/assets/move-projects/car-wash-example/sources/CarWash.move similarity index 100% rename from tests/assets/move-projects/car-wash-example/sources/CarWash.move rename to src/tests/assets/move-projects/car-wash-example/sources/CarWash.move diff --git a/tests/assets/move-projects/get-resource/Move.toml b/src/tests/assets/move-projects/get-resource/Move.toml similarity index 100% rename from tests/assets/move-projects/get-resource/Move.toml rename to src/tests/assets/move-projects/get-resource/Move.toml diff --git a/tests/assets/move-projects/get-resource/scripts/Count.move b/src/tests/assets/move-projects/get-resource/scripts/Count.move similarity index 100% rename from tests/assets/move-projects/get-resource/scripts/Count.move rename to src/tests/assets/move-projects/get-resource/scripts/Count.move diff --git a/tests/assets/move-projects/get-resource/scripts/CreateCounter.move b/src/tests/assets/move-projects/get-resource/scripts/CreateCounter.move similarity index 100% rename from tests/assets/move-projects/get-resource/scripts/CreateCounter.move rename to src/tests/assets/move-projects/get-resource/scripts/CreateCounter.move diff --git a/tests/assets/move-projects/get-resource/sources/Counter.move b/src/tests/assets/move-projects/get-resource/sources/Counter.move similarity index 100% rename from tests/assets/move-projects/get-resource/sources/Counter.move rename to src/tests/assets/move-projects/get-resource/sources/Counter.move diff --git a/tests/assets/move-projects/move-basics/Move.toml b/src/tests/assets/move-projects/move-basics/Move.toml similarity index 100% rename from tests/assets/move-projects/move-basics/Move.toml rename to src/tests/assets/move-projects/move-basics/Move.toml diff --git a/tests/assets/move-projects/move-basics/scripts/Generics.move b/src/tests/assets/move-projects/move-basics/scripts/Generics.move similarity index 100% rename from tests/assets/move-projects/move-basics/scripts/Generics.move rename to src/tests/assets/move-projects/move-basics/scripts/Generics.move diff --git a/tests/assets/move-projects/move-basics/scripts/Loops.move b/src/tests/assets/move-projects/move-basics/scripts/Loops.move similarity index 100% rename from tests/assets/move-projects/move-basics/scripts/Loops.move rename to src/tests/assets/move-projects/move-basics/scripts/Loops.move diff --git a/tests/assets/move-projects/move-basics/scripts/empty.move b/src/tests/assets/move-projects/move-basics/scripts/empty.move similarity index 100% rename from tests/assets/move-projects/move-basics/scripts/empty.move rename to src/tests/assets/move-projects/move-basics/scripts/empty.move diff --git a/tests/assets/move-projects/move-basics/sources/Empty.move b/src/tests/assets/move-projects/move-basics/sources/Empty.move similarity index 100% rename from tests/assets/move-projects/move-basics/sources/Empty.move rename to src/tests/assets/move-projects/move-basics/sources/Empty.move diff --git a/tests/assets/move-projects/move-basics/sources/EmptyBob.move b/src/tests/assets/move-projects/move-basics/sources/EmptyBob.move similarity index 100% rename from tests/assets/move-projects/move-basics/sources/EmptyBob.move rename to src/tests/assets/move-projects/move-basics/sources/EmptyBob.move diff --git a/tests/assets/move-projects/multiple-signers/Move.toml b/src/tests/assets/move-projects/multiple-signers/Move.toml similarity index 100% rename from tests/assets/move-projects/multiple-signers/Move.toml rename to src/tests/assets/move-projects/multiple-signers/Move.toml diff --git a/tests/assets/move-projects/multiple-signers/build.sh b/src/tests/assets/move-projects/multiple-signers/build.sh similarity index 100% rename from tests/assets/move-projects/multiple-signers/build.sh rename to src/tests/assets/move-projects/multiple-signers/build.sh diff --git a/tests/assets/move-projects/multiple-signers/estimate.sh b/src/tests/assets/move-projects/multiple-signers/estimate.sh similarity index 100% rename from tests/assets/move-projects/multiple-signers/estimate.sh rename to src/tests/assets/move-projects/multiple-signers/estimate.sh diff --git a/tests/assets/move-projects/multiple-signers/sources/Dorm.move b/src/tests/assets/move-projects/multiple-signers/sources/Dorm.move similarity index 100% rename from tests/assets/move-projects/multiple-signers/sources/Dorm.move rename to src/tests/assets/move-projects/multiple-signers/sources/Dorm.move diff --git a/tests/assets/move-projects/multiple-signers/sources/Scripts.move b/src/tests/assets/move-projects/multiple-signers/sources/Scripts.move similarity index 100% rename from tests/assets/move-projects/multiple-signers/sources/Scripts.move rename to src/tests/assets/move-projects/multiple-signers/sources/Scripts.move diff --git a/tests/assets/move-projects/signer-scripts/Move.toml b/src/tests/assets/move-projects/signer-scripts/Move.toml similarity index 100% rename from tests/assets/move-projects/signer-scripts/Move.toml rename to src/tests/assets/move-projects/signer-scripts/Move.toml diff --git a/tests/assets/move-projects/signer-scripts/sources/General.move b/src/tests/assets/move-projects/signer-scripts/sources/General.move similarity index 100% rename from tests/assets/move-projects/signer-scripts/sources/General.move rename to src/tests/assets/move-projects/signer-scripts/sources/General.move diff --git a/tests/assets/move-projects/signer-scripts/sources/Generics.move b/src/tests/assets/move-projects/signer-scripts/sources/Generics.move similarity index 100% rename from tests/assets/move-projects/signer-scripts/sources/Generics.move rename to src/tests/assets/move-projects/signer-scripts/sources/Generics.move diff --git a/tests/assets/move-projects/signer-scripts/sources/HelperModule.move b/src/tests/assets/move-projects/signer-scripts/sources/HelperModule.move similarity index 100% rename from tests/assets/move-projects/signer-scripts/sources/HelperModule.move rename to src/tests/assets/move-projects/signer-scripts/sources/HelperModule.move diff --git a/tests/assets/move-projects/signer-scripts/sources/Vectors.move b/src/tests/assets/move-projects/signer-scripts/sources/Vectors.move similarity index 100% rename from tests/assets/move-projects/signer-scripts/sources/Vectors.move rename to src/tests/assets/move-projects/signer-scripts/sources/Vectors.move diff --git a/tests/assets/move-projects/smove-build-all.sh b/src/tests/assets/move-projects/smove-build-all.sh similarity index 100% rename from tests/assets/move-projects/smove-build-all.sh rename to src/tests/assets/move-projects/smove-build-all.sh diff --git a/tests/assets/move-projects/smove-clean-all.sh b/src/tests/assets/move-projects/smove-clean-all.sh similarity index 100% rename from tests/assets/move-projects/smove-clean-all.sh rename to src/tests/assets/move-projects/smove-clean-all.sh diff --git a/tests/assets/move-projects/testing-move-stdlib/Move.toml b/src/tests/assets/move-projects/testing-move-stdlib/Move.toml similarity index 100% rename from tests/assets/move-projects/testing-move-stdlib/Move.toml rename to src/tests/assets/move-projects/testing-move-stdlib/Move.toml diff --git a/tests/assets/move-projects/testing-move-stdlib/README.md b/src/tests/assets/move-projects/testing-move-stdlib/README.md similarity index 100% rename from tests/assets/move-projects/testing-move-stdlib/README.md rename to src/tests/assets/move-projects/testing-move-stdlib/README.md diff --git a/tests/assets/move-projects/testing-move-stdlib/sources/ascii.move b/src/tests/assets/move-projects/testing-move-stdlib/sources/ascii.move similarity index 100% rename from tests/assets/move-projects/testing-move-stdlib/sources/ascii.move rename to src/tests/assets/move-projects/testing-move-stdlib/sources/ascii.move diff --git a/tests/assets/move-projects/testing-move-stdlib/sources/bcs.move b/src/tests/assets/move-projects/testing-move-stdlib/sources/bcs.move similarity index 100% rename from tests/assets/move-projects/testing-move-stdlib/sources/bcs.move rename to src/tests/assets/move-projects/testing-move-stdlib/sources/bcs.move diff --git a/tests/assets/move-projects/testing-move-stdlib/sources/bit_vector.move b/src/tests/assets/move-projects/testing-move-stdlib/sources/bit_vector.move similarity index 100% rename from tests/assets/move-projects/testing-move-stdlib/sources/bit_vector.move rename to src/tests/assets/move-projects/testing-move-stdlib/sources/bit_vector.move diff --git a/tests/assets/move-projects/testing-move-stdlib/sources/error.move b/src/tests/assets/move-projects/testing-move-stdlib/sources/error.move similarity index 100% rename from tests/assets/move-projects/testing-move-stdlib/sources/error.move rename to src/tests/assets/move-projects/testing-move-stdlib/sources/error.move diff --git a/tests/assets/move-projects/testing-move-stdlib/sources/fixed_point32.move b/src/tests/assets/move-projects/testing-move-stdlib/sources/fixed_point32.move similarity index 100% rename from tests/assets/move-projects/testing-move-stdlib/sources/fixed_point32.move rename to src/tests/assets/move-projects/testing-move-stdlib/sources/fixed_point32.move diff --git a/tests/assets/move-projects/testing-move-stdlib/sources/hash.move b/src/tests/assets/move-projects/testing-move-stdlib/sources/hash.move similarity index 100% rename from tests/assets/move-projects/testing-move-stdlib/sources/hash.move rename to src/tests/assets/move-projects/testing-move-stdlib/sources/hash.move diff --git a/tests/assets/move-projects/testing-move-stdlib/sources/option.move b/src/tests/assets/move-projects/testing-move-stdlib/sources/option.move similarity index 100% rename from tests/assets/move-projects/testing-move-stdlib/sources/option.move rename to src/tests/assets/move-projects/testing-move-stdlib/sources/option.move diff --git a/tests/assets/move-projects/testing-move-stdlib/sources/signer.move b/src/tests/assets/move-projects/testing-move-stdlib/sources/signer.move similarity index 100% rename from tests/assets/move-projects/testing-move-stdlib/sources/signer.move rename to src/tests/assets/move-projects/testing-move-stdlib/sources/signer.move diff --git a/tests/assets/move-projects/testing-move-stdlib/sources/string.move b/src/tests/assets/move-projects/testing-move-stdlib/sources/string.move similarity index 100% rename from tests/assets/move-projects/testing-move-stdlib/sources/string.move rename to src/tests/assets/move-projects/testing-move-stdlib/sources/string.move diff --git a/tests/assets/move-projects/testing-move-stdlib/sources/type_name.move b/src/tests/assets/move-projects/testing-move-stdlib/sources/type_name.move similarity index 100% rename from tests/assets/move-projects/testing-move-stdlib/sources/type_name.move rename to src/tests/assets/move-projects/testing-move-stdlib/sources/type_name.move diff --git a/tests/assets/move-projects/testing-move-stdlib/sources/unit_test.move b/src/tests/assets/move-projects/testing-move-stdlib/sources/unit_test.move similarity index 100% rename from tests/assets/move-projects/testing-move-stdlib/sources/unit_test.move rename to src/tests/assets/move-projects/testing-move-stdlib/sources/unit_test.move diff --git a/tests/assets/move-projects/testing-move-stdlib/sources/vector.move b/src/tests/assets/move-projects/testing-move-stdlib/sources/vector.move similarity index 100% rename from tests/assets/move-projects/testing-move-stdlib/sources/vector.move rename to src/tests/assets/move-projects/testing-move-stdlib/sources/vector.move diff --git a/tests/assets/move-projects/testing-substrate-stdlib/Move.toml b/src/tests/assets/move-projects/testing-substrate-stdlib/Move.toml similarity index 100% rename from tests/assets/move-projects/testing-substrate-stdlib/Move.toml rename to src/tests/assets/move-projects/testing-substrate-stdlib/Move.toml diff --git a/tests/assets/move-projects/testing-substrate-stdlib/README.md b/src/tests/assets/move-projects/testing-substrate-stdlib/README.md similarity index 100% rename from tests/assets/move-projects/testing-substrate-stdlib/README.md rename to src/tests/assets/move-projects/testing-substrate-stdlib/README.md diff --git a/tests/assets/move-projects/testing-substrate-stdlib/sources/balance.move b/src/tests/assets/move-projects/testing-substrate-stdlib/sources/balance.move similarity index 100% rename from tests/assets/move-projects/testing-substrate-stdlib/sources/balance.move rename to src/tests/assets/move-projects/testing-substrate-stdlib/sources/balance.move diff --git a/tests/assets/move-projects/using_stdlib_natives/Move.toml b/src/tests/assets/move-projects/using_stdlib_natives/Move.toml similarity index 100% rename from tests/assets/move-projects/using_stdlib_natives/Move.toml rename to src/tests/assets/move-projects/using_stdlib_natives/Move.toml diff --git a/tests/assets/move-projects/using_stdlib_natives/sources/DependsOnVector.move b/src/tests/assets/move-projects/using_stdlib_natives/sources/DependsOnVector.move similarity index 100% rename from tests/assets/move-projects/using_stdlib_natives/sources/DependsOnVector.move rename to src/tests/assets/move-projects/using_stdlib_natives/sources/DependsOnVector.move diff --git a/tests/assets/move-projects/using_stdlib_natives/sources/Vector.move b/src/tests/assets/move-projects/using_stdlib_natives/sources/Vector.move similarity index 100% rename from tests/assets/move-projects/using_stdlib_natives/sources/Vector.move rename to src/tests/assets/move-projects/using_stdlib_natives/sources/Vector.move diff --git a/src/tests/balance.rs b/src/tests/balance.rs new file mode 100644 index 0000000..37a168e --- /dev/null +++ b/src/tests/balance.rs @@ -0,0 +1,489 @@ +use crate::{ + balance::{BalanceAdapter, BalanceOf}, + mock::*, + no_type_args, script_transaction, +}; + +use frame_support::assert_ok; +use move_vm_backend::{balance::BalanceHandler, types::MAX_GAS_AMOUNT}; +use move_vm_backend_common::types::ScriptTransaction; + +#[test] +fn verify_get_balance() { + const AMOUNT: u128 = EXISTENTIAL_DEPOSIT + 100; + + let (bob_addr_32, bob_addr_mv) = addrs_from_ss58(BOB_ADDR).unwrap(); + + ExtBuilder::default() + .with_balances(vec![(bob_addr_32.clone(), AMOUNT)]) + .build() + .execute_with(|| { + // Set Bob's balance to a predefined value + // assert_ok!(Balances::force_set_balance( + // RuntimeOrigin::root(), + // bob_addr_32.clone(), + // AMOUNT, + // )); + + // Check the pallet side first. + let balance: BalanceAdapter = BalanceAdapter::new(); + assert_eq!(balance.total_amount(bob_addr_mv).unwrap(), AMOUNT); + + // Now check that it works from within the MoveVM. + let script = + assets::read_script_from_project("balance", "verify_preconfigured_balance"); + + // let account = bcs::to_bytes(&bob_addr_mv).unwrap(); + // let preconfigured_amount = bcs::to_bytes(&AMOUNT).unwrap(); + // let params: Vec<&[u8]> = vec![&account, &preconfigured_amount]; + // let type_args: Vec = vec![]; + + // let transaction = ScriptTransaction { + // bytecode: script, + // type_args, + // args: params.iter().map(|x| x.to_vec()).collect(), + // }; + // let transaction_bc = bcs::to_bytes(&transaction).unwrap(); + let transaction_bc = + script_transaction!(script, no_type_args!(), &bob_addr_mv, &AMOUNT); + + let res = MoveModule::execute( + RuntimeOrigin::signed(bob_addr_32.clone()), + transaction_bc, + MAX_GAS_AMOUNT, + 0, + ); + + assert_ok!(res); + }) +} + +#[test] +fn verify_simple_transfer() { + const AMOUNT: u128 = 100; + + let (alice_addr_32, alice_addr_mv) = addrs_from_ss58(ALICE_ADDR).unwrap(); + let (bob_addr_32, bob_addr_mv) = addrs_from_ss58(BOB_ADDR).unwrap(); + + ExtBuilder::default() + .with_balances(vec![(alice_addr_32.clone(), 10_000)]) + .build() + .execute_with(|| { + // Set Alice's balance to a predefined value + // assert_ok!(Balances::force_set_balance( + // RuntimeOrigin::root(), + // alice_addr_32.clone(), + // 10000, + // )); + + // Check initial state of balances of involved users. + let ini_blnc_alice = Balances::free_balance(&alice_addr_32); + let ini_blnc_bob = Balances::free_balance(&bob_addr_32); + + // Now check that it works from within the MoveVM. + let script = assets::read_script_from_project("balance", "single_transfer"); + + // let src = bcs::to_bytes(&alice_addr_mv).unwrap(); + // let dst = bcs::to_bytes(&bob_addr_mv).unwrap(); + // let amount = bcs::to_bytes(&AMOUNT).unwrap(); + // let params: Vec<&[u8]> = vec![&src, &dst, &amount]; + // let transaction = ScriptTransaction { + // bytecode: script, + // type_args: Vec::::new(), + // args: params.iter().map(|x| x.to_vec()).collect(), + // }; + // let transaction_bc = bcs::to_bytes(&transaction).unwrap(); + let transaction_bc = script_transaction!( + script, + no_type_args!(), + &alice_addr_mv, + &bob_addr_mv, + &AMOUNT + ); + + assert_ok!(MoveModule::execute( + RuntimeOrigin::signed(alice_addr_32.clone()), + transaction_bc, + MAX_GAS_AMOUNT, + 1500, + )); + + let now_blnc_alice = Balances::free_balance(&alice_addr_32); + let now_blnc_bob = Balances::free_balance(&bob_addr_32); + assert_eq!(ini_blnc_alice - AMOUNT, now_blnc_alice); + assert_eq!(ini_blnc_bob + AMOUNT, now_blnc_bob); + }) +} + +#[test] +fn verify_multiple_transfers_different() { + const AMOUNT: u128 = 100; + + let (alice_addr_32, alice_addr_mv) = addrs_from_ss58(ALICE_ADDR).unwrap(); + let (bob_addr_32, bob_addr_mv) = addrs_from_ss58(BOB_ADDR).unwrap(); + let (dave_addr_32, dave_addr_mv) = addrs_from_ss58(DAVE_ADDR).unwrap(); + + ExtBuilder::default() + .with_balances(vec![(alice_addr_32.clone(), 10_000)]) + .build() + .execute_with(|| { + // Set Alice's balance to a predefined value + // assert_ok!(Balances::force_set_balance( + // RuntimeOrigin::root(), + // alice_addr_32.clone(), + // 10000, + // )); + + // Check initial state of balances of involved users. + let ini_blnc_alice = Balances::free_balance(&alice_addr_32); + let ini_blnc_bob = Balances::free_balance(&bob_addr_32); + let ini_blnc_dave = Balances::free_balance(&dave_addr_32); + + // Now check that it works from within the MoveVM. + let script = assets::read_script_from_project("balance", "double_transfer"); + + // let src = bcs::to_bytes(&alice_addr_mv).unwrap(); + // let dst1 = bcs::to_bytes(&bob_addr_mv).unwrap(); + // let dst2 = bcs::to_bytes(&dave_addr_mv).unwrap(); + // let amount = bcs::to_bytes(&AMOUNT).unwrap(); + // let params: Vec<&[u8]> = vec![&src, &dst1, &amount, &dst2, &amount]; + // let transaction = ScriptTransaction { + // bytecode: script, + // type_args: Vec::::new(), + // args: params.iter().map(|x| x.to_vec()).collect(), + // }; + // let transaction_bc = bcs::to_bytes(&transaction).unwrap(); + let transaction_bc = script_transaction!( + script, + no_type_args!(), + &alice_addr_mv, + &bob_addr_mv, + &AMOUNT, + &dave_addr_mv, + &AMOUNT + ); + + assert_ok!(MoveModule::execute( + RuntimeOrigin::signed(alice_addr_32.clone()), + transaction_bc, + MAX_GAS_AMOUNT, + 1500, + )); + + let now_blnc_alice = Balances::free_balance(&alice_addr_32); + let now_blnc_bob = Balances::free_balance(&bob_addr_32); + let now_blnc_dave = Balances::free_balance(&dave_addr_32); + assert_eq!(ini_blnc_alice - AMOUNT * 2, now_blnc_alice); + assert_eq!(ini_blnc_bob + AMOUNT, now_blnc_bob); + assert_eq!(ini_blnc_dave + AMOUNT, now_blnc_dave); + }) +} + +#[test] +fn verify_multiple_transfers_same() { + const AMOUNT: u128 = 100; + + let (alice_addr_32, alice_addr_mv) = addrs_from_ss58(ALICE_ADDR).unwrap(); + let (bob_addr_32, bob_addr_mv) = addrs_from_ss58(BOB_ADDR).unwrap(); + + ExtBuilder::default() + .with_balances(vec![(alice_addr_32.clone(), 10_000)]) + .build() + .execute_with(|| { + // Set Alice's balance to a predefined value + // assert_ok!(Balances::force_set_balance( + // RuntimeOrigin::root(), + // alice_addr_32.clone(), + // 10000, + // )); + + // Check initial state of balances of involved users. + let ini_blnc_alice = Balances::free_balance(&alice_addr_32); + let ini_blnc_bob = Balances::free_balance(&bob_addr_32); + + // Now check that it works from within the MoveVM. + let script = assets::read_script_from_project("balance", "double_transfer"); + + // let src = bcs::to_bytes(&alice_addr_mv).unwrap(); + // let dst = bcs::to_bytes(&bob_addr_mv).unwrap(); + // let amount = bcs::to_bytes(&AMOUNT).unwrap(); + // let params: Vec<&[u8]> = vec![&src, &dst, &amount, &dst, &amount]; + // let transaction = ScriptTransaction { + // bytecode: script, + // type_args: Vec::::new(), + // args: params.iter().map(|x| x.to_vec()).collect(), + // }; + // let transaction_bc = bcs::to_bytes(&transaction).unwrap(); + let transaction_bc = script_transaction!( + script, + no_type_args!(), + &alice_addr_mv, + &bob_addr_mv, + &AMOUNT, + &bob_addr_mv, + &AMOUNT + ); + + assert_ok!(MoveModule::execute( + RuntimeOrigin::signed(alice_addr_32.clone()), + transaction_bc, + MAX_GAS_AMOUNT, + 1500, + )); + + let now_blnc_alice = Balances::free_balance(&alice_addr_32); + let now_blnc_bob = Balances::free_balance(&bob_addr_32); + assert_eq!(ini_blnc_alice - AMOUNT * 2, now_blnc_alice); + assert_eq!(ini_blnc_bob + AMOUNT * 2, now_blnc_bob); + }) +} + +#[test] +fn verify_balance_limit_too_low() { + const AMOUNT: BalanceOf = 100; + + let (alice_addr_32, alice_addr_mv) = addrs_from_ss58(ALICE_ADDR).unwrap(); + let (_, bob_addr_mv) = addrs_from_ss58(BOB_ADDR).unwrap(); + + ExtBuilder::default() + .with_balances(vec![(alice_addr_32.clone(), 10_000)]) + .build() + .execute_with(|| { + // Set Alice's balance to a predefined value + // assert_ok!(Balances::force_set_balance( + // RuntimeOrigin::root(), + // alice_addr_32.clone(), + // 10000, + // )); + + // Now check that it works from within the MoveVM. + let script = assets::read_script_from_project("balance", "single_transfer"); + + // let src = bcs::to_bytes(&alice_addr_mv).unwrap(); + // let dst = bcs::to_bytes(&bob_addr_mv).unwrap(); + // let amount = bcs::to_bytes(&AMOUNT).unwrap(); + // let params: Vec<&[u8]> = vec![&src, &dst, &amount]; + // let transaction = ScriptTransaction { + // bytecode: script, + // type_args: Vec::::new(), + // args: params.iter().map(|x| x.to_vec()).collect(), + // }; + // let transaction_bc = bcs::to_bytes(&transaction).unwrap(); + let transaction_bc = script_transaction!( + script, + no_type_args!(), + &alice_addr_mv, + &bob_addr_mv, + &AMOUNT + ); + + assert!(MoveModule::execute( + RuntimeOrigin::signed(alice_addr_32.clone()), + transaction_bc, + MAX_GAS_AMOUNT, + AMOUNT - 1, + ) + .is_err()); + }) +} + +#[test] +fn verify_insufficient_balance() { + const AMOUNT: BalanceOf = 100; + + let (alice_addr_32, alice_addr_mv) = addrs_from_ss58(ALICE_ADDR).unwrap(); + let (_, bob_addr_mv) = addrs_from_ss58(BOB_ADDR).unwrap(); + + ExtBuilder::default().build().execute_with(|| { + let script = assets::read_script_from_project("balance", "single_transfer"); + + // let src = bcs::to_bytes(&bob_addr_mv).unwrap(); + // let dst = bcs::to_bytes(&alice_addr_mv).unwrap(); + // let amount = bcs::to_bytes(&AMOUNT).unwrap(); + // let params: Vec<&[u8]> = vec![&src, &dst, &amount]; + // let transaction = ScriptTransaction { + // bytecode: script, + // type_args: Vec::::new(), + // args: params.iter().map(|x| x.to_vec()).collect(), + // }; + // let transaction_bc = bcs::to_bytes(&transaction).unwrap(); + let transaction_bc = script_transaction!( + script, + no_type_args!(), + &bob_addr_mv, + &alice_addr_mv, + &AMOUNT + ); + + assert!(MoveModule::execute( + RuntimeOrigin::signed(alice_addr_32.clone()), + transaction_bc, + MAX_GAS_AMOUNT, + AMOUNT, + ) + .is_err()); + }) +} + +#[test] +fn verify_move_script_fails_after_successful_transfer() { + const BALANCE: BalanceOf = 1000; + const AMOUNT: BalanceOf = 100; + + let (alice_addr_32, alice_addr_mv) = addrs_from_ss58(ALICE_ADDR).unwrap(); + let (bob_addr_32, bob_addr_mv) = addrs_from_ss58(BOB_ADDR).unwrap(); + + ExtBuilder::default() + .with_balances(vec![ + (alice_addr_32.clone(), BALANCE), + (bob_addr_32.clone(), BALANCE), + ]) + .build() + .execute_with(|| { + // Set Alice's and Bob's balances to a predefined value. + // assert_ok!(Balances::force_set_balance( + // RuntimeOrigin::root(), + // alice_addr_32.clone(), + // BALANCE, + // )); + // assert_ok!(Balances::force_set_balance( + // RuntimeOrigin::root(), + // bob_addr_32.clone(), + // BALANCE, + // )); + + // Execute script with a successful transfer but which fails after transfer. + let script = assets::read_script_from_project("balance", "fail_at_the_end"); + + // let src = bcs::to_bytes(&alice_addr_mv).unwrap(); + // let dst = bcs::to_bytes(&bob_addr_mv).unwrap(); + // let amount = bcs::to_bytes(&AMOUNT).unwrap(); + // let params: Vec<&[u8]> = vec![&src, &dst, &amount]; + // let transaction = ScriptTransaction { + // bytecode: script, + // type_args: Vec::::new(), + // args: params.iter().map(|x| x.to_vec()).collect(), + // }; + // let transaction_bc = bcs::to_bytes(&transaction).unwrap(); + let transaction_bc = script_transaction!( + script, + no_type_args!(), + &alice_addr_mv, + &bob_addr_mv, + &AMOUNT + ); + + // Expect error because script will fail at the end. + assert!(MoveModule::execute( + RuntimeOrigin::signed(alice_addr_32.clone()), + transaction_bc, + MAX_GAS_AMOUNT, + AMOUNT, + ) + .is_err()); + + // Verify balances have not been modified and transfer was not applied. + let now_blnc_alice = Balances::free_balance(&alice_addr_32); + let now_blnc_bob = Balances::free_balance(&bob_addr_32); + assert_eq!(now_blnc_alice, BALANCE); + assert_eq!(now_blnc_bob, BALANCE); + }) +} + +#[test] +fn verify_self_transfer() { + const AMOUNT: BalanceOf = 100; + + let (alice_addr_32, alice_addr_mv) = addrs_from_ss58(ALICE_ADDR).unwrap(); + + ExtBuilder::default() + .with_balances(vec![(alice_addr_32.clone(), AMOUNT * 2)]) + .build() + .execute_with(|| { + // assert_ok!(Balances::force_set_balance( + // RuntimeOrigin::root(), + // alice_addr_32.clone(), + // AMOUNT * 2, + // )); + + let script = assets::read_script_from_project("balance", "single_transfer"); + + // let src = bcs::to_bytes(&alice_addr_mv).unwrap(); + // let dst = bcs::to_bytes(&alice_addr_mv).unwrap(); + // let amount = bcs::to_bytes(&AMOUNT).unwrap(); + // let params: Vec<&[u8]> = vec![&src, &dst, &amount]; + // let transaction = ScriptTransaction { + // bytecode: script, + // type_args: Vec::::new(), + // args: params.iter().map(|x| x.to_vec()).collect(), + // }; + // let transaction_bc = bcs::to_bytes(&transaction).unwrap(); + let transaction_bc = script_transaction!( + script, + no_type_args!(), + &alice_addr_mv, + &alice_addr_mv, + &AMOUNT + ); + + assert_ok!(MoveModule::execute( + RuntimeOrigin::signed(alice_addr_32.clone()), + transaction_bc, + MAX_GAS_AMOUNT, + AMOUNT, + )); + + let now_blnc_alice = Balances::free_balance(&alice_addr_32); + assert_eq!(now_blnc_alice, AMOUNT * 2); + }) +} + +#[test] +fn verify_self_transfer_trying_to_cheat() { + const AMOUNT: BalanceOf = 1000; + const BALANCE: BalanceOf = 100; + + let (alice_addr_32, alice_addr_mv) = addrs_from_ss58(ALICE_ADDR).unwrap(); + + ExtBuilder::default() + .with_balances(vec![(alice_addr_32.clone(), BALANCE)]) + .build() + .execute_with(|| { + // assert_ok!(Balances::force_set_balance( + // RuntimeOrigin::root(), + // alice_addr_32.clone(), + // BALANCE, + // )); + + let script = assets::read_script_from_project("balance", "single_transfer"); + + // let src = bcs::to_bytes(&alice_addr_mv).unwrap(); + // let dst = bcs::to_bytes(&alice_addr_mv).unwrap(); + // let amount = bcs::to_bytes(&AMOUNT).unwrap(); + // let params: Vec<&[u8]> = vec![&src, &dst, &amount]; + // let transaction = ScriptTransaction { + // bytecode: script, + // type_args: Vec::::new(), + // args: params.iter().map(|x| x.to_vec()).collect(), + // }; + // let transaction_bc = bcs::to_bytes(&transaction).unwrap(); + let transaction_bc = script_transaction!( + script, + no_type_args!(), + &alice_addr_mv, + &alice_addr_mv, + &AMOUNT + ); + + assert!(MoveModule::execute( + RuntimeOrigin::signed(alice_addr_32.clone()), + transaction_bc, + MAX_GAS_AMOUNT, + AMOUNT, + ) + .is_err()); + + let now_blnc_alice = Balances::free_balance(&alice_addr_32); + assert_eq!(now_blnc_alice, BALANCE); + }) +} diff --git a/tests/example.rs b/src/tests/example.rs similarity index 99% rename from tests/example.rs rename to src/tests/example.rs index ce71f35..694c3cb 100644 --- a/tests/example.rs +++ b/src/tests/example.rs @@ -1,8 +1,6 @@ -mod assets; -mod mock; +use crate::mock::*; use frame_support::assert_ok; -use mock::*; use move_core_types::{account_address::AccountAddress, language_storage::TypeTag}; use move_vm_backend::types::MAX_GAS_AMOUNT; use move_vm_backend_common::types::ScriptTransaction; diff --git a/tests/execute.rs b/src/tests/execute.rs similarity index 98% rename from tests/execute.rs rename to src/tests/execute.rs index ff54a72..19eb815 100644 --- a/tests/execute.rs +++ b/src/tests/execute.rs @@ -1,8 +1,7 @@ -mod assets; -mod mock; +use crate::mock::*; +use crate::Error; use frame_support::{assert_err, assert_ok}; -use mock::*; use move_core_types::{ account_address::AccountAddress, identifier::Identifier, @@ -157,10 +156,7 @@ fn execute_script_generic_fails() { 0, ); - assert_err!( - res, - pallet_move::Error::::InvalidMainFunctionSignature - ); + assert_err!(res, Error::::InvalidMainFunctionSignature); }); } diff --git a/tests/modules.rs b/src/tests/modules.rs similarity index 98% rename from tests/modules.rs rename to src/tests/modules.rs index 05ad8c7..e30d2ab 100644 --- a/tests/modules.rs +++ b/src/tests/modules.rs @@ -1,8 +1,6 @@ -mod assets; -mod mock; +use crate::mock::*; use frame_support::assert_ok; -use mock::*; use move_core_types::{identifier::Identifier, language_storage::StructTag}; use move_vm_backend::types::MAX_GAS_AMOUNT; diff --git a/tests/publish.rs b/src/tests/publish.rs similarity index 99% rename from tests/publish.rs rename to src/tests/publish.rs index 0c42a54..202885d 100644 --- a/tests/publish.rs +++ b/src/tests/publish.rs @@ -1,10 +1,8 @@ -mod assets; -mod mock; +use crate::mock::*; +use crate::GasStrategy; use frame_support::assert_ok; -use mock::*; use move_vm_backend::types::MAX_GAS_AMOUNT; -use pallet_move::GasStrategy; #[test] /// Test that the module is published correctly. diff --git a/tests/signer.rs b/src/tests/signer.rs similarity index 96% rename from tests/signer.rs rename to src/tests/signer.rs index b3847d5..4d95bab 100644 --- a/tests/signer.rs +++ b/src/tests/signer.rs @@ -1,8 +1,7 @@ -mod assets; -mod mock; +use crate::mock::*; +use crate::Error; use frame_support::{assert_err, assert_ok, pallet_prelude::DispatchResultWithPostInfo}; -use mock::*; use move_core_types::{account_address::AccountAddress, language_storage::TypeTag, u256::U256}; use move_vm_backend::types::MAX_GAS_AMOUNT; use move_vm_backend_common::types::ScriptTransaction; @@ -174,7 +173,7 @@ fn general_script_eight_normal_signers_where_eve_tries_to_forge_signers_fails() let params: Vec<&[u8]> = vec![&eve, &eve, &alice, &eve, &eve, &eve, &eve, &eve, &extra]; let result = execute_script(eve_addr_32, script, params, type_args); - assert_err!(result, pallet_move::Error::::ScriptSignatureFailure); + assert_err!(result, Error::::ScriptSignatureFailure); }) } @@ -239,10 +238,7 @@ fn signer_after_all_possible_vectors_fails() { ]; let result = execute_script(bob_addr_32, script, params, type_args); - assert_err!( - result, - pallet_move::Error::::InvalidMainFunctionSignature - ); + assert_err!(result, Error::::InvalidMainFunctionSignature); }) } @@ -262,9 +258,6 @@ fn script_with_vector_containing_signer_fails() { let params: Vec<&[u8]> = vec![&v_addr]; let result = execute_script(bob_addr_32, script, params, type_args); - assert_err!( - result, - pallet_move::Error::::InvalidMainFunctionSignature - ); + assert_err!(result, Error::::InvalidMainFunctionSignature); }) } diff --git a/tests/update_stdlib.rs b/src/tests/update_stdlib.rs similarity index 88% rename from tests/update_stdlib.rs rename to src/tests/update_stdlib.rs index c0ba1d8..3fe187a 100644 --- a/tests/update_stdlib.rs +++ b/src/tests/update_stdlib.rs @@ -1,12 +1,11 @@ //! Integration tests related to extrinsic call `update_stdlib`. -mod assets; -mod mock; +use crate::mock::*; +use crate::{no_type_args, script_transaction}; use frame_support::{ assert_err, assert_ok, dispatch::DispatchErrorWithPostInfo, pallet_prelude::*, }; -use mock::*; use move_stdlib::move_stdlib_bundle; use move_vm_backend::types::MAX_GAS_AMOUNT; use move_vm_backend_common::types::ScriptTransaction; @@ -35,25 +34,6 @@ fn verify_module_error_with_msg( Err(format!("{res:?} does not match '{e_msg}'")) } -macro_rules! script_transaction { - ($bytecode:expr, $type_args:expr, $($args:expr),*) => { - { - let transaction = ScriptTransaction { - bytecode: $bytecode, - type_args: $type_args, - args: vec![$(bcs::to_bytes($args).unwrap()),*], - }; - bcs::to_bytes(&transaction).unwrap() - } - } -} - -macro_rules! no_type_args { - () => { - vec![] - }; -} - #[test] fn regular_user_update_fail() { ExtBuilder::default().build().execute_with(|| { diff --git a/tests/address.rs b/tests/address.rs deleted file mode 100644 index ec9b383..0000000 --- a/tests/address.rs +++ /dev/null @@ -1,92 +0,0 @@ -//! Address conversion utilities based on the Pontem address solution. -//! To properly handle Move VM addresses and Substrate addresses, we need to convert them to each other. -pub(crate) mod mock; - -#[cfg(test)] -mod account_convert_tests { - use move_core_types::account_address::AccountAddress; - use sp_core::{crypto::Ss58Codec, sr25519::Public}; - - use super::mock::*; - - // This dataset contains only allowed and unprotected memory addressses. - const DATASET: &[(&str, &str); 5] = &[ - ( - "gkQ5K6EnLRgZkwozG8GiBAEnJyM6FxzbSaSmVhKJ2w8FcK7ih", - "d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d", - ), - ( - "gkNW9pAcCHxZrnoVkhLkEQtsLsW5NWTC75cdAdxAMs9LNYCYg", - "8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48", - ), - ( - "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY", - "d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d", - ), - ( - "5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty", - "8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48", - ), - ( - "5FLSigC9HGRKVhB9FiEo4Y3koPsNmBmLJbpXg2mp1hXcS59Y", - "90b5ab205c6974c9ea841be688864633dc9ca8a357843eeacf2314649965fe22", - ), - ]; - - #[test] - fn to_move_address_check() { - new_test_ext().execute_with(|| { - for pair in DATASET.iter() { - let (pk, _) = Public::from_ss58check_with_version(pair.0).unwrap(); - let addr = MoveModule::to_move_address(&pk.into()).unwrap(); - assert_eq!(pair.1, addr.to_string()); - } - }) - } - - #[test] - fn to_substrate_account_check() { - new_test_ext().execute_with(|| { - for pair in DATASET.iter() { - let pk_expected = Public::from_ss58check_with_version(pair.0) - .unwrap() - .0 - .into(); - let addr = MoveModule::to_move_address(&pk_expected).unwrap(); - let pk_decoded = - MoveModule::to_native_account(&addr).expect("Cannot decode address"); - assert_eq!(pk_expected, pk_decoded); - } - }) - } - - #[test] - fn account_to_bytes_check() { - for pair in DATASET.iter() { - let (pk, _) = Public::from_ss58check_with_version(pair.0).unwrap(); - let bytes = MoveModule::to_move_address(&pk.into()) - .unwrap() - .into_bytes(); - assert_eq!(pair.1, hex::encode(bytes)); - - let bytes_expected = AccountAddress::from_hex_literal(&format!("0x{}", pair.1)) - .unwrap() - .to_vec(); - assert_eq!(bytes_expected, bytes); - } - } - - #[test] - fn check_protected_address_errors() { - new_test_ext().execute_with(|| { - // Check the one protected and prohibited memory address for an error. - // The ss58-address is equivalent to Move-address "0x1". - let prohibited = "gkKH52LJ2UumhVBim1n3mCsSj3ctj3GkV8JLVLdhJakxmEDcq"; - let pk_expected = Public::from_ss58check_with_version(prohibited) - .unwrap() - .0 - .into(); - assert!(MoveModule::to_move_address(&pk_expected).is_err()); - }); - } -} diff --git a/tests/assets.rs b/tests/assets.rs deleted file mode 100644 index 370cc8e..0000000 --- a/tests/assets.rs +++ /dev/null @@ -1,35 +0,0 @@ -#![allow(unused)] - -//! A set of IO helpers for accessing assests in the `tests/assets` directory. - -const MOVE_PROJECTS: &str = "tests/assets/move-projects"; - -/// Reads bytes from a file for the given path. -/// Can panic if the file doesn't exist. -fn read_bytes(file_path: &str) -> Vec { - std::fs::read(file_path) - .unwrap_or_else(|e| panic!("Can't read {file_path}: {e} - make sure you run pallet-move/tests/assets/move-projects/smove-build-all.sh")) -} - -/// Reads a precompiled Move module from our assets directory. -pub fn read_module_from_project(project: &str, module_name: &str) -> Vec { - let path = - format!("{MOVE_PROJECTS}/{project}/build/{project}/bytecode_modules/{module_name}.mv"); - - read_bytes(&path) -} - -/// Reads a precompiled Move bundle from our assets directory. -pub fn read_bundle_from_project(project: &str, bundle_name: &str) -> Vec { - let path = format!("{MOVE_PROJECTS}/{project}/build/{project}/bundles/{bundle_name}.mvb"); - - read_bytes(&path) -} - -/// Reads a precompiled Move scripts from our assets directory. -pub fn read_script_from_project(project: &str, script_name: &str) -> Vec { - let path = - format!("{MOVE_PROJECTS}/{project}/build/{project}/bytecode_scripts/{script_name}.mv"); - - read_bytes(&path) -} diff --git a/tests/balance.rs b/tests/balance.rs deleted file mode 100644 index 7bb455d..0000000 --- a/tests/balance.rs +++ /dev/null @@ -1,399 +0,0 @@ -mod assets; -mod mock; - -use frame_support::assert_ok; -use mock::*; -use move_core_types::language_storage::TypeTag; -use move_vm_backend::{balance::BalanceHandler, types::MAX_GAS_AMOUNT}; -use move_vm_backend_common::types::ScriptTransaction; -use pallet_move::balance::{BalanceAdapter, BalanceOf}; - -#[test] -fn verify_get_balance() { - new_test_ext().execute_with(|| { - let addr_native = BOB_ADDR_NATIVE.clone(); - let addr_move = *BOB_ADDR_MOVE; - const AMOUNT: u128 = EXISTENTIAL_DEPOSIT + 100; - - // Set Bob's balance to a predefined value - assert_ok!(Balances::force_set_balance( - RuntimeOrigin::root(), - addr_native.clone(), - AMOUNT, - )); - - // Check the pallet side first. - let balance: BalanceAdapter = BalanceAdapter::new(); - assert_eq!(balance.total_amount(addr_move).unwrap(), AMOUNT); - - // Now check that it works from within the MoveVM. - let script = assets::read_script_from_project("balance", "verify_preconfigured_balance"); - - let account = bcs::to_bytes(&addr_move).unwrap(); - let preconfigured_amount = bcs::to_bytes(&AMOUNT).unwrap(); - let params: Vec<&[u8]> = vec![&account, &preconfigured_amount]; - let type_args: Vec = vec![]; - - let transaction = ScriptTransaction { - bytecode: script, - type_args, - args: params.iter().map(|x| x.to_vec()).collect(), - }; - let transaction_bc = bcs::to_bytes(&transaction).unwrap(); - - let res = MoveModule::execute( - RuntimeOrigin::signed(addr_native.clone()), - transaction_bc, - MAX_GAS_AMOUNT, - 0, - ); - - assert_ok!(res); - }) -} - -#[test] -fn verify_simple_transfer() { - const AMOUNT: u128 = 100; - - let (alice_addr_32, alice_addr_mv) = addrs_from_ss58(ALICE_ADDR).unwrap(); - let (bob_addr_32, bob_addr_mv) = addrs_from_ss58(BOB_ADDR).unwrap(); - - new_test_ext().execute_with(|| { - // Set Alice's balance to a predefined value - assert_ok!(Balances::force_set_balance( - RuntimeOrigin::root(), - alice_addr_32.clone(), - 10000, - )); - - // Check initial state of balances of involved users. - let ini_blnc_alice = Balances::free_balance(&alice_addr_32); - let ini_blnc_bob = Balances::free_balance(&bob_addr_32); - - // Now check that it works from within the MoveVM. - let script = assets::read_script_from_project("balance", "single_transfer"); - - let src = bcs::to_bytes(&alice_addr_mv).unwrap(); - let dst = bcs::to_bytes(&bob_addr_mv).unwrap(); - let amount = bcs::to_bytes(&AMOUNT).unwrap(); - let params: Vec<&[u8]> = vec![&src, &dst, &amount]; - let transaction = ScriptTransaction { - bytecode: script, - type_args: Vec::::new(), - args: params.iter().map(|x| x.to_vec()).collect(), - }; - let transaction_bc = bcs::to_bytes(&transaction).unwrap(); - - assert_ok!(MoveModule::execute( - RuntimeOrigin::signed(alice_addr_32.clone()), - transaction_bc, - MAX_GAS_AMOUNT, - 1500, - )); - - let now_blnc_alice = Balances::free_balance(&alice_addr_32); - let now_blnc_bob = Balances::free_balance(&bob_addr_32); - assert_eq!(ini_blnc_alice - AMOUNT, now_blnc_alice); - assert_eq!(ini_blnc_bob + AMOUNT, now_blnc_bob); - }) -} - -#[test] -fn verify_multiple_transfers_different() { - const AMOUNT: u128 = 100; - - let (alice_addr_32, alice_addr_mv) = addrs_from_ss58(ALICE_ADDR).unwrap(); - let (bob_addr_32, bob_addr_mv) = addrs_from_ss58(BOB_ADDR).unwrap(); - let (dave_addr_32, dave_addr_mv) = addrs_from_ss58(DAVE_ADDR).unwrap(); - - new_test_ext().execute_with(|| { - // Set Alice's balance to a predefined value - assert_ok!(Balances::force_set_balance( - RuntimeOrigin::root(), - alice_addr_32.clone(), - 10000, - )); - - // Check initial state of balances of involved users. - let ini_blnc_alice = Balances::free_balance(&alice_addr_32); - let ini_blnc_bob = Balances::free_balance(&bob_addr_32); - let ini_blnc_dave = Balances::free_balance(&dave_addr_32); - - // Now check that it works from within the MoveVM. - let script = assets::read_script_from_project("balance", "double_transfer"); - - let src = bcs::to_bytes(&alice_addr_mv).unwrap(); - let dst1 = bcs::to_bytes(&bob_addr_mv).unwrap(); - let dst2 = bcs::to_bytes(&dave_addr_mv).unwrap(); - let amount = bcs::to_bytes(&AMOUNT).unwrap(); - let params: Vec<&[u8]> = vec![&src, &dst1, &amount, &dst2, &amount]; - let transaction = ScriptTransaction { - bytecode: script, - type_args: Vec::::new(), - args: params.iter().map(|x| x.to_vec()).collect(), - }; - let transaction_bc = bcs::to_bytes(&transaction).unwrap(); - - assert_ok!(MoveModule::execute( - RuntimeOrigin::signed(alice_addr_32.clone()), - transaction_bc, - MAX_GAS_AMOUNT, - 1500, - )); - - let now_blnc_alice = Balances::free_balance(&alice_addr_32); - let now_blnc_bob = Balances::free_balance(&bob_addr_32); - let now_blnc_dave = Balances::free_balance(&dave_addr_32); - assert_eq!(ini_blnc_alice - AMOUNT * 2, now_blnc_alice); - assert_eq!(ini_blnc_bob + AMOUNT, now_blnc_bob); - assert_eq!(ini_blnc_dave + AMOUNT, now_blnc_dave); - }) -} - -#[test] -fn verify_multiple_transfers_same() { - const AMOUNT: u128 = 100; - - let (alice_addr_32, alice_addr_mv) = addrs_from_ss58(ALICE_ADDR).unwrap(); - let (bob_addr_32, bob_addr_mv) = addrs_from_ss58(BOB_ADDR).unwrap(); - - new_test_ext().execute_with(|| { - // Set Alice's balance to a predefined value - assert_ok!(Balances::force_set_balance( - RuntimeOrigin::root(), - alice_addr_32.clone(), - 10000, - )); - - // Check initial state of balances of involved users. - let ini_blnc_alice = Balances::free_balance(&alice_addr_32); - let ini_blnc_bob = Balances::free_balance(&bob_addr_32); - - // Now check that it works from within the MoveVM. - let script = assets::read_script_from_project("balance", "double_transfer"); - - let src = bcs::to_bytes(&alice_addr_mv).unwrap(); - let dst = bcs::to_bytes(&bob_addr_mv).unwrap(); - let amount = bcs::to_bytes(&AMOUNT).unwrap(); - let params: Vec<&[u8]> = vec![&src, &dst, &amount, &dst, &amount]; - let transaction = ScriptTransaction { - bytecode: script, - type_args: Vec::::new(), - args: params.iter().map(|x| x.to_vec()).collect(), - }; - let transaction_bc = bcs::to_bytes(&transaction).unwrap(); - - assert_ok!(MoveModule::execute( - RuntimeOrigin::signed(alice_addr_32.clone()), - transaction_bc, - MAX_GAS_AMOUNT, - 1500, - )); - - let now_blnc_alice = Balances::free_balance(&alice_addr_32); - let now_blnc_bob = Balances::free_balance(&bob_addr_32); - assert_eq!(ini_blnc_alice - AMOUNT * 2, now_blnc_alice); - assert_eq!(ini_blnc_bob + AMOUNT * 2, now_blnc_bob); - }) -} - -#[test] -fn verify_balance_limit_too_low() { - const AMOUNT: BalanceOf = 100; - - let (alice_addr_32, alice_addr_mv) = addrs_from_ss58(ALICE_ADDR).unwrap(); - let (_, bob_addr_mv) = addrs_from_ss58(BOB_ADDR).unwrap(); - - new_test_ext().execute_with(|| { - // Set Alice's balance to a predefined value - assert_ok!(Balances::force_set_balance( - RuntimeOrigin::root(), - alice_addr_32.clone(), - 10000, - )); - - // Now check that it works from within the MoveVM. - let script = assets::read_script_from_project("balance", "single_transfer"); - - let src = bcs::to_bytes(&alice_addr_mv).unwrap(); - let dst = bcs::to_bytes(&bob_addr_mv).unwrap(); - let amount = bcs::to_bytes(&AMOUNT).unwrap(); - let params: Vec<&[u8]> = vec![&src, &dst, &amount]; - let transaction = ScriptTransaction { - bytecode: script, - type_args: Vec::::new(), - args: params.iter().map(|x| x.to_vec()).collect(), - }; - let transaction_bc = bcs::to_bytes(&transaction).unwrap(); - - assert!(MoveModule::execute( - RuntimeOrigin::signed(alice_addr_32.clone()), - transaction_bc, - MAX_GAS_AMOUNT, - AMOUNT - 1, - ) - .is_err()); - }) -} - -#[test] -fn verify_insufficient_balance() { - const AMOUNT: BalanceOf = 100; - - let (alice_addr_32, alice_addr_mv) = addrs_from_ss58(ALICE_ADDR).unwrap(); - let (_, bob_addr_mv) = addrs_from_ss58(BOB_ADDR).unwrap(); - - new_test_ext().execute_with(|| { - let script = assets::read_script_from_project("balance", "single_transfer"); - - let src = bcs::to_bytes(&bob_addr_mv).unwrap(); - let dst = bcs::to_bytes(&alice_addr_mv).unwrap(); - let amount = bcs::to_bytes(&AMOUNT).unwrap(); - let params: Vec<&[u8]> = vec![&src, &dst, &amount]; - let transaction = ScriptTransaction { - bytecode: script, - type_args: Vec::::new(), - args: params.iter().map(|x| x.to_vec()).collect(), - }; - let transaction_bc = bcs::to_bytes(&transaction).unwrap(); - - assert!(MoveModule::execute( - RuntimeOrigin::signed(alice_addr_32.clone()), - transaction_bc, - MAX_GAS_AMOUNT, - AMOUNT, - ) - .is_err()); - }) -} - -#[test] -fn verify_move_script_fails_after_successful_transfer() { - const BALANCE: BalanceOf = 1000; - const AMOUNT: BalanceOf = 100; - - let (alice_addr_32, alice_addr_mv) = addrs_from_ss58(ALICE_ADDR).unwrap(); - let (bob_addr_32, bob_addr_mv) = addrs_from_ss58(BOB_ADDR).unwrap(); - - new_test_ext().execute_with(|| { - // Set Alice's and Bob's balances to a predefined value. - assert_ok!(Balances::force_set_balance( - RuntimeOrigin::root(), - alice_addr_32.clone(), - BALANCE, - )); - assert_ok!(Balances::force_set_balance( - RuntimeOrigin::root(), - bob_addr_32.clone(), - BALANCE, - )); - - // Execute script with a successful transfer but which fails after transfer. - let script = assets::read_script_from_project("balance", "fail_at_the_end"); - - let src = bcs::to_bytes(&alice_addr_mv).unwrap(); - let dst = bcs::to_bytes(&bob_addr_mv).unwrap(); - let amount = bcs::to_bytes(&AMOUNT).unwrap(); - let params: Vec<&[u8]> = vec![&src, &dst, &amount]; - let transaction = ScriptTransaction { - bytecode: script, - type_args: Vec::::new(), - args: params.iter().map(|x| x.to_vec()).collect(), - }; - let transaction_bc = bcs::to_bytes(&transaction).unwrap(); - - // Expect error because script will fail at the end. - assert!(MoveModule::execute( - RuntimeOrigin::signed(alice_addr_32.clone()), - transaction_bc, - MAX_GAS_AMOUNT, - AMOUNT, - ) - .is_err()); - - // Verify balances have not been modified and transfer was not applied. - let now_blnc_alice = Balances::free_balance(&alice_addr_32); - let now_blnc_bob = Balances::free_balance(&bob_addr_32); - assert_eq!(now_blnc_alice, BALANCE); - assert_eq!(now_blnc_bob, BALANCE); - }) -} - -#[test] -fn verify_self_transfer() { - const AMOUNT: BalanceOf = 100; - - let (alice_addr_32, alice_addr_mv) = addrs_from_ss58(ALICE_ADDR).unwrap(); - - new_test_ext().execute_with(|| { - assert_ok!(Balances::force_set_balance( - RuntimeOrigin::root(), - alice_addr_32.clone(), - AMOUNT * 2, - )); - - let script = assets::read_script_from_project("balance", "single_transfer"); - - let src = bcs::to_bytes(&alice_addr_mv).unwrap(); - let dst = bcs::to_bytes(&alice_addr_mv).unwrap(); - let amount = bcs::to_bytes(&AMOUNT).unwrap(); - let params: Vec<&[u8]> = vec![&src, &dst, &amount]; - let transaction = ScriptTransaction { - bytecode: script, - type_args: Vec::::new(), - args: params.iter().map(|x| x.to_vec()).collect(), - }; - let transaction_bc = bcs::to_bytes(&transaction).unwrap(); - - assert_ok!(MoveModule::execute( - RuntimeOrigin::signed(alice_addr_32.clone()), - transaction_bc, - MAX_GAS_AMOUNT, - AMOUNT, - )); - - let now_blnc_alice = Balances::free_balance(&alice_addr_32); - assert_eq!(now_blnc_alice, AMOUNT * 2); - }) -} - -#[test] -fn verify_self_transfer_trying_to_cheat() { - const AMOUNT: BalanceOf = 1000; - const BALANCE: BalanceOf = 100; - - let (alice_addr_32, alice_addr_mv) = addrs_from_ss58(ALICE_ADDR).unwrap(); - - new_test_ext().execute_with(|| { - assert_ok!(Balances::force_set_balance( - RuntimeOrigin::root(), - alice_addr_32.clone(), - BALANCE, - )); - - let script = assets::read_script_from_project("balance", "single_transfer"); - - let src = bcs::to_bytes(&alice_addr_mv).unwrap(); - let dst = bcs::to_bytes(&alice_addr_mv).unwrap(); - let amount = bcs::to_bytes(&AMOUNT).unwrap(); - let params: Vec<&[u8]> = vec![&src, &dst, &amount]; - let transaction = ScriptTransaction { - bytecode: script, - type_args: Vec::::new(), - args: params.iter().map(|x| x.to_vec()).collect(), - }; - let transaction_bc = bcs::to_bytes(&transaction).unwrap(); - - assert!(MoveModule::execute( - RuntimeOrigin::signed(alice_addr_32.clone()), - transaction_bc, - MAX_GAS_AMOUNT, - AMOUNT, - ) - .is_err()); - - let now_blnc_alice = Balances::free_balance(&alice_addr_32); - assert_eq!(now_blnc_alice, BALANCE); - }) -}