From 4201817638240772819b5a291ebd316679d8a104 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marin=20Ver=C5=A1i=C4=87?= Date: Mon, 10 Jun 2024 18:28:17 +0200 Subject: [PATCH] refactor!: remove `_id` suffix for entity ids in public API MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marin Veršić --- cli/src/lib.rs | 6 +- cli/src/samples.rs | 2 +- client/src/client.rs | 27 +- client/src/config.rs | 8 +- client/src/config/user.rs | 12 +- client/src/lib.rs | 4 +- client/tests/integration/asset.rs | 18 +- client/tests/integration/asset_propagation.rs | 2 +- .../integration/domain_owner_permissions.rs | 16 +- client/tests/integration/events/data.rs | 28 +- .../tests/integration/events/notification.rs | 4 +- .../multiple_blocks_created.rs | 2 +- .../extra_functional/offline_peers.rs | 2 +- .../extra_functional/restart_peer.rs | 4 +- .../extra_functional/unregister_peer.rs | 2 +- .../extra_functional/unstable_network.rs | 2 +- client/tests/integration/non_mintable.rs | 8 +- client/tests/integration/permissions.rs | 14 +- client/tests/integration/queries/role.rs | 2 +- .../integration/queries/smart_contract.rs | 2 +- client/tests/integration/roles.rs | 14 +- .../src/lib.rs | 8 +- .../executor_custom_data_model/src/simple.rs | 2 +- .../src/lib.rs | 4 +- .../src/lib.rs | 4 +- client/tests/integration/transfer_asset.rs | 8 +- .../integration/triggers/by_call_trigger.rs | 18 +- .../integration/triggers/time_trigger.rs | 4 +- client/tests/integration/tx_rollback.rs | 2 +- client/tests/integration/upgrade.rs | 8 +- .../json_isi_examples/unregister_asset.json | 2 +- .../pytests/src/client_cli/client_cli.py | 8 +- .../pytests/src/client_cli/configuration.py | 2 +- .../test/assets/test_unregister_asset.py | 2 +- config/base/tests/misc.rs | 30 +- config/iroha_test_config.toml | 2 +- config/src/parameters/actual.rs | 11 +- config/src/parameters/user.rs | 8 +- config/tests/fixtures.rs | 8 +- config/tests/fixtures/base.toml | 2 +- config/tests/fixtures/full.env | 2 +- config/tests/fixtures/full.toml | 2 +- .../tests/fixtures/minimal_file_and_env.toml | 2 +- configs/client.template.toml | 4 +- configs/peer.template.toml | 2 +- configs/swarm/client.toml | 4 +- configs/swarm/executor.wasm | Bin 512019 -> 511696 bytes configs/swarm/genesis.json | 14 +- core/benches/blocks/common.rs | 2 +- core/src/lib.rs | 20 +- core/src/smartcontracts/isi/account.rs | 87 +++--- core/src/smartcontracts/isi/asset.rs | 78 +++-- core/src/smartcontracts/isi/domain.rs | 54 ++-- core/src/smartcontracts/isi/triggers/mod.rs | 22 +- core/src/smartcontracts/isi/world.rs | 26 +- core/src/smartcontracts/wasm.rs | 2 +- core/src/state.rs | 48 +-- core/src/sumeragi/mod.rs | 8 +- core/src/tx.rs | 12 +- core/test_network/src/lib.rs | 10 +- data_model/derive/src/has_origin.rs | 2 +- data_model/derive/src/lib.rs | 12 +- data_model/derive/tests/has_origin.rs | 2 +- .../derive/tests/has_origin_generics.rs | 2 +- data_model/src/account.rs | 10 +- data_model/src/asset.rs | 18 +- data_model/src/events/data/events.rs | 94 +++--- data_model/src/events/data/filters.rs | 16 +- data_model/src/isi.rs | 118 ++++---- data_model/src/transaction.rs | 10 +- docs/source/references/schema.json | 114 ++++---- scripts/test_env.py | 4 +- .../executor/derive/src/conversion.rs | 8 +- smart_contract/executor/derive/src/lib.rs | 12 +- smart_contract/executor/src/default.rs | 274 ++++++++---------- .../executor/src/default/permissions.rs | 66 ++--- smart_contract/executor/src/permission.rs | 61 ++-- tools/parity_scale_cli/samples/trigger.json | 2 +- 78 files changed, 748 insertions(+), 788 deletions(-) diff --git a/cli/src/lib.rs b/cli/src/lib.rs index 027a9189aef..e0ae2b8a6aa 100644 --- a/cli/src/lib.rs +++ b/cli/src/lib.rs @@ -319,14 +319,14 @@ impl Iroha { &config.block_sync, sumeragi.clone(), Arc::clone(&kura), - config.common.peer_id(), + config.common.peer.clone(), network.clone(), Arc::clone(&state), ) .start(); let gossiper = TransactionGossiper::from_config( - config.common.chain_id.clone(), + config.common.chain.clone(), config.transaction_gossiper, network.clone(), Arc::clone(&queue), @@ -356,7 +356,7 @@ impl Iroha { let kiso = KisoHandle::new(config.clone()); let torii = Torii::new( - config.common.chain_id.clone(), + config.common.chain.clone(), kiso.clone(), config.torii, Arc::clone(&queue), diff --git a/cli/src/samples.rs b/cli/src/samples.rs index 8c5a2ba1698..b73d2820e57 100644 --- a/cli/src/samples.rs +++ b/cli/src/samples.rs @@ -63,7 +63,7 @@ pub fn get_config_toml( let mut raw = toml::Table::new(); iroha_config::base::toml::Writer::new(&mut raw) - .write("chain_id", chain_id) + .write("chain", chain_id) .write("public_key", public_key) .write("private_key", ExposedPrivateKey(private_key)) .write(["sumeragi", "trusted_peers"], peers) diff --git a/client/src/client.rs b/client/src/client.rs index a86c3c37c50..84535567942 100644 --- a/client/src/client.rs +++ b/client/src/client.rs @@ -362,7 +362,7 @@ impl_query_output! { #[display(fmt = "{}@{torii_url}", "key_pair.public_key()")] pub struct Client { /// Unique id of the blockchain. Used for simple replay attack protection. - pub chain_id: ChainId, + pub chain: ChainId, /// Url for accessing Iroha node pub torii_url: Url, /// Accounts keypair @@ -372,7 +372,7 @@ pub struct Client { /// Transaction status timeout pub transaction_status_timeout: Duration, /// Current account - pub account_id: AccountId, + pub account: AccountId, /// Http headers which will be appended to each request pub headers: HashMap, /// If `true` add nonce, which makes different hashes for @@ -435,8 +435,8 @@ impl Client { #[inline] pub fn with_headers( Config { - chain_id, - account_id, + chain, + account, torii_api_url, key_pair, basic_auth, @@ -454,12 +454,12 @@ impl Client { } Self { - chain_id, + chain, torii_url: torii_api_url, key_pair, transaction_ttl: Some(transaction_ttl), transaction_status_timeout, - account_id, + account, headers, add_transaction_nonce: transaction_add_nonce, } @@ -474,7 +474,7 @@ impl Client { instructions: impl Into, metadata: UnlimitedMetadata, ) -> SignedTransaction { - let tx_builder = TransactionBuilder::new(self.chain_id.clone(), self.account_id.clone()); + let tx_builder = TransactionBuilder::new(self.chain.clone(), self.account.clone()); let mut tx_builder = match instructions.into() { Executable::Instructions(instructions) => tx_builder.with_instructions(instructions), @@ -836,7 +836,7 @@ impl Client { where >::Error: Into, { - let query_builder = ClientQueryBuilder::new(request, self.account_id.clone()) + let query_builder = ClientQueryBuilder::new(request, self.account.clone()) .with_filter(filter) .with_pagination(pagination) .with_sorting(sorting) @@ -1619,9 +1619,9 @@ mod tests { fn config_factory() -> Config { let (account_id, key_pair) = gen_account_in("wonderland"); Config { - chain_id: ChainId::from("00000000-0000-0000-0000-000000000000"), + chain: ChainId::from("00000000-0000-0000-0000-000000000000"), key_pair, - account_id, + account: account_id, torii_api_url: "http://127.0.0.1:8080".parse().unwrap(), basic_auth: None, transaction_add_nonce: false, @@ -1644,10 +1644,9 @@ mod tests { assert_ne!(tx1.hash(), tx2.hash()); let tx2 = { - let mut tx = - TransactionBuilder::new(client.chain_id.clone(), client.account_id.clone()) - .with_executable(tx1.instructions().clone()) - .with_metadata(tx1.metadata().clone()); + let mut tx = TransactionBuilder::new(client.chain.clone(), client.account.clone()) + .with_executable(tx1.instructions().clone()) + .with_metadata(tx1.metadata().clone()); tx.set_creation_time(tx1.creation_time()); if let Some(nonce) = tx1.nonce() { diff --git a/client/src/config.rs b/client/src/config.rs index 316434da4a2..53190d5b4d4 100644 --- a/client/src/config.rs +++ b/client/src/config.rs @@ -56,8 +56,8 @@ pub struct BasicAuth { #[derive(Clone, Debug, Serialize)] #[allow(missing_docs)] pub struct Config { - pub chain_id: ChainId, - pub account_id: AccountId, + pub chain: ChainId, + pub account: AccountId, pub key_pair: KeyPair, pub basic_auth: Option, pub torii_api_url: Url, @@ -108,7 +108,7 @@ mod tests { fn config_sample() -> toml::Table { toml::toml! { - chain_id = "00000000-0000-0000-0000-000000000000" + chain = "00000000-0000-0000-0000-000000000000" torii_url = "http://127.0.0.1:8080/" [basic_auth] @@ -116,7 +116,7 @@ mod tests { password = "ilovetea" [account] - domain_id = "wonderland" + domain = "wonderland" public_key = "ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03" private_key = "802640CCF31D85E3B32A4BEA59987CE0C78E3B8E2DB93881468AB2435FE45D5C9DCD53CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03" diff --git a/client/src/config/user.rs b/client/src/config/user.rs index 7ea7b1f066c..c096b224748 100644 --- a/client/src/config/user.rs +++ b/client/src/config/user.rs @@ -16,7 +16,7 @@ use crate::config::BasicAuth; #[derive(Clone, Debug, ReadConfig)] #[allow(missing_docs)] pub struct Root { - pub chain_id: ChainId, + pub chain: ChainId, #[config(env = "TORII_URL")] pub torii_url: WithOrigin, pub basic_auth: Option, @@ -44,12 +44,12 @@ impl Root { /// If a set of validity errors occurs. pub fn parse(self) -> error_stack::Result { let Self { - chain_id, + chain: chain_id, torii_url, basic_auth, account: Account { - domain_id, + domain: domain_id, public_key, private_key, }, @@ -98,8 +98,8 @@ impl Root { emitter.into_result()?; Ok(super::Config { - chain_id, - account_id, + chain: chain_id, + account: account_id, key_pair: key_pair.unwrap(), torii_api_url: torii_url.into_value(), basic_auth, @@ -113,7 +113,7 @@ impl Root { #[derive(Debug, Clone, ReadConfig)] #[allow(missing_docs)] pub struct Account { - pub domain_id: DomainId, + pub domain: DomainId, pub public_key: WithOrigin, pub private_key: WithOrigin, } diff --git a/client/src/lib.rs b/client/src/lib.rs index 0de4272bd81..f3541257d2c 100644 --- a/client/src/lib.rs +++ b/client/src/lib.rs @@ -30,10 +30,10 @@ pub mod samples { .parse() .expect("should be valid"); Config { - chain_id, + chain: chain_id, key_pair, torii_api_url, - account_id, + account: account_id, basic_auth: None, transaction_ttl: DEFAULT_TRANSACTION_TIME_TO_LIVE, transaction_status_timeout: DEFAULT_TRANSACTION_STATUS_TIMEOUT, diff --git a/client/tests/integration/asset.rs b/client/tests/integration/asset.rs index c3af76a2d58..d9e9022f591 100644 --- a/client/tests/integration/asset.rs +++ b/client/tests/integration/asset.rs @@ -43,7 +43,7 @@ fn client_register_asset_should_add_asset_once_but_not_twice() -> Result<()> { let assets = result.collect::>>().expect("Valid"); assets.iter().any(|asset| { - asset.id().definition_id == asset_definition_id + *asset.id().definition() == asset_definition_id && *asset.value() == AssetValue::Numeric(Numeric::ZERO) }) })?; @@ -77,7 +77,7 @@ fn unregister_asset_should_remove_asset_from_account() -> Result<()> { assets .iter() - .any(|asset| asset.id().definition_id == asset_definition_id) + .any(|asset| *asset.id().definition() == asset_definition_id) })?; test_client.submit(unregister_asset)?; @@ -88,7 +88,7 @@ fn unregister_asset_should_remove_asset_from_account() -> Result<()> { assets .iter() - .all(|asset| asset.id().definition_id != asset_definition_id) + .all(|asset| *asset.id().definition() != asset_definition_id) })?; Ok(()) @@ -120,7 +120,7 @@ fn client_add_asset_quantity_to_existing_asset_should_increase_asset_amount() -> let assets = result.collect::>>().expect("Valid"); assets.iter().any(|asset| { - asset.id().definition_id == asset_definition_id + *asset.id().definition() == asset_definition_id && *asset.value() == AssetValue::Numeric(quantity) }) })?; @@ -151,7 +151,7 @@ fn client_add_big_asset_quantity_to_existing_asset_should_increase_asset_amount( let assets = result.collect::>>().expect("Valid"); assets.iter().any(|asset| { - asset.id().definition_id == asset_definition_id + *asset.id().definition() == asset_definition_id && *asset.value() == AssetValue::Numeric(quantity) }) })?; @@ -183,7 +183,7 @@ fn client_add_asset_with_decimal_should_increase_asset_amount() -> Result<()> { let assets = result.collect::>>().expect("Valid"); assets.iter().any(|asset| { - asset.id().definition_id == asset_definition_id + *asset.id().definition() == asset_definition_id && *asset.value() == AssetValue::Numeric(quantity) }) })?; @@ -202,7 +202,7 @@ fn client_add_asset_with_decimal_should_increase_asset_amount() -> Result<()> { let assets = result.collect::>>().expect("Valid"); assets.iter().any(|asset| { - asset.id().definition_id == asset_definition_id + *asset.id().definition() == asset_definition_id && *asset.value() == AssetValue::Numeric(sum) }) })?; @@ -298,13 +298,13 @@ fn find_rate_and_make_exchange_isi_should_succeed() { let instruction = Grant::permission( Permission::new( "CanTransferUserAsset".parse().unwrap(), - json!({ "asset_id": asset_id }), + json!({ "asset": asset_id }), ), alice_id.clone(), ); let transaction = TransactionBuilder::new( ChainId::from("00000000-0000-0000-0000-000000000000"), - asset_id.account_id().clone(), + asset_id.account().clone(), ) .with_instructions([instruction]) .sign(&owner_key_pair); diff --git a/client/tests/integration/asset_propagation.rs b/client/tests/integration/asset_propagation.rs index 1e8326dd237..bcf99a5ca9c 100644 --- a/client/tests/integration/asset_propagation.rs +++ b/client/tests/integration/asset_propagation.rs @@ -53,7 +53,7 @@ fn client_add_asset_quantity_to_existing_asset_should_increase_asset_amount_on_a let assets = result.collect::>>().expect("Valid"); assets.iter().any(|asset| { - asset.id().definition_id == asset_definition_id + *asset.id().definition() == asset_definition_id && *asset.value() == AssetValue::Numeric(quantity) }) }, diff --git a/client/tests/integration/domain_owner_permissions.rs b/client/tests/integration/domain_owner_permissions.rs index 54ebd1e7c9c..a6d1434b514 100644 --- a/client/tests/integration/domain_owner_permissions.rs +++ b/client/tests/integration/domain_owner_permissions.rs @@ -48,7 +48,7 @@ fn domain_owner_domain_permissions() -> Result<()> { // Granting a respective token also allows "bob@kingdom" to do so let token = Permission::new( "CanRegisterAssetDefinitionInDomain".parse().unwrap(), - json!({ "domain_id": kingdom_id }), + json!({ "domain": kingdom_id }), ); test_client.submit_blocking(Grant::permission(token.clone(), bob_id.clone()))?; let transaction = TransactionBuilder::new(chain_id, bob_id.clone()) @@ -66,7 +66,7 @@ fn domain_owner_domain_permissions() -> Result<()> { // check that "alice@wonderland" as owner of domain can grant and revoke domain related permission tokens let token = Permission::new( "CanUnregisterDomain".parse().unwrap(), - json!({ "domain_id": kingdom_id }), + json!({ "domain": kingdom_id }), ); test_client.submit_blocking(Grant::permission(token.clone(), bob_id.clone()))?; test_client.submit_blocking(Revoke::permission(token, bob_id))?; @@ -106,7 +106,7 @@ fn domain_owner_account_permissions() -> Result<()> { let bob_id = BOB_ID.clone(); let token = Permission::new( "CanUnregisterAccount".parse().unwrap(), - json!({ "account_id": mad_hatter_id }), + json!({ "account": mad_hatter_id }), ); test_client.submit_blocking(Grant::permission(token.clone(), bob_id.clone()))?; test_client.submit_blocking(Revoke::permission(token, bob_id))?; @@ -141,7 +141,7 @@ fn domain_owner_asset_definition_permissions() -> Result<()> { // Grant permission to register asset definitions to "bob@kingdom" let token = Permission::new( "CanRegisterAssetDefinitionInDomain".parse().unwrap(), - json!({ "domain_id": kingdom_id }), + json!({ "domain": kingdom_id }), ); test_client.submit_blocking(Grant::permission(token, bob_id.clone()))?; @@ -172,7 +172,7 @@ fn domain_owner_asset_definition_permissions() -> Result<()> { // check that "alice@wonderland" as owner of domain can grant and revoke asset definition related permission tokens in her domain let token = Permission::new( "CanUnregisterAssetDefinition".parse().unwrap(), - json!({ "asset_definition_id": coin_id }), + json!({ "asset_definition": coin_id }), ); test_client.submit_blocking(Grant::permission(token.clone(), bob_id.clone()))?; test_client.submit_blocking(Revoke::permission(token, bob_id))?; @@ -206,7 +206,7 @@ fn domain_owner_asset_permissions() -> Result<()> { // Grant permission to register asset definitions to "bob@kingdom" let token = Permission::new( "CanRegisterAssetDefinitionInDomain".parse().unwrap(), - json!({ "domain_id": kingdom_id }), + json!({ "domain": kingdom_id }), ); test_client.submit_blocking(Grant::permission(token, bob_id.clone()))?; @@ -242,7 +242,7 @@ fn domain_owner_asset_permissions() -> Result<()> { // check that "alice@wonderland" as owner of domain can grant and revoke asset related permission tokens in her domain let token = Permission::new( "CanUnregisterUserAsset".parse().unwrap(), - json!({ "asset_id": bob_store_id }), + json!({ "asset": bob_store_id }), ); test_client.submit_blocking(Grant::permission(token.clone(), bob_id.clone()))?; test_client.submit_blocking(Revoke::permission(token, bob_id))?; @@ -293,7 +293,7 @@ fn domain_owner_trigger_permissions() -> Result<()> { // check that "alice@wonderland" as owner of domain can grant and revoke trigger related permission tokens in her domain let token = Permission::new( "CanUnregisterUserTrigger".parse().unwrap(), - json!({ "account_id": bob_id }), + json!({ "account": bob_id }), ); test_client.submit_blocking(Grant::permission(token.clone(), bob_id.clone()))?; test_client.submit_blocking(Revoke::permission(token, bob_id))?; diff --git a/client/tests/integration/events/data.rs b/client/tests/integration/events/data.rs index aa4aaa16932..1e35a9819ed 100644 --- a/client/tests/integration/events/data.rs +++ b/client/tests/integration/events/data.rs @@ -201,11 +201,11 @@ fn produce_multiple_events() -> Result<()> { let role_id = RoleId::from_str("TEST_ROLE")?; let token_1 = Permission::new( "CanRemoveKeyValueInAccount".parse()?, - json!({ "account_id": alice_id }), + json!({ "account": alice_id }), ); let token_2 = Permission::new( "CanSetKeyValueInAccount".parse()?, - json!({ "account_id": alice_id }), + json!({ "account": alice_id }), ); let role = iroha::data_model::role::Role::new(role_id.clone()) .add_permission(token_1.clone()) @@ -239,38 +239,38 @@ fn produce_multiple_events() -> Result<()> { let expected_domain_events: Vec = [ DataEvent::Domain(DomainEvent::Account(AccountEvent::PermissionAdded( AccountPermissionChanged { - account_id: bob_id.clone(), - permission_id: token_1.id.clone(), + account: bob_id.clone(), + permission: token_1.id.clone(), }, ))), DataEvent::Domain(DomainEvent::Account(AccountEvent::PermissionAdded( AccountPermissionChanged { - account_id: bob_id.clone(), - permission_id: token_2.id.clone(), + account: bob_id.clone(), + permission: token_2.id.clone(), }, ))), DataEvent::Domain(DomainEvent::Account(AccountEvent::RoleGranted( AccountRoleChanged { - account_id: bob_id.clone(), - role_id: role_id.clone(), + account: bob_id.clone(), + role: role_id.clone(), }, ))), DataEvent::Domain(DomainEvent::Account(AccountEvent::PermissionRemoved( AccountPermissionChanged { - account_id: bob_id.clone(), - permission_id: token_1.id, + account: bob_id.clone(), + permission: token_1.id, }, ))), DataEvent::Domain(DomainEvent::Account(AccountEvent::PermissionRemoved( AccountPermissionChanged { - account_id: bob_id.clone(), - permission_id: token_2.id, + account: bob_id.clone(), + permission: token_2.id, }, ))), DataEvent::Domain(DomainEvent::Account(AccountEvent::RoleRevoked( AccountRoleChanged { - account_id: bob_id, - role_id: role_id.clone(), + account: bob_id, + role: role_id.clone(), }, ))), DataEvent::Role(RoleEvent::Deleted(role_id)), diff --git a/client/tests/integration/events/notification.rs b/client/tests/integration/events/notification.rs index 8c36edc64c3..90f04abdf30 100644 --- a/client/tests/integration/events/notification.rs +++ b/client/tests/integration/events/notification.rs @@ -21,10 +21,10 @@ fn trigger_completion_success_should_produce_event() -> Result<()> { Action::new( vec![InstructionBox::from(instruction)], Repeats::Indefinitely, - asset_id.account_id.clone(), + asset_id.account().clone(), ExecuteTriggerEventFilter::new() .for_trigger(trigger_id.clone()) - .under_authority(asset_id.account_id), + .under_authority(asset_id.account().clone()), ), )); test_client.submit_blocking(register_trigger)?; diff --git a/client/tests/integration/extra_functional/multiple_blocks_created.rs b/client/tests/integration/extra_functional/multiple_blocks_created.rs index afa8737c974..458af606d10 100644 --- a/client/tests/integration/extra_functional/multiple_blocks_created.rs +++ b/client/tests/integration/extra_functional/multiple_blocks_created.rs @@ -62,7 +62,7 @@ fn long_multiple_blocks_created() -> Result<()> { let assets = result.collect::>>().expect("Valid"); assets.iter().any(|asset| { - asset.id().definition_id == asset_definition_id + *asset.id().definition() == asset_definition_id && *asset.value() == AssetValue::Numeric(account_has_quantity) }) }, diff --git a/client/tests/integration/extra_functional/offline_peers.rs b/client/tests/integration/extra_functional/offline_peers.rs index f0d847ee048..163d8ce20ab 100644 --- a/client/tests/integration/extra_functional/offline_peers.rs +++ b/client/tests/integration/extra_functional/offline_peers.rs @@ -36,7 +36,7 @@ fn genesis_block_is_committed_with_some_offline_peers() -> Result<()> { .collect::>>()?; let asset = assets .iter() - .find(|asset| asset.id().definition_id == roses) + .find(|asset| *asset.id().definition() == roses) .unwrap(); assert_eq!(AssetValue::Numeric(alice_has_roses), *asset.value()); Ok(()) diff --git a/client/tests/integration/extra_functional/restart_peer.rs b/client/tests/integration/extra_functional/restart_peer.rs index 2b919073c68..40540b7f549 100644 --- a/client/tests/integration/extra_functional/restart_peer.rs +++ b/client/tests/integration/extra_functional/restart_peer.rs @@ -51,7 +51,7 @@ fn restarted_peer_should_have_the_same_asset_amount() -> Result<()> { .collect::>>()?; let asset = assets .into_iter() - .find(|asset| asset.id().definition_id == asset_definition_id) + .find(|asset| *asset.id().definition() == asset_definition_id) .expect("Asset not found"); assert_eq!(AssetValue::Numeric(quantity), *asset.value()); @@ -82,7 +82,7 @@ fn restarted_peer_should_have_the_same_asset_amount() -> Result<()> { let account_asset = assets .into_iter() - .find(|asset| asset.id().definition_id == asset_definition_id) + .find(|asset| *asset.id().definition() == asset_definition_id) .expect("Asset not found"); AssetValue::Numeric(quantity) == *account_asset.value() diff --git a/client/tests/integration/extra_functional/unregister_peer.rs b/client/tests/integration/extra_functional/unregister_peer.rs index 3ea3a3292f8..ade2324d525 100644 --- a/client/tests/integration/extra_functional/unregister_peer.rs +++ b/client/tests/integration/extra_functional/unregister_peer.rs @@ -81,7 +81,7 @@ fn check_assets( let assets = result.collect::>>().expect("Valid"); assets.iter().any(|asset| { - asset.id().definition_id == *asset_definition_id + asset.id().definition() == asset_definition_id && *asset.value() == AssetValue::Numeric(quantity) }) }, diff --git a/client/tests/integration/extra_functional/unstable_network.rs b/client/tests/integration/extra_functional/unstable_network.rs index e96bfb428fc..3792be04267 100644 --- a/client/tests/integration/extra_functional/unstable_network.rs +++ b/client/tests/integration/extra_functional/unstable_network.rs @@ -118,7 +118,7 @@ fn unstable_network( let assets = result.collect::>>().expect("Valid"); assets.iter().any(|asset| { - asset.id().definition_id == asset_definition_id + *asset.id().definition() == asset_definition_id && *asset.value() == AssetValue::Numeric(account_has_quantity) }) }, diff --git a/client/tests/integration/non_mintable.rs b/client/tests/integration/non_mintable.rs index b6561028e41..b3f80e3d3d6 100644 --- a/client/tests/integration/non_mintable.rs +++ b/client/tests/integration/non_mintable.rs @@ -36,7 +36,7 @@ fn non_mintable_asset_can_be_minted_once_but_not_twice() -> Result<()> { test_client.poll_request(client::asset::by_account_id(account_id.clone()), |result| { let assets = result.collect::>>().expect("Valid"); assets.iter().any(|asset| { - asset.id().definition_id == asset_definition_id + *asset.id().definition() == asset_definition_id && *asset.value() == AssetValue::Numeric(numeric!(200)) }) })?; @@ -49,7 +49,7 @@ fn non_mintable_asset_can_be_minted_once_but_not_twice() -> Result<()> { .poll_request(client::asset::by_account_id(account_id), |result| { let assets = result.collect::>>().expect("Valid"); assets.iter().any(|asset| { - asset.id().definition_id == asset_definition_id + *asset.id().definition() == asset_definition_id && *asset.value() == AssetValue::Numeric(numeric!(400)) }) }) @@ -79,7 +79,7 @@ fn non_mintable_asset_cannot_be_minted_if_registered_with_non_zero_value() -> Re test_client.poll_request(client::asset::by_account_id(account_id), |result| { let assets = result.collect::>>().expect("Valid"); assets.iter().any(|asset| { - asset.id().definition_id == asset_definition_id + *asset.id().definition() == asset_definition_id && *asset.value() == AssetValue::Numeric(numeric!(1)) }) })?; @@ -117,7 +117,7 @@ fn non_mintable_asset_can_be_minted_if_registered_with_zero_value() -> Result<() test_client.poll_request(client::asset::by_account_id(account_id), |result| { let assets = result.collect::>>().expect("Valid"); assets.iter().any(|asset| { - asset.id().definition_id == asset_definition_id + *asset.id().definition() == asset_definition_id && *asset.value() == AssetValue::Numeric(numeric!(1)) }) })?; diff --git a/client/tests/integration/permissions.rs b/client/tests/integration/permissions.rs index 1538d6483ab..d213d9345f6 100644 --- a/client/tests/integration/permissions.rs +++ b/client/tests/integration/permissions.rs @@ -233,7 +233,7 @@ fn permissions_differ_not_only_by_names() { let allow_alice_to_set_key_value_in_hats = Grant::permission( Permission::new( "CanSetKeyValueInUserAsset".parse().unwrap(), - json!({ "asset_id": mouse_hat_id }), + json!({ "asset": mouse_hat_id }), ), alice_id.clone(), ); @@ -269,7 +269,7 @@ fn permissions_differ_not_only_by_names() { let allow_alice_to_set_key_value_in_shoes = Grant::permission( Permission::new( "CanSetKeyValueInUserAsset".parse().unwrap(), - json!({ "asset_id": mouse_shoes_id }), + json!({ "asset": mouse_shoes_id }), ), alice_id, ); @@ -321,7 +321,7 @@ fn stored_vs_granted_token_payload() -> Result<()> { JsonString::from_string_unchecked(format!( // Introducing some whitespaces // This way, if the executor compares just JSON strings, this test would fail - r##"{{ "asset_id" : "xor#wonderland#{mouse_id}" }}"## + r##"{{ "asset" : "xor#wonderland#{mouse_id}" }}"## )), ), alice_id, @@ -355,7 +355,7 @@ fn permissions_are_unified() { let allow_alice_to_transfer_rose_1 = Grant::permission( Permission::new( "CanTransferUserAsset".parse().unwrap(), - json!({ "asset_id": format!("rose#wonderland#{alice_id}") }), + json!({ "asset": format!("rose#wonderland#{alice_id}") }), ), alice_id.clone(), ); @@ -364,7 +364,7 @@ fn permissions_are_unified() { Permission::new( "CanTransferUserAsset".parse().unwrap(), // different content, but same meaning - json!({ "asset_id": format!("rose##{alice_id}") }), + json!({ "asset": format!("rose##{alice_id}") }), ), alice_id, ); @@ -391,7 +391,7 @@ fn associated_permissions_removed_on_unregister() { let register_domain = Register::domain(kingdom); let bob_to_set_kv_in_domain_token = Permission::new( "CanSetKeyValueInDomain".parse().unwrap(), - json!({ "domain_id": kingdom_id }), + json!({ "domain": kingdom_id }), ); let allow_bob_to_set_kv_in_domain = Grant::permission(bob_to_set_kv_in_domain_token.clone(), bob_id.clone()); @@ -438,7 +438,7 @@ fn associated_permissions_removed_from_role_on_unregister() { let register_domain = Register::domain(kingdom); let set_kv_in_domain_token = Permission::new( "CanSetKeyValueInDomain".parse().unwrap(), - json!({ "domain_id": kingdom_id }), + json!({ "domain": kingdom_id }), ); let role = Role::new(role_id.clone()).add_permission(set_kv_in_domain_token.clone()); let register_role = Register::role(role); diff --git a/client/tests/integration/queries/role.rs b/client/tests/integration/queries/role.rs index a2cd250a060..07d0035a3dc 100644 --- a/client/tests/integration/queries/role.rs +++ b/client/tests/integration/queries/role.rs @@ -133,7 +133,7 @@ fn find_roles_by_account_id() -> Result<()> { .map(|role_id| { Register::role(Role::new(role_id).add_permission(Permission::new( "CanSetKeyValueInAccount".parse().unwrap(), - json!({ "account_id": alice_id }), + json!({ "account": alice_id }), ))) }) .collect::>(); diff --git a/client/tests/integration/queries/smart_contract.rs b/client/tests/integration/queries/smart_contract.rs index 33858c64c07..649f4550146 100644 --- a/client/tests/integration/queries/smart_contract.rs +++ b/client/tests/integration/queries/smart_contract.rs @@ -30,7 +30,7 @@ fn live_query_is_dropped_after_smart_contract_end() -> Result<()> { client.submit_transaction_blocking(&transaction)?; let metadata_value = client.request(FindAccountKeyValueByIdAndKey::new( - client.account_id.clone(), + client.account.clone(), Name::from_str("cursor").unwrap(), ))?; let cursor: String = metadata_value.try_into()?; diff --git a/client/tests/integration/roles.rs b/client/tests/integration/roles.rs index 2f3a968e7a1..5fae2f04222 100644 --- a/client/tests/integration/roles.rs +++ b/client/tests/integration/roles.rs @@ -64,11 +64,11 @@ fn register_and_grant_role_for_metadata_access() -> Result<()> { let role = Role::new(role_id.clone()) .add_permission(Permission::new( "CanSetKeyValueInAccount".parse()?, - json!({ "account_id": mouse_id }), + json!({ "account": mouse_id }), )) .add_permission(Permission::new( "CanRemoveKeyValueInAccount".parse()?, - json!({ "account_id": mouse_id }), + json!({ "account": mouse_id }), )); let register_role = Register::role(role); test_client.submit_blocking(register_role)?; @@ -113,7 +113,7 @@ fn unregistered_role_removed_from_account() -> Result<()> { // Register root role let register_role = Register::role(Role::new(role_id.clone()).add_permission(Permission::new( "CanSetKeyValueInAccount".parse()?, - json!({ "account_id": alice_id }), + json!({ "account": alice_id }), ))); test_client.submit_blocking(register_role)?; @@ -151,7 +151,7 @@ fn role_with_invalid_permissions_is_not_accepted() -> Result<()> { .expect("should be valid"); let role = Role::new(role_id).add_permission(Permission::new( "CanSetKeyValueInAccount".parse()?, - json!({ "account_id": rose_asset_id }), + json!({ "account": rose_asset_id }), )); let err = test_client @@ -178,13 +178,13 @@ fn role_permissions_are_deduplicated() { let allow_alice_to_transfer_rose_1 = Permission::new( "CanTransferUserAsset".parse().unwrap(), - json!({ "asset_id": "rose#wonderland#ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland" }), + json!({ "asset": "rose#wonderland#ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland" }), ); // Different content, but same meaning let allow_alice_to_transfer_rose_2 = Permission::new( "CanTransferUserAsset".parse().unwrap(), - json!({ "asset_id": "rose##ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland" }), + json!({ "asset": "rose##ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland" }), ); let role_id: RoleId = "role_id".parse().expect("Valid"); @@ -247,7 +247,7 @@ fn grant_revoke_role_permissions() -> Result<()> { ); let permission = Permission::new( "CanSetKeyValueInAccount".parse()?, - json!({ "account_id": mouse_id }), + json!({ "account": mouse_id }), ); let grant_role_permission = Grant::role_permission(permission.clone(), role_id.clone()); let revoke_role_permission = Revoke::role_permission(permission.clone(), role_id.clone()); diff --git a/client/tests/integration/smartcontracts/create_nft_for_every_user_trigger/src/lib.rs b/client/tests/integration/smartcontracts/create_nft_for_every_user_trigger/src/lib.rs index 4ae58d430b7..811e64fbbb8 100644 --- a/client/tests/integration/smartcontracts/create_nft_for_every_user_trigger/src/lib.rs +++ b/client/tests/integration/smartcontracts/create_nft_for_every_user_trigger/src/lib.rs @@ -31,7 +31,7 @@ fn main(_id: TriggerId, _owner: AccountId, _event: EventBox) { for account in accounts_cursor { let account = account.dbg_unwrap(); - if bad_domain_ids.contains(account.id().domain_id()) { + if bad_domain_ids.contains(account.id().domain()) { continue; } @@ -39,7 +39,7 @@ fn main(_id: TriggerId, _owner: AccountId, _event: EventBox) { let name = format!( "nft_for_{}_in_{}", account.id().signatory(), - account.id().domain_id() + account.id().domain() ) .parse() .dbg_unwrap(); @@ -69,7 +69,7 @@ fn generate_new_nft_id(account_id: &AccountId) -> AssetDefinitionId { let new_number = assets .into_iter() .map(|res| res.dbg_unwrap()) - .filter(|asset| asset.id().definition_id().to_string().starts_with("nft_")) + .filter(|asset| asset.id().definition().to_string().starts_with("nft_")) .count() .checked_add(1) .dbg_unwrap(); @@ -79,7 +79,7 @@ fn generate_new_nft_id(account_id: &AccountId) -> AssetDefinitionId { "nft_number_{}_for_{}#{}", new_number, account_id.signatory(), - account_id.domain_id() + account_id.domain() ) .parse() .dbg_unwrap() diff --git a/client/tests/integration/smartcontracts/executor_custom_data_model/src/simple.rs b/client/tests/integration/smartcontracts/executor_custom_data_model/src/simple.rs index 690b6bca477..2f4b5d9528f 100644 --- a/client/tests/integration/smartcontracts/executor_custom_data_model/src/simple.rs +++ b/client/tests/integration/smartcontracts/executor_custom_data_model/src/simple.rs @@ -20,7 +20,7 @@ pub enum CustomInstructionBox { #[derive(Debug, Deserialize, Serialize, IntoSchema)] pub struct MintAssetForAllAccounts { - pub asset_definition_id: AssetDefinitionId, + pub asset_definition: AssetDefinitionId, pub quantity: Numeric, } diff --git a/client/tests/integration/smartcontracts/executor_custom_instructions_simple/src/lib.rs b/client/tests/integration/smartcontracts/executor_custom_instructions_simple/src/lib.rs index 37c7c1bdfc0..a10b0ea9fc6 100644 --- a/client/tests/integration/smartcontracts/executor_custom_instructions_simple/src/lib.rs +++ b/client/tests/integration/smartcontracts/executor_custom_instructions_simple/src/lib.rs @@ -45,10 +45,10 @@ fn execute_custom_instruction(isi: CustomInstructionBox) -> Result<(), Validatio } fn execute_mint_asset_for_all_accounts(isi: MintAssetForAllAccounts) -> Result<(), ValidationFail> { - let accounts = FindAccountsWithAsset::new(isi.asset_definition_id.clone()).execute()?; + let accounts = FindAccountsWithAsset::new(isi.asset_definition.clone()).execute()?; for account in accounts { let account = account.dbg_expect("Failed to get accounts with asset"); - let asset_id = AssetId::new(isi.asset_definition_id.clone(), account.id().clone()); + let asset_id = AssetId::new(isi.asset_definition.clone(), account.id().clone()); Mint::asset_numeric(isi.quantity, asset_id).execute()?; } Ok(()) diff --git a/client/tests/integration/smartcontracts/executor_with_custom_permission/src/lib.rs b/client/tests/integration/smartcontracts/executor_with_custom_permission/src/lib.rs index 72d553d5ed1..4a4ddb6df86 100644 --- a/client/tests/integration/smartcontracts/executor_with_custom_permission/src/lib.rs +++ b/client/tests/integration/smartcontracts/executor_with_custom_permission/src/lib.rs @@ -99,7 +99,7 @@ impl Executor { &token, ) { - found_accounts.push((account, can_unregister_domain_token.domain_id)); + found_accounts.push((account, can_unregister_domain_token.domain)); break; } } @@ -120,7 +120,7 @@ impl Executor { Revoke::permission( Permission::new( can_unregister_domain_definition_id.clone(), - json!({ "domain_id": domain_id }), + json!({ "domain": domain_id }), ), account.id().clone(), ) diff --git a/client/tests/integration/transfer_asset.rs b/client/tests/integration/transfer_asset.rs index e974e9f8e2b..ae217ae6b5b 100644 --- a/client/tests/integration/transfer_asset.rs +++ b/client/tests/integration/transfer_asset.rs @@ -66,8 +66,8 @@ fn simulate_transfer_store_asset() { |result| { let assets = result.collect::>>().unwrap(); assets.iter().any(|asset| { - asset.id().definition_id == asset_definition_id - && asset.id().account_id == mouse_id + *asset.id().definition() == asset_definition_id + && *asset.id().account() == mouse_id }) }, ) @@ -125,9 +125,9 @@ fn simulate_transfer( let assets = result.collect::>>().unwrap(); assets.iter().any(|asset| { - asset.id().definition_id == asset_definition_id + *asset.id().definition() == asset_definition_id && *asset.value() == amount_to_transfer.clone().into() - && asset.id().account_id == mouse_id + && *asset.id().account() == mouse_id }) }, ) diff --git a/client/tests/integration/triggers/by_call_trigger.rs b/client/tests/integration/triggers/by_call_trigger.rs index 358173f3018..79598ce4c7a 100644 --- a/client/tests/integration/triggers/by_call_trigger.rs +++ b/client/tests/integration/triggers/by_call_trigger.rs @@ -29,7 +29,7 @@ fn call_execute_trigger() -> Result<()> { let prev_value = get_asset_value(&mut test_client, asset_id.clone()); let instruction = Mint::asset_numeric(1u32, asset_id.clone()); - let register_trigger = build_register_trigger_isi(asset_id.clone(), vec![instruction.into()]); + let register_trigger = build_register_trigger_isi(asset_id.account(), vec![instruction.into()]); test_client.submit_blocking(register_trigger)?; let trigger_id = TriggerId::from_str(TRIGGER_NAME)?; @@ -52,7 +52,7 @@ fn execute_trigger_should_produce_event() -> Result<()> { let asset_id = AssetId::new(asset_definition_id, account_id.clone()); let instruction = Mint::asset_numeric(1u32, asset_id.clone()); - let register_trigger = build_register_trigger_isi(asset_id, vec![instruction.into()]); + let register_trigger = build_register_trigger_isi(asset_id.account(), vec![instruction.into()]); test_client.submit_blocking(register_trigger)?; let trigger_id = TriggerId::from_str(TRIGGER_NAME)?; @@ -94,7 +94,7 @@ fn infinite_recursion_should_produce_one_call_per_block() -> Result<()> { Mint::asset_numeric(1u32, asset_id.clone()).into(), call_trigger.clone().into(), ]; - let register_trigger = build_register_trigger_isi(asset_id.clone(), instructions); + let register_trigger = build_register_trigger_isi(asset_id.account(), instructions); test_client.submit_blocking(register_trigger)?; test_client.submit_blocking(call_trigger)?; @@ -274,21 +274,21 @@ fn only_account_with_permission_can_register_trigger() -> Result<()> { let (_rt, _peer, test_client) = ::new().with_port(10_035).start_with_runtime(); wait_for_genesis_committed(&vec![test_client.clone()], 0); - let domain_id = ALICE_ID.domain_id().clone(); + let domain_id = ALICE_ID.domain().clone(); let alice_account_id = ALICE_ID.clone(); let rabbit_keys = KeyPair::random(); let rabbit_account_id = AccountId::new(domain_id, rabbit_keys.public_key().clone()); let rabbit_account = Account::new(rabbit_account_id.clone()); let mut rabbit_client = test_client.clone(); - rabbit_client.account_id = rabbit_account_id.clone(); + rabbit_client.account = rabbit_account_id.clone(); rabbit_client.key_pair = rabbit_keys; // Permission token for the trigger registration // on behalf of alice let permission_on_registration = Permission::new( "CanRegisterUserTrigger".parse().unwrap(), - json!({ "account_id": ALICE_ID.clone(), }), + json!({ "account": ALICE_ID.clone(), }), ); // Trigger with 'alice' as authority @@ -628,7 +628,7 @@ fn get_asset_value(client: &mut Client, asset_id: AssetId) -> Numeric { } fn build_register_trigger_isi( - asset_id: AssetId, + account_id: &AccountId, trigger_instructions: Vec, ) -> Register { let trigger_id: TriggerId = TRIGGER_NAME.parse().expect("Valid"); @@ -638,10 +638,10 @@ fn build_register_trigger_isi( Action::new( trigger_instructions, Repeats::Indefinitely, - asset_id.account_id.clone(), + account_id.clone(), ExecuteTriggerEventFilter::new() .for_trigger(trigger_id) - .under_authority(asset_id.account_id), + .under_authority(account_id.clone()), ), )) } diff --git a/client/tests/integration/triggers/time_trigger.rs b/client/tests/integration/triggers/time_trigger.rs index 24945786a7f..b44acc1611a 100644 --- a/client/tests/integration/triggers/time_trigger.rs +++ b/client/tests/integration/triggers/time_trigger.rs @@ -269,14 +269,14 @@ fn mint_nft_for_every_user_every_1_sec() -> Result<()> { // Checking results for account_id in accounts { let start_pattern = "nft_number_"; - let end_pattern = format!("_for_{}#{}", account_id.signatory, account_id.domain_id); + let end_pattern = format!("_for_{}#{}", account_id.signatory(), account_id.domain()); let assets = test_client .request(client::asset::by_account_id(account_id.clone()))? .collect::>>()?; let count: u64 = assets .into_iter() .filter(|asset| { - let s = asset.id().definition_id.to_string(); + let s = asset.id().definition().to_string(); s.starts_with(start_pattern) && s.ends_with(&end_pattern) }) .count() diff --git a/client/tests/integration/tx_rollback.rs b/client/tests/integration/tx_rollback.rs index c9a713d79c0..8e29755b377 100644 --- a/client/tests/integration/tx_rollback.rs +++ b/client/tests/integration/tx_rollback.rs @@ -30,7 +30,7 @@ fn client_sends_transaction_with_invalid_instruction_should_not_see_any_changes( let query_result = client.request(request)?.collect::>>()?; assert!(query_result .iter() - .all(|asset| asset.id().definition_id != wrong_asset_definition_id)); + .all(|asset| *asset.id().definition() != wrong_asset_definition_id)); let definition_query_result = client .request(client::asset::all_definitions())? .collect::>>()?; diff --git a/client/tests/integration/upgrade.rs b/client/tests/integration/upgrade.rs index 23954f4ac08..4ecebbf685f 100644 --- a/client/tests/integration/upgrade.rs +++ b/client/tests/integration/upgrade.rs @@ -34,7 +34,7 @@ fn executor_upgrade_should_work() -> Result<()> { wait_for_genesis_committed(&vec![client.clone()], 0); // Register `admin` domain and account - let admin_domain = Domain::new(admin_id.domain_id().clone()); + let admin_domain = Domain::new(admin_id.domain().clone()); let register_admin_domain = Register::domain(admin_domain); client.submit_blocking(register_admin_domain)?; @@ -93,7 +93,7 @@ fn executor_upgrade_should_run_migration() -> Result<()> { .expect("Valid"); assert!(alice_tokens.contains(&Permission::new( can_unregister_domain_token_id.clone(), - json!({ "domain_id": DomainId::from_str("wonderland").unwrap() }), + json!({ "domain": DomainId::from_str("wonderland").unwrap() }), ))); upgrade_executor( @@ -136,7 +136,7 @@ fn executor_upgrade_should_revoke_removed_permissions() -> Result<()> { // Permission which will be removed by executor let can_unregister_domain_token = Permission::new( "CanUnregisterDomain".parse()?, - json!({ "domain_id": DomainId::from_str("wonderland")? }), + json!({ "domain": DomainId::from_str("wonderland")? }), ); // Register `TEST_ROLE` with permission @@ -224,7 +224,7 @@ fn executor_custom_instructions_simple() -> Result<()> { // Give 1 rose to all let isi = MintAssetForAllAccounts { - asset_definition_id, + asset_definition: asset_definition_id, quantity: Numeric::from(1u32), }; let isi = CustomInstructionBox::MintAssetForAllAccounts(isi); diff --git a/client_cli/pytests/common/json_isi_examples/unregister_asset.json b/client_cli/pytests/common/json_isi_examples/unregister_asset.json index 837355581fb..2a5f1c21d41 100644 --- a/client_cli/pytests/common/json_isi_examples/unregister_asset.json +++ b/client_cli/pytests/common/json_isi_examples/unregister_asset.json @@ -1,7 +1,7 @@ [{ "Unregister": { "Asset": { - "object_id": "rose#ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland" + "object": "rose#ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland" } } }] diff --git a/client_cli/pytests/src/client_cli/client_cli.py b/client_cli/pytests/src/client_cli/client_cli.py index c78373fa2cf..6ebcdadafba 100644 --- a/client_cli/pytests/src/client_cli/client_cli.py +++ b/client_cli/pytests/src/client_cli/client_cli.py @@ -285,12 +285,12 @@ def register_trigger(self, account): return self - def unregister_asset(self, asset_id): + def unregister_asset(self, asset): """ Creates a JSON file for the unregister asset and executes it using the Iroha CLI. - :param asset_id: The object ID to be used in the unregister_asset. - :type asset_id: str + :param asset: The object ID to be used in the unregister_asset. + :type asset: str """ json_template_path = ( @@ -301,7 +301,7 @@ def unregister_asset(self, asset_id): / "unregister_asset.json" ) asset_data = read_isi_from_json(str(json_template_path)) - asset_data[0]["Unregister"]["Asset"]["object_id"] = str(asset_id) + asset_data[0]["Unregister"]["Asset"]["object"] = str(asset) json_temp_file_path = Path(ROOT_DIR) / "isi_unregister_asset.json" write_isi_to_json(asset_data, str(json_temp_file_path)) diff --git a/client_cli/pytests/src/client_cli/configuration.py b/client_cli/pytests/src/client_cli/configuration.py index 897eec066f8..09ff381c0df 100644 --- a/client_cli/pytests/src/client_cli/configuration.py +++ b/client_cli/pytests/src/client_cli/configuration.py @@ -130,7 +130,7 @@ def account_domain(self): :return: The account domain. :rtype: str """ - return self._config["account"]["domain_id"] + return self._config["account"]["domain"] @property def account_signatory(self): diff --git a/client_cli/pytests/test/assets/test_unregister_asset.py b/client_cli/pytests/test/assets/test_unregister_asset.py index bd48a79e0c2..6eb86623744 100644 --- a/client_cli/pytests/test/assets/test_unregister_asset.py +++ b/client_cli/pytests/test/assets/test_unregister_asset.py @@ -26,7 +26,7 @@ def test_unregister_asset( f'WHEN client_cli unregisters the asset "{GIVEN_numeric_asset_for_account.definition.name}"' ): client_cli.unregister_asset( - asset_id=f"{GIVEN_numeric_asset_for_account.definition.name}#" + asset=f"{GIVEN_numeric_asset_for_account.definition.name}#" f"{GIVEN_numeric_asset_for_account.account}@" f"{GIVEN_numeric_asset_for_account.definition.domain}" ) diff --git a/config/base/tests/misc.rs b/config/base/tests/misc.rs index 8ea64ba8493..af1d1e6a48a 100644 --- a/config/base/tests/misc.rs +++ b/config/base/tests/misc.rs @@ -18,7 +18,7 @@ pub mod sample_config { #[derive(Debug)] pub struct Root { - pub chain_id: String, + pub chain: String, pub torii: Torii, pub kura: Kura, pub telemetry: Telemetry, @@ -31,8 +31,8 @@ pub mod sample_config { Self: Sized, { let chain_id = reader - .read_parameter::(["chain_id"]) - .env("CHAIN_ID") + .read_parameter::(["chain"]) + .env("CHAIN") .value_required() .finish(); @@ -45,7 +45,7 @@ pub mod sample_config { let logger = reader.read_nested("logger"); FinalWrap::value_fn(move || Self { - chain_id: chain_id.unwrap(), + chain: chain_id.unwrap(), torii: torii.unwrap(), kura: kura.unwrap(), telemetry: telemetry.unwrap(), @@ -252,7 +252,7 @@ fn error_reading_empty_config() { expect![[r#" Some required parameters are missing - ╰╴missing parameter: `chain_id`"#]] + ╰╴missing parameter: `chain`"#]] .assert_eq_report(&report); } @@ -269,7 +269,7 @@ fn error_extra_fields_in_multiple_files() { .with_toml_source(TomlSource::new( PathBuf::from("./base.toml"), toml! { - chain_id = "412" + chain = "412" [torii] bar = false @@ -298,7 +298,7 @@ fn multiple_parsing_errors_in_multiple_sources() { .with_toml_source(TomlSource::new( PathBuf::from("./base.toml"), toml! { - chain_id = "ok" + chain = "ok" torii.address = "is it socket addr?" }, )) @@ -335,7 +335,7 @@ fn minimal_config_ok() { .with_toml_source(TomlSource::new( PathBuf::from("./config.toml"), toml! { - chain_id = "whatever" + chain = "whatever" }, )) .read_and_complete::() @@ -343,7 +343,7 @@ fn minimal_config_ok() { expect![[r#" Root { - chain_id: "whatever", + chain: "whatever", torii: Torii { address: WithOrigin { value: 128.0.0.1:8080, @@ -378,7 +378,7 @@ fn full_config_ok() { .with_toml_source(TomlSource::new( PathBuf::from("./config.toml"), toml! { - chain_id = "whatever" + chain = "whatever" [torii] address = "127.0.0.2:1337" @@ -400,7 +400,7 @@ fn full_config_ok() { expect![[r#" Root { - chain_id: "whatever", + chain: "whatever", torii: Torii { address: WithOrigin { value: 127.0.0.2:1337, @@ -442,17 +442,17 @@ fn full_config_ok() { #[test] fn env_overwrites_toml() { let root = ConfigReader::new() - .with_env(MockEnv::from(vec![("CHAIN_ID", "in env")])) + .with_env(MockEnv::from(vec![("CHAIN", "in env")])) .with_toml_source(TomlSource::new( PathBuf::from("config.toml"), toml! { - chain_id = "in file" + chain = "in file" }, )) .read_and_complete::() .expect("config is valid"); - assert_eq!(root.chain_id, "in env"); + assert_eq!(root.chain, "in env"); } #[test] @@ -465,7 +465,7 @@ fn full_from_env() { fn multiple_env_parsing_errors() { let report = ConfigReader::new() .with_env(MockEnv::from([ - ("CHAIN_ID", "just to set"), + ("CHAIN", "just to set"), ("API_ADDRESS", "i am not socket addr"), ("LOG_LEVEL", "error or whatever"), ])) diff --git a/config/iroha_test_config.toml b/config/iroha_test_config.toml index a9c73000aea..00da96628dc 100644 --- a/config/iroha_test_config.toml +++ b/config/iroha_test_config.toml @@ -1,4 +1,4 @@ -chain_id = "00000000-0000-0000-0000-000000000000" +chain = "00000000-0000-0000-0000-000000000000" public_key = "ed01201C61FAF8FE94E253B93114240394F79A607B7FA55F9E5A41EBEC74B88055768B" private_key = "802640282ED9F3CF92811C3818DBC4AE594ED59DC1A2F78E4241E31924E101D6B1FB831C61FAF8FE94E253B93114240394F79A607B7FA55F9E5A41EBEC74B88055768B" diff --git a/config/src/parameters/actual.rs b/config/src/parameters/actual.rs index f293923bcad..825cb6a0df7 100644 --- a/config/src/parameters/actual.rs +++ b/config/src/parameters/actual.rs @@ -69,16 +69,9 @@ impl Root { #[allow(missing_docs)] #[derive(Debug, Clone)] pub struct Common { - pub chain_id: ChainId, + pub chain: ChainId, pub key_pair: KeyPair, - pub peer_id: PeerId, -} - -impl Common { - /// Construct an id of this peer - pub fn peer_id(&self) -> PeerId { - self.peer_id.clone() - } + pub peer: PeerId, } /// Network options diff --git a/config/src/parameters/user.rs b/config/src/parameters/user.rs index 1d04ebb0fd3..8f9aa61549a 100644 --- a/config/src/parameters/user.rs +++ b/config/src/parameters/user.rs @@ -56,8 +56,8 @@ impl FromEnvStr for ChainIdInConfig { #[derive(Debug, ReadConfig)] pub struct Root { - #[config(env = "CHAIN_ID")] - chain_id: ChainIdInConfig, + #[config(env = "CHAIN")] + chain: ChainIdInConfig, #[config(env = "PUBLIC_KEY")] public_key: WithOrigin, #[config(env = "PRIVATE_KEY")] @@ -136,9 +136,9 @@ impl Root { let key_pair = key_pair.unwrap(); let peer = actual::Common { - chain_id: self.chain_id.0, + chain: self.chain.0, key_pair, - peer_id: peer_id.unwrap(), + peer: peer_id.unwrap(), }; Ok(actual::Root { diff --git a/config/tests/fixtures.rs b/config/tests/fixtures.rs index 2a455e59f5c..93f8d0e12d7 100644 --- a/config/tests/fixtures.rs +++ b/config/tests/fixtures.rs @@ -69,7 +69,7 @@ fn minimal_config_snapshot() { expect![[r#" Root { common: Common { - chain_id: ChainId( + chain: ChainId( "0", ), key_pair: KeyPair { @@ -80,7 +80,7 @@ fn minimal_config_snapshot() { ), private_key: "[REDACTED PrivateKey]", }, - peer_id: PeerId { + peer: PeerId { address: 127.0.0.1:1337, public_key: PublicKey( ed25519( @@ -256,7 +256,7 @@ fn self_is_presented_in_trusted_peers() { .value() .clone() .into_non_empty_vec() - .contains(&config.common.peer_id())); + .contains(&config.common.peer)); } #[test] @@ -264,7 +264,7 @@ fn missing_fields() { let error = load_config_from_fixtures("bad.missing_fields.toml") .expect_err("should fail without missing fields"); - assert_contains!(format!("{error:?}"), "missing parameter: `chain_id`"); + assert_contains!(format!("{error:?}"), "missing parameter: `chain`"); assert_contains!(format!("{error:?}"), "missing parameter: `public_key`"); assert_contains!(format!("{error:?}"), "missing parameter: `network.address`"); } diff --git a/config/tests/fixtures/base.toml b/config/tests/fixtures/base.toml index 201c8b56299..f69d6111a7a 100644 --- a/config/tests/fixtures/base.toml +++ b/config/tests/fixtures/base.toml @@ -1,4 +1,4 @@ -chain_id = "0" +chain = "0" public_key = "ed01208BA62848CF767D72E7F7F4B9D2D7BA07FEE33760F79ABE5597A51520E292A0CB" private_key = "8026408F4C15E5D664DA3F13778801D23D4E89B76E94C1B94B389544168B6CB894F84F8BA62848CF767D72E7F7F4B9D2D7BA07FEE33760F79ABE5597A51520E292A0CB" diff --git a/config/tests/fixtures/full.env b/config/tests/fixtures/full.env index 5f320d36af3..4c1c087d760 100644 --- a/config/tests/fixtures/full.env +++ b/config/tests/fixtures/full.env @@ -1,4 +1,4 @@ -CHAIN_ID=0-0 +CHAIN=0-0 PUBLIC_KEY=ed01208BA62848CF767D72E7F7F4B9D2D7BA07FEE33760F79ABE5597A51520E292A0CB PRIVATE_KEY=8026408F4C15E5D664DA3F13778801D23D4E89B76E94C1B94B389544168B6CB894F84F8BA62848CF767D72E7F7F4B9D2D7BA07FEE33760F79ABE5597A51520E292A0CB P2P_ADDRESS=127.0.0.1:5432 diff --git a/config/tests/fixtures/full.toml b/config/tests/fixtures/full.toml index 59f6a1c0ab5..b62a2fe4cfd 100644 --- a/config/tests/fixtures/full.toml +++ b/config/tests/fixtures/full.toml @@ -1,6 +1,6 @@ # This config has ALL fields specified (except `extends`) -chain_id = "0" +chain = "0" public_key = "ed01208BA62848CF767D72E7F7F4B9D2D7BA07FEE33760F79ABE5597A51520E292A0CB" private_key = "8026408F4C15E5D664DA3F13778801D23D4E89B76E94C1B94B389544168B6CB894F84F8BA62848CF767D72E7F7F4B9D2D7BA07FEE33760F79ABE5597A51520E292A0CB" diff --git a/config/tests/fixtures/minimal_file_and_env.toml b/config/tests/fixtures/minimal_file_and_env.toml index 91143ba49d9..a8ea3ca9510 100644 --- a/config/tests/fixtures/minimal_file_and_env.toml +++ b/config/tests/fixtures/minimal_file_and_env.toml @@ -1,6 +1,6 @@ extends = "base_trusted_peers.toml" -chain_id = "0" +chain = "0" public_key = "ed01208BA62848CF767D72E7F7F4B9D2D7BA07FEE33760F79ABE5597A51520E292A0CB" private_key = "8026408F4C15E5D664DA3F13778801D23D4E89B76E94C1B94B389544168B6CB894F84F8BA62848CF767D72E7F7F4B9D2D7BA07FEE33760F79ABE5597A51520E292A0CB" diff --git a/configs/client.template.toml b/configs/client.template.toml index 858a4c1df8e..6b01f574a82 100644 --- a/configs/client.template.toml +++ b/configs/client.template.toml @@ -1,4 +1,4 @@ -# chain_id = +# chain = ## Might be set via `TORII_URL` env var # torii_url = @@ -8,7 +8,7 @@ # password = [account] -# domain_id = +# domain = # public_key = # private_key = diff --git a/configs/peer.template.toml b/configs/peer.template.toml index a1eb2e9b0ef..61d5cb86b8d 100644 --- a/configs/peer.template.toml +++ b/configs/peer.template.toml @@ -6,7 +6,7 @@ ## Or, for a chain of extensions: # extends = ["base-1.toml", "base-2.toml"] -# chain_id = +# chain = # public_key = # private_key = diff --git a/configs/swarm/client.toml b/configs/swarm/client.toml index f8fd0815237..7a62f9e6c37 100644 --- a/configs/swarm/client.toml +++ b/configs/swarm/client.toml @@ -1,4 +1,4 @@ -chain_id = "00000000-0000-0000-0000-000000000000" +chain = "00000000-0000-0000-0000-000000000000" torii_url = "http://127.0.0.1:8080/" [basic_auth] @@ -6,6 +6,6 @@ web_login = "mad_hatter" password = "ilovetea" [account] -domain_id = "wonderland" +domain = "wonderland" public_key = "ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03" private_key = "802640CCF31D85E3B32A4BEA59987CE0C78E3B8E2DB93881468AB2435FE45D5C9DCD53CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03" diff --git a/configs/swarm/executor.wasm b/configs/swarm/executor.wasm index eb20b37f59d5c8e74c519a57b4b13469f9746d26..0ec7ad328a42afcbeca654224357fc084bd00824 100644 GIT binary patch delta 82236 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ⅆ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 z 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 POh7I}w9{NZLHqs&%q4&i diff --git a/configs/swarm/genesis.json b/configs/swarm/genesis.json index 22711024837..327578b900a 100644 --- a/configs/swarm/genesis.json +++ b/configs/swarm/genesis.json @@ -80,7 +80,7 @@ "Mint": { "Asset": { "object": "13", - "destination_id": "rose##ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland" + "destination": "rose##ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland" } } }, @@ -88,25 +88,25 @@ "Mint": { "Asset": { "object": "44", - "destination_id": "cabbage#garden_of_live_flowers#ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland" + "destination": "cabbage#garden_of_live_flowers#ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland" } } }, { "Transfer": { "AssetDefinition": { - "source_id": "ed01204164BF554923ECE1FD412D241036D863A6AE430476C898248B8237D77534CFC4@genesis", + "source": "ed01204164BF554923ECE1FD412D241036D863A6AE430476C898248B8237D77534CFC4@genesis", "object": "rose#wonderland", - "destination_id": "ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland" + "destination": "ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland" } } }, { "Transfer": { "Domain": { - "source_id": "ed01204164BF554923ECE1FD412D241036D863A6AE430476C898248B8237D77534CFC4@genesis", + "source": "ed01204164BF554923ECE1FD412D241036D863A6AE430476C898248B8237D77534CFC4@genesis", "object": "wonderland", - "destination_id": "ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland" + "destination": "ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland" } } }, @@ -117,7 +117,7 @@ "id": "CanSetParameters", "payload": null }, - "destination_id": "ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland" + "destination": "ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland" } } }, diff --git a/core/benches/blocks/common.rs b/core/benches/blocks/common.rs index 851dd6592c2..a60b34a37f8 100644 --- a/core/benches/blocks/common.rs +++ b/core/benches/blocks/common.rs @@ -170,7 +170,7 @@ pub fn build_state(rt: &tokio::runtime::Handle, account_id: &AccountId) -> State let _guard = rt.enter(); LiveQueryStore::test().start() }; - let mut domain = Domain::new(account_id.domain_id.clone()).build(account_id); + let mut domain = Domain::new(account_id.domain().clone()).build(account_id); domain.accounts.insert( account_id.clone(), Account::new(account_id.clone()).build(account_id), diff --git a/core/src/lib.rs b/core/src/lib.rs index 5a3e1bb4be6..f1104d47163 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -123,25 +123,25 @@ pub mod role { )] pub struct RoleIdWithOwner { /// [`AccountId`] of the owner. - pub account_id: AccountId, + pub account: AccountId, /// [`RoleId`] of the given role. - pub role_id: RoleId, + pub id: RoleId, } /// Reference to [`RoleIdWithOwner`]. #[derive(Debug, Clone, Copy, Constructor, PartialEq, Eq, PartialOrd, Ord, Hash)] pub struct RoleIdWithOwnerRef<'role> { /// [`AccountId`] of the owner. - pub account_id: &'role AccountId, + pub account: &'role AccountId, /// [`RoleId`] of the given role. - pub role_id: &'role RoleId, + pub role: &'role RoleId, } impl AsRoleIdWithOwnerRef for RoleIdWithOwner { fn as_key(&self) -> RoleIdWithOwnerRef<'_> { RoleIdWithOwnerRef { - account_id: &self.account_id, - role_id: &self.role_id, + account: &self.account, + role: &self.id, } } } @@ -187,8 +187,8 @@ mod tests { for account_id in [&account_id_a, &account_id_b] { for role_id in [&role_id_a, &role_id_b] { role_ids_with_owner.push(RoleIdWithOwner { - role_id: role_id.clone(), - account_id: account_id.clone(), + id: role_id.clone(), + account: account_id.clone(), }) } } @@ -196,8 +196,8 @@ mod tests { for role_id_with_owner_1 in &role_ids_with_owner { for role_id_with_owner_2 in &role_ids_with_owner { match ( - role_id_with_owner_1.account_id.cmp(&role_id_with_owner_2.account_id), - role_id_with_owner_1.role_id.cmp(&role_id_with_owner_2.role_id), + role_id_with_owner_1.account.cmp(&role_id_with_owner_2.account), + role_id_with_owner_1.id.cmp(&role_id_with_owner_2.id), ) { // `AccountId` take precedence in comparison // if `AccountId`s are equal than comparison based on `RoleId`s diff --git a/core/src/smartcontracts/isi/account.rs b/core/src/smartcontracts/isi/account.rs index 236a3dc017e..09afde491a1 100644 --- a/core/src/smartcontracts/isi/account.rs +++ b/core/src/smartcontracts/isi/account.rs @@ -51,7 +51,7 @@ pub mod isi { Err(err) => match err { QueryExecutionFail::Find(FindError::Asset(_)) => { assert_can_register( - &asset_id.definition_id, + &asset_id.definition, state_transaction, &self.object.value, )?; @@ -62,14 +62,13 @@ pub mod isi { match asset.value { AssetValue::Numeric(increment) => { - state_transaction.world.increase_asset_total_amount( - &asset_id.definition_id, - increment, - )?; + state_transaction + .world + .increase_asset_total_amount(&asset_id.definition, increment)?; } AssetValue::Store(_) => { state_transaction.world.increase_asset_total_amount( - &asset_id.definition_id, + &asset_id.definition, Numeric::ONE, )?; } @@ -94,14 +93,14 @@ pub mod isi { _authority: &AccountId, state_transaction: &mut StateTransaction<'_, '_>, ) -> Result<(), Error> { - let asset_id = self.object_id; + let asset_id = self.object; let asset = state_transaction .world - .account_mut(&asset_id.account_id) + .account_mut(&asset_id.account) .and_then(|account| { account - .remove_asset(&asset_id.definition_id) + .remove_asset(&asset_id.definition) .ok_or_else(|| FindError::Asset(asset_id)) })?; @@ -109,12 +108,12 @@ pub mod isi { AssetValue::Numeric(increment) => { state_transaction .world - .decrease_asset_total_amount(&asset.id.definition_id, increment)?; + .decrease_asset_total_amount(&asset.id.definition, increment)?; } AssetValue::Store(_) => { state_transaction .world - .decrease_asset_total_amount(&asset.id.definition_id, Numeric::ONE)?; + .decrease_asset_total_amount(&asset.id.definition, Numeric::ONE)?; } } @@ -122,7 +121,7 @@ pub mod isi { .world .emit_events(Some(AccountEvent::Asset(AssetEvent::Removed( AssetChanged { - asset_id: asset.id, + asset: asset.id, amount: asset.value, }, )))); @@ -138,27 +137,27 @@ pub mod isi { state_transaction: &mut StateTransaction<'_, '_>, ) -> Result<(), Error> { let Transfer { - source_id, + source, object, - destination_id, + destination, } = self; - let _ = state_transaction.world.account(&source_id)?; - let _ = state_transaction.world.account(&destination_id)?; + let _ = state_transaction.world.account(&source)?; + let _ = state_transaction.world.account(&destination)?; let asset_definition = state_transaction.world.asset_definition_mut(&object)?; - if asset_definition.owned_by != source_id { - return Err(Error::Find(FindError::Account(source_id))); + if asset_definition.owned_by != source { + return Err(Error::Find(FindError::Account(source))); } - asset_definition.owned_by = destination_id.clone(); + asset_definition.owned_by = destination.clone(); state_transaction .world .emit_events(Some(AssetDefinitionEvent::OwnerChanged( AssetDefinitionOwnerChanged { - asset_definition_id: object, - new_owner: destination_id, + asset_definition: object, + new_owner: destination, }, ))); @@ -173,7 +172,7 @@ pub mod isi { _authority: &AccountId, state_transaction: &mut StateTransaction<'_, '_>, ) -> Result<(), Error> { - let account_id = self.object_id; + let account_id = self.object; let account_metadata_limits = state_transaction.config.account_metadata_limits; @@ -195,7 +194,7 @@ pub mod isi { state_transaction .world .emit_events(Some(AccountEvent::MetadataInserted(MetadataChanged { - target_id: account_id, + target: account_id, key: self.key, value: self.value, }))); @@ -211,7 +210,7 @@ pub mod isi { _authority: &AccountId, state_transaction: &mut StateTransaction<'_, '_>, ) -> Result<(), Error> { - let account_id = self.object_id; + let account_id = self.object; let value = state_transaction .world @@ -226,7 +225,7 @@ pub mod isi { state_transaction .world .emit_events(Some(AccountEvent::MetadataRemoved(MetadataChanged { - target_id: account_id, + target: account_id, key: self.key, value, }))); @@ -242,7 +241,7 @@ pub mod isi { _authority: &AccountId, state_transaction: &mut StateTransaction<'_, '_>, ) -> Result<(), Error> { - let account_id = self.destination_id; + let account_id = self.destination; let permission = self.object; let permission_id = permission.id.clone(); @@ -277,8 +276,8 @@ pub mod isi { .world .emit_events(Some(AccountEvent::PermissionAdded( AccountPermissionChanged { - account_id, - permission_id, + account: account_id, + permission: permission_id, }, ))); @@ -293,7 +292,7 @@ pub mod isi { _authority: &AccountId, state_transaction: &mut StateTransaction<'_, '_>, ) -> Result<(), Error> { - let account_id = self.destination_id; + let account_id = self.destination; let permission = self.object; // Check if account exists @@ -310,8 +309,8 @@ pub mod isi { .world .emit_events(Some(AccountEvent::PermissionRemoved( AccountPermissionChanged { - account_id, - permission_id: permission.id, + account: account_id, + permission: permission.id, }, ))); @@ -326,7 +325,7 @@ pub mod isi { _authority: &AccountId, state_transaction: &mut StateTransaction<'_, '_>, ) -> Result<(), Error> { - let account_id = self.destination_id; + let account_id = self.destination; let role_id = self.object; let permissions = state_transaction @@ -362,14 +361,14 @@ pub mod isi { permissions .zip(core::iter::repeat_with(move || account_id.clone())) .map(|(permission_id, account_id)| AccountPermissionChanged { - account_id, - permission_id, + account: account_id, + permission: permission_id, }) .map(AccountEvent::PermissionAdded) .chain(std::iter::once(AccountEvent::RoleGranted( AccountRoleChanged { - account_id: account_id_clone, - role_id, + account: account_id_clone, + role: role_id, }, ))) }); @@ -385,7 +384,7 @@ pub mod isi { _authority: &AccountId, state_transaction: &mut StateTransaction<'_, '_>, ) -> Result<(), Error> { - let account_id = self.destination_id; + let account_id = self.destination; let role_id = self.object; let permissions = state_transaction @@ -402,8 +401,8 @@ pub mod isi { .world .account_roles .remove(RoleIdWithOwner { - account_id: account_id.clone(), - role_id: role_id.clone(), + account: account_id.clone(), + id: role_id.clone(), }) .is_none() { @@ -415,14 +414,14 @@ pub mod isi { permissions .zip(core::iter::repeat_with(move || account_id.clone())) .map(|(permission_id, account_id)| AccountPermissionChanged { - account_id, - permission_id, + account: account_id, + permission: permission_id, }) .map(AccountEvent::PermissionRemoved) .chain(std::iter::once(AccountEvent::RoleRevoked( AccountRoleChanged { - account_id: account_id_clone, - role_id, + account: account_id_clone, + role: role_id, }, ))) }); @@ -610,7 +609,7 @@ pub mod query { Ok(Box::new( state_ro .world() - .map_domain(&asset_definition_id.domain_id.clone(), move |domain| { + .map_domain(&asset_definition_id.domain.clone(), move |domain| { domain.accounts.values().filter(move |account| { account.assets.contains_key(&asset_definition_id) }) diff --git a/core/src/smartcontracts/isi/asset.rs b/core/src/smartcontracts/isi/asset.rs index 20752dd167f..3c75c35cf35 100644 --- a/core/src/smartcontracts/isi/asset.rs +++ b/core/src/smartcontracts/isi/asset.rs @@ -44,10 +44,10 @@ pub mod isi { _authority: &AccountId, state_transaction: &mut StateTransaction<'_, '_>, ) -> Result<(), Error> { - let asset_id = self.object_id; + let asset_id = self.object; assert_asset_type( - &asset_id.definition_id, + &asset_id.definition, state_transaction, expected_asset_value_type_store, )?; @@ -59,7 +59,7 @@ pub mod isi { ) { state_transaction .world - .increase_asset_total_amount(&asset_id.definition_id, Numeric::ONE)?; + .increase_asset_total_amount(&asset_id.definition, Numeric::ONE)?; } let asset_metadata_limits = state_transaction.config.asset_metadata_limits; @@ -82,7 +82,7 @@ pub mod isi { state_transaction .world .emit_events(Some(AssetEvent::MetadataInserted(MetadataChanged { - target_id: asset_id, + target: asset_id, key: self.key, value: self.value, }))); @@ -98,10 +98,10 @@ pub mod isi { _authority: &AccountId, state_transaction: &mut StateTransaction<'_, '_>, ) -> Result<(), Error> { - let asset_id = self.object_id; + let asset_id = self.object; assert_asset_type( - &asset_id.definition_id, + &asset_id.definition, state_transaction, expected_asset_value_type_store, )?; @@ -121,7 +121,7 @@ pub mod isi { state_transaction .world .emit_events(Some(AssetEvent::MetadataRemoved(MetadataChanged { - target_id: asset_id, + target: asset_id, key: self.key, value, }))); @@ -137,25 +137,25 @@ pub mod isi { _authority: &AccountId, state_transaction: &mut StateTransaction<'_, '_>, ) -> Result<(), Error> { - let asset_id = self.source_id; + let asset_id = self.source; assert_asset_type( - &asset_id.definition_id, + &asset_id.definition, state_transaction, expected_asset_value_type_store, )?; let asset = state_transaction .world - .account_mut(&asset_id.account_id) + .account_mut(&asset_id.account) .and_then(|account| { account - .remove_asset(&asset_id.definition_id) + .remove_asset(&asset_id.definition) .ok_or_else(|| FindError::Asset(asset_id.clone())) })?; let destination_store = { let destination_id = - AssetId::new(asset_id.definition_id.clone(), self.destination_id.clone()); + AssetId::new(asset_id.definition.clone(), self.destination.clone()); let destination_store_asset = state_transaction .world .asset_or_insert(destination_id.clone(), asset.value)?; @@ -178,10 +178,10 @@ pub mod isi { _authority: &AccountId, state_transaction: &mut StateTransaction<'_, '_>, ) -> Result<(), Error> { - let asset_id = self.destination_id; + let asset_id = self.destination; let asset_definition = assert_asset_type( - &asset_id.definition_id, + &asset_id.definition, state_transaction, expected_asset_value_type_numeric, )?; @@ -206,13 +206,13 @@ pub mod isi { .push(self.object.to_f64()); state_transaction .world - .increase_asset_total_amount(&asset_id.definition_id, self.object)?; + .increase_asset_total_amount(&asset_id.definition, self.object)?; } state_transaction .world .emit_events(Some(AssetEvent::Added(AssetChanged { - asset_id, + asset: asset_id, amount: self.object.into(), }))); @@ -226,19 +226,19 @@ pub mod isi { _authority: &AccountId, state_transaction: &mut StateTransaction<'_, '_>, ) -> Result<(), Error> { - let asset_id = self.destination_id; + let asset_id = self.destination; let asset_definition = assert_asset_type( - &asset_id.definition_id, + &asset_id.definition, state_transaction, expected_asset_value_type_numeric, )?; assert_numeric_spec(&self.object, &asset_definition)?; - let account = state_transaction.world.account_mut(&asset_id.account_id)?; + let account = state_transaction.world.account_mut(&asset_id.account)?; let asset = account .assets - .get_mut(&asset_id.definition_id) + .get_mut(&asset_id.definition) .ok_or_else(|| FindError::Asset(asset_id.clone()))?; let AssetValue::Numeric(quantity) = &mut asset.value else { return Err(Error::Conversion("Expected numeric asset type".to_owned())); @@ -248,7 +248,7 @@ pub mod isi { .ok_or(MathError::NotEnoughQuantity)?; if asset.value.is_zero_value() { - assert!(account.remove_asset(&asset_id.definition_id).is_some()); + assert!(account.remove_asset(&asset_id.definition).is_some()); } #[allow(clippy::float_arithmetic)] @@ -259,13 +259,13 @@ pub mod isi { .push(self.object.to_f64()); state_transaction .world - .decrease_asset_total_amount(&asset_id.definition_id, self.object)?; + .decrease_asset_total_amount(&asset_id.definition, self.object)?; } state_transaction .world .emit_events(Some(AssetEvent::Removed(AssetChanged { - asset_id: asset_id.clone(), + asset: asset_id.clone(), amount: self.object.into(), }))); @@ -279,22 +279,22 @@ pub mod isi { _authority: &AccountId, state_transaction: &mut StateTransaction<'_, '_>, ) -> Result<(), Error> { - let source_id = self.source_id; + let source_id = self.source; let destination_id = - AssetId::new(source_id.definition_id.clone(), self.destination_id.clone()); + AssetId::new(source_id.definition.clone(), self.destination.clone()); let asset_definition = assert_asset_type( - &source_id.definition_id, + &source_id.definition, state_transaction, expected_asset_value_type_numeric, )?; assert_numeric_spec(&self.object, &asset_definition)?; { - let account = state_transaction.world.account_mut(&source_id.account_id)?; + let account = state_transaction.world.account_mut(&source_id.account)?; let asset = account .assets - .get_mut(&source_id.definition_id) + .get_mut(&source_id.definition) .ok_or_else(|| FindError::Asset(source_id.clone()))?; let AssetValue::Numeric(quantity) = &mut asset.value else { return Err(Error::Conversion("Expected numeric asset type".to_owned())); @@ -303,7 +303,7 @@ pub mod isi { .checked_sub(self.object) .ok_or(MathError::NotEnoughQuantity)?; if asset.value.is_zero_value() { - assert!(account.remove_asset(&source_id.definition_id).is_some()); + assert!(account.remove_asset(&source_id.definition).is_some()); } } @@ -329,11 +329,11 @@ pub mod isi { state_transaction.world.emit_events([ AssetEvent::Removed(AssetChanged { - asset_id: source_id, + asset: source_id, amount: self.object.into(), }), AssetEvent::Added(AssetChanged { - asset_id: destination_id, + asset: destination_id, amount: self.object.into(), }), ]); @@ -476,7 +476,7 @@ pub mod query { let id = &self.id; iroha_logger::trace!(%id); state_ro.world().asset(id).map_err(|asset_err| { - if let Err(definition_err) = state_ro.world().asset_definition(&id.definition_id) { + if let Err(definition_err) = state_ro.world().asset_definition(&id.definition) { definition_err.into() } else { asset_err @@ -517,7 +517,7 @@ pub mod query { account .assets .values() - .filter(move |asset| asset.id().definition_id.name == name) + .filter(move |asset| asset.id().definition.name == name) }) }) .cloned(), @@ -558,7 +558,7 @@ pub mod query { account .assets .values() - .filter(move |asset| asset.id().definition_id == id) + .filter(move |asset| asset.id().definition == id) }) }) .cloned(), @@ -609,8 +609,8 @@ pub mod query { let asset_definition_id = asset_definition_id.clone(); account.assets.values().filter(move |asset| { - asset.id().account_id.domain_id == domain_id - && asset.id().definition_id == asset_definition_id + asset.id().account.domain == domain_id + && asset.id().definition == asset_definition_id }) }) .cloned(), @@ -627,9 +627,7 @@ pub mod query { .world() .asset(id) .map_err(|asset_err| { - if let Err(definition_err) = - state_ro.world().asset_definition(&id.definition_id) - { + if let Err(definition_err) = state_ro.world().asset_definition(&id.definition) { Error::Find(definition_err) } else { asset_err @@ -662,7 +660,7 @@ pub mod query { let id = &self.id; let key = &self.key; let asset = state_ro.world().asset(id).map_err(|asset_err| { - if let Err(definition_err) = state_ro.world().asset_definition(&id.definition_id) { + if let Err(definition_err) = state_ro.world().asset_definition(&id.definition) { Error::Find(definition_err) } else { asset_err diff --git a/core/src/smartcontracts/isi/domain.rs b/core/src/smartcontracts/isi/domain.rs index 15e5a6df06a..34efd4848b8 100644 --- a/core/src/smartcontracts/isi/domain.rs +++ b/core/src/smartcontracts/isi/domain.rs @@ -50,13 +50,13 @@ pub mod isi { let account: Account = self.object.build(authority); let account_id = account.id().clone(); - if *account_id.domain_id() == *iroha_genesis::GENESIS_DOMAIN_ID { + if *account_id.domain() == *iroha_genesis::GENESIS_DOMAIN_ID { return Err(InstructionExecutionError::InvariantViolation( "Not allowed to register account in genesis domain".to_owned(), )); } - let domain = state_transaction.world.domain_mut(&account_id.domain_id)?; + let domain = state_transaction.world.domain_mut(&account_id.domain)?; if domain.accounts.contains_key(&account_id) { return Err(RepetitionError { instruction_type: InstructionType::Register, @@ -81,7 +81,7 @@ pub mod isi { _authority: &AccountId, state_transaction: &mut StateTransaction<'_, '_>, ) -> Result<(), Error> { - let account_id = self.object_id; + let account_id = self.object; state_transaction .world() @@ -103,7 +103,7 @@ pub mod isi { if state_transaction .world - .domain_mut(&account_id.domain_id)? + .domain_mut(&account_id.domain)? .remove_account(&account_id) .is_none() { @@ -135,7 +135,7 @@ pub mod isi { let asset_definition_id = asset_definition.id().clone(); let domain = state_transaction .world - .domain_mut(&asset_definition_id.domain_id)?; + .domain_mut(&asset_definition_id.domain)?; if domain.asset_definitions.contains_key(&asset_definition_id) { return Err(RepetitionError { instruction_type: InstructionType::Register, @@ -165,7 +165,7 @@ pub mod isi { _authority: &AccountId, state_transaction: &mut StateTransaction<'_, '_>, ) -> Result<(), Error> { - let asset_definition_id = self.object_id; + let asset_definition_id = self.object; let mut assets_to_remove = Vec::new(); for domain in state_transaction.world.domains_iter() { @@ -175,7 +175,7 @@ pub mod isi { .assets .values() .filter_map(|asset| { - if asset.id().definition_id == asset_definition_id { + if asset.id().definition == asset_definition_id { return Some(asset.id()); } @@ -190,8 +190,8 @@ pub mod isi { for asset_id in assets_to_remove { if state_transaction .world - .account_mut(&asset_id.account_id)? - .remove_asset(&asset_id.definition_id) + .account_mut(&asset_id.account)? + .remove_asset(&asset_id.definition) .is_none() { error!(%asset_id, "asset not found. This is a bug"); @@ -202,7 +202,7 @@ pub mod isi { let domain = state_transaction .world - .domain_mut(&asset_definition_id.domain_id)?; + .domain_mut(&asset_definition_id.domain)?; if domain .remove_asset_definition(&asset_definition_id) .is_none() @@ -229,7 +229,7 @@ pub mod isi { _authority: &AccountId, state_transaction: &mut StateTransaction<'_, '_>, ) -> Result<(), Error> { - let asset_definition_id = self.object_id; + let asset_definition_id = self.object; let metadata_limits = state_transaction.config.asset_definition_metadata_limits; state_transaction @@ -247,7 +247,7 @@ pub mod isi { .world .emit_events(Some(AssetDefinitionEvent::MetadataInserted( MetadataChanged { - target_id: asset_definition_id, + target: asset_definition_id, key: self.key, value: self.value, }, @@ -264,7 +264,7 @@ pub mod isi { _authority: &AccountId, state_transaction: &mut StateTransaction<'_, '_>, ) -> Result<(), Error> { - let asset_definition_id = self.object_id; + let asset_definition_id = self.object; let value = state_transaction .world @@ -280,7 +280,7 @@ pub mod isi { .world .emit_events(Some(AssetDefinitionEvent::MetadataRemoved( MetadataChanged { - target_id: asset_definition_id, + target: asset_definition_id, key: self.key, value, }, @@ -297,7 +297,7 @@ pub mod isi { _authority: &AccountId, state_transaction: &mut StateTransaction<'_, '_>, ) -> Result<(), Error> { - let domain_id = self.object_id; + let domain_id = self.object; let limits = state_transaction.config.domain_metadata_limits; @@ -309,7 +309,7 @@ pub mod isi { state_transaction .world .emit_events(Some(DomainEvent::MetadataInserted(MetadataChanged { - target_id: domain_id, + target: domain_id, key: self.key, value: self.value, }))); @@ -325,7 +325,7 @@ pub mod isi { _authority: &AccountId, state_transaction: &mut StateTransaction<'_, '_>, ) -> Result<(), Error> { - let domain_id = self.object_id; + let domain_id = self.object; let domain = state_transaction.world.domain_mut(&domain_id)?; let value = domain @@ -336,7 +336,7 @@ pub mod isi { state_transaction .world .emit_events(Some(DomainEvent::MetadataRemoved(MetadataChanged { - target_id: domain_id, + target: domain_id, key: self.key, value, }))); @@ -352,26 +352,26 @@ pub mod isi { state_transaction: &mut StateTransaction<'_, '_>, ) -> Result<(), Error> { let Transfer { - source_id, + source, object, - destination_id, + destination, } = self; - let _ = state_transaction.world.account(&source_id)?; - let _ = state_transaction.world.account(&destination_id)?; + let _ = state_transaction.world.account(&source)?; + let _ = state_transaction.world.account(&destination)?; let domain = state_transaction.world.domain_mut(&object)?; - if domain.owned_by != source_id { - return Err(Error::Find(FindError::Account(source_id))); + if domain.owned_by != source { + return Err(Error::Find(FindError::Account(source))); } - domain.owned_by = destination_id.clone(); + domain.owned_by = destination.clone(); state_transaction .world .emit_events(Some(DomainEvent::OwnerChanged(DomainOwnerChanged { - domain_id: object, - new_owner: destination_id, + domain: object, + new_owner: destination, }))); Ok(()) diff --git a/core/src/smartcontracts/isi/triggers/mod.rs b/core/src/smartcontracts/isi/triggers/mod.rs index 8aecd9f859d..92c872e2562 100644 --- a/core/src/smartcontracts/isi/triggers/mod.rs +++ b/core/src/smartcontracts/isi/triggers/mod.rs @@ -120,7 +120,7 @@ pub mod isi { _authority: &AccountId, state_transaction: &mut StateTransaction<'_, '_>, ) -> Result<(), Error> { - let trigger_id = self.object_id; + let trigger_id = self.object; let triggers = &mut state_transaction.world.triggers; if triggers.remove(trigger_id.clone()) { @@ -145,7 +145,7 @@ pub mod isi { _authority: &AccountId, state_transaction: &mut StateTransaction<'_, '_>, ) -> Result<(), Error> { - let id = self.destination_id; + let id = self.destination; let triggers = &mut state_transaction.world.triggers; triggers @@ -167,7 +167,7 @@ pub mod isi { .world .emit_events(Some(TriggerEvent::Extended( TriggerNumberOfExecutionsChanged { - trigger_id: id, + trigger: id, by: self.object, }, ))); @@ -183,7 +183,7 @@ pub mod isi { _authority: &AccountId, state_transaction: &mut StateTransaction<'_, '_>, ) -> Result<(), Error> { - let trigger = self.destination_id; + let trigger = self.destination; let triggers = &mut state_transaction.world.triggers; triggers.mod_repeats(&trigger, |n| { n.checked_sub(self.object) @@ -195,7 +195,7 @@ pub mod isi { .world .emit_events(Some(TriggerEvent::Shortened( TriggerNumberOfExecutionsChanged { - trigger_id: trigger, + trigger, by: self.object, }, ))); @@ -211,7 +211,7 @@ pub mod isi { _authority: &AccountId, state_transaction: &mut StateTransaction<'_, '_>, ) -> Result<(), Error> { - let trigger_id = self.object_id; + let trigger_id = self.object; let trigger_metadata_limits = state_transaction.config.account_metadata_limits; state_transaction @@ -229,7 +229,7 @@ pub mod isi { state_transaction .world .emit_events(Some(TriggerEvent::MetadataInserted(MetadataChanged { - target_id: trigger_id, + target: trigger_id, key: self.key, value: self.value, }))); @@ -245,7 +245,7 @@ pub mod isi { _authority: &AccountId, state_transaction: &mut StateTransaction<'_, '_>, ) -> Result<(), Error> { - let trigger_id = self.object_id; + let trigger_id = self.object; let value = state_transaction .world @@ -261,7 +261,7 @@ pub mod isi { state_transaction .world .emit_events(Some(TriggerEvent::MetadataRemoved(MetadataChanged { - target_id: trigger_id, + target: trigger_id, key: self.key, value, }))); @@ -277,7 +277,7 @@ pub mod isi { authority: &AccountId, state_transaction: &mut StateTransaction<'_, '_>, ) -> Result<(), Error> { - let id = &self.trigger_id; + let id = &self.trigger; state_transaction .world @@ -424,7 +424,7 @@ pub mod query { .world() .triggers() .inspect_by_action( - move |action| action.authority().domain_id() == &domain_id, + move |action| action.authority().domain() == &domain_id, |trigger_id, action| (trigger_id.clone(), action.clone_and_box()), ) .map(|(trigger_id, action)| { diff --git a/core/src/smartcontracts/isi/world.rs b/core/src/smartcontracts/isi/world.rs index 795117d1459..0839db60a3b 100644 --- a/core/src/smartcontracts/isi/world.rs +++ b/core/src/smartcontracts/isi/world.rs @@ -62,7 +62,7 @@ pub mod isi { _authority: &AccountId, state_transaction: &mut StateTransaction<'_, '_>, ) -> Result<(), Error> { - let peer_id = self.object_id; + let peer_id = self.object; let world = &mut state_transaction.world; let Some(index) = world.trusted_peers_ids.iter().position(|id| id == &peer_id) else { return Err(FindError::Peer(peer_id).into()); @@ -121,13 +121,13 @@ pub mod isi { _authority: &AccountId, state_transaction: &mut StateTransaction<'_, '_>, ) -> Result<(), Error> { - let domain_id = self.object_id; + let domain_id = self.object; state_transaction .world() .triggers() .inspect_by_action( - |action| action.authority().domain_id() == &domain_id, + |action| action.authority().domain() == &domain_id, |trigger_id, _| trigger_id.clone(), ) .collect::>() @@ -203,22 +203,22 @@ pub mod isi { authority: &AccountId, state_transaction: &mut StateTransaction<'_, '_>, ) -> Result<(), Error> { - let role_id = self.object_id; + let role_id = self.object; let accounts_with_role = state_transaction .world .account_roles .iter() .map(|(role, ())| role) - .filter(|role| role.role_id.eq(&role_id)) - .map(|role| &role.account_id) + .filter(|role| role.id.eq(&role_id)) + .map(|role| &role.account) .cloned() .collect::>(); for account_id in accounts_with_role { let revoke = Revoke { object: role_id.clone(), - destination_id: account_id, + destination: account_id, }; revoke.execute(authority, state_transaction)? } @@ -241,7 +241,7 @@ pub mod isi { _authority: &AccountId, state_transaction: &mut StateTransaction<'_, '_>, ) -> Result<(), Error> { - let role_id = self.destination_id; + let role_id = self.destination; let permission = self.object; let permission_id = permission.id.clone(); @@ -269,8 +269,8 @@ pub mod isi { state_transaction .world .emit_events(Some(RoleEvent::PermissionAdded(RolePermissionChanged { - role_id, - permission_id, + role: role_id, + permission: permission_id, }))); Ok(()) @@ -284,7 +284,7 @@ pub mod isi { _authority: &AccountId, state_transaction: &mut StateTransaction<'_, '_>, ) -> Result<(), Error> { - let role_id = self.destination_id; + let role_id = self.destination; let permission = self.object; let permission_id = permission.id.clone(); @@ -299,8 +299,8 @@ pub mod isi { state_transaction .world .emit_events(Some(RoleEvent::PermissionRemoved(RolePermissionChanged { - role_id, - permission_id, + role: role_id, + permission: permission_id, }))); Ok(()) diff --git a/core/src/smartcontracts/wasm.rs b/core/src/smartcontracts/wasm.rs index 641abd81895..5b0ce1aa492 100644 --- a/core/src/smartcontracts/wasm.rs +++ b/core/src/smartcontracts/wasm.rs @@ -1717,7 +1717,7 @@ mod tests { }; fn world_with_test_account(authority: &AccountId) -> World { - let domain_id = authority.domain_id.clone(); + let domain_id = authority.domain.clone(); let account = Account::new(authority.clone()).build(authority); let mut domain = Domain::new(domain_id).build(authority); assert!(domain.add_account(account).is_none()); diff --git a/core/src/state.rs b/core/src/state.rs index 8741aa4920f..9d92c4183f2 100644 --- a/core/src/state.rs +++ b/core/src/state.rs @@ -385,7 +385,7 @@ pub trait WorldReadOnly { /// # Errors /// Fails if there is no domain or account fn account(&self, id: &AccountId) -> Result<&Account, FindError> { - self.domain(&id.domain_id).and_then(|domain| { + self.domain(&id.domain).and_then(|domain| { domain .accounts .get(id) @@ -402,7 +402,7 @@ pub trait WorldReadOnly { id: &AccountId, f: impl FnOnce(&'slf Account) -> T, ) -> Result { - let domain = self.domain(&id.domain_id)?; + let domain = self.domain(&id.domain)?; let account = domain .accounts .get(id) @@ -434,7 +434,7 @@ pub trait WorldReadOnly { > { self.account_roles() .range(RoleIdByAccountBounds::new(id)) - .map(|(role, ())| &role.role_id) + .map(|(role, ())| &role.id) } /// Return a set of all permission tokens granted to this account. @@ -497,11 +497,11 @@ pub trait WorldReadOnly { /// - The [`Domain`] with which the [`Account`] is associated doesn't exist. fn asset(&self, id: &AssetId) -> Result { self.map_account( - &id.account_id, + &id.account, |account| -> Result { account .assets - .get(&id.definition_id) + .get(&id.definition) .ok_or_else(|| QueryExecutionFail::from(FindError::Asset(id.clone()))) .cloned() }, @@ -515,7 +515,7 @@ pub trait WorldReadOnly { /// # Errors /// - Asset definition entry not found fn asset_definition(&self, asset_id: &AssetDefinitionId) -> Result { - self.domain(&asset_id.domain_id)? + self.domain(&asset_id.domain)? .asset_definitions .get(asset_id) .ok_or_else(|| FindError::AssetDefinition(asset_id.clone())) @@ -527,7 +527,7 @@ pub trait WorldReadOnly { /// # Errors /// - Asset definition not found fn asset_total_amount(&self, definition_id: &AssetDefinitionId) -> Result { - self.domain(&definition_id.domain_id)? + self.domain(&definition_id.domain)? .asset_total_quantities .get(definition_id) .ok_or_else(|| FindError::AssetDefinition(definition_id.clone())) @@ -671,7 +671,7 @@ impl WorldTransaction<'_, '_> { /// # Errors /// Fail if domain or account not found pub fn account_mut(&mut self, id: &AccountId) -> Result<&mut Account, FindError> { - self.domain_mut(&id.domain_id).and_then(move |domain| { + self.domain_mut(&id.domain).and_then(move |domain| { domain .accounts .get_mut(id) @@ -713,10 +713,10 @@ impl WorldTransaction<'_, '_> { /// # Errors /// If domain, account or asset not found pub fn asset_mut(&mut self, id: &AssetId) -> Result<&mut Asset, FindError> { - self.account_mut(&id.account_id).and_then(move |account| { + self.account_mut(&id.account).and_then(move |account| { account .assets - .get_mut(&id.definition_id) + .get_mut(&id.definition) .ok_or_else(|| FindError::Asset(id.clone())) }) } @@ -733,8 +733,8 @@ impl WorldTransaction<'_, '_> { ) -> Result<&mut Asset, Error> { // Check that asset definition exists { - let asset_definition_id = &asset_id.definition_id; - let asset_definition_domain_id = &asset_id.definition_id.domain_id; + let asset_definition_id = &asset_id.definition; + let asset_definition_domain_id = &asset_id.definition.domain; let asset_definition_domain = self .domains .get(asset_definition_domain_id) @@ -745,11 +745,11 @@ impl WorldTransaction<'_, '_> { .ok_or(FindError::AssetDefinition(asset_definition_id.clone()))?; } - let account_id = &asset_id.account_id; + let account_id = &asset_id.account; let account_domain = self .domains - .get_mut(&asset_id.account_id.domain_id) - .ok_or(FindError::Domain(asset_id.account_id.domain_id.clone()))?; + .get_mut(&asset_id.account.domain) + .ok_or(FindError::Domain(asset_id.account.domain.clone()))?; let account = account_domain .accounts .get_mut(account_id) @@ -757,7 +757,7 @@ impl WorldTransaction<'_, '_> { Ok(account .assets - .entry(asset_id.definition_id.clone()) + .entry(asset_id.definition.clone()) .or_insert_with(|| { let asset = Asset::new(asset_id, default_asset_value.into()); Self::emit_events_impl( @@ -777,7 +777,7 @@ impl WorldTransaction<'_, '_> { &mut self, id: &AssetDefinitionId, ) -> Result<&mut AssetDefinition, FindError> { - self.domain_mut(&id.domain_id).and_then(|domain| { + self.domain_mut(&id.domain).and_then(|domain| { domain .asset_definitions .get_mut(id) @@ -795,7 +795,7 @@ impl WorldTransaction<'_, '_> { definition_id: &AssetDefinitionId, increment: Numeric, ) -> Result<(), Error> { - let domain = self.domain_mut(&definition_id.domain_id)?; + let domain = self.domain_mut(&definition_id.domain)?; let asset_total_amount: &mut Numeric = domain .asset_total_quantities.get_mut(definition_id) .expect("Asset total amount not being found is a bug: check `Register` to insert initial total amount"); @@ -807,7 +807,7 @@ impl WorldTransaction<'_, '_> { self.emit_events({ Some(DomainEvent::AssetDefinition( AssetDefinitionEvent::TotalQuantityChanged(AssetDefinitionTotalQuantityChanged { - asset_definition_id: definition_id.clone(), + asset_definition: definition_id.clone(), total_amount: asset_total_amount, }), )) @@ -826,7 +826,7 @@ impl WorldTransaction<'_, '_> { definition_id: &AssetDefinitionId, decrement: Numeric, ) -> Result<(), Error> { - let domain = self.domain_mut(&definition_id.domain_id)?; + let domain = self.domain_mut(&definition_id.domain)?; let asset_total_amount: &mut Numeric = domain .asset_total_quantities.get_mut(definition_id) .expect("Asset total amount not being found is a bug: check `Register` to insert initial total amount"); @@ -838,7 +838,7 @@ impl WorldTransaction<'_, '_> { self.emit_events({ Some(DomainEvent::AssetDefinition( AssetDefinitionEvent::TotalQuantityChanged(AssetDefinitionTotalQuantityChanged { - asset_definition_id: definition_id.clone(), + asset_definition: definition_id.clone(), total_amount: asset_total_amount, }), )) @@ -1549,8 +1549,8 @@ mod range_bounds { impl AsRoleIdByAccount for RoleIdWithOwner { fn as_key(&self) -> RoleIdByAccount<'_> { RoleIdByAccount { - account_id: &self.account_id, - role_id: (&self.role_id).into(), + account_id: &self.account, + role_id: (&self.id).into(), } } } @@ -1919,7 +1919,7 @@ mod tests { .collect::>(); assert_eq!(range.len(), 2); for role in range { - assert_eq!(&role.account_id, &account_id); + assert_eq!(&role.account, &account_id); } } } diff --git a/core/src/sumeragi/mod.rs b/core/src/sumeragi/mod.rs index 761fbe4dcd3..560fc7df530 100644 --- a/core/src/sumeragi/mod.rs +++ b/core/src/sumeragi/mod.rs @@ -179,7 +179,7 @@ impl SumeragiHandle { for block in blocks_iter { let mut state_block = state.block(); recreate_topology = Self::replay_block( - &common_config.chain_id, + &common_config.chain, &genesis_network.public_key, &block, &mut state_block, @@ -199,12 +199,10 @@ impl SumeragiHandle { #[cfg(not(debug_assertions))] let debug_force_soft_fork = false; - let peer_id = common_config.peer_id(); - let sumeragi = main_loop::Sumeragi { - chain_id: common_config.chain_id, + chain_id: common_config.chain, key_pair: common_config.key_pair, - peer_id, + peer_id: common_config.peer, queue: Arc::clone(&queue), events_sender, commit_time: state.view().config.commit_time, diff --git a/core/src/tx.rs b/core/src/tx.rs index 9314a4b9dc8..3fb83e8eb96 100644 --- a/core/src/tx.rs +++ b/core/src/tx.rs @@ -39,7 +39,7 @@ pub enum AcceptTransactionFail { SignatureVerification(#[source] SignatureVerificationFail), /// The genesis account can only sign transactions in the genesis block UnexpectedGenesisAccountSignature, - /// Transaction's `chain_id` doesn't correspond to the id of current blockchain + /// Chain id doesn't correspond to the id of current blockchain ChainIdMismatch(Mismatch), } @@ -54,7 +54,7 @@ impl AcceptedTransaction { expected_chain_id: &ChainId, genesis_public_key: &PublicKey, ) -> Result { - let actual_chain_id = tx.0.chain_id(); + let actual_chain_id = tx.0.chain(); if expected_chain_id != actual_chain_id { return Err(AcceptTransactionFail::ChainIdMismatch(Mismatch { @@ -85,7 +85,7 @@ impl AcceptedTransaction { expected_chain_id: &ChainId, limits: &TransactionLimits, ) -> Result { - let actual_chain_id = tx.chain_id(); + let actual_chain_id = tx.chain(); if expected_chain_id != actual_chain_id { return Err(AcceptTransactionFail::ChainIdMismatch(Mismatch { @@ -94,7 +94,7 @@ impl AcceptedTransaction { })); } - if *iroha_genesis::GENESIS_DOMAIN_ID == *tx.authority().domain_id() { + if *iroha_genesis::GENESIS_DOMAIN_ID == *tx.authority().domain() { return Err(AcceptTransactionFail::UnexpectedGenesisAccountSignature); } @@ -202,10 +202,10 @@ impl TransactionExecutor { if !state_transaction .world - .domain(&authority.domain_id) + .domain(&authority.domain) .map_err(|_e| { TransactionRejectionReason::AccountDoesNotExist(FindError::Domain( - authority.domain_id.clone(), + authority.domain.clone(), )) })? .accounts diff --git a/core/test_network/src/lib.rs b/core/test_network/src/lib.rs index b342f1cde68..b77b54be550 100644 --- a/core/test_network/src/lib.rs +++ b/core/test_network/src/lib.rs @@ -91,11 +91,11 @@ impl TestGenesis for GenesisTransaction { let mint_rose_permission = Permission::new( "CanMintAssetWithDefinition".parse().unwrap(), - json!({ "asset_definition_id": rose_definition_id }), + json!({ "asset_definition": rose_definition_id }), ); let burn_rose_permission = Permission::new( "CanBurnAssetWithDefinition".parse().unwrap(), - json!({ "asset_definition_id": rose_definition_id }), + json!({ "asset_definition": rose_definition_id }), ); let unregister_any_peer_permission = Permission::new("CanUnregisterAnyPeer".parse().unwrap(), json!(null)); @@ -103,7 +103,7 @@ impl TestGenesis for GenesisTransaction { Permission::new("CanUnregisterAnyRole".parse().unwrap(), json!(null)); let unregister_wonderland_domain = Permission::new( "CanUnregisterDomain".parse().unwrap(), - json!({ "domain_id": DomainId::from_str("wonderland").unwrap() }), + json!({ "domain": DomainId::from_str("wonderland").unwrap() }), ); let upgrade_executor_permission = Permission::new("CanUpgradeExecutor".parse().unwrap(), json!(null)); @@ -416,7 +416,7 @@ impl Peer { Config { common: Common { key_pair: self.key_pair.clone(), - peer_id: peer_id.clone(), + peer: peer_id.clone(), ..config.common }, network: Network { @@ -815,7 +815,7 @@ impl TestClient for Client { fn test_with_account(api_addr: &SocketAddr, keys: KeyPair, account_id: &AccountId) -> Self { let mut config = ClientConfig::test(api_addr); - config.account_id = account_id.clone(); + config.account = account_id.clone(); config.key_pair = keys; Client::new(config) } diff --git a/data_model/derive/src/has_origin.rs b/data_model/derive/src/has_origin.rs index b6f7fe365e2..0679e7a422f 100644 --- a/data_model/derive/src/has_origin.rs +++ b/data_model/derive/src/has_origin.rs @@ -103,7 +103,7 @@ pub fn impl_has_origin(emitter: &mut Emitter, input: &syn::DeriveInput) -> Token impl #impl_generics HasOrigin for #enum_ident #ty_generics #where_clause { type Origin = #enum_origin; - fn origin_id(&self) -> &::Id { + fn origin(&self) -> &::Id { use #enum_ident::*; match self { #( diff --git a/data_model/derive/src/lib.rs b/data_model/derive/src/lib.rs index c6767957413..2ecf9314397 100644 --- a/data_model/derive/src/lib.rs +++ b/data_model/derive/src/lib.rs @@ -417,7 +417,7 @@ pub fn partially_tagged_deserialize_derive(input: TokenStream) -> Result &sub_layer_event.origin_id().parent_id)] +/// #[has_origin(sub_layer_event => &sub_layer_event.origin().parent)] /// SubLayer(SubLayerEvent), /// Created(LayerId), /// } @@ -436,7 +436,7 @@ pub fn partially_tagged_deserialize_derive(input: TokenStream) -> Result Result Option { - assert_eq!(self.id, asset.id.account_id); - self.assets.insert(asset.id.definition_id.clone(), asset) + assert_eq!(self.id, asset.id.account); + self.assets.insert(asset.id.definition.clone(), asset) } /// Remove asset from the [`Account`] and return it diff --git a/data_model/src/asset.rs b/data_model/src/asset.rs index c3ef6cff67c..6b3972c1e49 100644 --- a/data_model/src/asset.rs +++ b/data_model/src/asset.rs @@ -64,13 +64,13 @@ mod model { SerializeDisplay, IntoSchema, )] - #[display(fmt = "{name}#{domain_id}")] - #[debug(fmt = "{name}#{domain_id}")] + #[display(fmt = "{name}#{domain}")] + #[debug(fmt = "{name}#{domain}")] #[getset(get = "pub")] #[ffi_type] pub struct AssetDefinitionId { /// Domain id. - pub domain_id: DomainId, + pub domain: DomainId, /// Asset name. pub name: Name, } @@ -95,9 +95,9 @@ mod model { #[ffi_type] pub struct AssetId { /// Entity Identification. - pub definition_id: AssetDefinitionId, + pub definition: AssetDefinitionId, /// Account Identification. - pub account_id: AccountId, + pub account: AccountId, } /// Asset definition defines the type of that asset. @@ -409,10 +409,10 @@ impl FromStr for AssetDefinitionId { impl fmt::Display for AssetId { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - if self.definition_id.domain_id == self.account_id.domain_id { - write!(f, "{}##{}", self.definition_id.name, self.account_id) + if self.definition.domain == self.account.domain { + write!(f, "{}##{}", self.definition.name, self.account) } else { - write!(f, "{}#{}", self.definition_id, self.account_id) + write!(f, "{}#{}", self.definition, self.account) } } } @@ -435,7 +435,7 @@ impl FromStr for AssetId { reason: "Failed to parse `account@domain` part in `asset#domain#account@domain`. `account` should have multihash format e.g. `ed0120...`" })?; let domain_complement = if definition_id_candidate.ends_with('#') { - account_id.domain_id.name.as_ref() + account_id.domain.name.as_ref() } else { "" }; diff --git a/data_model/src/events/data/events.rs b/data_model/src/events/data/events.rs index 5222a3f311e..766872cc0d2 100644 --- a/data_model/src/events/data/events.rs +++ b/data_model/src/events/data/events.rs @@ -59,7 +59,7 @@ mod model { //#[getset(get = "pub")] #[ffi_type] pub struct MetadataChanged { - pub target_id: Id, + pub target: Id, pub key: Name, pub value: MetadataValueBox, } @@ -113,13 +113,13 @@ mod asset { #[has_origin(asset => asset.id())] Created(Asset), Deleted(AssetId), - #[has_origin(asset_changed => &asset_changed.asset_id)] + #[has_origin(asset_changed => &asset_changed.asset)] Added(AssetChanged), - #[has_origin(asset_changed => &asset_changed.asset_id)] + #[has_origin(asset_changed => &asset_changed.asset)] Removed(AssetChanged), - #[has_origin(metadata_changed => &metadata_changed.target_id)] + #[has_origin(metadata_changed => &metadata_changed.target)] MetadataInserted(AssetMetadataChanged), - #[has_origin(metadata_changed => &metadata_changed.target_id)] + #[has_origin(metadata_changed => &metadata_changed.target)] MetadataRemoved(AssetMetadataChanged), } } @@ -130,14 +130,14 @@ mod asset { #[has_origin(asset_definition => asset_definition.id())] Created(AssetDefinition), MintabilityChanged(AssetDefinitionId), - #[has_origin(ownership_changed => &ownership_changed.asset_definition_id)] + #[has_origin(ownership_changed => &ownership_changed.asset_definition)] OwnerChanged(AssetDefinitionOwnerChanged), Deleted(AssetDefinitionId), - #[has_origin(metadata_changed => &metadata_changed.target_id)] + #[has_origin(metadata_changed => &metadata_changed.target)] MetadataInserted(AssetDefinitionMetadataChanged), - #[has_origin(metadata_changed => &metadata_changed.target_id)] + #[has_origin(metadata_changed => &metadata_changed.target)] MetadataRemoved(AssetDefinitionMetadataChanged), - #[has_origin(total_quantity_changed => &total_quantity_changed.asset_definition_id)] + #[has_origin(total_quantity_changed => &total_quantity_changed.asset_definition)] TotalQuantityChanged(AssetDefinitionTotalQuantityChanged), } } @@ -164,7 +164,7 @@ mod asset { #[getset(get = "pub")] #[ffi_type] pub struct AssetChanged { - pub asset_id: AssetId, + pub asset: AssetId, pub amount: AssetValue, } @@ -186,7 +186,7 @@ mod asset { #[getset(get = "pub")] #[ffi_type] pub struct AssetDefinitionTotalQuantityChanged { - pub asset_definition_id: AssetDefinitionId, + pub asset_definition: AssetDefinitionId, pub total_amount: Numeric, } @@ -209,7 +209,7 @@ mod asset { #[ffi_type] pub struct AssetDefinitionOwnerChanged { /// Id of asset definition being updated - pub asset_definition_id: AssetDefinitionId, + pub asset_definition: AssetDefinitionId, /// Id of new owning account pub new_owner: AccountId, } @@ -246,11 +246,11 @@ mod role { Deleted(RoleId), /// [`Permission`]s with particular [`PermissionId`] /// were removed from the role. - #[has_origin(permission_removed => &permission_removed.role_id)] + #[has_origin(permission_removed => &permission_removed.role)] PermissionRemoved(RolePermissionChanged), /// [`Permission`]s with particular [`PermissionId`] /// were removed added to the role. - #[has_origin(permission_added => &permission_added.role_id)] + #[has_origin(permission_added => &permission_added.role)] PermissionAdded(RolePermissionChanged), } } @@ -277,10 +277,10 @@ mod role { #[getset(get = "pub")] #[ffi_type] pub struct RolePermissionChanged { - pub role_id: RoleId, + pub role: RoleId, // TODO: Skipped temporarily because of FFI #[getset(skip)] - pub permission_id: PermissionId, + pub permission: PermissionId, } } } @@ -298,24 +298,24 @@ mod account { data_event! { #[has_origin(origin = Account)] pub enum AccountEvent { - #[has_origin(asset_event => &asset_event.origin_id().account_id)] + #[has_origin(asset_event => &asset_event.origin().account)] Asset(AssetEvent), #[has_origin(account => account.id())] Created(Account), Deleted(AccountId), AuthenticationAdded(AccountId), AuthenticationRemoved(AccountId), - #[has_origin(permission_changed => &permission_changed.account_id)] + #[has_origin(permission_changed => &permission_changed.account)] PermissionAdded(AccountPermissionChanged), - #[has_origin(permission_changed => &permission_changed.account_id)] + #[has_origin(permission_changed => &permission_changed.account)] PermissionRemoved(AccountPermissionChanged), - #[has_origin(role_changed => &role_changed.account_id)] + #[has_origin(role_changed => &role_changed.account)] RoleRevoked(AccountRoleChanged), - #[has_origin(role_changed => &role_changed.account_id)] + #[has_origin(role_changed => &role_changed.account)] RoleGranted(AccountRoleChanged), - #[has_origin(metadata_changed => &metadata_changed.target_id)] + #[has_origin(metadata_changed => &metadata_changed.target)] MetadataInserted(AccountMetadataChanged), - #[has_origin(metadata_changed => &metadata_changed.target_id)] + #[has_origin(metadata_changed => &metadata_changed.target)] MetadataRemoved(AccountMetadataChanged), } } @@ -342,10 +342,10 @@ mod account { #[getset(get = "pub")] #[ffi_type] pub struct AccountPermissionChanged { - pub account_id: AccountId, + pub account: AccountId, // TODO: Skipped temporarily because of FFI #[getset(skip)] - pub permission_id: PermissionId, + pub permission: PermissionId, } /// Depending on the wrapping event, [`AccountRoleChanged`] represents the granted or revoked role @@ -366,15 +366,15 @@ mod account { #[getset(get = "pub")] #[ffi_type] pub struct AccountRoleChanged { - pub account_id: AccountId, - pub role_id: RoleId, + pub account: AccountId, + pub role: RoleId, } } impl AccountPermissionChanged { /// Get permission id - pub fn permission_id(&self) -> &PermissionId { - &self.permission_id + pub fn permission(&self) -> &PermissionId { + &self.permission } } } @@ -390,18 +390,18 @@ mod domain { data_event! { #[has_origin(origin = Domain)] pub enum DomainEvent { - #[has_origin(account_event => &account_event.origin_id().domain_id)] + #[has_origin(account_event => &account_event.origin().domain)] Account(AccountEvent), - #[has_origin(asset_definition_event => &asset_definition_event.origin_id().domain_id)] + #[has_origin(asset_definition_event => &asset_definition_event.origin().domain)] AssetDefinition(AssetDefinitionEvent), #[has_origin(domain => domain.id())] Created(Domain), Deleted(DomainId), - #[has_origin(metadata_changed => &metadata_changed.target_id)] + #[has_origin(metadata_changed => &metadata_changed.target)] MetadataInserted(DomainMetadataChanged), - #[has_origin(metadata_changed => &metadata_changed.target_id)] + #[has_origin(metadata_changed => &metadata_changed.target)] MetadataRemoved(DomainMetadataChanged), - #[has_origin(owner_changed => &owner_changed.domain_id)] + #[has_origin(owner_changed => &owner_changed.domain)] OwnerChanged(DomainOwnerChanged), } } @@ -428,7 +428,7 @@ mod domain { #[getset(get = "pub")] #[ffi_type] pub struct DomainOwnerChanged { - pub domain_id: DomainId, + pub domain: DomainId, pub new_owner: AccountId, } } @@ -449,13 +449,13 @@ mod trigger { pub enum TriggerEvent { Created(TriggerId), Deleted(TriggerId), - #[has_origin(number_of_executions_changed => &number_of_executions_changed.trigger_id)] + #[has_origin(number_of_executions_changed => &number_of_executions_changed.trigger)] Extended(TriggerNumberOfExecutionsChanged), - #[has_origin(number_of_executions_changed => &number_of_executions_changed.trigger_id)] + #[has_origin(number_of_executions_changed => &number_of_executions_changed.trigger)] Shortened(TriggerNumberOfExecutionsChanged), - #[has_origin(metadata_changed => &metadata_changed.target_id)] + #[has_origin(metadata_changed => &metadata_changed.target)] MetadataInserted(TriggerMetadataChanged), - #[has_origin(metadata_changed => &metadata_changed.target_id)] + #[has_origin(metadata_changed => &metadata_changed.target)] MetadataRemoved(TriggerMetadataChanged), } } @@ -482,7 +482,7 @@ mod trigger { #[getset(get = "pub")] #[ffi_type] pub struct TriggerNumberOfExecutionsChanged { - pub trigger_id: TriggerId, + pub trigger: TriggerId, pub by: u32, } } @@ -571,7 +571,7 @@ pub trait HasOrigin { /// Type of the origin. type Origin: Identifiable; /// Identification of the origin. - fn origin_id(&self) -> &::Id; + fn origin(&self) -> &::Id; } impl From for DataEvent { @@ -594,9 +594,9 @@ impl From for DataEvent { impl DataEvent { /// Return the domain id of [`Event`] - pub fn domain_id(&self) -> Option<&DomainId> { + pub fn domain(&self) -> Option<&DomainId> { match self { - Self::Domain(event) => Some(event.origin_id()), + Self::Domain(event) => Some(event.origin()), Self::Configuration(_) | Self::Executor(_) | Self::Peer(_) @@ -607,12 +607,12 @@ impl DataEvent { } impl MetadataChanged { - /// Getter for `target_id` - pub fn target_id(&self) -> &Id { - &self.target_id + /// Getter for `target` + pub fn target(&self) -> &Id { + &self.target } - /// Getter for `target_id` + /// Getter for metadata key pub fn key(&self) -> &Name { &self.key } diff --git a/data_model/src/events/data/filters.rs b/data_model/src/events/data/filters.rs index 58840eb68bc..db34033eb82 100644 --- a/data_model/src/events/data/filters.rs +++ b/data_model/src/events/data/filters.rs @@ -287,7 +287,7 @@ impl EventFilter for PeerEventFilter { fn matches(&self, event: &Self::Event) -> bool { if let Some(id_matcher) = &self.id_matcher { - if id_matcher != event.origin_id() { + if id_matcher != event.origin() { return false; } } @@ -336,7 +336,7 @@ impl EventFilter for DomainEventFilter { fn matches(&self, event: &Self::Event) -> bool { if let Some(id_matcher) = &self.id_matcher { - if id_matcher != event.origin_id() { + if id_matcher != event.origin() { return false; } } @@ -385,7 +385,7 @@ impl super::EventFilter for AccountEventFilter { fn matches(&self, event: &Self::Event) -> bool { if let Some(id_matcher) = &self.id_matcher { - if id_matcher != event.origin_id() { + if id_matcher != event.origin() { return false; } } @@ -434,7 +434,7 @@ impl super::EventFilter for AssetEventFilter { fn matches(&self, event: &Self::Event) -> bool { if let Some(id_matcher) = &self.id_matcher { - if id_matcher != event.origin_id() { + if id_matcher != event.origin() { return false; } } @@ -483,7 +483,7 @@ impl super::EventFilter for AssetDefinitionEventFilter { fn matches(&self, event: &Self::Event) -> bool { if let Some(id_matcher) = &self.id_matcher { - if id_matcher != event.origin_id() { + if id_matcher != event.origin() { return false; } } @@ -532,7 +532,7 @@ impl super::EventFilter for TriggerEventFilter { fn matches(&self, event: &Self::Event) -> bool { if let Some(id_matcher) = &self.id_matcher { - if id_matcher != event.origin_id() { + if id_matcher != event.origin() { return false; } } @@ -581,7 +581,7 @@ impl super::EventFilter for RoleEventFilter { fn matches(&self, event: &Self::Event) -> bool { if let Some(id_matcher) = &self.id_matcher { - if id_matcher != event.origin_id() { + if id_matcher != event.origin() { return false; } } @@ -630,7 +630,7 @@ impl super::EventFilter for ConfigurationEventFilter { fn matches(&self, event: &Self::Event) -> bool { if let Some(id_matcher) = &self.id_matcher { - if id_matcher != event.origin_id() { + if id_matcher != event.origin() { return false; } } diff --git a/data_model/src/isi.rs b/data_model/src/isi.rs index 07bb86c0385..c7024cb8d2f 100644 --- a/data_model/src/isi.rs +++ b/data_model/src/isi.rs @@ -280,7 +280,7 @@ mod transparent { #[schema(bounds = "O: Identifiable, O::Id: IntoSchema")] pub struct SetKeyValue { /// Where to set key value. - pub object_id: O::Id, + pub object: O::Id, /// Key. pub key: Name, /// Value. @@ -292,7 +292,7 @@ mod transparent { /// Constructs a new [`SetKeyValue`] for a [`Domain`] with the given `key` and `value`. pub fn domain(domain_id: DomainId, key: Name, value: impl Into) -> Self { Self { - object_id: domain_id, + object: domain_id, key, value: value.into(), } @@ -307,7 +307,7 @@ mod transparent { value: impl Into, ) -> Self { Self { - object_id: account_id, + object: account_id, key, value: value.into(), } @@ -322,7 +322,7 @@ mod transparent { value: impl Into, ) -> Self { Self { - object_id: asset_definition_id, + object: asset_definition_id, key, value: value.into(), } @@ -333,7 +333,7 @@ mod transparent { /// Constructs a new [`SetKeyValue`] for an [`Asset`] with the given `key` and `value`. pub fn asset(asset_id: AssetId, key: Name, value: impl Into) -> Self { Self { - object_id: asset_id, + object: asset_id, key, value: value.into(), } @@ -348,7 +348,7 @@ mod transparent { value: impl Into, ) -> Self { Self { - object_id: trigger_id, + object: trigger_id, key, value: value.into(), } @@ -362,7 +362,7 @@ mod transparent { O::Id: Display, => "SET `{}` = `{}` IN `{}`", - key, value, object_id, + key, value, object, } impl_into_box! { @@ -380,7 +380,7 @@ mod transparent { #[schema(bounds = "O: Identifiable, O::Id: IntoSchema")] pub struct RemoveKeyValue { /// From where to remove key value. - pub object_id: O::Id, + pub object: O::Id, /// Key of the pair to remove. pub key: Name, } @@ -390,7 +390,7 @@ mod transparent { /// Constructs a new [`RemoveKeyValue`] for a [`Domain`] with the given `key`. pub fn domain(domain_id: DomainId, key: Name) -> Self { Self { - object_id: domain_id, + object: domain_id, key, } } @@ -400,7 +400,7 @@ mod transparent { /// Constructs a new [`RemoveKeyValue`] for an [`Account`] with the given `key`. pub fn account(account_id: AccountId, key: Name) -> Self { Self { - object_id: account_id, + object: account_id, key, } } @@ -410,7 +410,7 @@ mod transparent { /// Constructs a new [`RemoveKeyValue`] for an [`AssetDefinition`] with the given `key`. pub fn asset_definition(asset_definition_id: AssetDefinitionId, key: Name) -> Self { Self { - object_id: asset_definition_id, + object: asset_definition_id, key, } } @@ -420,7 +420,7 @@ mod transparent { /// Constructs a new [`RemoveKeyValue`] for an [`Asset`] with the given `key`. pub fn asset(asset_id: AssetId, key: Name) -> Self { Self { - object_id: asset_id, + object: asset_id, key, } } @@ -430,7 +430,7 @@ mod transparent { /// Constructs a new [`RemoveKeyValue`] for an [`Asset`] with the given `key`. pub fn trigger(trigger_id: TriggerId, key: Name) -> Self { Self { - object_id: trigger_id, + object: trigger_id, key, } } @@ -443,7 +443,7 @@ mod transparent { O::Id: Display, => "REMOVE `{}` from `{}`", - key, object_id, + key, object, } impl_into_box! { @@ -548,7 +548,7 @@ mod transparent { #[schema(bounds = "O: Identifiable, O::Id: IntoSchema")] pub struct Unregister { /// [`Identifiable::Id`] of the object which should be unregistered. - pub object_id: O::Id, + pub object: O::Id, } } @@ -559,7 +559,7 @@ mod transparent { O::Id: Display, => "UNREGISTER `{}`", - object_id, + object, } impl_into_box! { @@ -577,25 +577,21 @@ mod transparent { impl Unregister { /// Constructs a new [`Unregister`] for a [`Peer`]. pub fn peer(peer_id: PeerId) -> Self { - Self { object_id: peer_id } + Self { object: peer_id } } } impl Unregister { /// Constructs a new [`Unregister`] for a [`Domain`]. pub fn domain(domain_id: DomainId) -> Self { - Self { - object_id: domain_id, - } + Self { object: domain_id } } } impl Unregister { /// Constructs a new [`Unregister`] for an [`Account`]. pub fn account(account_id: AccountId) -> Self { - Self { - object_id: account_id, - } + Self { object: account_id } } } @@ -603,7 +599,7 @@ mod transparent { /// Constructs a new [`Unregister`] for an [`AssetDefinition`]. pub fn asset_definition(asset_definition_id: AssetDefinitionId) -> Self { Self { - object_id: asset_definition_id, + object: asset_definition_id, } } } @@ -611,25 +607,21 @@ mod transparent { impl Unregister { /// Constructs a new [`Unregister`] for an [`Asset`]. pub fn asset(asset_id: AssetId) -> Self { - Self { - object_id: asset_id, - } + Self { object: asset_id } } } impl Unregister { /// Constructs a new [`Unregister`] for a [`Role`]. pub fn role(role_id: RoleId) -> Self { - Self { object_id: role_id } + Self { object: role_id } } } impl Unregister { /// Constructs a new [`Unregister`] for a [`Trigger`]. pub fn trigger(trigger_id: TriggerId) -> Self { - Self { - object_id: trigger_id, - } + Self { object: trigger_id } } } @@ -640,7 +632,7 @@ mod transparent { /// Object which should be minted. pub object: O, /// Destination object [`Identifiable::Id`]. - pub destination_id: D::Id, + pub destination: D::Id, } } @@ -649,7 +641,7 @@ mod transparent { pub fn asset_numeric(object: impl Into, asset_id: AssetId) -> Self { Self { object: object.into(), - destination_id: asset_id, + destination: asset_id, } } } @@ -659,7 +651,7 @@ mod transparent { pub fn trigger_repetitions(repetitions: u32, trigger_id: TriggerId) -> Self { Self { object: repetitions, - destination_id: trigger_id, + destination: trigger_id, } } } @@ -673,7 +665,7 @@ mod transparent { => "MINT `{}` TO `{}`", object, - destination_id, + destination, } impl_into_box! { @@ -690,7 +682,7 @@ mod transparent { /// Object which should be burned. pub object: O, /// Destination object [`Identifiable::Id`]. - pub destination_id: D::Id, + pub destination: D::Id, } } @@ -699,7 +691,7 @@ mod transparent { pub fn asset_numeric(object: impl Into, asset_id: AssetId) -> Self { Self { object: object.into(), - destination_id: asset_id, + destination: asset_id, } } } @@ -709,7 +701,7 @@ mod transparent { pub fn trigger_repetitions(repetitions: u32, trigger_id: TriggerId) -> Self { Self { object: repetitions, - destination_id: trigger_id, + destination: trigger_id, } } } @@ -723,7 +715,7 @@ mod transparent { => "BURN `{}` FROM `{}`", object, - destination_id, + destination, } impl_into_box! { @@ -740,11 +732,11 @@ mod transparent { D: Identifiable, D::Id: IntoSchema")] pub struct Transfer { /// Source object `Id`. - pub source_id: S::Id, + pub source: S::Id, /// Object which should be transferred. pub object: O, /// Destination object `Id`. - pub destination_id: D::Id, + pub destination: D::Id, } } @@ -752,9 +744,9 @@ mod transparent { /// Constructs a new [`Transfer`] for a [`Domain`]. pub fn domain(from: AccountId, domain_id: DomainId, to: AccountId) -> Self { Self { - source_id: from, + source: from, object: domain_id, - destination_id: to, + destination: to, } } } @@ -767,9 +759,9 @@ mod transparent { to: AccountId, ) -> Self { Self { - source_id: from, + source: from, object: asset_definition_id, - destination_id: to, + destination: to, } } } @@ -782,9 +774,9 @@ mod transparent { to: AccountId, ) -> Self { Self { - source_id: asset_id, + source: asset_id, object: quantity.into(), - destination_id: to, + destination: to, } } } @@ -793,9 +785,9 @@ mod transparent { /// Constructs a new [`Transfer`] for an [`Asset`] of [`Store`] type. pub fn asset_store(asset_id: AssetId, to: AccountId) -> Self { Self { - source_id: asset_id, + source: asset_id, object: Metadata::new(), - destination_id: to, + destination: to, } } } @@ -811,8 +803,8 @@ mod transparent { => "TRANSFER `{}` FROM `{}` TO `{}`", object, - source_id, - destination_id, + source, + destination, } impl_into_box! { @@ -848,7 +840,7 @@ mod transparent { /// Object to grant. pub object: O, /// Entity to which to grant this token. - pub destination_id: D::Id, + pub destination: D::Id, } } @@ -857,7 +849,7 @@ mod transparent { pub fn permission(permission: Permission, to: AccountId) -> Self { Self { object: permission, - destination_id: to, + destination: to, } } } @@ -867,7 +859,7 @@ mod transparent { pub fn role(role_id: RoleId, to: AccountId) -> Self { Self { object: role_id, - destination_id: to, + destination: to, } } } @@ -877,7 +869,7 @@ mod transparent { pub fn role_permission(permission: Permission, to: RoleId) -> Self { Self { object: permission, - destination_id: to, + destination: to, } } } @@ -891,7 +883,7 @@ mod transparent { => "GRANT `{}` TO `{}`", object, - destination_id, + destination, } impl_into_box! { @@ -909,7 +901,7 @@ mod transparent { /// Object to revoke. pub object: O, /// Entity which is being revoked this token from. - pub destination_id: D::Id, + pub destination: D::Id, } } @@ -918,7 +910,7 @@ mod transparent { pub fn permission(permission: Permission, from: AccountId) -> Self { Self { object: permission, - destination_id: from, + destination: from, } } } @@ -928,7 +920,7 @@ mod transparent { pub fn role(role_id: RoleId, from: AccountId) -> Self { Self { object: role_id, - destination_id: from, + destination: from, } } } @@ -938,7 +930,7 @@ mod transparent { pub fn role_permission(permission: Permission, from: RoleId) -> Self { Self { object: permission, - destination_id: from, + destination: from, } } } @@ -952,7 +944,7 @@ mod transparent { => "REVOKE `{}` FROM `{}`", object, - destination_id, + destination, } impl_into_box! { @@ -966,12 +958,12 @@ mod transparent { isi! { /// Instruction to execute specified trigger #[derive(Constructor, Display)] - #[display(fmt = "EXECUTE `{trigger_id}`")] + #[display(fmt = "EXECUTE `{trigger}`")] #[serde(transparent)] #[repr(transparent)] pub struct ExecuteTrigger { /// Id of a trigger to execute - pub trigger_id: TriggerId, + pub trigger: TriggerId, } } diff --git a/data_model/src/transaction.rs b/data_model/src/transaction.rs index 9b8bbc83c8c..edd2ef7cf20 100644 --- a/data_model/src/transaction.rs +++ b/data_model/src/transaction.rs @@ -98,7 +98,7 @@ mod model { )] pub(crate) struct TransactionPayload { /// Unique id of the blockchain. Used for simple replay attack protection. - pub chain_id: ChainId, + pub chain: ChainId, /// Account ID of transaction creator. /// TODO dedup public keys in transaction #4410 pub authority: AccountId, @@ -286,9 +286,9 @@ impl SignedTransaction { /// Transaction chain id #[inline] - pub fn chain_id(&self) -> &ChainId { + pub fn chain(&self) -> &ChainId { let SignedTransaction::V1(tx) = self; - &tx.payload.chain_id + &tx.payload.chain } /// Return the transaction signature @@ -630,10 +630,10 @@ mod http { impl TransactionBuilder { #[cfg(feature = "std")] - fn new_with_time(chain_id: ChainId, authority: AccountId, creation_time_ms: u64) -> Self { + fn new_with_time(chain: ChainId, authority: AccountId, creation_time_ms: u64) -> Self { Self { payload: TransactionPayload { - chain_id, + chain, authority, creation_time_ms, nonce: None, diff --git a/docs/source/references/schema.json b/docs/source/references/schema.json index 50bd3086ff0..f760af50afd 100644 --- a/docs/source/references/schema.json +++ b/docs/source/references/schema.json @@ -140,7 +140,7 @@ "AccountId": { "Struct": [ { - "name": "domain_id", + "name": "domain", "type": "DomainId" }, { @@ -152,11 +152,11 @@ "AccountPermissionChanged": { "Struct": [ { - "name": "account_id", + "name": "account", "type": "AccountId" }, { - "name": "permission_id", + "name": "permission", "type": "PermissionId" } ] @@ -164,11 +164,11 @@ "AccountRoleChanged": { "Struct": [ { - "name": "account_id", + "name": "account", "type": "AccountId" }, { - "name": "role_id", + "name": "role", "type": "RoleId" } ] @@ -250,7 +250,7 @@ "AssetChanged": { "Struct": [ { - "name": "asset_id", + "name": "asset", "type": "AssetId" }, { @@ -376,7 +376,7 @@ "AssetDefinitionId": { "Struct": [ { - "name": "domain_id", + "name": "domain", "type": "DomainId" }, { @@ -388,7 +388,7 @@ "AssetDefinitionOwnerChanged": { "Struct": [ { - "name": "asset_definition_id", + "name": "asset_definition", "type": "AssetDefinitionId" }, { @@ -400,7 +400,7 @@ "AssetDefinitionTotalQuantityChanged": { "Struct": [ { - "name": "asset_definition_id", + "name": "asset_definition", "type": "AssetDefinitionId" }, { @@ -489,11 +489,11 @@ "AssetId": { "Struct": [ { - "name": "definition_id", + "name": "definition", "type": "AssetDefinitionId" }, { - "name": "account_id", + "name": "account", "type": "AccountId" } ] @@ -686,7 +686,7 @@ "type": "Numeric" }, { - "name": "destination_id", + "name": "destination", "type": "AssetId" } ] @@ -698,7 +698,7 @@ "type": "u32" }, { - "name": "destination_id", + "name": "destination", "type": "TriggerId" } ] @@ -1057,7 +1057,7 @@ "DomainOwnerChanged": { "Struct": [ { - "name": "domain_id", + "name": "domain", "type": "DomainId" }, { @@ -1149,7 +1149,7 @@ "ExecuteTrigger": { "Struct": [ { - "name": "trigger_id", + "name": "trigger", "type": "TriggerId" } ] @@ -1632,7 +1632,7 @@ "type": "Permission" }, { - "name": "destination_id", + "name": "destination", "type": "AccountId" } ] @@ -1644,7 +1644,7 @@ "type": "Permission" }, { - "name": "destination_id", + "name": "destination", "type": "RoleId" } ] @@ -1656,7 +1656,7 @@ "type": "RoleId" }, { - "name": "destination_id", + "name": "destination", "type": "AccountId" } ] @@ -2160,7 +2160,7 @@ "MetadataChanged": { "Struct": [ { - "name": "target_id", + "name": "target", "type": "AccountId" }, { @@ -2176,7 +2176,7 @@ "MetadataChanged": { "Struct": [ { - "name": "target_id", + "name": "target", "type": "AssetDefinitionId" }, { @@ -2192,7 +2192,7 @@ "MetadataChanged": { "Struct": [ { - "name": "target_id", + "name": "target", "type": "AssetId" }, { @@ -2208,7 +2208,7 @@ "MetadataChanged": { "Struct": [ { - "name": "target_id", + "name": "target", "type": "DomainId" }, { @@ -2224,7 +2224,7 @@ "MetadataChanged": { "Struct": [ { - "name": "target_id", + "name": "target", "type": "TriggerId" }, { @@ -2311,7 +2311,7 @@ "type": "Numeric" }, { - "name": "destination_id", + "name": "destination", "type": "AssetId" } ] @@ -2323,7 +2323,7 @@ "type": "u32" }, { - "name": "destination_id", + "name": "destination", "type": "TriggerId" } ] @@ -3146,7 +3146,7 @@ "RemoveKeyValue": { "Struct": [ { - "name": "object_id", + "name": "object", "type": "AccountId" }, { @@ -3158,7 +3158,7 @@ "RemoveKeyValue": { "Struct": [ { - "name": "object_id", + "name": "object", "type": "AssetId" }, { @@ -3170,7 +3170,7 @@ "RemoveKeyValue": { "Struct": [ { - "name": "object_id", + "name": "object", "type": "AssetDefinitionId" }, { @@ -3182,7 +3182,7 @@ "RemoveKeyValue": { "Struct": [ { - "name": "object_id", + "name": "object", "type": "DomainId" }, { @@ -3194,7 +3194,7 @@ "RemoveKeyValue": { "Struct": [ { - "name": "object_id", + "name": "object", "type": "TriggerId" }, { @@ -3264,7 +3264,7 @@ "type": "Permission" }, { - "name": "destination_id", + "name": "destination", "type": "AccountId" } ] @@ -3276,7 +3276,7 @@ "type": "Permission" }, { - "name": "destination_id", + "name": "destination", "type": "RoleId" } ] @@ -3288,7 +3288,7 @@ "type": "RoleId" }, { - "name": "destination_id", + "name": "destination", "type": "AccountId" } ] @@ -3394,11 +3394,11 @@ "RolePermissionChanged": { "Struct": [ { - "name": "role_id", + "name": "role", "type": "RoleId" }, { - "name": "permission_id", + "name": "permission", "type": "PermissionId" } ] @@ -3451,7 +3451,7 @@ "SetKeyValue": { "Struct": [ { - "name": "object_id", + "name": "object", "type": "AccountId" }, { @@ -3467,7 +3467,7 @@ "SetKeyValue": { "Struct": [ { - "name": "object_id", + "name": "object", "type": "AssetId" }, { @@ -3483,7 +3483,7 @@ "SetKeyValue": { "Struct": [ { - "name": "object_id", + "name": "object", "type": "AssetDefinitionId" }, { @@ -3499,7 +3499,7 @@ "SetKeyValue": { "Struct": [ { - "name": "object_id", + "name": "object", "type": "DomainId" }, { @@ -3515,7 +3515,7 @@ "SetKeyValue": { "Struct": [ { - "name": "object_id", + "name": "object", "type": "TriggerId" }, { @@ -3870,7 +3870,7 @@ "TransactionPayload": { "Struct": [ { - "name": "chain_id", + "name": "chain", "type": "ChainId" }, { @@ -3964,7 +3964,7 @@ "Transfer": { "Struct": [ { - "name": "source_id", + "name": "source", "type": "AccountId" }, { @@ -3972,7 +3972,7 @@ "type": "AssetDefinitionId" }, { - "name": "destination_id", + "name": "destination", "type": "AccountId" } ] @@ -3980,7 +3980,7 @@ "Transfer": { "Struct": [ { - "name": "source_id", + "name": "source", "type": "AccountId" }, { @@ -3988,7 +3988,7 @@ "type": "DomainId" }, { - "name": "destination_id", + "name": "destination", "type": "AccountId" } ] @@ -3996,7 +3996,7 @@ "Transfer": { "Struct": [ { - "name": "source_id", + "name": "source", "type": "AssetId" }, { @@ -4004,7 +4004,7 @@ "type": "Metadata" }, { - "name": "destination_id", + "name": "destination", "type": "AccountId" } ] @@ -4012,7 +4012,7 @@ "Transfer": { "Struct": [ { - "name": "source_id", + "name": "source", "type": "AssetId" }, { @@ -4020,7 +4020,7 @@ "type": "Numeric" }, { - "name": "destination_id", + "name": "destination", "type": "AccountId" } ] @@ -4193,7 +4193,7 @@ "TriggerNumberOfExecutionsChanged": { "Struct": [ { - "name": "trigger_id", + "name": "trigger", "type": "TriggerId" }, { @@ -4248,7 +4248,7 @@ "Unregister": { "Struct": [ { - "name": "object_id", + "name": "object", "type": "AccountId" } ] @@ -4256,7 +4256,7 @@ "Unregister": { "Struct": [ { - "name": "object_id", + "name": "object", "type": "AssetId" } ] @@ -4264,7 +4264,7 @@ "Unregister": { "Struct": [ { - "name": "object_id", + "name": "object", "type": "AssetDefinitionId" } ] @@ -4272,7 +4272,7 @@ "Unregister": { "Struct": [ { - "name": "object_id", + "name": "object", "type": "DomainId" } ] @@ -4280,7 +4280,7 @@ "Unregister": { "Struct": [ { - "name": "object_id", + "name": "object", "type": "PeerId" } ] @@ -4288,7 +4288,7 @@ "Unregister": { "Struct": [ { - "name": "object_id", + "name": "object", "type": "RoleId" } ] @@ -4296,7 +4296,7 @@ "Unregister": { "Struct": [ { - "name": "object_id", + "name": "object", "type": "TriggerId" } ] diff --git a/scripts/test_env.py b/scripts/test_env.py index 1a45b3b4e0b..5bf7d5991c4 100755 --- a/scripts/test_env.py +++ b/scripts/test_env.py @@ -40,7 +40,7 @@ def __init__(self, args: argparse.Namespace): genesis_public_key = self.peers[0].public_key genesis_private_key = self.peers[0].private_key shared_config = { - "chain_id": "00000000-0000-0000-0000-000000000000", + "chain": "00000000-0000-0000-0000-000000000000", "genesis": { "public_key": genesis_public_key }, @@ -247,7 +247,7 @@ def setup(args: argparse.Namespace): def cleanup(out_dir: pathlib.Path): logging.info("Killing peer processes...") - subprocess.run(["pkill", "-9", "irohad"]) + subprocess.run(["pkill", "-9", "iroha"]) logging.info(f"Cleaning up test directory `{out_dir}`...") shutil.rmtree(out_dir) diff --git a/smart_contract/executor/derive/src/conversion.rs b/smart_contract/executor/derive/src/conversion.rs index 4ea3e505f2b..561224350b1 100644 --- a/smart_contract/executor/derive/src/conversion.rs +++ b/smart_contract/executor/derive/src/conversion.rs @@ -10,7 +10,7 @@ pub fn impl_derive_ref_into_asset_owner(input: &DeriveInput) -> TokenStream { &input.ident, &input.generics, &syn::parse_quote!(::iroha_executor::permission::asset::Owner), - &syn::parse_quote!(asset_id), + &syn::parse_quote!(asset), ) } @@ -21,7 +21,7 @@ pub fn impl_derive_ref_into_asset_definition_owner(input: &DeriveInput) -> Token &input.ident, &input.generics, &syn::parse_quote!(::iroha_executor::permission::asset_definition::Owner), - &syn::parse_quote!(asset_definition_id), + &syn::parse_quote!(asset_definition), ) } @@ -31,7 +31,7 @@ pub fn impl_derive_ref_into_account_owner(input: &DeriveInput) -> TokenStream { &input.ident, &input.generics, &syn::parse_quote!(::iroha_executor::permission::account::Owner), - &syn::parse_quote!(account_id), + &syn::parse_quote!(account), ) } @@ -41,7 +41,7 @@ pub fn impl_derive_ref_into_domain_owner(input: &DeriveInput) -> TokenStream { &input.ident, &input.generics, &syn::parse_quote!(::iroha_executor::permission::domain::Owner), - &syn::parse_quote!(domain_id), + &syn::parse_quote!(domain), ) } diff --git a/smart_contract/executor/derive/src/lib.rs b/smart_contract/executor/derive/src/lib.rs index 962cbd794a1..4b11347a112 100644 --- a/smart_contract/executor/derive/src/lib.rs +++ b/smart_contract/executor/derive/src/lib.rs @@ -75,7 +75,7 @@ pub fn entrypoint(attr: TokenStream, item: TokenStream) -> TokenStream { /// #[validate(permission::asset::Owner)] /// struct CanDoSomethingWithAsset { /// some_data: String, -/// asset_id: AssetId, +/// asset: AssetId, /// } /// /// #[entrypoint(params = "[authority, operation]")] @@ -88,7 +88,7 @@ pub fn entrypoint(attr: TokenStream, item: TokenStream) -> TokenStream { /// /// CanDoSomethingWithAsset { /// some_data: "some data".to_owned(), -/// asset_id: parse!(AssetId, "rose##ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland"), +/// asset: parse!(AssetId, "rose##ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland"), /// }.is_owned_by(&authority) /// } /// ``` @@ -174,7 +174,7 @@ pub fn derive_validate_grant_revoke(input: TokenStream) -> Result { /// Should be used together with [`ValidateGrantRevoke`] derive macro to derive a conversion /// from your token to a `permission::asset_definition::Owner` type. /// -/// Requires `asset_definition_id` field in the token. +/// Requires `asset_definition` field in the token. /// /// Implements [`From`] for `permission::asset_definition::Owner` /// and not [`Into`] for your type. [`Into`] will be implemented automatically. @@ -191,7 +191,7 @@ pub fn derive_ref_into_asset_definition_owner(input: TokenStream) -> Result Result { /// Should be used together with [`ValidateGrantRevoke`] derive macro to derive a conversion /// from your token to a `permission::account::Owner` type. /// -/// Requires `account_id` field in the token. +/// Requires `account` field in the token. /// /// Implements [`From`] for `permission::asset::Owner` /// and not [`Into`] for your type. [`Into`] will be implemented automatically. @@ -221,7 +221,7 @@ pub fn derive_ref_into_account_owner(input: TokenStream) -> Result /// Should be used together with [`ValidateGrantRevoke`] derive macro to derive a conversion /// from your token to a `permission::domain::Owner` type. /// -/// Requires `domain_id` field in the token. +/// Requires `domain` field in the token. /// /// Implements [`From`] for `permission::domain::Owner` /// and not [`Into`] for your type. [`Into`] will be implemented automatically. diff --git a/smart_contract/executor/src/default.rs b/smart_contract/executor/src/default.rs index 26c4a6707b3..6a685fa757f 100644 --- a/smart_contract/executor/src/default.rs +++ b/smart_contract/executor/src/default.rs @@ -186,7 +186,7 @@ pub mod domain { authority: &AccountId, isi: &Unregister, ) { - let domain_id = isi.object_id(); + let domain_id = isi.object(); if is_genesis(executor) || match is_domain_owner(domain_id, authority) { @@ -195,7 +195,7 @@ pub mod domain { } || { let can_unregister_domain_token = permissions::domain::CanUnregisterDomain { - domain_id: domain_id.clone(), + domain: domain_id.clone(), }; can_unregister_domain_token.is_owned_by(authority) } @@ -226,7 +226,7 @@ pub mod domain { authority: &AccountId, isi: &Transfer, ) { - let source_id = isi.source_id(); + let source_id = isi.source(); let domain_id = isi.object(); if is_genesis(executor) { @@ -251,7 +251,7 @@ pub mod domain { authority: &AccountId, isi: &SetKeyValue, ) { - let domain_id = isi.object_id(); + let domain_id = isi.object(); if is_genesis(executor) { execute!(executor, isi); @@ -262,7 +262,7 @@ pub mod domain { Ok(false) => {} } let can_set_key_value_in_domain_token = permissions::domain::CanSetKeyValueInDomain { - domain_id: domain_id.clone(), + domain: domain_id.clone(), }; if can_set_key_value_in_domain_token.is_owned_by(authority) { execute!(executor, isi); @@ -276,7 +276,7 @@ pub mod domain { authority: &AccountId, isi: &RemoveKeyValue, ) { - let domain_id = isi.object_id(); + let domain_id = isi.object(); if is_genesis(executor) { execute!(executor, isi); @@ -287,7 +287,7 @@ pub mod domain { Ok(false) => {} } let can_remove_key_value_in_domain_token = permissions::domain::CanRemoveKeyValueInDomain { - domain_id: domain_id.clone(), + domain: domain_id.clone(), }; if can_remove_key_value_in_domain_token.is_owned_by(authority) { execute!(executor, isi); @@ -302,88 +302,86 @@ pub mod domain { return false; }; match permission { - AnyPermission::CanUnregisterDomain(permission) => &permission.domain_id == domain_id, - AnyPermission::CanSetKeyValueInDomain(permission) => &permission.domain_id == domain_id, - AnyPermission::CanRemoveKeyValueInDomain(permission) => { - &permission.domain_id == domain_id - } + AnyPermission::CanUnregisterDomain(permission) => &permission.domain == domain_id, + AnyPermission::CanSetKeyValueInDomain(permission) => &permission.domain == domain_id, + AnyPermission::CanRemoveKeyValueInDomain(permission) => &permission.domain == domain_id, AnyPermission::CanRegisterAccountInDomain(permission) => { - &permission.domain_id == domain_id + &permission.domain == domain_id } AnyPermission::CanRegisterAssetDefinitionInDomain(permission) => { - &permission.domain_id == domain_id + &permission.domain == domain_id } AnyPermission::CanUnregisterAssetDefinition(permission) => { - permission.asset_definition_id.domain_id() == domain_id + permission.asset_definition.domain() == domain_id } AnyPermission::CanSetKeyValueInAssetDefinition(permission) => { - permission.asset_definition_id.domain_id() == domain_id + permission.asset_definition.domain() == domain_id } AnyPermission::CanRemoveKeyValueInAssetDefinition(permission) => { - permission.asset_definition_id.domain_id() == domain_id + permission.asset_definition.domain() == domain_id } AnyPermission::CanRegisterAssetWithDefinition(permission) => { - permission.asset_definition_id.domain_id() == domain_id + permission.asset_definition.domain() == domain_id } AnyPermission::CanUnregisterAssetWithDefinition(permission) => { - permission.asset_definition_id.domain_id() == domain_id + permission.asset_definition.domain() == domain_id } AnyPermission::CanBurnAssetWithDefinition(permission) => { - permission.asset_definition_id.domain_id() == domain_id + permission.asset_definition.domain() == domain_id } AnyPermission::CanMintAssetWithDefinition(permission) => { - permission.asset_definition_id.domain_id() == domain_id + permission.asset_definition.domain() == domain_id } AnyPermission::CanTransferAssetWithDefinition(permission) => { - permission.asset_definition_id.domain_id() == domain_id + permission.asset_definition.domain() == domain_id } AnyPermission::CanBurnUserAsset(permission) => { - permission.asset_id.definition_id().domain_id() == domain_id - || permission.asset_id.account_id().domain_id() == domain_id + permission.asset.definition().domain() == domain_id + || permission.asset.account().domain() == domain_id } AnyPermission::CanTransferUserAsset(permission) => { - permission.asset_id.definition_id().domain_id() == domain_id - || permission.asset_id.account_id().domain_id() == domain_id + permission.asset.definition().domain() == domain_id + || permission.asset.account().domain() == domain_id } AnyPermission::CanUnregisterUserAsset(permission) => { - permission.asset_id.definition_id().domain_id() == domain_id - || permission.asset_id.account_id().domain_id() == domain_id + permission.asset.definition().domain() == domain_id + || permission.asset.account().domain() == domain_id } AnyPermission::CanSetKeyValueInUserAsset(permission) => { - permission.asset_id.definition_id().domain_id() == domain_id - || permission.asset_id.account_id().domain_id() == domain_id + permission.asset.definition().domain() == domain_id + || permission.asset.account().domain() == domain_id } AnyPermission::CanRemoveKeyValueInUserAsset(permission) => { - permission.asset_id.definition_id().domain_id() == domain_id - || permission.asset_id.account_id().domain_id() == domain_id + permission.asset.definition().domain() == domain_id + || permission.asset.account().domain() == domain_id } AnyPermission::CanMintUserAsset(permission) => { - permission.asset_id.definition_id().domain_id() == domain_id - || permission.asset_id.account_id().domain_id() == domain_id + permission.asset.definition().domain() == domain_id + || permission.asset.account().domain() == domain_id } AnyPermission::CanUnregisterAccount(permission) => { - permission.account_id.domain_id() == domain_id + permission.account.domain() == domain_id } AnyPermission::CanMintUserPublicKeys(permission) => { - permission.account_id.domain_id() == domain_id + permission.account.domain() == domain_id } AnyPermission::CanBurnUserPublicKeys(permission) => { - permission.account_id.domain_id() == domain_id + permission.account.domain() == domain_id } AnyPermission::CanMintUserSignatureCheckConditions(permission) => { - permission.account_id.domain_id() == domain_id + permission.account.domain() == domain_id } AnyPermission::CanSetKeyValueInAccount(permission) => { - permission.account_id.domain_id() == domain_id + permission.account.domain() == domain_id } AnyPermission::CanRemoveKeyValueInAccount(permission) => { - permission.account_id.domain_id() == domain_id + permission.account.domain() == domain_id } AnyPermission::CanRegisterUserTrigger(permission) => { - permission.account_id.domain_id() == domain_id + permission.account.domain() == domain_id } AnyPermission::CanUnregisterUserTrigger(permission) => { - permission.account_id.domain_id() == domain_id + permission.account.domain() == domain_id } AnyPermission::CanExecuteUserTrigger(_) | AnyPermission::CanBurnUserTrigger(_) @@ -412,7 +410,7 @@ pub mod account { authority: &AccountId, isi: &Register, ) { - let domain_id = isi.object().id().domain_id(); + let domain_id = isi.object().id().domain(); match crate::permission::domain::is_domain_owner(domain_id, authority) { Err(err) => deny!(executor, err), @@ -421,7 +419,7 @@ pub mod account { } let can_register_account_in_domain = permissions::domain::CanRegisterAccountInDomain { - domain_id: domain_id.clone(), + domain: domain_id.clone(), }; if can_register_account_in_domain.is_owned_by(authority) { execute!(executor, isi); @@ -438,7 +436,7 @@ pub mod account { authority: &AccountId, isi: &Unregister, ) { - let account_id = isi.object_id(); + let account_id = isi.object(); if is_genesis(executor) || match is_account_owner(account_id, authority) { @@ -447,7 +445,7 @@ pub mod account { } || { let can_unregister_user_account = permissions::account::CanUnregisterAccount { - account_id: account_id.clone(), + account: account_id.clone(), }; can_unregister_user_account.is_owned_by(authority) } @@ -478,7 +476,7 @@ pub mod account { authority: &AccountId, isi: &SetKeyValue, ) { - let account_id = isi.object_id(); + let account_id = isi.object(); if is_genesis(executor) { execute!(executor, isi); @@ -490,7 +488,7 @@ pub mod account { } let can_set_key_value_in_user_account_token = permissions::account::CanSetKeyValueInAccount { - account_id: account_id.clone(), + account: account_id.clone(), }; if can_set_key_value_in_user_account_token.is_owned_by(authority) { execute!(executor, isi); @@ -507,7 +505,7 @@ pub mod account { authority: &AccountId, isi: &RemoveKeyValue, ) { - let account_id = isi.object_id(); + let account_id = isi.object(); if is_genesis(executor) { execute!(executor, isi); @@ -519,7 +517,7 @@ pub mod account { } let can_remove_key_value_in_user_account_token = permissions::account::CanRemoveKeyValueInAccount { - account_id: account_id.clone(), + account: account_id.clone(), }; if can_remove_key_value_in_user_account_token.is_owned_by(authority) { execute!(executor, isi); @@ -536,45 +534,33 @@ pub mod account { return false; }; match permission { - AnyPermission::CanUnregisterAccount(permission) => &permission.account_id == account_id, - AnyPermission::CanMintUserPublicKeys(permission) => { - &permission.account_id == account_id - } - AnyPermission::CanBurnUserPublicKeys(permission) => { - &permission.account_id == account_id - } + AnyPermission::CanUnregisterAccount(permission) => &permission.account == account_id, + AnyPermission::CanMintUserPublicKeys(permission) => &permission.account == account_id, + AnyPermission::CanBurnUserPublicKeys(permission) => &permission.account == account_id, AnyPermission::CanMintUserSignatureCheckConditions(permission) => { - &permission.account_id == account_id - } - AnyPermission::CanSetKeyValueInAccount(permission) => { - &permission.account_id == account_id + &permission.account == account_id } + AnyPermission::CanSetKeyValueInAccount(permission) => &permission.account == account_id, AnyPermission::CanRemoveKeyValueInAccount(permission) => { - &permission.account_id == account_id - } - AnyPermission::CanBurnUserAsset(permission) => { - permission.asset_id.account_id() == account_id + &permission.account == account_id } + AnyPermission::CanBurnUserAsset(permission) => permission.asset.account() == account_id, AnyPermission::CanTransferUserAsset(permission) => { - permission.asset_id.account_id() == account_id + permission.asset.account() == account_id } AnyPermission::CanUnregisterUserAsset(permission) => { - permission.asset_id.account_id() == account_id + permission.asset.account() == account_id } AnyPermission::CanSetKeyValueInUserAsset(permission) => { - permission.asset_id.account_id() == account_id + permission.asset.account() == account_id } AnyPermission::CanRemoveKeyValueInUserAsset(permission) => { - permission.asset_id.account_id() == account_id - } - AnyPermission::CanMintUserAsset(permission) => { - permission.asset_id.account_id() == account_id - } - AnyPermission::CanRegisterUserTrigger(permission) => { - &permission.account_id == account_id + permission.asset.account() == account_id } + AnyPermission::CanMintUserAsset(permission) => permission.asset.account() == account_id, + AnyPermission::CanRegisterUserTrigger(permission) => &permission.account == account_id, AnyPermission::CanUnregisterUserTrigger(permission) => { - &permission.account_id == account_id + &permission.account == account_id } AnyPermission::CanExecuteUserTrigger(_) | AnyPermission::CanBurnUserTrigger(_) @@ -621,7 +607,7 @@ pub mod asset_definition { authority: &AccountId, isi: &Register, ) { - let domain_id = isi.object().id().domain_id(); + let domain_id = isi.object().id().domain(); match crate::permission::domain::is_domain_owner(domain_id, authority) { Err(err) => deny!(executor, err), @@ -631,7 +617,7 @@ pub mod asset_definition { let can_register_asset_definition_in_domain_token = permissions::domain::CanRegisterAssetDefinitionInDomain { - domain_id: domain_id.clone(), + domain: domain_id.clone(), }; if can_register_asset_definition_in_domain_token.is_owned_by(authority) { execute!(executor, isi); @@ -648,7 +634,7 @@ pub mod asset_definition { authority: &AccountId, isi: &Unregister, ) { - let asset_definition_id = isi.object_id(); + let asset_definition_id = isi.object(); if is_genesis(executor) || match is_asset_definition_owner(asset_definition_id, authority) { @@ -658,7 +644,7 @@ pub mod asset_definition { || { let can_unregister_asset_definition_token = permissions::asset_definition::CanUnregisterAssetDefinition { - asset_definition_id: asset_definition_id.clone(), + asset_definition: asset_definition_id.clone(), }; can_unregister_asset_definition_token.is_owned_by(authority) } @@ -692,7 +678,7 @@ pub mod asset_definition { authority: &AccountId, isi: &Transfer, ) { - let source_id = isi.source_id(); + let source_id = isi.source(); let asset_definition_id = isi.object(); if is_genesis(executor) { @@ -720,7 +706,7 @@ pub mod asset_definition { authority: &AccountId, isi: &SetKeyValue, ) { - let asset_definition_id = isi.object_id(); + let asset_definition_id = isi.object(); if is_genesis(executor) { execute!(executor, isi); @@ -732,7 +718,7 @@ pub mod asset_definition { } let can_set_key_value_in_asset_definition_token = permissions::asset_definition::CanSetKeyValueInAssetDefinition { - asset_definition_id: asset_definition_id.clone(), + asset_definition: asset_definition_id.clone(), }; if can_set_key_value_in_asset_definition_token.is_owned_by(authority) { execute!(executor, isi); @@ -749,7 +735,7 @@ pub mod asset_definition { authority: &AccountId, isi: &RemoveKeyValue, ) { - let asset_definition_id = isi.object_id(); + let asset_definition_id = isi.object(); if is_genesis(executor) { execute!(executor, isi); @@ -761,7 +747,7 @@ pub mod asset_definition { } let can_remove_key_value_in_asset_definition_token = permissions::asset_definition::CanRemoveKeyValueInAssetDefinition { - asset_definition_id: asset_definition_id.clone(), + asset_definition: asset_definition_id.clone(), }; if can_remove_key_value_in_asset_definition_token.is_owned_by(authority) { execute!(executor, isi); @@ -782,46 +768,46 @@ pub mod asset_definition { }; match permission { AnyPermission::CanUnregisterAssetDefinition(permission) => { - &permission.asset_definition_id == asset_definition_id + &permission.asset_definition == asset_definition_id } AnyPermission::CanSetKeyValueInAssetDefinition(permission) => { - &permission.asset_definition_id == asset_definition_id + &permission.asset_definition == asset_definition_id } AnyPermission::CanRemoveKeyValueInAssetDefinition(permission) => { - &permission.asset_definition_id == asset_definition_id + &permission.asset_definition == asset_definition_id } AnyPermission::CanRegisterAssetWithDefinition(permission) => { - &permission.asset_definition_id == asset_definition_id + &permission.asset_definition == asset_definition_id } AnyPermission::CanUnregisterAssetWithDefinition(permission) => { - &permission.asset_definition_id == asset_definition_id + &permission.asset_definition == asset_definition_id } AnyPermission::CanBurnAssetWithDefinition(permission) => { - &permission.asset_definition_id == asset_definition_id + &permission.asset_definition == asset_definition_id } AnyPermission::CanMintAssetWithDefinition(permission) => { - &permission.asset_definition_id == asset_definition_id + &permission.asset_definition == asset_definition_id } AnyPermission::CanTransferAssetWithDefinition(permission) => { - &permission.asset_definition_id == asset_definition_id + &permission.asset_definition == asset_definition_id } AnyPermission::CanBurnUserAsset(permission) => { - permission.asset_id.definition_id() == asset_definition_id + permission.asset.definition() == asset_definition_id } AnyPermission::CanTransferUserAsset(permission) => { - permission.asset_id.definition_id() == asset_definition_id + permission.asset.definition() == asset_definition_id } AnyPermission::CanUnregisterUserAsset(permission) => { - permission.asset_id.definition_id() == asset_definition_id + permission.asset.definition() == asset_definition_id } AnyPermission::CanSetKeyValueInUserAsset(permission) => { - permission.asset_id.definition_id() == asset_definition_id + permission.asset.definition() == asset_definition_id } AnyPermission::CanRemoveKeyValueInUserAsset(permission) => { - permission.asset_id.definition_id() == asset_definition_id + permission.asset.definition() == asset_definition_id } AnyPermission::CanMintUserAsset(permission) => { - permission.asset_id.definition_id() == asset_definition_id + permission.asset.definition() == asset_definition_id } AnyPermission::CanUnregisterAccount(_) | AnyPermission::CanMintUserPublicKeys(_) @@ -873,14 +859,14 @@ pub mod asset { if is_genesis(executor) { execute!(executor, isi); } - match is_asset_definition_owner(asset.id().definition_id(), authority) { + match is_asset_definition_owner(asset.id().definition(), authority) { Err(err) => deny!(executor, err), Ok(true) => execute!(executor, isi), Ok(false) => {} } let can_register_assets_with_definition_token = permissions::asset::CanRegisterAssetWithDefinition { - asset_definition_id: asset.id().definition_id().clone(), + asset_definition: asset.id().definition().clone(), }; if can_register_assets_with_definition_token.is_owned_by(authority) { execute!(executor, isi); @@ -897,7 +883,7 @@ pub mod asset { authority: &AccountId, isi: &Unregister, ) { - let asset_id = isi.object_id(); + let asset_id = isi.object(); if is_genesis(executor) { execute!(executor, isi); @@ -907,20 +893,20 @@ pub mod asset { Ok(true) => execute!(executor, isi), Ok(false) => {} } - match is_asset_definition_owner(asset_id.definition_id(), authority) { + match is_asset_definition_owner(asset_id.definition(), authority) { Err(err) => deny!(executor, err), Ok(true) => execute!(executor, isi), Ok(false) => {} } let can_unregister_assets_with_definition_token = permissions::asset::CanUnregisterAssetWithDefinition { - asset_definition_id: asset_id.definition_id().clone(), + asset_definition: asset_id.definition().clone(), }; if can_unregister_assets_with_definition_token.is_owned_by(authority) { execute!(executor, isi); } let can_unregister_user_asset_token = permissions::asset::CanUnregisterUserAsset { - asset_id: asset_id.clone(), + asset: asset_id.clone(), }; if can_unregister_user_asset_token.is_owned_by(authority) { execute!(executor, isi); @@ -935,24 +921,24 @@ pub mod asset { Q: Into, Mint: Instruction + Encode, { - let asset_id = isi.destination_id(); + let asset_id = isi.destination(); if is_genesis(executor) { execute!(executor, isi); } - match is_asset_definition_owner(asset_id.definition_id(), authority) { + match is_asset_definition_owner(asset_id.definition(), authority) { Err(err) => deny!(executor, err), Ok(true) => execute!(executor, isi), Ok(false) => {} } let can_mint_assets_with_definition_token = permissions::asset::CanMintAssetWithDefinition { - asset_definition_id: asset_id.definition_id().clone(), + asset_definition: asset_id.definition().clone(), }; if can_mint_assets_with_definition_token.is_owned_by(authority) { execute!(executor, isi); } let can_mint_user_asset_token = permissions::asset::CanMintUserAsset { - asset_id: asset_id.clone(), + asset: asset_id.clone(), }; if can_mint_user_asset_token.is_owned_by(authority) { execute!(executor, isi); @@ -978,7 +964,7 @@ pub mod asset { Q: Into, Burn: Instruction + Encode, { - let asset_id = isi.destination_id(); + let asset_id = isi.destination(); if is_genesis(executor) { execute!(executor, isi); } @@ -987,20 +973,20 @@ pub mod asset { Ok(true) => execute!(executor, isi), Ok(false) => {} } - match is_asset_definition_owner(asset_id.definition_id(), authority) { + match is_asset_definition_owner(asset_id.definition(), authority) { Err(err) => deny!(executor, err), Ok(true) => execute!(executor, isi), Ok(false) => {} } let can_burn_assets_with_definition_token = permissions::asset::CanBurnAssetWithDefinition { - asset_definition_id: asset_id.definition_id().clone(), + asset_definition: asset_id.definition().clone(), }; if can_burn_assets_with_definition_token.is_owned_by(authority) { execute!(executor, isi); } let can_burn_user_asset_token = permissions::asset::CanBurnUserAsset { - asset_id: asset_id.clone(), + asset: asset_id.clone(), }; if can_burn_user_asset_token.is_owned_by(authority) { execute!(executor, isi); @@ -1026,7 +1012,7 @@ pub mod asset { Q: Into, Transfer: Instruction + Encode, { - let asset_id = isi.source_id(); + let asset_id = isi.source(); if is_genesis(executor) { execute!(executor, isi); } @@ -1035,20 +1021,20 @@ pub mod asset { Ok(true) => execute!(executor, isi), Ok(false) => {} } - match is_asset_definition_owner(asset_id.definition_id(), authority) { + match is_asset_definition_owner(asset_id.definition(), authority) { Err(err) => deny!(executor, err), Ok(true) => execute!(executor, isi), Ok(false) => {} } let can_transfer_assets_with_definition_token = permissions::asset::CanTransferAssetWithDefinition { - asset_definition_id: asset_id.definition_id().clone(), + asset_definition: asset_id.definition().clone(), }; if can_transfer_assets_with_definition_token.is_owned_by(authority) { execute!(executor, isi); } let can_transfer_user_asset_token = permissions::asset::CanTransferUserAsset { - asset_id: asset_id.clone(), + asset: asset_id.clone(), }; if can_transfer_user_asset_token.is_owned_by(authority) { execute!(executor, isi); @@ -1078,7 +1064,7 @@ pub mod asset { authority: &AccountId, isi: &SetKeyValue, ) { - let asset_id = isi.object_id(); + let asset_id = isi.object(); if is_genesis(executor) { execute!(executor, isi); @@ -1090,7 +1076,7 @@ pub mod asset { } let can_set_key_value_in_user_asset_token = permissions::asset::CanSetKeyValueInUserAsset { - asset_id: asset_id.clone(), + asset: asset_id.clone(), }; if can_set_key_value_in_user_asset_token.is_owned_by(authority) { execute!(executor, isi); @@ -1107,7 +1093,7 @@ pub mod asset { authority: &AccountId, isi: &RemoveKeyValue, ) { - let asset_id = isi.object_id(); + let asset_id = isi.object(); if is_genesis(executor) { execute!(executor, isi); @@ -1119,7 +1105,7 @@ pub mod asset { } let can_remove_key_value_in_user_asset_token = permissions::asset::CanRemoveKeyValueInUserAsset { - asset_id: asset_id.clone(), + asset: asset_id.clone(), }; if can_remove_key_value_in_user_asset_token.is_owned_by(authority) { execute!(executor, isi); @@ -1220,7 +1206,7 @@ pub mod role { macro_rules! impl_validate_grant_revoke_role_permission { ($executor:ident, $isi:ident, $authority:ident, $method:ident, $isi_type:ty) => { - let role_id = $isi.destination_id().clone(); + let role_id = $isi.destination().clone(); let token = $isi.object(); if let Ok(any_token) = AnyPermission::try_from(token) { @@ -1352,7 +1338,7 @@ pub mod trigger { if is_genesis(executor) || { - match is_domain_owner(trigger.action().authority().domain_id(), authority) { + match is_domain_owner(trigger.action().authority().domain(), authority) { Err(err) => deny!(executor, err), Ok(is_domain_owner) => is_domain_owner, } @@ -1360,7 +1346,7 @@ pub mod trigger { || { let can_register_user_trigger_token = permissions::trigger::CanRegisterUserTrigger { - account_id: isi.object().action().authority().clone(), + account: isi.object().action().authority().clone(), }; can_register_user_trigger_token.is_owned_by(authority) } @@ -1375,7 +1361,7 @@ pub mod trigger { authority: &AccountId, isi: &Unregister, ) { - let trigger_id = isi.object_id(); + let trigger_id = isi.object(); if is_genesis(executor) || match is_trigger_owner(trigger_id, authority) { @@ -1385,7 +1371,7 @@ pub mod trigger { || { let can_unregister_user_trigger_token = permissions::trigger::CanUnregisterUserTrigger { - account_id: find_trigger(trigger_id) + account: find_trigger(trigger_id) .unwrap() .action() .authority() @@ -1423,7 +1409,7 @@ pub mod trigger { authority: &AccountId, isi: &Mint, ) { - let trigger_id = isi.destination_id(); + let trigger_id = isi.destination(); if is_genesis(executor) { execute!(executor, isi); @@ -1434,7 +1420,7 @@ pub mod trigger { Ok(false) => {} } let can_mint_user_trigger_token = permissions::trigger::CanMintUserTrigger { - trigger_id: trigger_id.clone(), + trigger: trigger_id.clone(), }; if can_mint_user_trigger_token.is_owned_by(authority) { execute!(executor, isi); @@ -1451,7 +1437,7 @@ pub mod trigger { authority: &AccountId, isi: &Burn, ) { - let trigger_id = isi.destination_id(); + let trigger_id = isi.destination(); if is_genesis(executor) { execute!(executor, isi); @@ -1462,7 +1448,7 @@ pub mod trigger { Ok(false) => {} } let can_mint_user_trigger_token = permissions::trigger::CanBurnUserTrigger { - trigger_id: trigger_id.clone(), + trigger: trigger_id.clone(), }; if can_mint_user_trigger_token.is_owned_by(authority) { execute!(executor, isi); @@ -1479,7 +1465,7 @@ pub mod trigger { authority: &AccountId, isi: &ExecuteTrigger, ) { - let trigger_id = isi.trigger_id(); + let trigger_id = isi.trigger(); if is_genesis(executor) { execute!(executor, isi); @@ -1490,7 +1476,7 @@ pub mod trigger { Ok(false) => {} } let can_execute_trigger_token = permissions::trigger::CanExecuteUserTrigger { - trigger_id: trigger_id.clone(), + trigger: trigger_id.clone(), }; if can_execute_trigger_token.is_owned_by(authority) { execute!(executor, isi); @@ -1504,7 +1490,7 @@ pub mod trigger { authority: &AccountId, isi: &SetKeyValue, ) { - let trigger_id = isi.object_id(); + let trigger_id = isi.object(); if is_genesis(executor) { execute!(executor, isi); @@ -1516,7 +1502,7 @@ pub mod trigger { } let can_set_key_value_in_user_trigger_token = permissions::trigger::CanSetKeyValueInTrigger { - trigger_id: trigger_id.clone(), + trigger: trigger_id.clone(), }; if can_set_key_value_in_user_trigger_token.is_owned_by(authority) { execute!(executor, isi); @@ -1533,7 +1519,7 @@ pub mod trigger { authority: &AccountId, isi: &RemoveKeyValue, ) { - let trigger_id = isi.object_id(); + let trigger_id = isi.object(); if is_genesis(executor) { execute!(executor, isi); @@ -1545,7 +1531,7 @@ pub mod trigger { } let can_remove_key_value_in_trigger_token = permissions::trigger::CanRemoveKeyValueInTrigger { - trigger_id: trigger_id.clone(), + trigger: trigger_id.clone(), }; if can_remove_key_value_in_trigger_token.is_owned_by(authority) { execute!(executor, isi); @@ -1562,16 +1548,12 @@ pub mod trigger { return false; }; match permission { - AnyPermission::CanExecuteUserTrigger(permission) => { - &permission.trigger_id == trigger_id - } - AnyPermission::CanBurnUserTrigger(permission) => &permission.trigger_id == trigger_id, - AnyPermission::CanMintUserTrigger(permission) => &permission.trigger_id == trigger_id, - AnyPermission::CanSetKeyValueInTrigger(permission) => { - &permission.trigger_id == trigger_id - } + AnyPermission::CanExecuteUserTrigger(permission) => &permission.trigger == trigger_id, + AnyPermission::CanBurnUserTrigger(permission) => &permission.trigger == trigger_id, + AnyPermission::CanMintUserTrigger(permission) => &permission.trigger == trigger_id, + AnyPermission::CanSetKeyValueInTrigger(permission) => &permission.trigger == trigger_id, AnyPermission::CanRemoveKeyValueInTrigger(permission) => { - &permission.trigger_id == trigger_id + &permission.trigger == trigger_id } AnyPermission::CanRegisterUserTrigger(_) | AnyPermission::CanUnregisterUserTrigger(_) @@ -1618,7 +1600,7 @@ pub mod permission { macro_rules! impl_validate { ($executor:ident, $authority:ident, $isi:ident, $method:ident, $isi_type:ty) => { - let account_id = $isi.destination_id().clone(); + let account_id = $isi.destination().clone(); let token = $isi.object(); if let Ok(any_token) = AnyPermission::try_from(token) { diff --git a/smart_contract/executor/src/default/permissions.rs b/smart_contract/executor/src/default/permissions.rs index 1ac643b451d..735ef253942 100644 --- a/smart_contract/executor/src/default/permissions.rs +++ b/smart_contract/executor/src/default/permissions.rs @@ -161,7 +161,7 @@ pub mod domain { #[derive(ValidateGrantRevoke, permission::derive_conversions::domain::Owner)] #[validate(permission::domain::Owner)] pub struct CanUnregisterDomain { - pub domain_id: DomainId, + pub domain: DomainId, } } @@ -169,7 +169,7 @@ pub mod domain { #[derive(ValidateGrantRevoke, permission::derive_conversions::domain::Owner)] #[validate(permission::domain::Owner)] pub struct CanSetKeyValueInDomain { - pub domain_id: DomainId, + pub domain: DomainId, } } @@ -177,7 +177,7 @@ pub mod domain { #[derive(ValidateGrantRevoke, permission::derive_conversions::domain::Owner)] #[validate(permission::domain::Owner)] pub struct CanRemoveKeyValueInDomain { - pub domain_id: DomainId, + pub domain: DomainId, } } @@ -185,7 +185,7 @@ pub mod domain { #[derive(ValidateGrantRevoke, permission::derive_conversions::domain::Owner)] #[validate(permission::domain::Owner)] pub struct CanRegisterAccountInDomain { - pub domain_id: DomainId, + pub domain: DomainId, } } @@ -193,7 +193,7 @@ pub mod domain { #[derive(ValidateGrantRevoke, permission::derive_conversions::domain::Owner)] #[validate(permission::domain::Owner)] pub struct CanRegisterAssetDefinitionInDomain { - pub domain_id: DomainId, + pub domain: DomainId, } } } @@ -205,42 +205,42 @@ pub mod account { #[derive(ValidateGrantRevoke, permission::derive_conversions::account::Owner)] #[validate(permission::account::Owner)] pub struct CanUnregisterAccount { - pub account_id: AccountId, + pub account: AccountId, } } permission! { #[derive(ValidateGrantRevoke, permission::derive_conversions::account::Owner)] #[validate(permission::account::Owner)] pub struct CanMintUserPublicKeys { - pub account_id: AccountId, + pub account: AccountId, } } permission! { #[derive(ValidateGrantRevoke, permission::derive_conversions::account::Owner)] #[validate(permission::account::Owner)] pub struct CanBurnUserPublicKeys { - pub account_id: AccountId, + pub account: AccountId, } } permission! { #[derive(ValidateGrantRevoke, permission::derive_conversions::account::Owner)] #[validate(permission::account::Owner)] pub struct CanMintUserSignatureCheckConditions { - pub account_id: AccountId, + pub account: AccountId, } } permission! { #[derive(ValidateGrantRevoke, permission::derive_conversions::account::Owner)] #[validate(permission::account::Owner)] pub struct CanSetKeyValueInAccount { - pub account_id: AccountId, + pub account: AccountId, } } permission! { #[derive(ValidateGrantRevoke, permission::derive_conversions::account::Owner)] #[validate(permission::account::Owner)] pub struct CanRemoveKeyValueInAccount { - pub account_id: AccountId, + pub account: AccountId, } } } @@ -252,7 +252,7 @@ pub mod asset_definition { #[derive(ValidateGrantRevoke, permission::derive_conversions::asset_definition::Owner)] #[validate(permission::asset_definition::Owner)] pub struct CanUnregisterAssetDefinition { - pub asset_definition_id: AssetDefinitionId, + pub asset_definition: AssetDefinitionId, } } @@ -260,7 +260,7 @@ pub mod asset_definition { #[derive(ValidateGrantRevoke, permission::derive_conversions::asset_definition::Owner)] #[validate(permission::asset_definition::Owner)] pub struct CanSetKeyValueInAssetDefinition { - pub asset_definition_id: AssetDefinitionId, + pub asset_definition: AssetDefinitionId, } } @@ -268,7 +268,7 @@ pub mod asset_definition { #[derive(ValidateGrantRevoke, permission::derive_conversions::asset_definition::Owner)] #[validate(permission::asset_definition::Owner)] pub struct CanRemoveKeyValueInAssetDefinition { - pub asset_definition_id: AssetDefinitionId, + pub asset_definition: AssetDefinitionId, } } } @@ -280,7 +280,7 @@ pub mod asset { #[derive(ValidateGrantRevoke, permission::derive_conversions::asset_definition::Owner)] #[validate(permission::asset_definition::Owner)] pub struct CanRegisterAssetWithDefinition { - pub asset_definition_id: AssetDefinitionId, + pub asset_definition: AssetDefinitionId, } } @@ -288,7 +288,7 @@ pub mod asset { #[derive(ValidateGrantRevoke, permission::derive_conversions::asset_definition::Owner)] #[validate(permission::asset_definition::Owner)] pub struct CanUnregisterAssetWithDefinition { - pub asset_definition_id: AssetDefinitionId, + pub asset_definition: AssetDefinitionId, } } @@ -296,7 +296,7 @@ pub mod asset { #[derive(ValidateGrantRevoke, permission::derive_conversions::asset::Owner)] #[validate(permission::asset::Owner)] pub struct CanUnregisterUserAsset { - pub asset_id: AssetId, + pub asset: AssetId, } } @@ -304,7 +304,7 @@ pub mod asset { #[derive(ValidateGrantRevoke, permission::derive_conversions::asset_definition::Owner)] #[validate(permission::asset_definition::Owner)] pub struct CanBurnAssetWithDefinition { - pub asset_definition_id: AssetDefinitionId, + pub asset_definition: AssetDefinitionId, } } @@ -312,7 +312,7 @@ pub mod asset { #[derive(ValidateGrantRevoke, permission::derive_conversions::asset::Owner)] #[validate(permission::asset::Owner)] pub struct CanBurnUserAsset { - pub asset_id: AssetId, + pub asset: AssetId, } } @@ -320,7 +320,7 @@ pub mod asset { #[derive(ValidateGrantRevoke, permission::derive_conversions::asset_definition::Owner)] #[validate(permission::asset_definition::Owner)] pub struct CanMintAssetWithDefinition { - pub asset_definition_id: AssetDefinitionId, + pub asset_definition: AssetDefinitionId, } } @@ -328,7 +328,7 @@ pub mod asset { #[derive(ValidateGrantRevoke, permission::derive_conversions::asset::Owner)] #[validate(permission::asset::Owner)] pub struct CanMintUserAsset { - pub asset_id: AssetId, + pub asset: AssetId, } } @@ -336,7 +336,7 @@ pub mod asset { #[derive(ValidateGrantRevoke, permission::derive_conversions::asset_definition::Owner)] #[validate(permission::asset_definition::Owner)] pub struct CanTransferAssetWithDefinition { - pub asset_definition_id: AssetDefinitionId, + pub asset_definition: AssetDefinitionId, } } @@ -344,7 +344,7 @@ pub mod asset { #[derive(ValidateGrantRevoke, permission::derive_conversions::asset::Owner)] #[validate(permission::asset::Owner)] pub struct CanTransferUserAsset { - pub asset_id: AssetId, + pub asset: AssetId, } } @@ -352,7 +352,7 @@ pub mod asset { #[derive(ValidateGrantRevoke, permission::derive_conversions::asset::Owner)] #[validate(permission::asset::Owner)] pub struct CanSetKeyValueInUserAsset { - pub asset_id: AssetId, + pub asset: AssetId, } } @@ -360,7 +360,7 @@ pub mod asset { #[derive(ValidateGrantRevoke, permission::derive_conversions::asset::Owner)] #[validate(permission::asset::Owner)] pub struct CanRemoveKeyValueInUserAsset { - pub asset_id: AssetId, + pub asset: AssetId, } } } @@ -471,7 +471,7 @@ pub mod trigger { impl<'token> From<&'token $name> for permission::trigger::Owner<'token> { fn from(value: &'token $name) -> Self { Self { - trigger_id: &value.trigger_id, + trigger: &value.trigger, } } } @@ -482,7 +482,7 @@ pub mod trigger { #[derive(ValidateGrantRevoke, permission::derive_conversions::account::Owner)] #[validate(permission::account::Owner)] pub struct CanRegisterUserTrigger { - pub account_id: AccountId, + pub account: AccountId, } } @@ -490,7 +490,7 @@ pub mod trigger { #[derive(ValidateGrantRevoke)] #[validate(permission::trigger::Owner)] pub struct CanExecuteUserTrigger { - pub trigger_id: TriggerId, + pub trigger: TriggerId, } } @@ -498,7 +498,7 @@ pub mod trigger { #[derive(ValidateGrantRevoke, permission::derive_conversions::account::Owner)] #[validate(permission::account::Owner)] pub struct CanUnregisterUserTrigger { - pub account_id: AccountId, + pub account: AccountId, } } @@ -506,7 +506,7 @@ pub mod trigger { #[derive(ValidateGrantRevoke)] #[validate(permission::trigger::Owner)] pub struct CanMintUserTrigger { - pub trigger_id: TriggerId, + pub trigger: TriggerId, } } @@ -514,7 +514,7 @@ pub mod trigger { #[derive(ValidateGrantRevoke)] #[validate(permission::trigger::Owner)] pub struct CanBurnUserTrigger { - pub trigger_id: TriggerId, + pub trigger: TriggerId, } } @@ -522,7 +522,7 @@ pub mod trigger { #[derive(ValidateGrantRevoke)] #[validate(permission::trigger::Owner)] pub struct CanSetKeyValueInTrigger { - pub trigger_id: TriggerId, + pub trigger: TriggerId, } } @@ -530,7 +530,7 @@ pub mod trigger { #[derive(ValidateGrantRevoke)] #[validate(permission::trigger::Owner)] pub struct CanRemoveKeyValueInTrigger { - pub trigger_id: TriggerId, + pub trigger: TriggerId, } } diff --git a/smart_contract/executor/src/permission.rs b/smart_contract/executor/src/permission.rs index a08c1248afc..6aa5c7d2a13 100644 --- a/smart_contract/executor/src/permission.rs +++ b/smart_contract/executor/src/permission.rs @@ -77,9 +77,9 @@ pub mod asset { use super::*; - /// Check if `authority` is the owner of `asset_id`. + /// Check if `authority` is the owner of asset. /// - /// `authority` is owner of `asset_id` if: + /// `authority` is owner of asset if: /// - `asset_id.account_id` is `account_id` /// - `asset_id.account_id.domain_id` domain is owned by `authority` /// @@ -87,19 +87,19 @@ pub mod asset { /// /// Fails if `is_account_owner` fails pub fn is_asset_owner(asset_id: &AssetId, authority: &AccountId) -> Result { - crate::permission::account::is_account_owner(asset_id.account_id(), authority) + crate::permission::account::is_account_owner(asset_id.account(), authority) } - /// Pass condition that checks if `authority` is the owner of `asset_id`. + /// Pass condition that checks if `authority` is the owner of asset. #[derive(Debug, Clone)] pub struct Owner<'asset> { /// Asset id to check against - pub asset_id: &'asset AssetId, + pub asset: &'asset AssetId, } impl PassCondition for Owner<'_> { fn validate(&self, authority: &AccountId, _block_height: u64) -> Result { - if is_asset_owner(self.asset_id, authority)? { + if is_asset_owner(self.asset, authority)? { return Ok(()); } @@ -115,9 +115,9 @@ pub mod asset_definition { use super::*; - /// Check if `authority` is the owner of `asset_definition_id` + /// Check if `authority` is the owner of asset definition - /// `authority` is owner of `asset_definition_id` if: + /// `authority` is owner of asset_definition if: /// - `asset_definition.owned_by` is `authority` /// - `asset_definition.domain_id` domain is owned by `authority` /// @@ -134,20 +134,20 @@ pub mod asset_definition { if asset_definition.owned_by() == authority { Ok(true) } else { - crate::permission::domain::is_domain_owner(asset_definition_id.domain_id(), authority) + crate::permission::domain::is_domain_owner(asset_definition_id.domain(), authority) } } - /// Pass condition that checks if `authority` is the owner of `asset_definition_id`. + /// Pass condition that checks if `authority` is the owner of asset definition. #[derive(Debug, Clone)] pub struct Owner<'asset_definition> { /// Asset definition id to check against - pub asset_definition_id: &'asset_definition AssetDefinitionId, + pub asset_definition: &'asset_definition AssetDefinitionId, } impl PassCondition for Owner<'_> { fn validate(&self, authority: &AccountId, _block_height: u64) -> Result { - if is_asset_definition_owner(self.asset_definition_id, authority)? { + if is_asset_definition_owner(self.asset_definition, authority)? { return Ok(()); } @@ -163,9 +163,9 @@ pub mod account { use super::*; - /// Check if `authority` is the owner of `account_id`. + /// Check if `authority` is the owner of account. /// - /// `authority` is owner of `account_id` if: + /// `authority` is owner of account if: /// - `account_id` is `authority` /// - `account_id.domain_id` is owned by `authority` /// @@ -176,20 +176,20 @@ pub mod account { if account_id == authority { Ok(true) } else { - crate::permission::domain::is_domain_owner(account_id.domain_id(), authority) + crate::permission::domain::is_domain_owner(account_id.domain(), authority) } } - /// Pass condition that checks if `authority` is the owner of `account_id`. + /// Pass condition that checks if `authority` is the owner of account. #[derive(Debug, Clone)] pub struct Owner<'asset> { /// Account id to check against - pub account_id: &'asset AccountId, + pub account: &'asset AccountId, } impl PassCondition for Owner<'_> { fn validate(&self, authority: &AccountId, _block_height: u64) -> Result { - if is_account_owner(self.account_id, authority)? { + if is_account_owner(self.account, authority)? { return Ok(()); } @@ -205,9 +205,9 @@ pub mod trigger { use super::*; use crate::permission::domain::is_domain_owner; - /// Check if `authority` is the owner of `trigger_id`. + /// Check if `authority` is the owner of trigger. /// - /// `authority` is owner of `trigger_id` if: + /// `authority` is owner of trigger if: /// - `trigger.action.authority` is `authority` /// - `trigger.action.authority.domain_id` is owned by `authority` /// @@ -218,26 +218,25 @@ pub mod trigger { let trigger = find_trigger(trigger_id)?; Ok(trigger.action().authority() == authority - || is_domain_owner(trigger.action().authority().domain_id(), authority)?) + || is_domain_owner(trigger.action().authority().domain(), authority)?) } /// Returns the trigger. pub(crate) fn find_trigger(trigger_id: &TriggerId) -> Result { - let trigger = FindTriggerById::new(trigger_id.clone()) + FindTriggerById::new(trigger_id.clone()) .execute() - .map(QueryOutputCursor::into_inner)?; - Ok(trigger) + .map(QueryOutputCursor::into_inner) } - /// Pass condition that checks if `authority` is the owner of `trigger_id`. + /// Pass condition that checks if `authority` is the owner of trigger. #[derive(Debug, Clone)] pub struct Owner<'trigger> { /// Trigger id to check against - pub trigger_id: &'trigger TriggerId, + pub trigger: &'trigger TriggerId, } impl PassCondition for Owner<'_> { fn validate(&self, authority: &AccountId, _block_height: u64) -> Result { - if is_trigger_owner(self.trigger_id, authority)? { + if is_trigger_owner(self.trigger, authority)? { return Ok(()); } @@ -252,7 +251,7 @@ pub mod domain { //! Module with pass conditions for domain related tokens use super::*; - /// Check if `authority` is owner of `domain_id` + /// Check if `authority` is owner of domain /// /// # Errors /// Fails if query fails @@ -263,16 +262,16 @@ pub mod domain { .map(|domain| domain.owned_by() == authority) } - /// Pass condition that checks if `authority` is the owner of `domain_id`. + /// Pass condition that checks if `authority` is the owner of domain. #[derive(Debug, Clone)] pub struct Owner<'domain> { /// Domain id to check against - pub domain_id: &'domain DomainId, + pub domain: &'domain DomainId, } impl PassCondition for Owner<'_> { fn validate(&self, authority: &AccountId, _block_height: u64) -> Result { - if is_domain_owner(self.domain_id, authority)? { + if is_domain_owner(self.domain, authority)? { return Ok(()); } diff --git a/tools/parity_scale_cli/samples/trigger.json b/tools/parity_scale_cli/samples/trigger.json index 6c74b0f5a53..a6c19320318 100644 --- a/tools/parity_scale_cli/samples/trigger.json +++ b/tools/parity_scale_cli/samples/trigger.json @@ -7,7 +7,7 @@ "Mint": { "Asset": { "object": "1", - "destination_id": "rose##ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland" + "destination": "rose##ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland" } } }