From ae1614b6beeafd9b9bc8c44a9e7ab9d9f14e205a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marin=20Ver=C5=A1i=C4=87?= Date: Tue, 4 Feb 2025 12:36:43 +0100 Subject: [PATCH] update to RC.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marin Veršić --- .gitignore | 1 + build.gradle | 2 +- docker-compose/docker-compose.yaml | 53 +- examples/tutorial/build.gradle.kts | 14 +- .../kotlin/jp/co/soramitsu/iroha2/Main.kt | 114 +- .../kotlin/jp/co/soramitsu/iroha2/Query.kt | 66 +- .../jp/co/soramitsu/iroha2/SendTransaction.kt | 76 +- gradle.properties | 19 +- gradle/wrapper/gradle-wrapper.jar | Bin 63375 -> 43583 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 22 +- gradlew.bat | 22 +- modules/admin-client/build.gradle | 8 +- .../iroha2/AdminIroha2AsyncClient.kt | 63 +- .../co/soramitsu/iroha2/AdminIroha2Client.kt | 81 +- .../jp/co/soramitsu/iroha2/PeerStatus.kt | 2 +- .../jp/co/soramitsu/iroha2/ClientTest.kt | 50 +- modules/block/build.gradle | 7 +- .../jp/co/soramitsu/iroha2/Exceptions.kt | 15 - .../kotlin/jp/co/soramitsu/iroha2/Genesis.kt | 148 +- .../co/soramitsu/iroha2/DeserializerTest.kt | 3 +- .../jp/co/soramitsu/iroha2/SerializerTest.kt | 224 +- .../block/src/test/resources/executor.wasm | Bin 388835 -> 1052756 bytes modules/client/build.gradle | 33 +- .../kotlin/jp/co/soramitsu/iroha2/Enums.kt | 48 - .../jp/co/soramitsu/iroha2/Exceptions.kt | 27 +- .../jp/co/soramitsu/iroha2/Extensions.kt | 390 --- .../jp/co/soramitsu/iroha2/Extractors.kt | 384 +-- .../jp/co/soramitsu/iroha2/SingletonHolder.kt | 5 +- .../iroha2/client/Iroha2AsyncClient.kt | 77 +- .../soramitsu/iroha2/client/Iroha2Client.kt | 487 ++- .../client/balancing/BalancingStrategy.kt | 4 +- .../client/balancing/RoundRobinStrategy.kt | 28 +- .../balancing/WithoutBalancingStrategy.kt | 8 +- .../blockstream/BlockStreamSubscription.kt | 133 +- .../jp/co/soramitsu/iroha2/model/IrohaUrls.kt | 8 +- .../jp/co/soramitsu/iroha2/model/Page.kt | 5 +- .../jp/co/soramitsu/iroha2/query/Queries.kt | 447 ++- .../co/soramitsu/iroha2/query/QueryBuilder.kt | 596 ++-- .../iroha2/transaction/Instructions.kt | 412 --- .../iroha2/transaction/TransactionBuilder.kt | 390 --- .../java/jp/co/soramitsu/iroha2/JavaTest.java | 420 +-- .../jp/co/soramitsu/iroha2/BlockStreamTest.kt | 202 +- .../jp/co/soramitsu/iroha2/ExampleTest.kt | 41 +- .../jp/co/soramitsu/iroha2/GenesisTest.kt | 59 +- .../co/soramitsu/iroha2/InstructionsTest.kt | 1384 ++++---- .../kotlin/jp/co/soramitsu/iroha2/PeerTest.kt | 244 +- .../jp/co/soramitsu/iroha2/QueriesTest.kt | 1122 +++--- .../jp/co/soramitsu/iroha2/TriggersTest.kt | 671 ++-- .../iroha2/annotations/Permission.kt | 4 +- .../co/soramitsu/iroha2/annotations/Query.kt | 4 +- .../jp/co/soramitsu/iroha2/annotations/Sdk.kt | 4 +- .../soramitsu/iroha2/annotations/SdkTestId.kt | 4 +- .../co/soramitsu/iroha2/testengine/Genesis.kt | 589 ++-- .../jp/co/soramitsu/iroha2/util/CryptoTest.kt | 29 +- .../jp/co/soramitsu/iroha2/util/FixnumTest.kt | 7 +- .../create_nft_for_alice_smartcontract.wasm | Bin 434280 -> 289802 bytes .../Cargo.toml | 16 +- .../build.sh | 4 +- .../src/lib.rs | 29 +- .../client/src/test/resources/executor.wasm | Bin 388835 -> 1052756 bytes .../src/test/resources/executor/Cargo.toml | 17 +- .../src/test/resources/executor/build.sh | 4 +- .../src/test/resources/executor/src/lib.rs | 28 +- .../client/src/test/resources/genesis.json | 30 +- modules/codegen/build.gradle | 5 - .../jp/co/soramitsu/iroha2/EntryPoint.kt | 13 +- .../iroha2/codegen/KotlinTypeResolver.kt | 73 +- .../iroha2/codegen/blueprint/Blueprint.kt | 10 +- .../iroha2/codegen/blueprint/EnumBlueprint.kt | 9 +- .../codegen/blueprint/EnumVariantBlueprint.kt | 7 +- .../codegen/blueprint/StructBlueprint.kt | 9 +- .../codegen/blueprint/TupleStructBlueprint.kt | 41 +- .../codegen/blueprint/TypeBasedBlueprint.kt | 4 +- .../codegen/generator/AbstractGenerator.kt | 244 +- .../iroha2/codegen/generator/EnumGenerator.kt | 95 +- .../codegen/generator/EnumVariantGenerator.kt | 56 +- .../codegen/generator/GeneratorEntryPoint.kt | 65 +- .../iroha2/codegen/generator/Scale.kt | 177 +- .../codegen/generator/StructGenerator.kt | 23 +- .../soramitsu/iroha2/parse/ExtractGeneric.kt | 5 +- .../co/soramitsu/iroha2/parse/SchemaParser.kt | 34 +- .../co/soramitsu/iroha2/parse/SchemaReader.kt | 29 +- .../co/soramitsu/iroha2/parse/TypeResolver.kt | 317 +- .../jp/co/soramitsu/iroha2/type/Common.kt | 6 +- .../jp/co/soramitsu/iroha2/type/Composite.kt | 42 +- .../kotlin/jp/co/soramitsu/iroha2/type/Int.kt | 4 +- .../jp/co/soramitsu/iroha2/type/Uint.kt | 4 +- .../jp/co/soramitsu/iroha2/type/Wrapper.kt | 34 +- .../codegen/src/main/resources/schema.json | 3060 ++++++++++++----- modules/model/build.gradle | 9 + .../jp/co/soramitsu/iroha2/Comparators.kt | 90 +- .../jp/co/soramitsu/iroha2/Constants.kt | 0 .../kotlin/jp/co/soramitsu/iroha2/Crypto.kt | 74 +- .../jp/co/soramitsu/iroha2/Exceptions.kt | 33 +- .../jp/co/soramitsu/iroha2/Extensions.kt | 440 +++ .../kotlin/jp/co/soramitsu/iroha2/Fixnum.kt | 48 +- .../iroha2/ModelCustomInstruction.kt | 3 + .../jp/co/soramitsu/iroha2/ModelParameter.kt | 3 + .../jp/co/soramitsu/iroha2/ModelPermission.kt | 11 + .../kotlin/jp/co/soramitsu/iroha2/Serde.kt | 975 ++++-- .../jp/co/soramitsu/iroha2/TriggerArgs.kt | 3 + .../kotlin/jp/co/soramitsu/iroha2/Util.kt | 5 +- .../co/soramitsu/iroha2/codec/CompactMode.kt | 19 +- .../jp/co/soramitsu/iroha2/codec/IntMax.kt | 23 +- .../iroha2/codec/ScaleCodecReader.kt | 136 +- .../iroha2/codec/ScaleCodecWriter.kt | 34 +- .../co/soramitsu/iroha2/codec/ScaleWriter.kt | 6 +- .../co/soramitsu/iroha2/codec/UnionValue.kt | 19 +- .../iroha2/codec/reader/BoolReader.kt | 10 +- .../iroha2/codec/reader/EnumReader.kt | 5 +- .../iroha2/codec/reader/IntReader.kt | 10 +- .../iroha2/codec/reader/ListReader.kt | 4 +- .../iroha2/codec/reader/StringReader.kt | 4 +- .../iroha2/codec/reader/UIntReader.kt | 4 +- .../iroha2/codec/reader/UnionReader.kt | 5 +- .../iroha2/codec/reader/UnsupportedReader.kt | 11 +- .../iroha2/codec/writer/BoolWriter.kt | 10 +- .../codec/writer/CompactBigIntWriter.kt | 5 +- .../iroha2/codec/writer/CompactUIntWriter.kt | 16 +- .../iroha2/codec/writer/CompactULongWriter.kt | 16 +- .../iroha2/codec/writer/IntWriter.kt | 19 +- .../iroha2/codec/writer/ListWriter.kt | 9 +- .../iroha2/codec/writer/UByteWriter.kt | 5 +- .../iroha2/codec/writer/UIntWriter.kt | 24 +- .../iroha2/codec/writer/UnionWriter.kt | 10 +- .../co/soramitsu/iroha2/generated/Account.kt | 33 +- .../iroha2/generated/AccountEvent.kt | 269 +- .../iroha2/generated/AccountEventFilter.kt | 33 +- .../soramitsu/iroha2/generated/AccountId.kt | 33 +- .../generated/AccountIdPredicateAtom.kt | 80 + .../iroha2/generated/AccountIdPredicateBox.kt | 141 - .../AccountIdProjectionOfPredicateMarker.kt | 152 + .../AccountIdProjectionOfSelectorMarker.kt | 172 + .../generated/AccountPermissionChanged.kt | 33 +- .../iroha2/generated/AccountPredicateAtom.kt | 40 + .../iroha2/generated/AccountPredicateBox.kt | 107 - .../AccountProjectionOfPredicateMarker.kt | 152 + .../AccountProjectionOfSelectorMarker.kt | 172 + .../iroha2/generated/AccountRoleChanged.kt | 33 +- .../co/soramitsu/iroha2/generated/Action.kt | 45 +- .../iroha2/generated/ActionPredicateAtom.kt | 40 + .../ActionProjectionOfPredicateMarker.kt | 116 + .../ActionProjectionOfSelectorMarker.kt | 136 + .../soramitsu/iroha2/generated/Algorithm.kt | 176 +- .../jp/co/soramitsu/iroha2/generated/Asset.kt | 33 +- .../iroha2/generated/AssetChanged.kt | 33 +- .../iroha2/generated/AssetDefinition.kt | 52 +- .../iroha2/generated/AssetDefinitionEvent.kt | 204 +- .../generated/AssetDefinitionEventFilter.kt | 33 +- .../iroha2/generated/AssetDefinitionId.kt | 33 +- .../AssetDefinitionIdPredicateAtom.kt | 80 + .../AssetDefinitionIdPredicateBox.kt | 145 - ...DefinitionIdProjectionOfPredicateMarker.kt | 158 + ...tDefinitionIdProjectionOfSelectorMarker.kt | 174 + .../generated/AssetDefinitionOwnerChanged.kt | 33 +- .../generated/AssetDefinitionPredicateAtom.kt | 42 + .../generated/AssetDefinitionPredicateBox.kt | 145 - ...etDefinitionProjectionOfPredicateMarker.kt | 154 + ...setDefinitionProjectionOfSelectorMarker.kt | 174 + .../AssetDefinitionTotalQuantityChanged.kt | 33 +- .../soramitsu/iroha2/generated/AssetEvent.kt | 185 +- .../iroha2/generated/AssetEventFilter.kt | 33 +- .../co/soramitsu/iroha2/generated/AssetId.kt | 33 +- .../iroha2/generated/AssetIdPredicateAtom.kt | 78 + .../iroha2/generated/AssetIdPredicateBox.kt | 141 - .../AssetIdProjectionOfPredicateMarker.kt | 152 + .../AssetIdProjectionOfSelectorMarker.kt | 172 + ...rPredicateBox.kt => AssetPredicateAtom.kt} | 25 +- .../iroha2/generated/AssetPredicateBox.kt | 107 - .../AssetProjectionOfPredicateMarker.kt | 152 + .../AssetProjectionOfSelectorMarker.kt | 172 + .../iroha2/generated/AssetTransferBox.kt | 79 +- .../soramitsu/iroha2/generated/AssetType.kt | 88 +- .../soramitsu/iroha2/generated/AssetValue.kt | 75 +- .../generated/AssetValuePredicateAtom.kt | 144 + .../AssetValueProjectionOfPredicateMarker.kt | 152 + .../AssetValueProjectionOfSelectorMarker.kt | 172 + .../co/soramitsu/iroha2/generated/AtIndex.kt | 40 - .../iroha2/generated/BatchedResponse.kt | 76 - .../iroha2/generated/BatchedResponseV1.kt | 42 - .../soramitsu/iroha2/generated/BlockEvent.kt | 33 +- .../iroha2/generated/BlockEventFilter.kt | 33 +- .../iroha2/generated/BlockHashPredicateBox.kt | 73 - .../soramitsu/iroha2/generated/BlockHeader.kt | 48 +- .../generated/BlockHeaderHashPredicateAtom.kt | 80 + ...ckHeaderHashProjectionOfPredicateMarker.kt | 80 + ...ockHeaderHashProjectionOfSelectorMarker.kt | 100 + .../generated/BlockHeaderPredicateAtom.kt | 42 + .../generated/BlockHeaderPredicateBox.kt | 75 - .../BlockHeaderProjectionOfPredicateMarker.kt | 116 + .../BlockHeaderProjectionOfSelectorMarker.kt | 136 + .../iroha2/generated/BlockMessage.kt | 29 +- .../iroha2/generated/BlockParameter.kt | 45 +- .../iroha2/generated/BlockParameters.kt | 29 +- .../iroha2/generated/BlockPayload.kt | 45 +- .../iroha2/generated/BlockRejectionReason.kt | 64 +- .../iroha2/generated/BlockSignature.kt | 33 +- .../soramitsu/iroha2/generated/BlockStatus.kt | 233 +- .../generated/BlockSubscriptionRequest.kt | 29 +- .../co/soramitsu/iroha2/generated/BurnBox.kt | 58 +- .../iroha2/generated/BurnOfNumericAndAsset.kt | 40 +- .../iroha2/generated/BurnOfu32AndTrigger.kt | 40 +- .../iroha2/generated/CanBurnAsset.kt | 42 + .../generated/CanBurnAssetWithDefinition.kt | 32 +- .../iroha2/generated/CanBurnUserAsset.kt | 36 - .../iroha2/generated/CanBurnUserTrigger.kt | 36 - .../iroha2/generated/CanExecuteTrigger.kt | 42 + .../iroha2/generated/CanExecuteUserTrigger.kt | 36 - .../iroha2/generated/CanManagePeers.kt | 51 + .../iroha2/generated/CanManageRoles.kt | 51 + .../iroha2/generated/CanMintAsset.kt | 42 + .../generated/CanMintAssetWithDefinition.kt | 32 +- .../iroha2/generated/CanMintUserAsset.kt | 36 - .../iroha2/generated/CanMintUserTrigger.kt | 36 - .../generated/CanModifyAccountMetadata.kt | 44 + .../CanModifyAssetDefinitionMetadata.kt | 44 + .../generated/CanModifyAssetMetadata.kt | 44 + .../generated/CanModifyDomainMetadata.kt | 44 + .../iroha2/generated/CanModifyTrigger.kt | 42 + .../generated/CanModifyTriggerMetadata.kt | 44 + .../iroha2/generated/CanRegisterAccount.kt | 42 + .../generated/CanRegisterAccountInDomain.kt | 38 - .../iroha2/generated/CanRegisterAsset.kt | 42 + .../generated/CanRegisterAssetDefinition.kt | 44 + .../CanRegisterAssetDefinitionInDomain.kt | 38 - .../CanRegisterAssetWithDefinition.kt | 23 +- .../iroha2/generated/CanRegisterDomain.kt | 51 + .../iroha2/generated/CanRegisterTrigger.kt | 42 + .../generated/CanRegisterUserTrigger.kt | 36 - .../generated/CanRemoveKeyValueInAccount.kt | 38 - .../CanRemoveKeyValueInAssetDefinition.kt | 38 - .../generated/CanRemoveKeyValueInDomain.kt | 38 - .../generated/CanRemoveKeyValueInTrigger.kt | 38 - .../generated/CanRemoveKeyValueInUserAsset.kt | 38 - .../generated/CanSetKeyValueInAccount.kt | 38 - .../CanSetKeyValueInAssetDefinition.kt | 39 - .../generated/CanSetKeyValueInDomain.kt | 36 - .../generated/CanSetKeyValueInTrigger.kt | 38 - .../generated/CanSetKeyValueInUserAsset.kt | 38 - .../iroha2/generated/CanSetParameters.kt | 51 + .../iroha2/generated/CanTransferAsset.kt | 42 + .../CanTransferAssetWithDefinition.kt | 23 +- .../iroha2/generated/CanTransferUserAsset.kt | 36 - .../iroha2/generated/CanUnregisterAccount.kt | 32 +- .../iroha2/generated/CanUnregisterAsset.kt | 42 + .../generated/CanUnregisterAssetDefinition.kt | 32 +- .../CanUnregisterAssetWithDefinition.kt | 23 +- .../iroha2/generated/CanUnregisterDomain.kt | 32 +- .../iroha2/generated/CanUnregisterTrigger.kt | 42 + .../generated/CanUnregisterUserAsset.kt | 36 - .../generated/CanUnregisterUserTrigger.kt | 38 - .../iroha2/generated/CanUpgradeExecutor.kt | 51 + .../co/soramitsu/iroha2/generated/ChainId.kt | 29 +- .../iroha2/generated/ClientQueryPayload.kt | 51 - .../iroha2/generated/CommittedTransaction.kt | 36 +- .../CommittedTransactionPredicateAtom.kt | 42 + .../CommittedTransactionPredicateBox.kt | 111 - ...dTransactionProjectionOfPredicateMarker.kt | 196 ++ ...edTransactionProjectionOfSelectorMarker.kt | 216 ++ .../generated/CompoundPredicateOfAccount.kt | 195 ++ .../CompoundPredicateOfAccountPredicateBox.kt | 187 - .../generated/CompoundPredicateOfAsset.kt | 195 ++ .../CompoundPredicateOfAssetDefinition.kt | 195 ++ ...dPredicateOfAssetDefinitionPredicateBox.kt | 189 - .../CompoundPredicateOfAssetPredicateBox.kt | 187 - .../CompoundPredicateOfBlockHeader.kt | 195 ++ ...poundPredicateOfBlockHeaderPredicateBox.kt | 189 - ...CompoundPredicateOfCommittedTransaction.kt | 195 ++ .../generated/CompoundPredicateOfDomain.kt | 195 ++ .../CompoundPredicateOfDomainPredicateBox.kt | 187 - .../generated/CompoundPredicateOfPeerId.kt | 195 ++ .../CompoundPredicateOfPeerPredicateBox.kt | 188 - .../CompoundPredicateOfPermission.kt | 195 ++ ...mpoundPredicateOfPermissionPredicateBox.kt | 188 - .../generated/CompoundPredicateOfRole.kt | 195 ++ ...ateBox.kt => CompoundPredicateOfRoleId.kt} | 177 +- .../CompoundPredicateOfRoleIdPredicateBox.kt | 187 - .../CompoundPredicateOfSignedBlock.kt | 195 ++ ...poundPredicateOfSignedBlockPredicateBox.kt | 189 - ...ateOfTransactionQueryOutputPredicateBox.kt | 194 -- .../generated/CompoundPredicateOfTrigger.kt | 195 ++ .../generated/CompoundPredicateOfTriggerId.kt | 195 ++ ...ompoundPredicateOfTriggerIdPredicateBox.kt | 190 - .../CompoundPredicateOfTriggerPredicateBox.kt | 187 - .../iroha2/generated/ConfigurationEvent.kt | 45 +- .../generated/ConfigurationEventFilter.kt | 29 +- .../soramitsu/iroha2/generated/Container.kt | 143 - .../iroha2/generated/CustomInstruction.kt | 32 +- .../iroha2/generated/CustomParameter.kt | 36 +- .../iroha2/generated/CustomParameterId.kt | 29 +- .../soramitsu/iroha2/generated/DataEvent.kt | 155 +- .../iroha2/generated/DataEventFilter.kt | 321 +- .../co/soramitsu/iroha2/generated/Domain.kt | 41 +- .../soramitsu/iroha2/generated/DomainEvent.kt | 213 +- .../iroha2/generated/DomainEventFilter.kt | 33 +- .../co/soramitsu/iroha2/generated/DomainId.kt | 29 +- .../iroha2/generated/DomainIdPredicateAtom.kt | 78 + .../iroha2/generated/DomainIdPredicateBox.kt | 107 - .../DomainIdProjectionOfPredicateMarker.kt | 116 + .../DomainIdProjectionOfSelectorMarker.kt | 136 + .../iroha2/generated/DomainOwnerChanged.kt | 33 +- .../iroha2/generated/DomainPredicateAtom.kt | 40 + .../iroha2/generated/DomainPredicateBox.kt | 107 - .../DomainProjectionOfPredicateMarker.kt | 152 + .../DomainProjectionOfSelectorMarker.kt | 172 + .../co/soramitsu/iroha2/generated/EventBox.kt | 127 +- .../iroha2/generated/EventFilterBox.kt | 157 +- .../iroha2/generated/EventMessage.kt | 29 +- .../generated/EventSubscriptionRequest.kt | 33 +- .../soramitsu/iroha2/generated/Executable.kt | 77 +- .../iroha2/generated/ExecuteTrigger.kt | 43 +- .../iroha2/generated/ExecuteTriggerEvent.kt | 40 +- .../generated/ExecuteTriggerEventFilter.kt | 33 +- .../iroha2/generated/ExecutionTime.kt | 99 +- .../co/soramitsu/iroha2/generated/Executor.kt | 29 +- .../iroha2/generated/ExecutorDataModel.kt | 80 +- .../iroha2/generated/ExecutorEvent.kt | 45 +- .../iroha2/generated/ExecutorEventFilter.kt | 29 +- .../iroha2/generated/ExecutorUpgrade.kt | 29 +- .../soramitsu/iroha2/generated/FetchSize.kt | 31 +- .../iroha2/generated/FindAccountById.kt | 36 - .../FindAccountKeyValueByIdAndKey.kt | 42 - .../iroha2/generated/FindAccountMetadata.kt | 33 +- .../iroha2/generated/FindAccounts.kt | 37 +- .../generated/FindAccountsByDomainId.kt | 36 - .../iroha2/generated/FindAccountsWithAsset.kt | 29 +- .../iroha2/generated/FindActiveTriggerIds.kt | 37 +- .../iroha2/generated/FindAllAccounts.kt | 41 - .../generated/FindAllActiveTriggerIds.kt | 43 - .../iroha2/generated/FindAllAssets.kt | 41 - .../generated/FindAllAssetsDefinitions.kt | 43 - .../iroha2/generated/FindAllBlockHeaders.kt | 41 - .../iroha2/generated/FindAllBlocks.kt | 41 - .../iroha2/generated/FindAllDomains.kt | 41 - .../iroha2/generated/FindAllParameters.kt | 41 - .../iroha2/generated/FindAllPeers.kt | 41 - .../iroha2/generated/FindAllRoleIds.kt | 41 - .../iroha2/generated/FindAllRoles.kt | 41 - .../iroha2/generated/FindAllTransactions.kt | 41 - .../iroha2/generated/FindAssetById.kt | 36 - .../generated/FindAssetDefinitionById.kt | 38 - .../FindAssetDefinitionKeyValueByIdAndKey.kt | 41 - .../generated/FindAssetDefinitionMetadata.kt | 33 +- .../generated/FindAssetKeyValueByIdAndKey.kt | 41 - .../iroha2/generated/FindAssetMetadata.kt | 33 +- .../iroha2/generated/FindAssetQuantityById.kt | 29 +- .../soramitsu/iroha2/generated/FindAssets.kt | 37 +- .../iroha2/generated/FindAssetsByAccountId.kt | 36 - .../FindAssetsByAssetDefinitionId.kt | 39 - .../iroha2/generated/FindAssetsByDomainId.kt | 36 - ...indAssetsByDomainIdAndAssetDefinitionId.kt | 44 - .../iroha2/generated/FindAssetsByName.kt | 36 - .../iroha2/generated/FindAssetsDefinitions.kt | 37 +- .../iroha2/generated/FindBlockHeaderByHash.kt | 36 - .../iroha2/generated/FindBlockHeaders.kt | 37 +- .../soramitsu/iroha2/generated/FindBlocks.kt | 37 +- .../iroha2/generated/FindDomainById.kt | 36 - .../generated/FindDomainKeyValueByIdAndKey.kt | 41 - .../iroha2/generated/FindDomainMetadata.kt | 33 +- .../soramitsu/iroha2/generated/FindDomains.kt | 37 +- .../soramitsu/iroha2/generated/FindError.kt | 327 +- .../iroha2/generated/FindExecutorDataModel.kt | 37 +- .../iroha2/generated/FindParameters.kt | 37 +- .../soramitsu/iroha2/generated/FindPeers.kt | 37 +- .../generated/FindPermissionsByAccountId.kt | 29 +- .../iroha2/generated/FindRoleByRoleId.kt | 36 - .../soramitsu/iroha2/generated/FindRoleIds.kt | 37 +- .../soramitsu/iroha2/generated/FindRoles.kt | 37 +- .../iroha2/generated/FindRolesByAccountId.kt | 29 +- ...ndTotalAssetQuantityByAssetDefinitionId.kt | 41 - .../iroha2/generated/FindTransactionByHash.kt | 36 - .../iroha2/generated/FindTransactions.kt | 37 +- .../generated/FindTransactionsByAccountId.kt | 38 - .../iroha2/generated/FindTriggerById.kt | 36 - .../FindTriggerKeyValueByIdAndKey.kt | 42 - .../iroha2/generated/FindTriggerMetadata.kt | 33 +- .../iroha2/generated/FindTriggers.kt | 37 +- .../FindTriggersByAuthorityDomainId.kt | 39 - .../generated/FindTriggersByAuthorityId.kt | 38 - .../iroha2/generated/ForwardCursor.kt | 37 +- .../iroha2/generated/GenericPredicateBox.kt | 178 - .../iroha2/generated/GenesisWasmAction.kt | 51 + .../iroha2/generated/GenesisWasmTrigger.kt | 44 + .../co/soramitsu/iroha2/generated/GrantBox.kt | 86 +- .../generated/GrantOfPermissionAndAccount.kt | 40 +- .../generated/GrantOfPermissionAndRole.kt | 40 +- .../generated/GrantOfRoleIdAndAccount.kt | 40 +- .../jp/co/soramitsu/iroha2/generated/Hash.kt | 29 +- .../co/soramitsu/iroha2/generated/HashOf.kt | 31 +- .../jp/co/soramitsu/iroha2/generated/IdBox.kt | 234 +- .../iroha2/generated/IdentifiableBox.kt | 450 --- .../iroha2/generated/InstructionBox.kt | 417 ++- .../generated/InstructionEvaluationError.kt | 90 +- .../generated/InstructionExecutionError.kt | 236 +- .../generated/InstructionExecutionFail.kt | 33 +- .../iroha2/generated/InstructionType.kt | 554 +-- .../iroha2/generated/InvalidParameterError.kt | 92 +- .../co/soramitsu/iroha2/generated/IpfsPath.kt | 29 +- .../co/soramitsu/iroha2/generated/Ipv4Addr.kt | 29 +- .../co/soramitsu/iroha2/generated/Ipv6Addr.kt | 31 +- .../jp/co/soramitsu/iroha2/generated/Json.kt | 42 + .../iroha2/generated/JsonPredicateAtom.kt | 78 + .../JsonProjectionOfPredicateMarker.kt | 80 + .../JsonProjectionOfSelectorMarker.kt | 100 + .../jp/co/soramitsu/iroha2/generated/Level.kt | 192 +- .../jp/co/soramitsu/iroha2/generated/Log.kt | 33 +- .../soramitsu/iroha2/generated/MathError.kt | 280 +- .../co/soramitsu/iroha2/generated/Metadata.kt | 43 +- .../generated/MetadataChangedOfAccountId.kt | 40 +- .../MetadataChangedOfAssetDefinitionId.kt | 40 +- .../generated/MetadataChangedOfAssetId.kt | 40 +- .../generated/MetadataChangedOfDomainId.kt | 40 +- .../generated/MetadataChangedOfTriggerId.kt | 40 +- .../MetadataKeyProjectionOfPredicateMarker.kt | 46 + .../MetadataKeyProjectionOfSelectorMarker.kt | 46 + ...edicateBox.kt => MetadataPredicateAtom.kt} | 25 +- .../MetadataProjectionOfPredicateMarker.kt | 116 + .../MetadataProjectionOfSelectorMarker.kt | 136 + .../co/soramitsu/iroha2/generated/MintBox.kt | 58 +- .../iroha2/generated/MintOfNumericAndAsset.kt | 40 +- .../iroha2/generated/MintOfu32AndTrigger.kt | 40 +- .../iroha2/generated/MintabilityError.kt | 90 +- .../co/soramitsu/iroha2/generated/Mintable.kt | 117 +- .../co/soramitsu/iroha2/generated/Mismatch.kt | 33 +- .../iroha2/generated/MultisigAccountArgs.kt | 66 + .../iroha2/generated/MultisigApprove.kt | 46 + .../generated/MultisigInstructionBox.kt | 152 + .../iroha2/generated/MultisigProposalValue.kt | 67 + .../iroha2/generated/MultisigPropose.kt | 52 + .../iroha2/generated/MultisigRegister.kt | 45 + .../iroha2/generated/MultisigSpec.kt | 57 + .../generated/MultisigTransactionArgs.kt | 123 + .../jp/co/soramitsu/iroha2/generated/Name.kt | 29 +- .../NameProjectionOfPredicateMarker.kt | 80 + .../NameProjectionOfSelectorMarker.kt | 100 + .../soramitsu/iroha2/generated/NewAccount.kt | 33 +- .../iroha2/generated/NewAssetDefinition.kt | 45 +- .../soramitsu/iroha2/generated/NewDomain.kt | 37 +- .../co/soramitsu/iroha2/generated/NewRole.kt | 44 + .../soramitsu/iroha2/generated/NonTrivial.kt | 44 - .../iroha2/generated/NonZeroOfu16.kt | 42 + .../iroha2/generated/NonZeroOfu32.kt | 29 +- .../iroha2/generated/NonZeroOfu64.kt | 29 +- .../co/soramitsu/iroha2/generated/Numeric.kt | 33 +- .../iroha2/generated/NumericPredicateAtom.kt | 40 + .../NumericProjectionOfPredicateMarker.kt | 80 + .../NumericProjectionOfSelectorMarker.kt | 100 + .../soramitsu/iroha2/generated/NumericSpec.kt | 29 +- .../soramitsu/iroha2/generated/Pagination.kt | 38 +- .../soramitsu/iroha2/generated/Parameter.kt | 185 +- .../iroha2/generated/ParameterChanged.kt | 33 +- .../soramitsu/iroha2/generated/Parameters.kt | 64 +- .../jp/co/soramitsu/iroha2/generated/Peer.kt | 32 +- .../soramitsu/iroha2/generated/PeerEvent.kt | 73 +- .../iroha2/generated/PeerEventFilter.kt | 33 +- .../co/soramitsu/iroha2/generated/PeerId.kt | 32 +- .../iroha2/generated/PeerIdPredicateAtom.kt | 40 + .../PeerIdProjectionOfPredicateMarker.kt | 116 + .../PeerIdProjectionOfSelectorMarker.kt | 136 + .../soramitsu/iroha2/generated/Permission.kt | 35 +- ...icateBox.kt => PermissionPredicateAtom.kt} | 27 +- .../PermissionProjectionOfPredicateMarker.kt | 80 + .../PermissionProjectionOfSelectorMarker.kt | 100 + .../iroha2/generated/PipelineEventBox.kt | 73 +- .../generated/PipelineEventFilterBox.kt | 77 +- .../soramitsu/iroha2/generated/PublicKey.kt | 33 +- ...dicateBox.kt => PublicKeyPredicateAtom.kt} | 63 +- .../PublicKeyProjectionOfPredicateMarker.kt | 80 + .../PublicKeyProjectionOfSelectorMarker.kt | 100 + .../co/soramitsu/iroha2/generated/QueryBox.kt | 1586 ++------- .../iroha2/generated/QueryExecutionFail.kt | 343 +- .../soramitsu/iroha2/generated/QueryOutput.kt | 39 +- .../iroha2/generated/QueryOutputBatchBox.kt | 1312 +++++-- .../generated/QueryOutputBatchBoxTuple.kt | 47 + .../iroha2/generated/QueryOutputBox.kt | 418 --- .../iroha2/generated/QueryOutputPredicate.kt | 255 -- .../soramitsu/iroha2/generated/QueryParams.kt | 37 +- .../iroha2/generated/QueryRequest.kt | 101 +- .../generated/QueryRequestWithAuthority.kt | 33 +- .../iroha2/generated/QueryResponse.kt | 73 +- .../iroha2/generated/QuerySignature.kt | 31 +- .../QueryWithFilterOfFindAccounts.kt | 49 + ...terOfFindAccountsAndAccountPredicateBox.kt | 44 - .../QueryWithFilterOfFindAccountsWithAsset.kt | 49 + ...AccountsWithAssetAndAccountPredicateBox.kt | 44 - .../QueryWithFilterOfFindActiveTriggerIds.kt | 49 + ...ctiveTriggerIdsAndTriggerIdPredicateBox.kt | 44 - .../generated/QueryWithFilterOfFindAssets.kt | 49 + ...hFilterOfFindAssetsAndAssetPredicateBox.kt | 45 - .../QueryWithFilterOfFindAssetsDefinitions.kt | 49 + ...finitionsAndAssetDefinitionPredicateBox.kt | 45 - .../QueryWithFilterOfFindBlockHeaders.kt | 49 + ...dBlockHeadersAndBlockHeaderPredicateBox.kt | 44 - .../generated/QueryWithFilterOfFindBlocks.kt | 49 + ...rOfFindBlocksAndSignedBlockPredicateBox.kt | 44 - .../generated/QueryWithFilterOfFindDomains.kt | 49 + ...ilterOfFindDomainsAndDomainPredicateBox.kt | 45 - .../generated/QueryWithFilterOfFindPeers.kt | 49 + ...ithFilterOfFindPeersAndPeerPredicateBox.kt | 44 - ...yWithFilterOfFindPermissionsByAccountId.kt | 49 + ...onsByAccountIdAndPermissionPredicateBox.kt | 45 - .../generated/QueryWithFilterOfFindRoleIds.kt | 49 + ...ilterOfFindRoleIdsAndRoleIdPredicateBox.kt | 45 - .../generated/QueryWithFilterOfFindRoles.kt | 49 + ...ithFilterOfFindRolesAndRolePredicateBox.kt | 44 - .../QueryWithFilterOfFindRolesByAccountId.kt | 49 + ...ndRolesByAccountIdAndRoleIdPredicateBox.kt | 44 - .../QueryWithFilterOfFindTransactions.kt | 49 + ...nsAndTransactionQueryOutputPredicateBox.kt | 46 - .../QueryWithFilterOfFindTriggers.kt | 49 + ...terOfFindTriggersAndTriggerPredicateBox.kt | 44 - .../iroha2/generated/QueryWithParams.kt | 33 +- .../iroha2/generated/RawGenesisTransaction.kt | 69 +- .../soramitsu/iroha2/generated/RegisterBox.kt | 213 +- .../iroha2/generated/RegisterOfAccount.kt | 36 +- .../iroha2/generated/RegisterOfAsset.kt | 36 +- .../generated/RegisterOfAssetDefinition.kt | 36 +- .../iroha2/generated/RegisterOfDomain.kt | 36 +- .../iroha2/generated/RegisterOfPeer.kt | 38 +- .../iroha2/generated/RegisterOfRole.kt | 38 +- .../iroha2/generated/RegisterOfTrigger.kt | 36 +- .../iroha2/generated/RemoveKeyValueBox.kt | 157 +- .../generated/RemoveKeyValueOfAccount.kt | 40 +- .../iroha2/generated/RemoveKeyValueOfAsset.kt | 40 +- .../RemoveKeyValueOfAssetDefinition.kt | 29 +- .../generated/RemoveKeyValueOfDomain.kt | 44 +- .../generated/RemoveKeyValueOfTrigger.kt | 40 +- .../co/soramitsu/iroha2/generated/Repeats.kt | 97 +- .../iroha2/generated/RepetitionError.kt | 33 +- .../soramitsu/iroha2/generated/RevokeBox.kt | 86 +- .../generated/RevokeOfPermissionAndAccount.kt | 40 +- .../generated/RevokeOfPermissionAndRole.kt | 40 +- .../generated/RevokeOfRoleIdAndAccount.kt | 40 +- .../jp/co/soramitsu/iroha2/generated/Role.kt | 42 +- .../soramitsu/iroha2/generated/RoleEvent.kt | 129 +- .../iroha2/generated/RoleEventFilter.kt | 33 +- .../co/soramitsu/iroha2/generated/RoleId.kt | 29 +- .../iroha2/generated/RoleIdPredicateAtom.kt | 78 + .../iroha2/generated/RoleIdPredicateBox.kt | 107 - .../RoleIdProjectionOfPredicateMarker.kt | 116 + .../RoleIdProjectionOfSelectorMarker.kt | 136 + .../iroha2/generated/RolePermissionChanged.kt | 33 +- ...uePredicateBox.kt => RolePredicateAtom.kt} | 25 +- .../iroha2/generated/RolePredicateBox.kt | 73 - .../RoleProjectionOfPredicateMarker.kt | 116 + .../RoleProjectionOfSelectorMarker.kt | 136 + .../co/soramitsu/iroha2/generated/Schedule.kt | 33 +- .../generated/SelectorTupleOfAccount.kt | 47 + .../iroha2/generated/SelectorTupleOfAsset.kt | 45 + .../SelectorTupleOfAssetDefinition.kt | 47 + .../generated/SelectorTupleOfBlockHeader.kt | 47 + .../SelectorTupleOfCommittedTransaction.kt | 47 + .../iroha2/generated/SelectorTupleOfDomain.kt | 45 + .../iroha2/generated/SelectorTupleOfPeerId.kt | 45 + .../generated/SelectorTupleOfPermission.kt | 47 + .../iroha2/generated/SelectorTupleOfRole.kt | 45 + .../iroha2/generated/SelectorTupleOfRoleId.kt | 45 + .../generated/SelectorTupleOfSignedBlock.kt | 47 + .../generated/SelectorTupleOfTrigger.kt | 47 + .../generated/SelectorTupleOfTriggerId.kt | 47 + .../iroha2/generated/SemiIntervalOfNumeric.kt | 39 - .../iroha2/generated/SemiIntervalOfu128.kt | 40 - .../soramitsu/iroha2/generated/SemiRange.kt | 73 - .../iroha2/generated/SetKeyValueBox.kt | 157 +- .../iroha2/generated/SetKeyValueOfAccount.kt | 47 +- .../iroha2/generated/SetKeyValueOfAsset.kt | 47 +- .../generated/SetKeyValueOfAssetDefinition.kt | 47 +- .../iroha2/generated/SetKeyValueOfDomain.kt | 47 +- .../iroha2/generated/SetKeyValueOfTrigger.kt | 47 +- .../iroha2/generated/SetParameter.kt | 36 +- .../soramitsu/iroha2/generated/Signature.kt | 29 +- .../soramitsu/iroha2/generated/SignatureOf.kt | 29 +- .../soramitsu/iroha2/generated/SignedBlock.kt | 30 +- .../generated/SignedBlockPredicateAtom.kt | 42 + .../generated/SignedBlockPredicateBox.kt | 75 - .../SignedBlockProjectionOfPredicateMarker.kt | 116 + .../SignedBlockProjectionOfSelectorMarker.kt | 136 + .../iroha2/generated/SignedBlockV1.kt | 46 +- .../soramitsu/iroha2/generated/SignedQuery.kt | 30 +- .../iroha2/generated/SignedQueryV1.kt | 35 +- .../iroha2/generated/SignedTransaction.kt | 45 +- .../SignedTransactionPredicateAtom.kt | 42 + .../SignedTransactionPredicateBox.kt | 109 - ...dTransactionProjectionOfPredicateMarker.kt | 158 + ...edTransactionProjectionOfSelectorMarker.kt | 174 + .../iroha2/generated/SignedTransactionV1.kt | 33 +- .../iroha2/generated/SingularQueryBox.kt | 281 +- .../generated/SingularQueryOutputBox.kt | 256 +- .../generated/SmartContractParameter.kt | 77 +- .../generated/SmartContractParameters.kt | 33 +- .../soramitsu/iroha2/generated/SocketAddr.kt | 101 +- .../iroha2/generated/SocketAddrHost.kt | 33 +- .../iroha2/generated/SocketAddrV4.kt | 33 +- .../iroha2/generated/SocketAddrV6.kt | 33 +- .../co/soramitsu/iroha2/generated/Sorting.kt | 29 +- .../iroha2/generated/StringPredicate.kt | 176 - ...PredicateBox.kt => StringPredicateAtom.kt} | 169 +- .../iroha2/generated/SumeragiParameter.kt | 101 +- .../iroha2/generated/SumeragiParameters.kt | 37 +- .../soramitsu/iroha2/generated/TimeEvent.kt | 32 +- .../iroha2/generated/TimeEventFilter.kt | 29 +- .../iroha2/generated/TimeInterval.kt | 33 +- ...ox.kt => TransactionErrorPredicateAtom.kt} | 77 +- ...sactionErrorProjectionOfPredicateMarker.kt | 80 + ...nsactionErrorProjectionOfSelectorMarker.kt | 100 + .../iroha2/generated/TransactionEvent.kt | 37 +- .../generated/TransactionEventFilter.kt | 41 +- ...Box.kt => TransactionHashPredicateAtom.kt} | 63 +- ...nsactionHashProjectionOfPredicateMarker.kt | 80 + ...ansactionHashProjectionOfSelectorMarker.kt | 100 + .../iroha2/generated/TransactionLimitError.kt | 29 +- .../iroha2/generated/TransactionParameter.kt | 51 +- .../iroha2/generated/TransactionParameters.kt | 33 +- .../iroha2/generated/TransactionPayload.kt | 53 +- .../generated/TransactionQueryOutput.kt | 39 - .../TransactionQueryOutputPredicateBox.kt | 109 - .../generated/TransactionRejectionReason.kt | 135 +- .../iroha2/generated/TransactionSignature.kt | 29 +- .../iroha2/generated/TransactionStatus.kt | 179 +- .../soramitsu/iroha2/generated/TransferBox.kt | 110 +- ...OfAccountAndAssetDefinitionIdAndAccount.kt | 22 +- .../TransferOfAccountAndDomainIdAndAccount.kt | 44 +- .../TransferOfAssetAndMetadataAndAccount.kt | 44 +- .../TransferOfAssetAndNumericAndAccount.kt | 44 +- .../co/soramitsu/iroha2/generated/Trigger.kt | 33 +- .../iroha2/generated/TriggerCompletedEvent.kt | 33 +- .../generated/TriggerCompletedEventFilter.kt | 33 +- .../generated/TriggerCompletedOutcome.kt | 92 +- .../generated/TriggerCompletedOutcomeType.kt | 81 +- .../iroha2/generated/TriggerEvent.kt | 185 +- .../iroha2/generated/TriggerEventFilter.kt | 33 +- .../soramitsu/iroha2/generated/TriggerId.kt | 29 +- .../generated/TriggerIdPredicateAtom.kt | 80 + .../iroha2/generated/TriggerIdPredicateBox.kt | 107 - .../TriggerIdProjectionOfPredicateMarker.kt | 116 + .../TriggerIdProjectionOfSelectorMarker.kt | 136 + .../TriggerNumberOfExecutionsChanged.kt | 22 +- .../iroha2/generated/TriggerPredicateAtom.kt | 40 + .../iroha2/generated/TriggerPredicateBox.kt | 73 - .../TriggerProjectionOfPredicateMarker.kt | 152 + .../TriggerProjectionOfSelectorMarker.kt | 172 + .../soramitsu/iroha2/generated/TypeError.kt | 75 +- .../iroha2/generated/UnregisterBox.kt | 213 +- .../iroha2/generated/UnregisterOfAccount.kt | 36 +- .../iroha2/generated/UnregisterOfAsset.kt | 36 +- .../generated/UnregisterOfAssetDefinition.kt | 36 +- .../iroha2/generated/UnregisterOfDomain.kt | 36 +- .../iroha2/generated/UnregisterOfPeer.kt | 36 +- .../iroha2/generated/UnregisterOfRole.kt | 36 +- .../iroha2/generated/UnregisterOfTrigger.kt | 36 +- .../co/soramitsu/iroha2/generated/Upgrade.kt | 36 +- .../iroha2/generated/ValidationFail.kt | 186 +- .../iroha2/generated/WasmExecutionFail.kt | 29 +- .../iroha2/generated/WasmSmartContract.kt | 29 +- .../soramitsu/iroha2/transaction/Filters.kt | 64 +- .../iroha2/transaction/Instructions.kt | 509 +++ .../iroha2/transaction/TransactionBuilder.kt | 67 + modules/test-tools/build.gradle | 19 +- .../iroha2/testengine/IrohaConfig.kt | 11 +- .../iroha2/testengine/IrohaContainer.kt | 86 +- .../iroha2/testengine/IrohaRunnerExtension.kt | 302 +- .../soramitsu/iroha2/testengine/IrohaTest.kt | 19 +- .../soramitsu/iroha2/testengine/TestConsts.kt | 55 +- .../soramitsu/iroha2/testengine/WithIroha.kt | 8 +- .../src/main/resources/executor.wasm | Bin 388835 -> 1052756 bytes .../src/main/resources/genesis.json | 83 +- .../src/main/resources/genesis2.json | 40 +- .../src/main/resources/genesis3.json | 41 +- 669 files changed, 34454 insertions(+), 25544 deletions(-) delete mode 100644 modules/block/src/main/kotlin/jp/co/soramitsu/iroha2/Exceptions.kt delete mode 100644 modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/Enums.kt delete mode 100644 modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/Extensions.kt delete mode 100644 modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/transaction/Instructions.kt delete mode 100644 modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/transaction/TransactionBuilder.kt rename modules/{client => model}/src/main/kotlin/jp/co/soramitsu/iroha2/Constants.kt (100%) rename modules/{client => model}/src/main/kotlin/jp/co/soramitsu/iroha2/Crypto.kt (62%) create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/Extensions.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/ModelCustomInstruction.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/ModelParameter.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/ModelPermission.kt rename modules/{block => model}/src/main/kotlin/jp/co/soramitsu/iroha2/Serde.kt (67%) create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/TriggerArgs.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountIdPredicateAtom.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountIdPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountIdProjectionOfPredicateMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountIdProjectionOfSelectorMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountPredicateAtom.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountProjectionOfPredicateMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountProjectionOfSelectorMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ActionPredicateAtom.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ActionProjectionOfPredicateMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ActionProjectionOfSelectorMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionIdPredicateAtom.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionIdPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionIdProjectionOfPredicateMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionIdProjectionOfSelectorMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionPredicateAtom.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionProjectionOfPredicateMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionProjectionOfSelectorMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetIdPredicateAtom.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetIdPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetIdProjectionOfPredicateMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetIdProjectionOfSelectorMarker.kt rename modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/{PeerPredicateBox.kt => AssetPredicateAtom.kt} (51%) delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetProjectionOfPredicateMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetProjectionOfSelectorMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetValuePredicateAtom.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetValueProjectionOfPredicateMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetValueProjectionOfSelectorMarker.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AtIndex.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BatchedResponse.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BatchedResponseV1.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockHashPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockHeaderHashPredicateAtom.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockHeaderHashProjectionOfPredicateMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockHeaderHashProjectionOfSelectorMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockHeaderPredicateAtom.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockHeaderPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockHeaderProjectionOfPredicateMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockHeaderProjectionOfSelectorMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanBurnAsset.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanBurnUserAsset.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanBurnUserTrigger.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanExecuteTrigger.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanExecuteUserTrigger.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanManagePeers.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanManageRoles.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanMintAsset.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanMintUserAsset.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanMintUserTrigger.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanModifyAccountMetadata.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanModifyAssetDefinitionMetadata.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanModifyAssetMetadata.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanModifyDomainMetadata.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanModifyTrigger.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanModifyTriggerMetadata.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRegisterAccount.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRegisterAccountInDomain.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRegisterAsset.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRegisterAssetDefinition.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRegisterAssetDefinitionInDomain.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRegisterDomain.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRegisterTrigger.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRegisterUserTrigger.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRemoveKeyValueInAccount.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRemoveKeyValueInAssetDefinition.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRemoveKeyValueInDomain.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRemoveKeyValueInTrigger.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRemoveKeyValueInUserAsset.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanSetKeyValueInAccount.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanSetKeyValueInAssetDefinition.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanSetKeyValueInDomain.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanSetKeyValueInTrigger.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanSetKeyValueInUserAsset.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanSetParameters.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanTransferAsset.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanTransferUserAsset.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanUnregisterAsset.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanUnregisterTrigger.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanUnregisterUserAsset.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanUnregisterUserTrigger.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanUpgradeExecutor.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ClientQueryPayload.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CommittedTransactionPredicateAtom.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CommittedTransactionPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CommittedTransactionProjectionOfPredicateMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CommittedTransactionProjectionOfSelectorMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfAccount.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfAccountPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfAsset.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfAssetDefinition.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfAssetDefinitionPredicateBox.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfAssetPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfBlockHeader.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfBlockHeaderPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfCommittedTransaction.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfDomain.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfDomainPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfPeerId.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfPeerPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfPermission.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfPermissionPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfRole.kt rename modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/{CompoundPredicateOfRolePredicateBox.kt => CompoundPredicateOfRoleId.kt} (50%) delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfRoleIdPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfSignedBlock.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfSignedBlockPredicateBox.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfTransactionQueryOutputPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfTrigger.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfTriggerId.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfTriggerIdPredicateBox.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfTriggerPredicateBox.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Container.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainIdPredicateAtom.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainIdPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainIdProjectionOfPredicateMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainIdProjectionOfSelectorMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainPredicateAtom.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainProjectionOfPredicateMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainProjectionOfSelectorMarker.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAccountById.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAccountKeyValueByIdAndKey.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAccountsByDomainId.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllAccounts.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllActiveTriggerIds.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllAssets.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllAssetsDefinitions.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllBlockHeaders.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllBlocks.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllDomains.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllParameters.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllPeers.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllRoleIds.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllRoles.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllTransactions.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetById.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetDefinitionById.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetDefinitionKeyValueByIdAndKey.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetKeyValueByIdAndKey.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetsByAccountId.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetsByAssetDefinitionId.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetsByDomainId.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetsByDomainIdAndAssetDefinitionId.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetsByName.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindBlockHeaderByHash.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindDomainById.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindDomainKeyValueByIdAndKey.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindRoleByRoleId.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTotalAssetQuantityByAssetDefinitionId.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTransactionByHash.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTransactionsByAccountId.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTriggerById.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTriggerKeyValueByIdAndKey.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTriggersByAuthorityDomainId.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTriggersByAuthorityId.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/GenericPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/GenesisWasmAction.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/GenesisWasmTrigger.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/IdentifiableBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Json.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/JsonPredicateAtom.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/JsonProjectionOfPredicateMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/JsonProjectionOfSelectorMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataKeyProjectionOfPredicateMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataKeyProjectionOfSelectorMarker.kt rename modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/{MetadataPredicateBox.kt => MetadataPredicateAtom.kt} (55%) create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataProjectionOfPredicateMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataProjectionOfSelectorMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MultisigAccountArgs.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MultisigApprove.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MultisigInstructionBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MultisigProposalValue.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MultisigPropose.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MultisigRegister.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MultisigSpec.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MultisigTransactionArgs.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NameProjectionOfPredicateMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NameProjectionOfSelectorMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NewRole.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NonTrivial.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NonZeroOfu16.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NumericPredicateAtom.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NumericProjectionOfPredicateMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NumericProjectionOfSelectorMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PeerIdPredicateAtom.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PeerIdProjectionOfPredicateMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PeerIdProjectionOfSelectorMarker.kt rename modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/{PermissionPredicateBox.kt => PermissionPredicateAtom.kt} (54%) create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PermissionProjectionOfPredicateMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PermissionProjectionOfSelectorMarker.kt rename modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/{PublicKeyPredicateBox.kt => PublicKeyPredicateAtom.kt} (54%) create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PublicKeyProjectionOfPredicateMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PublicKeyProjectionOfSelectorMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryOutputBatchBoxTuple.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryOutputBox.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryOutputPredicate.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindAccounts.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindAccountsAndAccountPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindAccountsWithAsset.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindAccountsWithAssetAndAccountPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindActiveTriggerIds.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindActiveTriggerIdsAndTriggerIdPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindAssets.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindAssetsAndAssetPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindAssetsDefinitions.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindAssetsDefinitionsAndAssetDefinitionPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindBlockHeaders.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindBlockHeadersAndBlockHeaderPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindBlocks.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindBlocksAndSignedBlockPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindDomains.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindDomainsAndDomainPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindPeers.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindPeersAndPeerPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindPermissionsByAccountId.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindPermissionsByAccountIdAndPermissionPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindRoleIds.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindRoleIdsAndRoleIdPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindRoles.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindRolesAndRolePredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindRolesByAccountId.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindRolesByAccountIdAndRoleIdPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindTransactions.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindTransactionsAndTransactionQueryOutputPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindTriggers.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindTriggersAndTriggerPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RoleIdPredicateAtom.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RoleIdPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RoleIdProjectionOfPredicateMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RoleIdProjectionOfSelectorMarker.kt rename modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/{AssetValuePredicateBox.kt => RolePredicateAtom.kt} (51%) delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RolePredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RoleProjectionOfPredicateMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RoleProjectionOfSelectorMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfAccount.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfAsset.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfAssetDefinition.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfBlockHeader.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfCommittedTransaction.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfDomain.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfPeerId.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfPermission.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfRole.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfRoleId.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfSignedBlock.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfTrigger.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfTriggerId.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SemiIntervalOfNumeric.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SemiIntervalOfu128.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SemiRange.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedBlockPredicateAtom.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedBlockPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedBlockProjectionOfPredicateMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedBlockProjectionOfSelectorMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedTransactionPredicateAtom.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedTransactionPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedTransactionProjectionOfPredicateMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedTransactionProjectionOfSelectorMarker.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/StringPredicate.kt rename modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/{StringPredicateBox.kt => StringPredicateAtom.kt} (52%) rename modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/{TransactionErrorPredicateBox.kt => TransactionErrorPredicateAtom.kt} (54%) create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionErrorProjectionOfPredicateMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionErrorProjectionOfSelectorMarker.kt rename modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/{TransactionHashPredicateBox.kt => TransactionHashPredicateAtom.kt} (54%) create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionHashProjectionOfPredicateMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionHashProjectionOfSelectorMarker.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionQueryOutput.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionQueryOutputPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerIdPredicateAtom.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerIdPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerIdProjectionOfPredicateMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerIdProjectionOfSelectorMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerPredicateAtom.kt delete mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerPredicateBox.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerProjectionOfPredicateMarker.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerProjectionOfSelectorMarker.kt rename modules/{client => model}/src/main/kotlin/jp/co/soramitsu/iroha2/transaction/Filters.kt (76%) create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/transaction/Instructions.kt create mode 100644 modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/transaction/TransactionBuilder.kt diff --git a/.gitignore b/.gitignore index d2c8cb243..9bf863099 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ build/ .idea/ +.kotlin/ .gradle/ */*/out diff --git a/build.gradle b/build.gradle index fb4511468..55cbeb021 100644 --- a/build.gradle +++ b/build.gradle @@ -58,7 +58,7 @@ subprojects { java { toolchain { - languageVersion = JavaLanguageVersion.of(8) + languageVersion = JavaLanguageVersion.of(21) } withJavadocJar() diff --git a/docker-compose/docker-compose.yaml b/docker-compose/docker-compose.yaml index c5a73ba4a..0f9005c0a 100644 --- a/docker-compose/docker-compose.yaml +++ b/docker-compose/docker-compose.yaml @@ -1,23 +1,24 @@ services: irohad0: - image: hyperledger/iroha:2.0.0-pre-rc.22.2 + image: hyperledger/iroha:2.0.0-rc.1.0 platform: linux/amd64 environment: CHAIN: 00000000-0000-0000-0000-000000000000 PUBLIC_KEY: ed0120A98BAFB0663CE08D75EBD506FEC38A84E576A7C9B0897693ED4B04FD9EF2D18D PRIVATE_KEY: 802620A4DFC16789FBF9A588525E4AC7F791AC51B12AEE8919EACC03EB2FC31D32C692 + P2P_PUBLIC_ADDRESS: irohad0:1337 P2P_ADDRESS: 0.0.0.0:1337 API_ADDRESS: 0.0.0.0:8080 - TRUSTED_PEERS: '[{"address":"irohad2:1339","public_key":"ed01204EE2FCD53E1730AF142D1E23951198678295047F9314B4006B0CB61850B1DB10"},{"address":"irohad1:1338","public_key":"ed01209897952D14BDFAEA780087C38FF3EB800CB20B882748FC95A575ADB9CD2CB21D"},{"address":"irohad3:1340","public_key":"ed0120CACF3A84B8DC8710CE9D6B968EE95EC7EE4C93C85858F026F3B4417F569592CE"}]' GENESIS_PUBLIC_KEY: ed01204164BF554923ECE1FD412D241036D863A6AE430476C898248B8237D77534CFC4 + TRUSTED_PEERS: '["ed01209897952D14BDFAEA780087C38FF3EB800CB20B882748FC95A575ADB9CD2CB21D@irohad1:1338","ed01204EE2FCD53E1730AF142D1E23951198678295047F9314B4006B0CB61850B1DB10@irohad2:1339","ed0120CACF3A84B8DC8710CE9D6B968EE95EC7EE4C93C85858F026F3B4417F569592CE@irohad3:1340"]' GENESIS_PRIVATE_KEY: 80262082B3BDE54AEBECA4146257DA0DE8D59D8E46D5FE34887DCD8072866792FCB3AD GENESIS: /tmp/genesis.signed.scale - TOPOLOGY: '[{"address":"irohad2:1339","public_key":"ed01204EE2FCD53E1730AF142D1E23951198678295047F9314B4006B0CB61850B1DB10"},{"address":"irohad1:1338","public_key":"ed01209897952D14BDFAEA780087C38FF3EB800CB20B882748FC95A575ADB9CD2CB21D"},{"address":"irohad0:1337","public_key":"ed0120A98BAFB0663CE08D75EBD506FEC38A84E576A7C9B0897693ED4B04FD9EF2D18D"},{"address":"irohad3:1340","public_key":"ed0120CACF3A84B8DC8710CE9D6B968EE95EC7EE4C93C85858F026F3B4417F569592CE"}]' + TOPOLOGY: '["ed0120A98BAFB0663CE08D75EBD506FEC38A84E576A7C9B0897693ED4B04FD9EF2D18D","ed01209897952D14BDFAEA780087C38FF3EB800CB20B882748FC95A575ADB9CD2CB21D","ed01204EE2FCD53E1730AF142D1E23951198678295047F9314B4006B0CB61850B1DB10","ed0120CACF3A84B8DC8710CE9D6B968EE95EC7EE4C93C85858F026F3B4417F569592CE"]' ports: - - 1337:1337 - - 8080:8080 + - 1337:1337 + - 8080:8080 volumes: - - "../modules/test-tools/src/main/resources:/config" + - "../modules/test-tools/src/main/resources:/config" init: true healthcheck: test: test $(curl -s http://127.0.0.1:8080/status/blocks) -gt 0 @@ -29,34 +30,38 @@ services: /bin/sh -c " EXECUTOR_RELATIVE_PATH=$(jq -r '.executor' /config/genesis.json) && \\ EXECUTOR_ABSOLUTE_PATH=$(realpath \"/config/$$EXECUTOR_RELATIVE_PATH\") && \\ + WASM_DIR_RELATIVE_PATH=$(jq -r '.wasm_dir' /config/genesis.json) && \\ + WASM_DIR_ABSOLUTE_PATH=$(realpath \"/config/$$WASM_DIR_RELATIVE_PATH\") && \\ jq \\ --arg executor \"$$EXECUTOR_ABSOLUTE_PATH\" \\ + --arg wasm_dir \"$$WASM_DIR_ABSOLUTE_PATH\" \\ --argjson topology \"$$TOPOLOGY\" \\ - '.executor = $$executor | .topology = $$topology' /config/genesis.json \\ + '.executor = $$executor | .wasm_dir = $$wasm_dir | .topology = $$topology' /config/genesis.json \\ >/tmp/genesis.json && \\ kagami genesis sign /tmp/genesis.json \\ --public-key $$GENESIS_PUBLIC_KEY \\ --private-key $$GENESIS_PRIVATE_KEY \\ --out-file $$GENESIS \\ && \\ - irohad + exec irohad " irohad1: - image: hyperledger/iroha:2.0.0-pre-rc.22.2 + image: hyperledger/iroha:2.0.0-rc.1.0 platform: linux/amd64 environment: CHAIN: 00000000-0000-0000-0000-000000000000 PUBLIC_KEY: ed01209897952D14BDFAEA780087C38FF3EB800CB20B882748FC95A575ADB9CD2CB21D PRIVATE_KEY: 8026203ECA64ADC23DC106C9D703233375EA6AC345AD7299FF3AD45F355DE6CD1B5510 + P2P_PUBLIC_ADDRESS: irohad1:1338 P2P_ADDRESS: 0.0.0.0:1338 API_ADDRESS: 0.0.0.0:8081 GENESIS_PUBLIC_KEY: ed01204164BF554923ECE1FD412D241036D863A6AE430476C898248B8237D77534CFC4 - TRUSTED_PEERS: '[{"address":"irohad2:1339","public_key":"ed01204EE2FCD53E1730AF142D1E23951198678295047F9314B4006B0CB61850B1DB10"},{"address":"irohad0:1337","public_key":"ed0120A98BAFB0663CE08D75EBD506FEC38A84E576A7C9B0897693ED4B04FD9EF2D18D"},{"address":"irohad3:1340","public_key":"ed0120CACF3A84B8DC8710CE9D6B968EE95EC7EE4C93C85858F026F3B4417F569592CE"}]' + TRUSTED_PEERS: '["ed0120A98BAFB0663CE08D75EBD506FEC38A84E576A7C9B0897693ED4B04FD9EF2D18D@irohad0:1337","ed01204EE2FCD53E1730AF142D1E23951198678295047F9314B4006B0CB61850B1DB10@irohad2:1339","ed0120CACF3A84B8DC8710CE9D6B968EE95EC7EE4C93C85858F026F3B4417F569592CE@irohad3:1340"]' ports: - - 1338:1338 - - 8081:8081 + - 1338:1338 + - 8081:8081 volumes: - - "../modules/test-tools/src/main/resources:/config" + - "../modules/test-tools/src/main/resources:/config" init: true healthcheck: test: test $(curl -s http://127.0.0.1:8081/status/blocks) -gt 0 @@ -65,21 +70,22 @@ services: retries: 30 start_period: 4s irohad2: - image: hyperledger/iroha:2.0.0-pre-rc.22.2 + image: hyperledger/iroha:2.0.0-rc.1.0 platform: linux/amd64 environment: CHAIN: 00000000-0000-0000-0000-000000000000 PUBLIC_KEY: ed01204EE2FCD53E1730AF142D1E23951198678295047F9314B4006B0CB61850B1DB10 PRIVATE_KEY: 8026207B1C78F733EDAFD6AF9BAC3A0D6C5A494557DD031609A4FDD9796EEF471D928C + P2P_PUBLIC_ADDRESS: irohad2:1339 P2P_ADDRESS: 0.0.0.0:1339 API_ADDRESS: 0.0.0.0:8082 GENESIS_PUBLIC_KEY: ed01204164BF554923ECE1FD412D241036D863A6AE430476C898248B8237D77534CFC4 - TRUSTED_PEERS: '[{"address":"irohad1:1338","public_key":"ed01209897952D14BDFAEA780087C38FF3EB800CB20B882748FC95A575ADB9CD2CB21D"},{"address":"irohad0:1337","public_key":"ed0120A98BAFB0663CE08D75EBD506FEC38A84E576A7C9B0897693ED4B04FD9EF2D18D"},{"address":"irohad3:1340","public_key":"ed0120CACF3A84B8DC8710CE9D6B968EE95EC7EE4C93C85858F026F3B4417F569592CE"}]' + TRUSTED_PEERS: '["ed0120A98BAFB0663CE08D75EBD506FEC38A84E576A7C9B0897693ED4B04FD9EF2D18D@irohad0:1337","ed01209897952D14BDFAEA780087C38FF3EB800CB20B882748FC95A575ADB9CD2CB21D@irohad1:1338","ed0120CACF3A84B8DC8710CE9D6B968EE95EC7EE4C93C85858F026F3B4417F569592CE@irohad3:1340"]' ports: - - 1339:1339 - - 8082:8082 + - 1339:1339 + - 8082:8082 volumes: - - "../modules/test-tools/src/main/resources:/config" + - "../modules/test-tools/src/main/resources:/config" init: true healthcheck: test: test $(curl -s http://127.0.0.1:8082/status/blocks) -gt 0 @@ -88,21 +94,22 @@ services: retries: 30 start_period: 4s irohad3: - image: hyperledger/iroha:2.0.0-pre-rc.22.2 + image: hyperledger/iroha:2.0.0-rc.1.0 platform: linux/amd64 environment: CHAIN: 00000000-0000-0000-0000-000000000000 PUBLIC_KEY: ed0120CACF3A84B8DC8710CE9D6B968EE95EC7EE4C93C85858F026F3B4417F569592CE PRIVATE_KEY: 8026206C7FF4CA09D395C7B7332C654099406E929C6238942E3CE85155CC1A5E2CF519 + P2P_PUBLIC_ADDRESS: irohad3:1340 P2P_ADDRESS: 0.0.0.0:1340 API_ADDRESS: 0.0.0.0:8083 GENESIS_PUBLIC_KEY: ed01204164BF554923ECE1FD412D241036D863A6AE430476C898248B8237D77534CFC4 - TRUSTED_PEERS: '[{"address":"irohad2:1339","public_key":"ed01204EE2FCD53E1730AF142D1E23951198678295047F9314B4006B0CB61850B1DB10"},{"address":"irohad1:1338","public_key":"ed01209897952D14BDFAEA780087C38FF3EB800CB20B882748FC95A575ADB9CD2CB21D"},{"address":"irohad0:1337","public_key":"ed0120A98BAFB0663CE08D75EBD506FEC38A84E576A7C9B0897693ED4B04FD9EF2D18D"}]' + TRUSTED_PEERS: '["ed0120A98BAFB0663CE08D75EBD506FEC38A84E576A7C9B0897693ED4B04FD9EF2D18D@irohad0:1337","ed01209897952D14BDFAEA780087C38FF3EB800CB20B882748FC95A575ADB9CD2CB21D@irohad1:1338","ed01204EE2FCD53E1730AF142D1E23951198678295047F9314B4006B0CB61850B1DB10@irohad2:1339"]' ports: - - 1340:1340 - - 8083:8083 + - 1340:1340 + - 8083:8083 volumes: - - "../modules/test-tools/src/main/resources:/config" + - "../modules/test-tools/src/main/resources:/config" init: true healthcheck: test: test $(curl -s http://127.0.0.1:8083/status/blocks) -gt 0 diff --git a/examples/tutorial/build.gradle.kts b/examples/tutorial/build.gradle.kts index 1b1e6d7a7..9a21aab3b 100644 --- a/examples/tutorial/build.gradle.kts +++ b/examples/tutorial/build.gradle.kts @@ -1,14 +1,10 @@ -dependencies { - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0") - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.0") +val ktorVer = project.properties["ktorVer"] as String - implementation("net.i2p.crypto:eddsa:0.3.0") - implementation("org.bouncycastle:bcprov-jdk15on:1.65") - implementation("com.github.multiformats:java-multihash:1.3.0") +dependencies { + implementation(project(":admin-client")) - implementation(project(":model")) - implementation(project(":block")) - api(project(":admin-client")) + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0") + implementation("io.ktor:ktor-client-logging:$ktorVer") } tasks.jacocoTestReport { diff --git a/examples/tutorial/src/main/kotlin/jp/co/soramitsu/iroha2/Main.kt b/examples/tutorial/src/main/kotlin/jp/co/soramitsu/iroha2/Main.kt index 9bb218039..18bf45336 100644 --- a/examples/tutorial/src/main/kotlin/jp/co/soramitsu/iroha2/Main.kt +++ b/examples/tutorial/src/main/kotlin/jp/co/soramitsu/iroha2/Main.kt @@ -5,65 +5,79 @@ import jp.co.soramitsu.iroha2.generated.AssetId import jp.co.soramitsu.iroha2.generated.AssetType import jp.co.soramitsu.iroha2.generated.AssetValue import kotlinx.coroutines.runBlocking -import java.net.URL +import java.math.BigDecimal +import java.net.URI import java.util.UUID -fun main(args: Array): Unit = runBlocking { - val chainId = UUID.fromString("00000000-0000-0000-0000-000000000000") - val apiUrl = "http://127.0.0.1:8080" - val peerUrl = "http://127.0.0.1:1337" - val admin = AccountId( - "wonderland".asDomainId(), - publicKeyFromHex("CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03").toIrohaPublicKey(), - ) - val adminKeyPair = keyPairFromHex( - "CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03", - "CCF31D85E3B32A4BEA59987CE0C78E3B8E2DB93881468AB2435FE45D5C9DCD53", - ) - val client = AdminIroha2Client(URL(apiUrl), URL(peerUrl)) - val query = Query(client, admin, adminKeyPair) - query.findAllDomains() - .also { println("ALL DOMAINS: ${it.map { d -> d.id.asString() }}") } - query.findAllAccounts() - .also { println("ALL ACCOUNTS: ${it.map { d -> d.id.asString() }}") } - query.findAllAssets() - .also { println("ALL ASSETS: ${it.map { d -> d.id.asString() }}") } +fun main(): Unit = + runBlocking { + val chainId = UUID.fromString("00000000-0000-0000-0000-000000000000") + val apiUrl = "http://127.0.0.1:8080" + val admin = + AccountId( + "wonderland".asDomainId(), + publicKeyFromHex("CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03").toIrohaPublicKey(), + ) + val adminKeyPair = + keyPairFromHex( + "CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03", + "CCF31D85E3B32A4BEA59987CE0C78E3B8E2DB93881468AB2435FE45D5C9DCD53", + ) + val client = AdminIroha2Client(listOf(URI(apiUrl).toURL()), chainId, admin, adminKeyPair) + val query = Query(client, admin, adminKeyPair) + query + .findAllDomains() + .also { println("ALL DOMAINS: ${it.map { d -> d.id.asString() }}") } + query + .findAllAccounts() + .also { println("ALL ACCOUNTS: ${it.map { d -> d.id.asString() }}") } + query + .findAllAssets() + .also { println("ALL ASSETS: ${it.map { d -> d.id.asString() }}") } - val sendTransaction = SendTransaction(client, admin, adminKeyPair, chainId) + val sendTransaction = SendTransaction(client) - val domain = "looking_glass_${System.currentTimeMillis()}" - sendTransaction.registerDomain(domain).also { println("DOMAIN $domain CREATED") } + val domain = "looking_glass_${System.currentTimeMillis()}" + sendTransaction.registerDomain(domain).also { println("DOMAIN $domain CREATED") } - val madHatterKeyPair = generateKeyPair() - val madHatter = AccountId(domain.asDomainId(), madHatterKeyPair.public.toIrohaPublicKey()) - sendTransaction.registerAccount(madHatter.asString()) - .also { println("ACCOUNT $madHatter CREATED") } + val madHatterKeyPair = generateKeyPair() + val madHatter = AccountId(domain.asDomainId(), madHatterKeyPair.public.toIrohaPublicKey()) + sendTransaction + .registerAccount(madHatter.asString()) + .also { println("ACCOUNT $madHatter CREATED") } - val assetDefinition = "asset_time_${System.currentTimeMillis()}$ASSET_ID_DELIMITER$domain" - sendTransaction.registerAssetDefinition(assetDefinition, AssetType.numeric()) - .also { println("ASSET DEFINITION $assetDefinition CREATED") } + val assetDefinition = "asset_time_${System.currentTimeMillis()}$ASSET_ID_DELIMITER$domain" + sendTransaction + .registerAssetDefinition(assetDefinition, AssetType.numeric()) + .also { println("ASSET DEFINITION $assetDefinition CREATED") } - val madHatterAsset = AssetId(madHatter, assetDefinition.asAssetDefinitionId()) - sendTransaction.registerAsset(madHatterAsset, AssetValue.Numeric(100.asNumeric())) - .also { println("ASSET $madHatterAsset CREATED") } + val madHatterAsset = AssetId(madHatter, assetDefinition.asAssetDefinitionId()) + sendTransaction + .registerAsset(madHatterAsset, AssetValue.Numeric(100.asNumeric())) + .also { println("ASSET $madHatterAsset CREATED") } - val whiteRabbitKeyPair = generateKeyPair() - val whiteRabbit = AccountId(domain.asDomainId(), whiteRabbitKeyPair.public.toIrohaPublicKey()) - sendTransaction.registerAccount(whiteRabbit.asString()) - .also { println("ACCOUNT $whiteRabbit CREATED") } + val whiteRabbitKeyPair = generateKeyPair() + val whiteRabbit = AccountId(domain.asDomainId(), whiteRabbitKeyPair.public.toIrohaPublicKey()) + sendTransaction + .registerAccount(whiteRabbit.asString()) + .also { println("ACCOUNT $whiteRabbit CREATED") } - val whiteRabbitAsset = AssetId(whiteRabbit, assetDefinition.asAssetDefinitionId()) - sendTransaction.registerAsset(whiteRabbitAsset, AssetValue.Numeric(0.asNumeric())) - .also { println("ASSET $whiteRabbitAsset CREATED") } + val whiteRabbitAsset = AssetId(whiteRabbit, assetDefinition.asAssetDefinitionId()) + sendTransaction + .registerAsset(whiteRabbitAsset, AssetValue.Numeric(0.asNumeric())) + .also { println("ASSET $whiteRabbitAsset CREATED") } - sendTransaction.transferAsset(madHatterAsset, 10, whiteRabbit.asString(), madHatter, madHatterKeyPair) - .also { println("$madHatter TRANSFERRED FROM $madHatterAsset TO $whiteRabbitAsset: 10") } - query.getAccountAmount(madHatter, madHatterAsset.definition).also { println("$madHatterAsset BALANCE: $it") } - query.getAccountAmount(whiteRabbit, whiteRabbitAsset.definition).also { println("$whiteRabbitAsset BALANCE: $it") } + sendTransaction + .transferAsset(madHatterAsset, BigDecimal(10), whiteRabbit.asString()) + .also { println("$madHatter TRANSFERRED FROM $madHatterAsset TO $whiteRabbitAsset: 10") } + query.getAccountAmount(madHatter, madHatterAsset.definition).also { println("$madHatterAsset BALANCE: $it") } + query.getAccountAmount(whiteRabbit, whiteRabbitAsset.definition).also { println("$whiteRabbitAsset BALANCE: $it") } - sendTransaction.burnAssets(madHatterAsset, 10, madHatter, madHatterKeyPair) - .also { println("$madHatterAsset WAS BURN") } + sendTransaction + .burnAssets(madHatterAsset, BigDecimal(10)) + .also { println("$madHatterAsset WAS BURN") } - query.getAccountAmount(madHatter, madHatterAsset.definition) - .also { println("$madHatterAsset BALANCE: $it AFTER ASSETS BURNING") } -} + query + .getAccountAmount(madHatter, madHatterAsset.definition) + .also { println("$madHatterAsset BALANCE: $it AFTER ASSETS BURNING") } + } diff --git a/examples/tutorial/src/main/kotlin/jp/co/soramitsu/iroha2/Query.kt b/examples/tutorial/src/main/kotlin/jp/co/soramitsu/iroha2/Query.kt index 75e12d25b..570035a4d 100644 --- a/examples/tutorial/src/main/kotlin/jp/co/soramitsu/iroha2/Query.kt +++ b/examples/tutorial/src/main/kotlin/jp/co/soramitsu/iroha2/Query.kt @@ -1,10 +1,15 @@ package jp.co.soramitsu.iroha2 import jp.co.soramitsu.iroha2.generated.AccountId +import jp.co.soramitsu.iroha2.generated.AccountIdPredicateAtom +import jp.co.soramitsu.iroha2.generated.AccountIdProjectionOfPredicateMarker import jp.co.soramitsu.iroha2.generated.AssetDefinitionId +import jp.co.soramitsu.iroha2.generated.AssetIdProjectionOfPredicateMarker +import jp.co.soramitsu.iroha2.generated.AssetProjectionOfPredicateMarker import jp.co.soramitsu.iroha2.generated.AssetValue -import jp.co.soramitsu.iroha2.generated.GenericPredicateBox -import jp.co.soramitsu.iroha2.generated.QueryOutputPredicate +import jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAccount +import jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAsset +import jp.co.soramitsu.iroha2.generated.CompoundPredicateOfDomain import jp.co.soramitsu.iroha2.query.QueryBuilder import java.math.BigInteger import java.security.KeyPair @@ -14,32 +19,47 @@ open class Query( private val admin: AccountId, private val keyPair: KeyPair, ) { + suspend fun findAllDomains(filter: CompoundPredicateOfDomain? = null) = + client.submit( + QueryBuilder + .findDomains(filter) + .signAs(admin, keyPair), + ) - suspend fun findAllDomains(queryFilter: GenericPredicateBox? = null) = QueryBuilder - .findAllDomains(queryFilter) - .account(admin) - .buildSigned(keyPair) - .let { client.sendQuery(it) } + suspend fun findAllAccounts(filter: CompoundPredicateOfAccount? = null) = + client.submit( + QueryBuilder + .findAccounts(filter) + .signAs(admin, keyPair), + ) - suspend fun findAllAccounts(queryFilter: GenericPredicateBox? = null) = QueryBuilder - .findAllAccounts(queryFilter) - .account(admin) - .buildSigned(keyPair) - .let { client.sendQuery(it) } + suspend fun findAllAssets(filter: CompoundPredicateOfAsset? = null) = + client.submit( + QueryBuilder + .findAssets(filter) + .signAs(admin, keyPair), + ) - suspend fun findAllAssets(queryFilter: GenericPredicateBox? = null) = QueryBuilder - .findAllAssets(queryFilter) - .account(admin) - .buildSigned(keyPair) - .let { client.sendQuery(it) } - - suspend fun getAccountAmount(accountId: AccountId, assetDefinitionId: AssetDefinitionId): BigInteger = - QueryBuilder.findAssetsByAccountId(accountId) - .account(admin) - .buildSigned(keyPair) + suspend fun getAccountAmount( + accountId: AccountId, + assetDefinitionId: AssetDefinitionId, + ): BigInteger { + val byAccountIdFilter = + CompoundPredicateOfAsset.Atom( + AssetProjectionOfPredicateMarker.Id( + AssetIdProjectionOfPredicateMarker.Account( + AccountIdProjectionOfPredicateMarker.Atom( + AccountIdPredicateAtom.Equals(accountId), + ), + ), + ), + ) + return client + .submit(QueryBuilder.findAssets(byAccountIdFilter).signAs(admin, keyPair)) .let { query -> - client.sendQuery(query).find { it.id.definition == assetDefinitionId }?.value + query.find { it.id.definition == assetDefinitionId }?.value }.let { value -> value?.cast()?.numeric?.mantissa } ?: throw RuntimeException("NOT FOUND") + } } diff --git a/examples/tutorial/src/main/kotlin/jp/co/soramitsu/iroha2/SendTransaction.kt b/examples/tutorial/src/main/kotlin/jp/co/soramitsu/iroha2/SendTransaction.kt index 34aa58dc5..807208954 100644 --- a/examples/tutorial/src/main/kotlin/jp/co/soramitsu/iroha2/SendTransaction.kt +++ b/examples/tutorial/src/main/kotlin/jp/co/soramitsu/iroha2/SendTransaction.kt @@ -1,52 +1,36 @@ package jp.co.soramitsu.iroha2 -import jp.co.soramitsu.iroha2.generated.AccountId import jp.co.soramitsu.iroha2.generated.AssetId import jp.co.soramitsu.iroha2.generated.AssetType import jp.co.soramitsu.iroha2.generated.AssetValue +import jp.co.soramitsu.iroha2.generated.Json import jp.co.soramitsu.iroha2.generated.Metadata import jp.co.soramitsu.iroha2.generated.Mintable import jp.co.soramitsu.iroha2.generated.Name +import jp.co.soramitsu.iroha2.transaction.Burn +import jp.co.soramitsu.iroha2.transaction.Register +import jp.co.soramitsu.iroha2.transaction.Transfer import kotlinx.coroutines.withTimeout -import java.security.KeyPair -import java.util.UUID +import java.math.BigDecimal class SendTransaction( private val client: AdminIroha2Client, - private val admin: AccountId, - private val keyPair: KeyPair, - private val chainUuid: UUID, private val timeout: Long = 10000, ) { - suspend fun registerDomain( id: String, - metadata: Map = mapOf(), - admin: AccountId = this.admin, - keyPair: KeyPair = this.keyPair, + metadata: Map = mapOf(), ) { - client.sendTransaction { - account(admin) - chainId(chainUuid) - registerDomain(id.asDomainId(), metadata) - buildSigned(keyPair) - }.also { + client.submit(Register.domain(id.asDomainId(), metadata)).also { withTimeout(timeout) { it.await() } } } suspend fun registerAccount( id: String, - metadata: Map = mapOf(), - admin: AccountId = this.admin, - keyPair: KeyPair = this.keyPair, + metadata: Map = mapOf(), ) { - client.sendTransaction { - account(admin) - chainId(chainUuid) - registerAccount(id.asAccountId(), Metadata(metadata)) - buildSigned(keyPair) - }.also { + client.submit(Register.account(id.asAccountId(), Metadata(metadata))).also { withTimeout(timeout) { it.await() } } } @@ -54,17 +38,10 @@ class SendTransaction( suspend fun registerAssetDefinition( id: String, type: AssetType = AssetType.Store(), - metadata: Map = mapOf(), + metadata: Map = mapOf(), mintable: Mintable = Mintable.Infinitely(), - admin: AccountId = this.admin, - keyPair: KeyPair = this.keyPair, ) { - client.sendTransaction { - account(admin) - chainId(chainUuid) - registerAssetDefinition(id.asAssetDefinitionId(), type, Metadata(metadata), mintable) - buildSigned(keyPair) - }.also { + client.submit(Register.assetDefinition(id.asAssetDefinitionId(), type, mintable, metadata = Metadata(metadata))).also { withTimeout(timeout) { it.await() } } } @@ -72,48 +49,27 @@ class SendTransaction( suspend fun registerAsset( id: AssetId, value: AssetValue, - admin: AccountId = this.admin, - keyPair: KeyPair = this.keyPair, ) { - client.sendTransaction { - account(admin) - chainId(chainUuid) - registerAsset(id, value) - buildSigned(keyPair) - }.also { + client.submit(Register.asset(id, value)).also { withTimeout(timeout) { it.await() } } } suspend fun transferAsset( from: AssetId, - value: Int, + value: BigDecimal, to: String, - admin: AccountId = this.admin, - keyPair: KeyPair = this.keyPair, ) { - client.sendTransaction { - account(admin) - chainId(chainUuid) - transferAsset(from, value, to.asAccountId()) - buildSigned(keyPair) - }.also { + client.submit(Transfer.asset(from, value, to.asAccountId())).also { withTimeout(timeout) { it.await() } } } suspend fun burnAssets( assetId: AssetId, - value: Int, - admin: AccountId = this.admin, - keyPair: KeyPair = this.keyPair, + value: BigDecimal, ) { - client.sendTransaction { - account(admin) - chainId(chainUuid) - burnAsset(assetId, value) - buildSigned(keyPair) - }.also { + client.submit(Burn.asset(assetId, value)).also { withTimeout(timeout) { it.await() } } } diff --git a/gradle.properties b/gradle.properties index ca5442def..e456963a6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,21 +1,20 @@ # kotlin -kotlinVer=1.8.22 -kotlinLinterVer=3.15.0 -ktorVer=2.3.2 -coroutinesVer=1.7.2 +kotlinVer=2.0.21 +kotlinLinterVer=4.5.0 +ktorVer=3.0.1 +coroutinesVer=1.9.0 # json serde -jacksonKotlinVer=2.15.2 +jacksonKotlinVer=2.18.1 # codegen -kotlinPoetVer=1.14.2 +kotlinPoetVer=2.0.0 # crypto bouncyCastleVer=1.70 i2pCryptoEddsa=0.3.0 -multihashVersion=1.3.0 -googleTinkVer=1.9.0 +multihashVersion=1.3.4 +googleTinkVer=1.15.0 # testing testContainersVer=1.20.3 -junitVersion=5.9.3 # logging -logbackVer=1.2.3 +logbackVer=1.5.12 org.gradle.jvmargs=-XX:MetaspaceSize=128M -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 systemProp.sonar.host.url=https://sonar.katana.soramitsu.co.jp diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 033e24c4cdf41af1ab109bc7f253b2b887023340..a4b76b9530d66f5e68d973ea569d8e19de379189 100644 GIT binary patch literal 43583 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 yu?e%!_ptzGB|8GrCfu%p?(_ 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 GZ~q4|mN%#X literal 63375 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≫L+crb^Bz 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 /dev/null && printf '%s +' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -144,7 +148,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -152,7 +156,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -201,11 +205,11 @@ fi # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ diff --git a/gradlew.bat b/gradlew.bat index 93e3f59f1..9d21a2183 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## @@ -43,11 +45,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -57,11 +59,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail diff --git a/modules/admin-client/build.gradle b/modules/admin-client/build.gradle index 69c24669c..cedf257c0 100644 --- a/modules/admin-client/build.gradle +++ b/modules/admin-client/build.gradle @@ -2,10 +2,10 @@ dependencies { api project(":model") api project(":client") - //kotlin support - implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVer" - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVer" - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:$coroutinesVer" + implementation "io.ktor:ktor-client-core:$ktorVer" + implementation "io.ktor:ktor-client-cio:$ktorVer" + implementation "io.ktor:ktor-client-logging:$ktorVer" testApi project(":test-tools") + testImplementation "org.jetbrains.kotlin:kotlin-test-junit5:$kotlinVer" } diff --git a/modules/admin-client/src/main/kotlin/jp/co/soramitsu/iroha2/AdminIroha2AsyncClient.kt b/modules/admin-client/src/main/kotlin/jp/co/soramitsu/iroha2/AdminIroha2AsyncClient.kt index 9e9227abb..b9b5bb5ff 100644 --- a/modules/admin-client/src/main/kotlin/jp/co/soramitsu/iroha2/AdminIroha2AsyncClient.kt +++ b/modules/admin-client/src/main/kotlin/jp/co/soramitsu/iroha2/AdminIroha2AsyncClient.kt @@ -1,41 +1,48 @@ package jp.co.soramitsu.iroha2 import io.ktor.client.plugins.logging.LogLevel -import jp.co.soramitsu.iroha2.model.IrohaUrls +import jp.co.soramitsu.iroha2.generated.AccountId import kotlinx.coroutines.future.future +import java.net.URL +import java.security.KeyPair +import java.util.UUID /** * Extension of [AdminIroha2Client] for Java. Functionality for monitoring peers and configuration support */ @Suppress("unused") -class AdminIroha2AsyncClient @JvmOverloads constructor( - urls: List, - httpLogLevel: LogLevel = LogLevel.NONE, - credentials: String? = null, -) : AdminIroha2Client(urls, httpLogLevel, credentials) { +class AdminIroha2AsyncClient + @JvmOverloads + constructor( + override val apiURL: List, + override val chain: UUID, + override val authority: AccountId, + override val keyPair: KeyPair, + httpLogLevel: LogLevel = LogLevel.NONE, + credentials: String? = null, + ) : AdminIroha2Client(apiURL, chain, authority, keyPair, credentials, httpLogLevel) { + /** + * Send health check request + */ + fun healthAsync() = future { health() } - /** - * Send health check request - */ - fun healthAsync() = future { health() } + /** + * Send status check request + */ + fun statusAsync() = future { status() } - /** - * Send status check request - */ - fun statusAsync() = future { status() } + /** + * Send metrics request + */ + fun metricsAsync() = future { metrics() } - /** - * Send metrics request - */ - fun metricsAsync() = future { metrics() } + /** + * Request current configuration of the peer + */ + fun getConfigsAsync() = future { getConfigs() } - /** - * Request current configuration of the peer - */ - fun getConfigsAsync() = future { getConfigs() } - - /** - * Request description of a configuration property - */ - fun describeConfigAsync(fieldValue: Collection) = future { describeConfig(fieldValue) } -} + /** + * Request description of a configuration property + */ + fun describeConfigAsync(fieldValue: Collection) = future { describeConfig(fieldValue) } + } diff --git a/modules/admin-client/src/main/kotlin/jp/co/soramitsu/iroha2/AdminIroha2Client.kt b/modules/admin-client/src/main/kotlin/jp/co/soramitsu/iroha2/AdminIroha2Client.kt index a8013d19d..18f195fe4 100644 --- a/modules/admin-client/src/main/kotlin/jp/co/soramitsu/iroha2/AdminIroha2Client.kt +++ b/modules/admin-client/src/main/kotlin/jp/co/soramitsu/iroha2/AdminIroha2Client.kt @@ -6,71 +6,56 @@ import io.ktor.client.request.get import io.ktor.client.request.setBody import io.ktor.client.statement.HttpResponse import io.ktor.http.ContentType -import io.ktor.http.HttpStatusCode import io.ktor.http.contentType import jp.co.soramitsu.iroha2.client.Iroha2Client -import jp.co.soramitsu.iroha2.model.IrohaUrls -import kotlinx.coroutines.runBlocking +import jp.co.soramitsu.iroha2.generated.AccountId +import jp.co.soramitsu.iroha2.generated.Peer import java.net.URL +import java.security.KeyPair +import java.util.* /** * Enhancement of [Iroha2Client] for monitoring peers and configuration support */ @Suppress("unused") open class AdminIroha2Client( - urls: List, - httpLogLevel: LogLevel = LogLevel.NONE, + override val apiURL: List, + override val chain: UUID, + override val authority: AccountId, + override val keyPair: KeyPair, credentials: String? = null, + httpLogLevel: LogLevel = LogLevel.NONE, private val balancingHealthCheck: Boolean = true, -) : Iroha2Client(urls, httpLogLevel, credentials) { - - constructor( - url: IrohaUrls, - httpLogLevel: LogLevel = LogLevel.NONE, - credentials: String? = null, - balancingHealthCheck: Boolean = true, - ) : this(mutableListOf(url), httpLogLevel, credentials, balancingHealthCheck) - - constructor( - apiUrl: URL, - peerUrl: URL, - httpLogLevel: LogLevel = LogLevel.NONE, - credentials: String? = null, - balancingHealthCheck: Boolean = true, - ) : this(IrohaUrls(apiUrl, peerUrl), httpLogLevel, credentials, balancingHealthCheck) - - constructor( - apiUrl: String, - peerUrl: String, - httpLogLevel: LogLevel = LogLevel.NONE, - credentials: String? = null, - balancingHealthCheck: Boolean = true, - ) : this(URL(apiUrl), URL(peerUrl), httpLogLevel, credentials, balancingHealthCheck) - +) : Iroha2Client(apiURL, chain, authority, keyPair, credentials, httpLogLevel) { /** * Send metrics request */ - suspend fun metrics(): String = client.get("${getApiUrl()}$METRICS_ENDPOINT").body() + suspend fun metrics(): String = client.get("${getApiURL()}$METRICS_ENDPOINT").body() /** * Send health check request */ - suspend fun health(): Int = client.get("${getApiUrl()}$HEALTH_ENDPOINT").status.value + suspend fun health(): Int = client.get("${getApiURL()}$HEALTH_ENDPOINT").status.value /** * Send health check request */ - suspend fun health(peerUrl: URL): Int = client.get("$peerUrl$HEALTH_ENDPOINT").status.value + private suspend fun health(peerUrl: URL): Int = client.get("$peerUrl$HEALTH_ENDPOINT").status.value /** * Send status check request */ - suspend fun status(): PeerStatus = client.get("${getApiUrl()}$STATUS_ENDPOINT").body() + suspend fun status(): PeerStatus = client.get("${getApiURL()}$STATUS_ENDPOINT").body() + + /** + * Send peers request + */ + suspend fun peers(): List = client.get("${getApiURL()}$PEERS_ENDPOINT").body() /** * Send schema request */ - suspend fun schema(): String = client.get("${getApiUrl()}$SCHEMA_ENDPOINT").body() + suspend fun schema(): String = client.get("${getApiURL()}$SCHEMA_ENDPOINT").body() /** * Request current configuration of the peer @@ -88,28 +73,12 @@ open class AdminIroha2Client( } private suspend inline fun config(body: B): T { - val response: HttpResponse = client.get("${getApiUrl()}$CONFIGURATION_ENDPOINT") { - contentType(ContentType.Application.Json) - setBody(body) - } - return response.body() - } - - override fun getApiUrl(): URL = when (balancingHealthCheck) { - true -> { - var attempt = 0 - var url = super.getApiUrl() - - while (runBlocking { health(url) } != HttpStatusCode.OK.value) { - url = super.getApiUrl() - if (++attempt >= urls.size) { - throw IrohaClientException("All peers are unhealthy") - } + val response: HttpResponse = + client.get("${getApiURL()}$CONFIGURATION_ENDPOINT") { + contentType(ContentType.Application.Json) + setBody(body) } - url - } - - false -> super.getApiUrl() + return response.body() } enum class ConfigurationFieldType { Value, Docs } diff --git a/modules/admin-client/src/main/kotlin/jp/co/soramitsu/iroha2/PeerStatus.kt b/modules/admin-client/src/main/kotlin/jp/co/soramitsu/iroha2/PeerStatus.kt index 6b5eef1fd..f4cf97b7f 100644 --- a/modules/admin-client/src/main/kotlin/jp/co/soramitsu/iroha2/PeerStatus.kt +++ b/modules/admin-client/src/main/kotlin/jp/co/soramitsu/iroha2/PeerStatus.kt @@ -14,7 +14,7 @@ import java.time.Duration data class PeerStatus( val peers: Int, val blocks: Long, - val txs_accepted: Long, + val txs_approved: Long, val txs_rejected: Long, val uptime: Duration, val view_changes: Long, diff --git a/modules/admin-client/src/test/kotlin/jp/co/soramitsu/iroha2/ClientTest.kt b/modules/admin-client/src/test/kotlin/jp/co/soramitsu/iroha2/ClientTest.kt index 2f1d78d9f..2c7e981a0 100644 --- a/modules/admin-client/src/test/kotlin/jp/co/soramitsu/iroha2/ClientTest.kt +++ b/modules/admin-client/src/test/kotlin/jp/co/soramitsu/iroha2/ClientTest.kt @@ -10,43 +10,43 @@ import kotlin.test.assertEquals @Timeout(120) class ClientTest : IrohaTest() { - @Test @WithIroha - fun schema(): Unit = runBlocking { - val schema = client.schema() - assert(schema.isNotEmpty()) - } + fun schema(): Unit = + runBlocking { + val schema = client.schema() + assert(schema.isNotEmpty()) + } @Test @WithIroha - fun health(): Unit = runBlocking { - val health = client.health() - assert(health == HttpStatusCode.OK.value) - } + fun health(): Unit = + runBlocking { + val health = client.health() + assert(health == HttpStatusCode.OK.value) + } @Test @WithIroha - fun status(): Unit = runBlocking { - val status = client.status() - assertEquals(1, status.blocks) - } + fun status(): Unit = + runBlocking { + val status = client.status() + assertEquals(1, status.blocks) + } @Test @WithIroha - fun metrics(): Unit = runBlocking { - val metrics = client.metrics() - assert(metrics.isNotEmpty()) - } + fun metrics(): Unit = + runBlocking { + val metrics = client.metrics() + assert(metrics.isNotEmpty()) + } @Test @WithIroha - fun getConfigValues(): Unit = runBlocking { - val configs = client.getConfigs() - assert(configs.isNotEmpty()) - } - - companion object { - private const val PEER_AMOUNT = 4 - } + fun getConfigValues(): Unit = + runBlocking { + val configs = client.getConfigs() + assert(configs.isNotEmpty()) + } } diff --git a/modules/block/build.gradle b/modules/block/build.gradle index fdb17e855..eae47777d 100644 --- a/modules/block/build.gradle +++ b/modules/block/build.gradle @@ -1,11 +1,12 @@ dependencies { - api project(":client") + implementation project(":model") - api "com.fasterxml.jackson.module:jackson-module-kotlin:$jacksonKotlinVer" - api "com.google.crypto.tink:tink:$googleTinkVer" + implementation "com.fasterxml.jackson.module:jackson-module-kotlin:$jacksonKotlinVer" testImplementation "org.jetbrains.kotlin:kotlin-test-junit5:$kotlinVer" testImplementation "org.jetbrains.kotlin:kotlin-test:$kotlinVer" + + testImplementation "com.google.crypto.tink:tink:$googleTinkVer" } jacocoTestReport { diff --git a/modules/block/src/main/kotlin/jp/co/soramitsu/iroha2/Exceptions.kt b/modules/block/src/main/kotlin/jp/co/soramitsu/iroha2/Exceptions.kt deleted file mode 100644 index bc29205af..000000000 --- a/modules/block/src/main/kotlin/jp/co/soramitsu/iroha2/Exceptions.kt +++ /dev/null @@ -1,15 +0,0 @@ -package jp.co.soramitsu.iroha2 - -/** - * Throw if there is an issue with deserialization. - * - * @param message The explanation of the issue - */ -class DeserializationException(message: String) : RuntimeException(message) - -/** - * Throw if there is an issue with serialization - * - * @param message The explanation of the issue - */ -class SerializationException(message: String) : RuntimeException(message) diff --git a/modules/block/src/main/kotlin/jp/co/soramitsu/iroha2/Genesis.kt b/modules/block/src/main/kotlin/jp/co/soramitsu/iroha2/Genesis.kt index 99fe25b95..4f4dd4c52 100644 --- a/modules/block/src/main/kotlin/jp/co/soramitsu/iroha2/Genesis.kt +++ b/modules/block/src/main/kotlin/jp/co/soramitsu/iroha2/Genesis.kt @@ -6,7 +6,7 @@ import jp.co.soramitsu.iroha2.generated.Metadata import jp.co.soramitsu.iroha2.generated.NewAccount import jp.co.soramitsu.iroha2.generated.NewAssetDefinition import jp.co.soramitsu.iroha2.generated.NewDomain -import jp.co.soramitsu.iroha2.generated.Parameter +import jp.co.soramitsu.iroha2.generated.Parameters import jp.co.soramitsu.iroha2.generated.RawGenesisTransaction import jp.co.soramitsu.iroha2.generated.RegisterBox import jp.co.soramitsu.iroha2.generated.RegisterOfAccount @@ -19,49 +19,60 @@ import java.nio.file.StandardOpenOption /** * Genesis block is used to initialise a blockchain */ -open class Genesis(open val transaction: RawGenesisTransaction) { +open class Genesis( + open val transaction: RawGenesisTransaction, +) { /** * Write genesis to file */ - fun writeToFile(path: Path): Path = Files.write( - path, - asJson().toByteArray(Charsets.UTF_8), - StandardOpenOption.TRUNCATE_EXISTING, - StandardOpenOption.CREATE, - ) + fun writeToFile(path: Path): Path = + Files.write( + path, + asJson().toByteArray(Charsets.UTF_8), + StandardOpenOption.TRUNCATE_EXISTING, + StandardOpenOption.CREATE, + ) /** * Represent genesis as JSON */ - fun asJson(): String = JSON_SERDE.writeValueAsString(this.transaction) + fun asJson(): String = + JSON_SERDE.writeValueAsString(this.transaction).also { genesis -> + println("GENESIS: $genesis") + } companion object { - - const val EXECUTOR_FILE_NAME = "executor.wasm" + const val EXECUTOR_FILE_NAME = "./executor.wasm" /** * List of genesis blocks to single block with unique instructions */ fun List.toSingle(): Genesis { val uniqueIsi: MutableSet = mutableSetOf() - val uniqueParams: MutableSet = mutableSetOf() + val uniqueParams: MutableSet = mutableSetOf() this.forEach { genesis -> uniqueIsi.addAll(genesis.transaction.instructions) - uniqueParams.addAll(genesis.transaction.parameters) + genesis.transaction.parameters?.also { uniqueParams.add(it) } } return Genesis( RawGenesisTransaction( ChainId("00000000-0000-0000-0000-000000000000"), EXECUTOR_FILE_NAME, - uniqueParams.toList(), - uniqueIsi.mergeMetadata().toList(), + uniqueParams.merge(), + uniqueIsi.merge().toList(), + "libs", + emptyList(), emptyList(), ), ) } - private fun MutableSet.mergeMetadata(): List { + private fun MutableSet.merge(): Parameters? { + return this.firstOrNull() // TODO + } + + private fun MutableSet.merge(): List { // entity id to its metadata val metadataMap = mutableMapOf() @@ -79,48 +90,54 @@ open class Genesis(open val transaction: RawGenesisTransaction) { return this.sorted() } - private fun MutableSet.sorted() = this.sortedWith( - compareByDescending { instruction -> - when (instruction) { - is InstructionBox.Register -> when (instruction.cast().registerBox) { - is RegisterBox.Domain -> 5 - is RegisterBox.Account -> 4 - is RegisterBox.AssetDefinition -> 3 - is RegisterBox.Role -> 2 - else -> 1 + private fun MutableSet.sorted() = + this.sortedWith( + compareByDescending { instruction -> + when (instruction) { + is InstructionBox.Register -> + when (instruction.cast().registerBox) { + is RegisterBox.Domain -> 5 + is RegisterBox.Account -> 4 + is RegisterBox.AssetDefinition -> 3 + is RegisterBox.Role -> 2 + else -> 1 + } + + else -> -1 } - - else -> -1 - } - }, - ) - - private fun RegisterBox.addMetadata(metadata: Metadata) = when (this) { - is RegisterBox.Account -> RegisterBox.Account( - RegisterOfAccount( - NewAccount(this.registerOfAccount.`object`.id, metadata), - ), + }, ) - is RegisterBox.Domain -> RegisterBox.Domain( - RegisterOfDomain( - NewDomain(this.registerOfDomain.`object`.id, this.registerOfDomain.`object`.logo, metadata), - ), - ) - - is RegisterBox.AssetDefinition -> RegisterBox.AssetDefinition( - RegisterOfAssetDefinition( - NewAssetDefinition( - this.registerOfAssetDefinition.`object`.id, - this.registerOfAssetDefinition.`object`.type, - this.registerOfAssetDefinition.`object`.mintable, - metadata = metadata, - ), - ), - ) - - else -> throw IrohaSdkException("Unexpected type ${this::class}") - } + private fun RegisterBox.addMetadata(metadata: Metadata) = + when (this) { + is RegisterBox.Account -> + RegisterBox.Account( + RegisterOfAccount( + NewAccount(this.registerOfAccount.`object`.id, metadata), + ), + ) + + is RegisterBox.Domain -> + RegisterBox.Domain( + RegisterOfDomain( + NewDomain(this.registerOfDomain.`object`.id, this.registerOfDomain.`object`.logo, metadata), + ), + ) + + is RegisterBox.AssetDefinition -> + RegisterBox.AssetDefinition( + RegisterOfAssetDefinition( + NewAssetDefinition( + this.registerOfAssetDefinition.`object`.id, + this.registerOfAssetDefinition.`object`.type, + this.registerOfAssetDefinition.`object`.mintable, + metadata = metadata, + ), + ), + ) + + else -> throw IrohaSdkException("Unexpected type ${this::class}") + } private fun MutableMap.putMergedMetadata(idBox: RegisterBox) { fun MutableMap.putOrMerge( @@ -141,10 +158,11 @@ open class Genesis(open val transaction: RawGenesisTransaction) { when (idBox) { is RegisterBox.Account -> this.putOrMerge(idBox.registerOfAccount.`object`.id, idBox.registerOfAccount.`object`.metadata) is RegisterBox.Domain -> this.putOrMerge(idBox.registerOfDomain.`object`.id, idBox.registerOfDomain.`object`.metadata) - is RegisterBox.AssetDefinition -> this.putOrMerge( - idBox.registerOfAssetDefinition.`object`.id, - idBox.registerOfAssetDefinition.`object`.metadata, - ) + is RegisterBox.AssetDefinition -> + this.putOrMerge( + idBox.registerOfAssetDefinition.`object`.id, + idBox.registerOfAssetDefinition.`object`.metadata, + ) else -> {} } @@ -161,9 +179,15 @@ open class Genesis(open val transaction: RawGenesisTransaction) { instruction.cast().registerBox }.onSuccess { idBox -> when (idBox) { - is RegisterBox.Account -> idBox.registerOfAccount.`object`.id.let { id -> id to metadata[id]!! } - is RegisterBox.Domain -> idBox.registerOfDomain.`object`.id.let { id -> id to metadata[id]!! } - is RegisterBox.AssetDefinition -> idBox.registerOfAssetDefinition.`object`.id.let { id -> id to metadata[id]!! } + is RegisterBox.Account -> + idBox.registerOfAccount.`object`.id + .let { id -> id to metadata[id]!! } + is RegisterBox.Domain -> + idBox.registerOfDomain.`object`.id + .let { id -> id to metadata[id]!! } + is RegisterBox.AssetDefinition -> + idBox.registerOfAssetDefinition.`object`.id + .let { id -> id to metadata[id]!! } else -> null }?.takeIf { it.second.sortedMapOfName.isNotEmpty() }?.let { isiToReplace.merge(it, mutableListOf(instruction.cast())) { old, new -> diff --git a/modules/block/src/test/kotlin/jp/co/soramitsu/iroha2/DeserializerTest.kt b/modules/block/src/test/kotlin/jp/co/soramitsu/iroha2/DeserializerTest.kt index b962eadfa..04cfb582c 100644 --- a/modules/block/src/test/kotlin/jp/co/soramitsu/iroha2/DeserializerTest.kt +++ b/modules/block/src/test/kotlin/jp/co/soramitsu/iroha2/DeserializerTest.kt @@ -50,7 +50,8 @@ class DeserializerTest { private fun removeWhiteSpacesAndReplacePubKey(json: String): String { val regex = "(\"ed01)+\\w+\"".toRegex() - return json.replace(System.getProperty("line.separator"), "") + return json + .replace(System.getProperty("line.separator"), "") .replace(" ", "") .replace(regex, "publicKey") } diff --git a/modules/block/src/test/kotlin/jp/co/soramitsu/iroha2/SerializerTest.kt b/modules/block/src/test/kotlin/jp/co/soramitsu/iroha2/SerializerTest.kt index e0f1b6e1a..c68a03b7e 100644 --- a/modules/block/src/test/kotlin/jp/co/soramitsu/iroha2/SerializerTest.kt +++ b/modules/block/src/test/kotlin/jp/co/soramitsu/iroha2/SerializerTest.kt @@ -1,41 +1,92 @@ package jp.co.soramitsu.iroha2 +import com.google.gson.GsonBuilder import jp.co.soramitsu.iroha2.generated.AssetDefinitionId import jp.co.soramitsu.iroha2.generated.AssetId +import jp.co.soramitsu.iroha2.generated.BlockParameters +import jp.co.soramitsu.iroha2.generated.CanUnregisterAccount import jp.co.soramitsu.iroha2.generated.ChainId +import jp.co.soramitsu.iroha2.generated.EventFilterBox +import jp.co.soramitsu.iroha2.generated.Json import jp.co.soramitsu.iroha2.generated.Metadata import jp.co.soramitsu.iroha2.generated.Name +import jp.co.soramitsu.iroha2.generated.NonZeroOfu64 +import jp.co.soramitsu.iroha2.generated.Parameters import jp.co.soramitsu.iroha2.generated.RawGenesisTransaction import jp.co.soramitsu.iroha2.generated.Repeats +import jp.co.soramitsu.iroha2.generated.SmartContractParameters +import jp.co.soramitsu.iroha2.generated.SumeragiParameters +import jp.co.soramitsu.iroha2.generated.TransactionParameters import jp.co.soramitsu.iroha2.generated.TriggerId import jp.co.soramitsu.iroha2.transaction.EventFilters -import jp.co.soramitsu.iroha2.transaction.Instructions +import jp.co.soramitsu.iroha2.transaction.Grant +import jp.co.soramitsu.iroha2.transaction.Mint +import jp.co.soramitsu.iroha2.transaction.Register +import jp.co.soramitsu.iroha2.transaction.SetKeyValue import org.junit.jupiter.api.Test +import java.math.BigDecimal import java.math.BigInteger import kotlin.test.assertEquals class SerializerTest { @Test fun `should serialize grant permission token genesis block`() { - val genesis = Genesis( - RawGenesisTransaction( - ChainId("00000000-0000-0000-0000-000000000000"), - Genesis.EXECUTOR_FILE_NAME, - emptyList(), - Instructions.grantPermissionToken( - Permissions.CanUnregisterAccount, - "ed012004FF5B81046DDCCF19E2E451C45DFB6F53759D4EB30FA2EFA807284D1CC33016${ACCOUNT_ID_DELIMITER}wonderland".asAccountId() - .asJsonString(withPrefix = true), - "ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03${ACCOUNT_ID_DELIMITER}wonderland".asAccountId(), - ).let { listOf(it) }, - emptyList(), - ), - ) - val expectedJson = """ + val account = "ed012004FF5B81046DDCCF19E2E451C45DFB6F53759D4EB30FA2EFA807284D1CC33016${ACCOUNT_ID_DELIMITER}wonderland" + val destination = "ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03${ACCOUNT_ID_DELIMITER}wonderland" + + val genesis = + Genesis( + RawGenesisTransaction( + ChainId("00000000-0000-0000-0000-000000000000"), + Genesis.EXECUTOR_FILE_NAME, + Parameters( + SumeragiParameters(BigInteger.valueOf(1), BigInteger.valueOf(2), BigInteger.valueOf(3)), + BlockParameters(NonZeroOfu64(BigInteger.valueOf(4))), + TransactionParameters(NonZeroOfu64(BigInteger.valueOf(5)), NonZeroOfu64(BigInteger.valueOf(6))), + SmartContractParameters(NonZeroOfu64(BigInteger.valueOf(7)), NonZeroOfu64(BigInteger.valueOf(8))), + SmartContractParameters(NonZeroOfu64(BigInteger.valueOf(9)), NonZeroOfu64(BigInteger.valueOf(10))), + emptyMap(), + ), + listOf( + Grant + .accountPermission( + CanUnregisterAccount(account.asAccountId()), + destination.asAccountId(), + ).asInstructionBox(), + ), + "", + emptyList(), + emptyList(), + ), + ) + val expectedJson = + """ { "chain": "00000000-0000-0000-0000-000000000000", - "executor": "executor.wasm", - "parameters": [], + "executor": "./executor.wasm", + "parameters": { + "sumeragi": { + "block_time_ms": 1, + "commit_time_ms": 2, + "max_clock_drift_ms": 3 + }, + "block": { + "max_transactions": 4 + }, + "transaction": { + "max_instructions": 5, + "smart_contract_size": 6 + }, + "executor": { + "fuel": 7, + "memory": 8 + }, + "smart_contract": { + "fuel": 9, + "memory": 10 + }, + "custom": {} + }, "instructions": [ { "Grant": { @@ -51,11 +102,13 @@ class SerializerTest { } } ], + "wasm_dir": "", + "wasm_triggers": [], "topology": [] } - """.trimIndent() + """.trimIndent() - val json = JSON_SERDE.writeValueAsString(genesis.transaction).trimIndent() + val json = JSON_SERDE.writeValueAsString(genesis.transaction) assertEquals(expectedJson.lowercase(), json.asPrettyJson().lowercase()) } @@ -64,51 +117,88 @@ class SerializerTest { val triggerId = TriggerId(name = Name("time_trigger")) val aliceAccountId = "ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03${ACCOUNT_ID_DELIMITER}wonderland".asAccountId() - val assetId = AssetId( - aliceAccountId, - AssetDefinitionId("wonderland".asDomainId(), "xor".asName()), - ) - val genesis = Genesis( - RawGenesisTransaction( - ChainId("00000000-0000-0000-0000-000000000000"), - Genesis.EXECUTOR_FILE_NAME, - emptyList(), - listOf( - Instructions.mintAsset(assetId, 100), - Instructions.setKeyValue(assetId, "key".asName(), "value"), - Instructions.registerTrigger( - triggerId, - listOf(Instructions.mintAsset(assetId, 1)), - Repeats.Indefinitely(), - aliceAccountId, - Metadata(mapOf()), - EventFilters.timeEventFilter( - BigInteger.valueOf(1715676978L), - BigInteger.valueOf(1L), - ), + val assetId = + AssetId( + aliceAccountId, + AssetDefinitionId("wonderland".asDomainId(), "xor".asName()), + ) + val genesis = + Genesis( + RawGenesisTransaction( + ChainId("00000000-0000-0000-0000-000000000000"), + Genesis.EXECUTOR_FILE_NAME, + Parameters( + SumeragiParameters(BigInteger.valueOf(1), BigInteger.valueOf(2), BigInteger.valueOf(3)), + BlockParameters(NonZeroOfu64(BigInteger.valueOf(4))), + TransactionParameters(NonZeroOfu64(BigInteger.valueOf(5)), NonZeroOfu64(BigInteger.valueOf(6))), + SmartContractParameters(NonZeroOfu64(BigInteger.valueOf(7)), NonZeroOfu64(BigInteger.valueOf(8))), + SmartContractParameters(NonZeroOfu64(BigInteger.valueOf(9)), NonZeroOfu64(BigInteger.valueOf(10))), + emptyMap(), + ), + listOf( + Mint.asset(assetId, BigDecimal(100)).asInstructionBox(), + SetKeyValue.asset(assetId, "key".asName(), "value").asInstructionBox(), + Register + .trigger( + triggerId, + listOf(Mint.asset(assetId, BigDecimal(1))), + Repeats.Indefinitely(), + aliceAccountId, + EventFilterBox.Time( + EventFilters.timeEventFilter( + BigInteger.valueOf(1715676978L), + BigInteger.valueOf(1L), + ), + ), + Metadata(mapOf(Pair("key".asName(), Json.writeValue("value")))), + ).asInstructionBox(), ), + "", + emptyList(), + emptyList(), ), - emptyList(), - ), - ) - val expectedJson = """ + ) + val expectedJson = + """ { "chain": "00000000-0000-0000-0000-000000000000", - "executor": "executor.wasm", - "parameters": [], + "executor": "./executor.wasm", + "parameters": { + "sumeragi": { + "block_time_ms": 1, + "commit_time_ms": 2, + "max_clock_drift_ms": 3 + }, + "block": { + "max_transactions": 4 + }, + "transaction": { + "max_instructions": 5, + "smart_contract_size": 6 + }, + "executor": { + "fuel": 7, + "memory": 8 + }, + "smart_contract": { + "fuel": 9, + "memory": 10 + }, + "custom": {} + }, "instructions": [ { "Mint": { "Asset": { "object": "100", - "destination": "xor#wonderland#ed0120ce7fa46c9dce7ea4b125e2e36bdb63ea33073e7590ac92816ae1e861b7048b03@wonderland" + "destination": "xor#wonderland#ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland" } } }, { "SetKeyValue": { "Asset": { - "object": "xor#wonderland#ed0120ce7fa46c9dce7ea4b125e2e36bdb63ea33073e7590ac92816ae1e861b7048b03@wonderland", + "object": "xor#wonderland#ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland", "key": "key", "value": "value" } @@ -120,14 +210,16 @@ class SerializerTest { "id": "time_trigger", "action": { "executable": { - "Instructions": [{ - "Mint": { - "Asset": { - "object": "1", - "destination": "xor#wonderland#ed0120ce7fa46c9dce7ea4b125e2e36bdb63ea33073e7590ac92816ae1e861b7048b03@wonderland" + "Instructions": [ + { + "Mint": { + "Asset": { + "object": "1", + "destination": "xor#wonderland#ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland" + } } } - }] + ] }, "repeats": "Indefinitely", "authority": "ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland", @@ -139,16 +231,28 @@ class SerializerTest { } } }, - "metadata": {} + "metadata": { + "key": "value" + } } } } } ], + "wasm_dir": "", + "wasm_triggers": [], "topology": [] } - """.trimIndent() - val json = JSON_SERDE.writeValueAsString(genesis.transaction).trimIndent() - assertEquals(expectedJson.asPrettyJson().lowercase(), json.asPrettyJson().lowercase()) + """.trimIndent() + val json = JSON_SERDE.writeValueAsString(genesis.transaction) + assertEquals(expectedJson.lowercase(), json.asPrettyJson().lowercase()) } } + +fun String.asPrettyJson(): String { + val gson = GsonBuilder().setPrettyPrinting().create() + val jsonElement = + com.google.gson.JsonParser + .parseString(this) + return gson.toJson(jsonElement) +} diff --git a/modules/block/src/test/resources/executor.wasm b/modules/block/src/test/resources/executor.wasm index f51b5112367097b7fd6d53cb3056c6d74b61f1aa..11cc0f19f937a724d8ec886e2c69378864a99189 100644 GIT binary patch literal 1052756 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 z�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%0ALw}`{qZai>jbh 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�KlYEjuymcNm#LyISv>6Cr>e-ofc=eFE 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 z zK~hQfZPYqF-I|zePoWBgxTIYA=J5~Y5f*-Dzf(f<3 zQUGCI7rrt-vM83)d<$M8`{->!3e@v4-?4znd7~cJQBjY- z_Z{tu9FfGqF(g0Rgp+yjjZksg(0-V&G_FK92!8q>&>EoG+XoFPlbX-Bg+Dj0{@z3L zf}w3yMz*pB?;Esnb7KWqbj)dFu~}hxg?+nq zxgk5cA^={R3`Of|C@BaG#6yMZ`xall`QSz*$g>&&BHujPTu)7T;QWZibir7Xyc$NT zsuwb5nLs)#Fx8!XnBCe(t^VF)_N~K5+$7r?NxvZ+bypvZ;~Bq_1FOtIRWMjjdKna9 zj3R}Vvn9?iRkD^`DfC!a_%NM`(oZusk<-me1C#qR=9Lp>0cx$}RufJWM8Xy!0eRc` zU8v<~yQ!t{HBI5#+xxk_wAaZ$ZNEweN4qyzyAR3$!W^m875o_LeyRS#G4wGFZLAfbOUt(v8(Vl6j=t=R7!X$|ho}ERVFU0Xg z=zC?)8IUQ{D?em}|pZ91zzw3P>&@_EB!UL)V;o9V@n$)xv`PzF_WMV{- zC#sfr+^iz4N)b`1cDUDS@`uq@id7ri+iJ?`-sFEzmx_d33F2-J1ov!lU1T*lkY2Q`qY7dX8 zw6SYPBXdyD``0;vPSOTF3prQab^y#_ONtfgF zYgknDRbKO_&axti-=Rw`Jl?!k!@>Z;FeV4Zn^2UBWILiou9_!AC%FgD-4Q{g`ICiQ z!<0u)#MVRi$XpXHr_Of&2uz1GJBC5msp6R>hjJY%o{=y$u}&7qVYy&O<7A+)y~t5E zc|!E-+(C)Yv{{D)g3Ev4uB6V~l@zDDlFepU8t5xxFQGf%Xp~88?kQ=PGKRU8Z6^#{ zKOrQ`_XTzcLufU2i3OBP3WVYy5tfz4=Em6m*hZgresAP<`oIH|`U0QDq~-uTFWfMAf^TFy8aE(S@<(h};)%6g zi36KNzoS@s;Lu+F4$!he$Vli0xP}qY?s@XC30<~lUe83HwrAdM*cfR|<)I-c4@Z?x zl7szW$*WwaPz*Fw*{p&-ff$pJ3rAB&m*ol>K0#J*AqdygzX-@sMInC498nDPtLK_i z`3vRzz2 zz5Ly|oL*~0v9gb@t$zgb=f{S`TGVhtL>GV~THF!+snrg<48sKP)X^XLrh(#NyA=L< zj20NA!(|66eGf>a6S!>Bdxa~pM&;T%m%s8Zr@p=?4M&5(KJW~=B%~vHqNQ)&@xXPj ze%FI{{^rtc7k}WR-@X1bUp-%b#8Ge-iRK|D8Xx+3`qzTabhMaw_&=QnN~)H**@#)q z%uKV{n!x)9O_Bky-4%-A3a)2JU7w|Y<7k6dI3`>23_SS^Sjk+J-AM;8oP%VBYG!&< z-3FEo+G2{#&?0gXsB|a4>20z|{U@{`(cYVOw8S+zn|CzM&e~jcm55RKNrVmOYBshN zi_W+!ajsoue1&ked~$q6ifXt~Kek<>>=d8+PNik1QlFAvqKMu#&-7A7UQI&>-4Y=F z%f<4`g@6uXbfF+LA*&0*$HmBoS;V3li<`Ss4jq%^LxzXMgquB1ECW-(2_SEAxtZS> zL()kQiY#{M&P&4Gb|;+!qNb?MV`wowkKByWQ6(A{L4#R}40a4ETz@t*Omt3xLS7=>q<;S_>Wo;Yxy4I{7yQC^D_?qLPE(f zk;s}nKCyA0J3hHoV~RR@jecj3PcGIkL~bLGEx$+iQ^zN}^*eEV@RIt;r`PW>eqKzTiF@r@F}HL-C3d+IPf6b!N}NcEORNO6Lx7B;dYE@80*W78QiTkKm+`;;6wf8?55sVQ;9+4)Kn4|-X9;tGc$AN(~7qi1Te zQTlxvB4`j+kEUr6L|_2OA#vUtZKjsl%=||6rf^6o(IS^wUVq~RZIFKXkE#V)k-2Wt0nzGv##XFYb9Cp zs+RP}$-0tzYbBA2)soj5oJvRtoVV0UG9Ry&yxU582hXjwlCrle_zdUETAjDmNiZ<8sMs%ItH=D;^dhL2d$?^I4W-ZbEiK+J1dJrtuzC%WBh_xBMhY z$g;lHxx2q9gQ>eZ(6Ey{bT!b{IsyDp(Dv=?yYLE;Njv|7k&7o*$0|d8eHV-yhxD_O zU7%lS(ioF1TtX5gG7BVufD=hTB(e}Ki@)f=W%1XQ&*ER92*MbK_RSVhJUQ0V?p5fK zJZ7TD2VPDmbvi(zWc#AWiyeT+aS6ztH1j(tbRv&l<;w3Alzr5?-JZFVlOfqE-Ih@9 z4Y_I{+=Bq--5$)_F0^i~377}K+pJTsn72zDRd{>fRQeI4(y0|w>Aq{c)oPqragEn# zb=p%~#dU1T6PJBz<|JA?N?-O8y0-QFiekfZ!Y5`H+7e?>oz zYAszQ$JgE={H9;uqrd;CzY;(g2l~_YHl7%#kkfS|Bk|8mIUVQsiogkMGBt9Z)$d&E zV%|dHN1fj;g>KDU(F8BOQXY;B15LpSnipfk%h3|r>wKbuv-(m;vMbr;tqN=;i5}-Kd$T~6Mgk>wRza5OCD|{VLsPofS;@mF*|ST*FIU}(s?l%j>K(C4kt?C?Tv(lMX^ zy%l1LIjklb-{P}xTOnrZ!wQ+%gGSJJ{lE%JH!vtw22i1rhRI7hZ178b4q2_c?a~pv zWwAvD=3CyRB2IVI#lgU8-3g8=EE!y958Gf0ST<=QOrwh&uccXW$74!CT zeg4sBgTLR2c~{|B8{DfHS8}Wk?p22?d0RzrxUAstRG9s&+y=j^+VM|U>+GY)earS* zRnH z;J43I`X{0)`E6gq)+P+%-+jZ0sb zIOzK(e~7P@BSLCkcDkTy@~k(hl|}Z$JmI8Slb;zU(P$=MvIQ$8&5tlB05Sa=y|9WA z*da3Qq*)|*B*TaGyd_3*cScgxu-N1(^Dju;>IgY~mDMEWFNY<*LWDkM7y{F+T^rtT zn+S{i;LvFp=G3^Yq^m8RD?ttE->Nc5F_@*D-+@9BGg9h@7y08CR92=5b(kq;2QkpJ zP^9*RGCAAbeP;n&U~fg~PsD3IJB*JsAW`QJkkR9sp>mf5S4(!bj3vJ%zHH|d#t&Pz zS%73~UzOH3g4%7-m4Ah@I4X;Q;uGp^=NFO^*B=s;NM>7jcx9A$G_(UjVPU&${ZLu@ zGZWdx(~d7A&hf|S#BOGw%n9kwt@JTg4^jb2GNKica+|&v0|+L-B1wNFJN_4wFxDLs zgh95;6%)p8d9x6lgGGovl_*$v-4hJ=}WCv@yD1B;GFRbWGc+0=UoJB zy@n$}Eu{JBh=g<__w-9k>>}u*Uy#oYTrN2)EQ``MJCaQ5$LX&4x}`_s^L8}k01+Z6 zXDj=Q%jrM6@RoFsn#*ZNX2#yaEz^+bt(*2Gg5--22r}r=mdyZ~p}2}?S~jFGD=iM2 z5yldog+a@v>r5rXVwLG}WSQ$!zqlKtV{Wq1z+#Uqpc%u-4J-WXc(s`8>xo`}LtX52 zo*3zS8+)GWSHQcqVmRIS`ncuJvu!W((L%5-JrvVeK0;B^2^Q?a(gT{bX?B2ABdZTK zOinplVtsHKrum&);%dzr_?9Cz*D-^}4SEs=J*ERT(i(Iho38BYEgN=D$6}CM(&C%Z z*^5vd2hqP&14&Og$#yZH5UWyJW8Tu3tC%12R{C`z2FzO&e`_(>s-EMaMz}9EydS8HcrG{16^U;7``L zPV7Tp)Y+y`*(_1nEKx~}OF!1GUVBg#O$9V#A>I#2-_b0?KC!oBhfz_8Bm<)*_E8j{ zcn52EK@1@uoZZQ##9fm+aiXm9&0O;{qX#fY9&5k9J<9k2wRR4zqi&WITUyh0M3MDu za$!5i&B||gBV!Z@rrFba9~b1ExAI6y0Vp%L;a03^@40?0QL>YiTOHOrV;zQt%t_xM z8d42gWMSHbVbO;Q#0>E{sFqBvxqnbNPB$|})q2r(*6K#oDx`F&Rl$Lw`TYJ!!Pz>k zneW^*#Ys4e3IbJ{8X`LkA?gWeGaOlmptED+=MW4i;B%3pp7N~ zG&L#{)+B@q^imt0fRPcMj@8~)*R1b5Ld*}B4Wxi%8U!qM>U3P1{GVyYlflRPc+!bb zqp|TAhQfxB2tx!G=>rIH;qoF8#%nRTL5ERjj2hfCeJE%IRHv7fG{Vq&8gWAkmWI=a z#RXSs1nFzBKr|*gG+GdSsr{TdztDa`BMq6l1&zQvLukbHh@n0<{!r|QM9gADLcNYi zAbML@C-h9giP@wh616#LBrXOMk+^ULamHY;>qKImHzI*{XV zKtyGo|H`4UqHlzi)OJ&df`xi0OPGwHr6hf$4Q~@DP>=+2rPrC49=Y$T66rH%m6)SO zeW%EB+hCb6L(L!D2MCwMaWn8p#jGS~Hrbpy%w1e%|EJCi}fAJ9VskBc9 zv=P+voYBN1owFar^ZP5J9S$V!r=92Qn{*sf3epjTYeYKF5!DP(j#T30aLQ3PM-Yxy z?;sr$7$(A@t@lTCXrI)sSP^XzqM1>!en8|&y zTEkQ?y*0xnl&x527Dk`7O!c;8owcO;OoBa7s$NWQr+T$wi9~Frmm4c-awUXcw^ z)|82OQaTQLl_cR-mIGTz`wCWZa5;GWED6W?&E*63)3krcqlYBR#hW92% z12b(#(?j-Kw7n%+VjaWWH8J!{Y3F6qrHdRVU}c~N8sO=bOzU||DM=3VIU!e` zpKtd;?JQ*&^hl#^o#^9Q$G$2EVTQhNd=s6YJQ&y0s;p`%Cn$UNF*|=J8 zC@j|P(ow9p&opDA!#N!3HKEsG$Bk_?P`E#!WPE-M`+Ib${s2_^HsLGT<$ELmE)8HM zKxfTbX}cnhx|u$zq?ptNVsK=rTUNgrUDSUmab+4k36SbGnUE|Sn2&pAqinY zN|xS_2x)Sjz$1`P`h9&Qvnw9T~ zB_D$Ouz{)Oj5L_M3ZH|p%`D0#`A}E*n&efe<08sONq$iH!BePdGm8ip8GOWJ=-pFi zCwR(gt>N3!{;15wR)!FZ!X1uw7T}*VOv;$FkC}1nW7{$={8|GJ+qTY2RqjqJvBgMm z$+Xbg(BlUg)}IO?os-R!3kepayzWrMaiKd-EL4ZzV94O*F0}-jBWyZ!isLFtBWHRYxZ*h3=?%mxB2awMuQo8k z`qYL4+y+TzmQx$xo?)r04eiz%R2zCaN^ShNLTj8Y1+YI#Pk zN@20k6;9OfXuFpuTq1x>V{|^zClRy*H*sWuJyW+P7o9apsFOD+Ig)hWLZR&@b#1w| z&7c%x=`I*~BVBg_#em!-X}TbDz{gfrRd zV!~OR{nn+PjuI0Xcfq=pp{WgptG6z%cGjiq6>z23mcoL5NmyJ^H8A_+1r{?#cQbwQ zc!6<2&BiQutqn+w>zu@R$1h^6*W4i?F&-c-z=|U&wn}6i=Ped22(wOjbbGKtsxsr` z>VkLaRB|jO2kqwcRnj9)=gAhb1qCchMTS)z78gyol&d7IO=pwSdJ{naUDumjk|n4A zp8UdWaa#p$>9&`{UQ7~DB$oz|N|@slBSFFEbImd}x6D5e2|{14p#xDM@<4LL-v)SLViS2B@`SjlUvOQWK089)Il@mmY4glH zettLQp2p-gYtteAS4O)t?YSDuGyPAl4ed*Bk%4RdNw4Qa^b(!71mUy&?xgJbRp z?MBbmJwwr&{_%3QPSFj@#HtVQ(h?vVIl72>LO+;|k9OVQbqwVXgJ9H6D&s1C zfo^&nss1$J+^E(B`wUJfri*wlfPI69Z(~LWfW^TluHuXAF#SwXnPA-LxT^}^R3Cg( zeefx_bQL~0K|7xXoWNAQ0nF}3(LET{V1hx>L~Rfz@_UkHC$XSMDCNxVOm;+fP7}X* zDxK+WBxAFH&NiOrjUHD{%;JjDLg)V-wp+mo)hKK%l%JYGl%JZZH}cPII7G(Uq(Fa~ z>BX8ls~Da3lGOHWv&ZOZosX`IXTtg=Yy6YGK%zlti)|XlJc!t?By3a8HrL~v#mMwM zqDtGiBAU~p0Rs=YB}gx^vqW%jS_IZvrf*0^q^_#v&7>%w)g4bGmUK$FmOTv#T*P!i zLuR3AcI?Z~WSwxO(d$&+=*v#|<%~wZQ`9U2l!nvyn~3RTGwzBU%WSNkT+*B;+tJ|g z>}>kFrR;n%ndLCzX>d8oxKD$Px$`|z#5X-^G_*_#5X#Ar-XR@C4_VE`;}4yH%5{7c z^AXoQtYy(OKdF$LO;acp!KK+c{eU0g&5pGdg4iyabxsjEuk#%imMB}GN?78)K$Wn> zeFat2@C+kmRpy8qfishF$T+Uxtn;+lN%Lx0W0dhMG_|R>zS`#czBbqQwYk1*vy-jM zQvR*;Rn3-FX(#}q0AEAJeF46PlKTRD5~NFIcZ5iJLckGdwLuV3As)O4A+T*7V>Rn! z=sHsc;91|Lrmc{#Xb1*orq==g+WK}{V-?*z)}IMMu7W*j5Gq=7i8qnoyFZ* z^KoYBX%J6a`UL9&<3+rtHhSxvRL<7n{_n2y%gn^d$3p#nHjes`f#hk}_HJ+o=8u##po(3+z~JgleESwCE}mEp3X zGAilz4b_|*Du=;kSZjX~&5Rf^Y zWY~DwP&J|7RyM=9pwvBi%1Y@RjB!D@g`w%-Q=i0f2xvb%R+ciGvh*6rLHVzD@;=jz&L)E?f_=sUKL7MU zQo`5QOE51nPhAxgn+PqU`HWbrO)Mq%+P>8(SRZb+&o>bWTrjN}3>7VJ>tq!z9~bsP z%!CwC!}OuAg01RB!SyZ^I;H0WP)j|k$kd{!If+S{)o4dB9U8<1O@sCgo5LVRrFLC^$WEUT5 zSyl%fB}?)DF&pt9xoR#+BF#~3SyhV(bbYs92tG>plC~PX>JqFLUOToegG2n>dL=6& z#M_~P{kDvgsou4T&f&0FwS&rFeSrCvZzrq}STpKBv$9Gvxkbl>W}J_^znN23&`jZL zTv0pDHP+wGzhi6>4ly|674%N8dRpqp<8BPn;3nKKU_0(SeP9`f)g5>EO_@7CiB(um zNVg&-(44Q<1DQUcfW~UfK4yGy*~09m$x$l`ZPEVj!CW*x_s3Sz5q@H~F;da~$0v(g zh#8*KBM2cnLJZ`jk2hq24SGE`zK|@i^pr?UA&5xK*oPO|K{F5^NpmgqfGIO^g>6Mb zVR>ju3X9u(n;1p=RWeB~itxhlT=XH)^CTMM*RajXM*49PeCPiGxkt;Chp$iTHJ!ku znAB@R6e1=&L&UY%p^5l#B|vIZ@st2$k=y*xj-ihvdlY0GKBA;o(v&9`(Sv2T)oE%_ zrwO(2okpV@ltmnm1@OQ@P>7;-o@kT+O45gnTcg>?2Ax1i`W9I%R2GF|H|?X?OBKRb z_Pycz9&1#(rnw-{2~(0pF`a>$BxFenA8e@S2nK-S$Ks19qW7otCO4t-h!nN3ry3qa z*7|}D*_agA?3`7GH!=!=D%EY23qMh}nciw$ww%&Rq%1Llj0KPBZF&=Cx4e?sE_`Kx zs)iUi*R0)XzUaEzxm*&q#6ZhEPIf_2=b(f%go4I5V6Stk z(SnDsk$13!MGJ-z4<8Haz^7$(LzjooXt01!kaZR#`YZ{M|BCGBC_VRFnv~%1qN(jS zPX6CDe1&ncu~?n2;Q|FQcO~Y+U_iH*)x7?dy>P}SjuLEl8$C*2y@wiLJBU%i2Nnr8 zpT12zr>G@p0Bhq~F}7)q3Hrq*)9+VUS1U9 zXzL;^r>h#!l(3O%mK$9hL#0Vh%$>H{8J1Zqd$|f@@tJ0&(7(&SP0+FmT8Sqw=X>9A z%kC(Bh03}5-&TAg*-9En6aJaK%rD-1E5fOfUZ7LMdolcHF#SwjbGPcNkl?!O;+qWs zJ>A+xOBy=LBAIcZ4@S^?$C1wA0ZM&dJQ~8lan#tcGi4(k9RnfGyB%KXCqkz<3$d-oAi*|LTDJo&kCMV+`afF?sc?g~`p2 zF_7DC=Ag>%xlQ*so$lDE*d!x06^5b!JEl!fwGmnWlqyZ+$3OAoZ^lX^y z`R$P?cI8D!a5mB_B#U7(IM8oBrL2VDnEjGsFWA&=J#7_RPX{(pJ|-P_<3a4eZ=q%p zqaiR4-D}D=Xe`~#_;eTf)rsF)(0NR{efdG`_G8k4Hy^|f94_>zfl2hS@J*c~@Yba!>rm%)tfRIbPuZ&i^a#ud5f6DooyWw4e_k_cvMqRjms@AO{b zQyaEi3m1G$pC7j3&uuu$&p&a~J^}om0r-SrEd(I$f4^$^^>Ib^-muRi-?ZafNFFnY ziO|pw->q847P;$#Dl#;Q-SEvDD>%i*ZB`0E+;p{!OuTP{aGuTVwVWf>ZGK5GpSu)! zg@uld$yON5FC_qQucQH-m5$lQe8R0WGA+TSrO5{N;j7M*<%o;4G973PnKs{;^i7+; zYm8{qW}R0Qw!aLYHgh=9z_dA>as(WmS5{_&^(~q=CiJPHEt)AkVKS*y{0dI7$+0rN z5pP!P%e0*aL?CObVpC-f)zFN0-hIn1PvPd<0^L0OX3aK*2u)TSd9goph`;27+M}VLkG|X;ZUx=#L8S@U6baa|tAW}an z=KZx{tQCs9>t+=>a$J!&>{XFp8CT@|TlQJYeWNAoP6V^F{y+hTHWltfldk4Ogvfua zF%36A(G4lOGWqEXrAVo7BHH~6?t-@5vYdX)UaVGTJ)GosF)t1q&H~mxcdh!naU4p1 z@~)9Z9$09uBY6x z+)@Yg*ct#5CBNPxGHs96UG5UcsqjF&5L_hpEj|r?BvQy*=N%sUk;CIPeA7fqaCtu) zWZV4G1BhFp80`Gl)wBb)L9g|azeFs&R$O~31&NsHRh;o&;Q5XyTI91miPW^t-a^EXC^B*2!zX;UC#du{{|8$5(=D} zHKiIWt!S~e{d+zVlL2xe2{RLf(+Gn`8mn!iqN25mmo`YnMn$C_FQ`~)iw zR%>ai6_qL~mGk{Q&$}*r&z?yF*!F+^ikY?cTJL%<&;5Pg=Y3u!+zmdc`Uh0&xQe|4 zYW{9(9*WdfRcO<;kFtTm%XW0ZuvhPblsYzrFnuc72DPByPz0PIwyAu#-0dE>D#b=7 zEVNq6kgg$Ma2PCS1$u|UX=XSDQ94=z>~cq3ik2V@QKuB-Dag@qdn{1q35ud2%nHIE z$;Q@lzF}JdZQ~72xM)g`^FaduE%!4iEPIBOJ~1J}B;sHs{YMEr$ZDkFfE}UZm_2f{S4&$Rc{8$BhUS!pUk=ohItnEXBT1if!KTp(gw<$i> zv)P#kr4ARAY^(}Qj8R=biNNhKE2s9jQe*1UQ9n*4)6G(j$}9Wy{A}q# z@2N$621+$BnQNIU;4DG(^7K*pZgu+ro3?d*FedViE1S3tom<9NrY{v;Dul&APIP0# zR)gg%4MhC?Fqs*61K1skrQjGu^JJKNeq% zAZY?Kq0KwRXO6D|l(^stoKurR){eqWm#QF@EEhI|>yFS$Z%l+Qp+VTIWPw3dj}SA* zWTV9+F$6LLrT};=&SvleFEO>P)n@|%9twy0L9dNR3)q<)U6$@MjxBeB=?F{XF;TLD z!`jDX#|BxX7@GF+*)id#5!j6}EYu_(W+Yn)xL0Yoiqr&|BS0hUkeABYL0?96qGcNa zHp>sfm=TF*C%ZG8EKeUD)&d-Cuv!=vjSIsg9q1hi=q2N+p?78aGQ(>VylNexeWHOE zgw*l6yuvFSWNn;8IpMVx@VdOfYfE??&h(znE!&>8)G@^o6TR6myzZ1g9w` zO=-5Wps8iFuOCKJ#);D6*(!o;e`|RTc@PVXJLe4Tg)6oYgj&5JnS$WXx(Y`PH^$@R_JKl9 z%)jVGN=YbLlVuvCt=BE}JIHBVcMUKuuReSv0ju(cLRDI>BMH%;2;Hz=D7? z3&XB6wZD*QV2xMUA$;w4lZ?+NzyiBS$0uPVnf42U8<=&8ZhHaMjQNXF)Yo)@MqUVV ziFlLkrei93?x}?*k_$y#vZka_Ts*gH;En^hjXwqX5|AzMB#;;c#{y9p5ba<{djlLH ztPKvz0J&wB^{-e?vz*BwTQEY!IdD}(`i+IlmYV>~BW&`JqgqM}INm1v7h^VkiIMl2#vmtR6&Nf`>T5UqH$_T(RgPP~WgQhpD5-lRJP~@f(=D8Y_(M=TL zddyc|>Y+I$pax-`m+0>vCV!`$uTpbGV0Y`@S}ytef+m|ud(JPk`2owPub5wuw}bjv zf-F`Q)e8v>bv2LAi*5Q`pI+$meyngaFIjgKOgbz;RmdXb!>_9hzyOBvxT{XH$|khd z7py@l1J4s~jV8GH5ien-QO3QVq;rx-D!4WtVKj_qZ9H~fjCVlCKwA(vBOudXFjKo5 zb-dRn512J5y~-Y4rS>(9Ro;Fb6h^Fu?XcboMIEk34$}pDB#dI3hIP<)B@H$o?Jdt9 z#Zwd}jmZZ8PZP1IIGjHIQTFdjxiW`CTx5+O=fG>z8A*O}frT&HYIrvww15m8iLn}N zH{qkbd-aDnD`-`tXNsp9v5yFmomc1ARi_gMZ=3%uPM~H{O(v>=n(LKcx0n4=jf+Km z%6EAL)v6E9FWprOT%`-EO>;u!_wB&7UPo25-u9#dbf3*@Y5!5ow>!0Mo!Q?-kLv9rn=7`v+N0AmRJx%)64%M}{)VQ40kEx0QkSDRQA-)6xK3zO8dwUrJtdjbUul;jTz^3ec`MhCXYQler$ zloYW?j~u3_xHcC^Xjb`J=cmI%JwKj|W@v7PFB#4v10(1RLMmzX(fKLOFbo6q6o!UTeO&p6f_AHLA$8 zO1{EW5N8jkoOaKk^@a+iX<1~MI&~>c!mv$K)FeXXlT!u5d0T-x5(tRq1HV%$NHY!K zc?<^kZp99(!r8`jT$|qMTj|_d;ZtJ*ljPjOI|QlNWSKK^^IPpykHPfyvP4`( zR>5q*pJJ*Y8%&WAV3+?z=Q})RvX^8gpjCZ9oT6&s|0@1~6(_N+oM^J7aLU)!Z4Ct2 zW1UshfrQ~>HbBWE1@i8Dulo8Ui;=(|{l1EfFIMCOA5@Y5vRIM#e^N!rEW9u|e$*E8 z7F|I5qxT%PFMoHtiY)4b|B5--doIHjaQXZp)w1Zq;+yVLk&_o2(H$Q+Y>{``!s4Rq z0k?llwe)1LcO@OmI9&z|q#EaQvD}4;=v~R<=Gb@w)iY^qKFjzFD?gbQk&E=N!gnxz zZiKslU;S6*PrZ`wc`%wcpkXBg%1nUTa#Cb*mFb7}L7NiC4TO;C6jX^F-wbt{2N0Ih zR!47xTJN+rMEY)w^SV*IUUpUfP|q$feexbwePUtGIHK&P6q%We&GdHfRf709MH6Ir zqxGwCN1R!JmcwREmK0N*Qy8UW2M+W*e;d%JpH@-?7@1M()Ng;~8OtKcZOz`+12m%h zoFU1JK2*z#&Xmv33rMPPvh7t@IwYea^3vZ5t^jinu8?sobGT@$^K1gzs?H|R;LEm3 zW`FG>9U_(>7o+wYjGP6IBJDu5A;L zz&C?lO_ULJch|c0KvbIF!n229)51+J#q;PD@zV4c~R^S#qi4a%l~ht19?D5Czg|eY7@`d+Q@nPk>+n z;f#(jgbTT3e$poIH}WeCA@uz$p6~)hs31ewzz|~Y*KAAgt@qysm38+&v*i3WT8wM` z$MaIqBD-UpHCq26nE2dFYFx#JC1I})K_cx1h*3DTaCaa)MbQl2g>@xys;)i<1DO$|pUqHT6rZ+O%ysjC5- zf*Fg(J>~XOK&t7T@mLqK{+pY;nUY#{p7kQ%}>7O4_@~wVk0Kj~RYc26Ohi4Ep+^3V(HDRcxW8nWb6Wg|FB5S7a zE`FUyS$YuWTdXM>#rS-y=)o-mhv~s?ENNiRaq8$%wsw50|1euSY`=nLkOP|0J*<@9 zh*d_@YlFx9303Q_V-AfFxFby8a?BXLjC#PZ!L$duFGsDddW|q@J6E2`l=l}BBnX7< zK3KF|h85k>U||=is+U8P?xSnUH#R@Ce@`^4ZKoe6{3ts+4sk?`S6_1H0^-p>kA`$OB!(+x4g%X;W=%WEmOv z>w5}c;6$#_*J6UNv$IU(E1#7174MvRTsPhmCIxs8Adup;pK4uFr zvUX|)g5K_4-;ickMe<{)58M<>rz)|LBwi*35+#T9vffRNcb`O_MF+&{Ag6}7ynmi| zn=a8dy9zmw>Dw;@S_saG34pY~Kd&3vWoa-M{~zfa(jSDj92HJe#3OM&pZ@(A_uAImSd z8%QlLTkI@rU^S>uBX=`O}588xb>(p82d zQ61lB@%DUVXL^I|8{9m7>G!Ya&YM7*e!!_|BDtKb1uU>bM9^Y;iJg?fHm|3#@`;=5 zS7R+>H9@-8{0X@kmUL;4k}*^ks8&iSGU6FdN4056Pg8q3h%1Cu!%^+bPZ4HH{bW0^ z8hO}sh!8>cjS6OTn5FC@6phkDCP=ooku=oubm|ze^=ni_pM5aMU-n1aYBdliY($A^Vh zE$x7LsduFl0PKeQ5aA=rP%Z@ov3T4fq_A&1D@Xf+H8=USj7y9?-Z zIrnLC&hf#i4*Ly>I);>4z%&|IF290RMZy-UfuKz9a;DSrsqxV&WtWjDS!c)nkgW)p z#d}0l9CoFmHwCJ)8!EBS2z-B>ekw3CvQQ-g=Tf5LS4oYAG@C?wA+WqdhBn0uC=W<# zNb{8ViKGK4&}BE5bGD@)6pOVCI5^SP(<6k4WHGj}?f0-aC?Eo{ArjoMvkZ#w-p7{= z#|$|njZKtqF7t^Vk|`1NRn00FHL;E=YJyT>U-Y^;BgG6n9jT=%XNRb}^fXSbHcM>c z8ShWuB>63faX>*Kav(~rs>mx*$e18nktr6eE`J4M8?>=$jnKMW+Wm)3aW`^=Dem4D zR}PvvCi;z2B=aHzG6ZlH1CR4t?_=M!{*n_-3Zd_rvQ___1WU4$3QY=UYt0!*8Nf`Y za0}mW=j)G0&%hSD!=z-xQR&M%e3bv07_?SG@!A=M#Aj~NSQJvZr$t>vP=u0}r#d#wv1si-Uw*@~!X$kqyU5!2$CBHk4< zO#8ZHe^$sp4Z;-a@ex%7rE{S%K$sM^Y&v1H4=f4!z|z-h{;FFVaAno{4Nqt|hIv-T z+TZ)+Co}|fSiwNq5*iM{iLABIr&f{V_5*iW(Z;1SH|bcZ^!~M zj27jXdFh9ZGs`MSE=9-a(rwwuZS7+$zo9Z*S$;$Nsr-gx%5PX8@YoD(N-jK+dHp}> zcu5LRWH>6LXO-ftvawozLrj1%`6ex4p^O5Qi7}|igyfe(%V^Oj0)&>3?y<;kxJt!A zW?QhdNL?=QUGrFLEuw1OASw50~j;(`JcG^DUTBm*bZI^>+g)tHa!oEg=Hk{R18s+^4CQV7r9 zs&5Vm#e%1R#QP=_%1IiD3Dkr@poRqN1bk;s!{e0GaEK5^OQbb~9k)`9raWV0!mM%{ zs+<_ai_*f;>@xX~F^CxhXub1dOeN51G>SlRwRzZGCT`F3k?m&iQKi2t#jG&MQyk-;w*usyX|0)hc>GVv4XnIx*!UEnih(IsWAWEAfZeM$OJgV!)|l6FTn!x6=yfy$h` za--yQf-d!YG+)Qvum;AvBCQ-BVkUn~m4H?mZcwAr&WO=TdFX8t{Wu(+5v~@VEpbJF zcq79p0eAk5a%b5H+ROaCOj^k=NSP>8WUN0X_t2;&xro`2l1_t%kVr{4vQq)5Vj-$3 zHv`nt&FO?Exs{w1`nRLi-}TZ z94nu>+E|%%t-NYw%aEQh#V~YHjL}BeUP3F@WLt5%7Smn;WHrE6_kl$~pfRPs5MEW= z<*LoqYzsB(wRKmtl!}lKU{STDs%=D5I}<81 zE@IkAJrkk6H4D^761wi*oieX?BpLibewYlfo)i%=rs!?pBEPb4Qe)4Gqi zN2<>NLc)7R)$#aBn^iJLCwJmt267>1^p=3EI@-f7XW_Xv(;mYqCXq}}h8U0|f~JQh z-ziL$I$9D1P_CL9wyuxjQh=QB4D>_J@`7WQGsj?ku0Lq@Q4C0Jf-r(HFglH@dMA`Z zpjTAdUQ!T@q1g677>Y#?A{aEX15txkPsGnmAmL*XMk~G3gn-D=q>P%^h*+8OSNR}P z!26URhJtF%)aqNwr+*}#|puaKx#z@VZoh6oio z8=$%h+FgJXhI9C!v%)T(sPzo8uPR)C8HNe81c#kf*4RQ_4^;|<@MTq{^|9iI8Y)$& znwlrG>IB`-|>CD2M1XhmIFdxxs5y(1C_Bn8`!p%b~~OuAm; z%$2oQhW~#e@EpCtHjWu{Y?%NSKyGWY;;JXkvnp|H#_D>~9W+H|7zYYk8L={m>gKGJd9e%(X&B+7X~MT3t6r?zj8JD zJ4sNG8gOB*2u_#tWRO;Iy?|n4GG&W|bbHo7=n|c1(2bA_@)W*UQ@7h%pO>F2*}wpM zCVE^~=6S?6^E{7kf2o@>vGi&I$40QqWPPyAB*|8LnzU%3u+tg^j?Il^fB`iE1t4no z7Z5dV6@bd3T>xu)$luFO6ZH=;JQm8xsAo=|B1hzeh_Em>Bh)$HlO4;=PpZQCVO-Pt zP9kD--6Un+kbwubb!rSF)ZDS(2&5r7G9bZ|Y{>e}o`d|QPr3B*jIx#t8t~ zwe2XrKo!hmOAK0xXQ^iVpNfdooy{y!(i$8UusR^IA-yg7>!icp1Utz21c7t}FqB`} zqITM_A`_}9tWbqwiZUf)xCY=uOocRXPkmL5)-a1+<6gGO~j@V#D$=g$^%*rmc-oXPjd&8Y(teWRa}z%SfF+a z*9jk7`Uzuzdl7N97KwL~DYyrR=wLm=`;!X#kiL6@|Vk)_5uEJy*YXc)xv}lHV8N z2j+5t2@37TVHe3;_8EG4yb*rV9wY1d{8in~uCq`wukU(Rb)MQph!>jOZQV=nG9%YI z!rGRtpKR1p2fbJJ(k+q~-r3j}Rq-kN$kI<0`do>~379y+7FDt3<+5Z8mljpus-aK^ zTY+P1HL4a>!xA`SPT!$oPN?8=2Muu9!bLBC+rW`*NC4?+(Xl3UfHUAg1j45jV>=mA z0hPlfG%TGk^7J-+na7<=Cv)Y}Ns(r!c7$q_{-H+IYQ619))roU$5O_|U;L5P+QMrr zC{$|;PJ4{MV{JkEGP~Cn{=m@C@Ufc5Kp*9=j;Y_*7OX_)+QOd?*%3cKXpcCXyN3a^ z((41u;)tK2E{}Nqh#$Ofg-09%880rgQ8432{M0<+tY<9sJjx)ox8s{5epVKTq~LF0 zGH_%r?)rB};ml?)y&P}b#C78>2zk>VLiZpL1(u4dJAXv5dH7r%pR&cv-toI4OSV zUH)b{v*lTp80kwtV;srj75-Som>kq!GVe4mb~vmj)l!F64&Z;rh>4n08-I6jYV*SSVovRm!l`ZEaL&Q8J{IRz)cW^0 z59?9q)J@e}bkk2X0D?lMNntcW4MW%?^}~A1u|0xgdr0bd1fns=w(tr>=R3B&sQfUC zuQq-NzjgO&BRQ`iRP9AZ4Y;PMg!}baOQbTvu5oSGYFU0dGop}dB;UDHrdI2}M5eYo zBOgs2xb%z692}8-6sLb=MEL{{{4trXOd;m!Mq!G0AlU>tOWqZJ!#_Vf@W)PYk&yv^ z{P4h^A0GH4Q-s4v%px(K6h~@d=7$IVAf54$x%2=3_Xqw2OA39U{duO$wR-f!1Al&a z;E(h@QbT5~Oc)exhX>dwr}dF0v0Itqk;Y?Pn(ahM(wP;QjUZQ-M@(vN`gs1cY2et2 zanfk^^{*Nj92#zojE*fymo8hrV&yT%t~&1c)hE!;E}vTZY6VA)oWMeF`dOJFBdc|5 z5r!kAP-&+3+SB87`=@rhYJMd*StZA+%;&5O2Prnw&)Y4>pElDk*zF44{+Zn_*X^I% z?K0i|h21XI?R|Dj*g`Y?f9;lNux9#~c1xU1GyN;O)!KA=zuk`L_U#HD7-8Y9nf@<( zI;?&wpiREM26KD)`VOh5B@px~eUEjX7|`CJ;bhuo`qx$?VFbu$xGm(|7$P}6iK4j%Yv0c%NWu$>>&_8J?A zm5I|E^<#dS*VW5dl=l2GuRnq^Z>X1fWAC=!R4?;ez0170Ugj;m%iLTq^VZ&F-c~R3 z_TFXQQ7`k`z03Sgz03kIJXkNY04{E+mw9LJwr;JLS)i@ot(SRM?|R-{FY|l7%e=Q< z=6$`(++HuUK!4s}FS7vNfAa{+e4t+DJ4~T^(CP>4W$w_A`Lz1`^)g=1J$w3E1aXd# zRCJ&S7P_|9UGC!#YO76tl0>c?f43wGJbe8Bsg8Fluj7?tCq*Zou=@DpRvmlH z$`#9(Elrna9_(giwp6}(Gzv2Y{iLulO&0#{LP2tEj`rF zz8n@38rH?EsaP7GG7`R{cr$;WRu|sakFStG!F)yfAsb&bKA=xn9U71ixPN@Wz1P%7 zA8suc0S@)EI%lf@@~%=b*`W}WY$xF&Kd`y-`|R#eQxH?DT4$d~4%xX()|vGCcEFXM z-mY+p6?h+5&X$9RL6i2ZDX*%QOi3K+xjt1)USr0fG#>PiIl5O{EKEFY^yG}uo=Tmb z7YZl2<%JqK89B<4Q-F<48Ms~eP%sI4>qPy$*^q7fs#NREiJ;9gz(n$n1ph-PxH)s? zP$GCSLd#TD2Qm8=v=w8n35Z#8$+Hr~e!e1mKm_6@fhV>=;2^%mL3~>DSwL(qa0BkK zT8O1~(0XjOtyf?tc8JNjz46WG0)2rHrCrrGz7^PzlAIbH>R%6NORNO&xzAtV__8#O zJq0VRypI(=%Qpu)A{J$`!E>XNZS5=T7gqF4t^z}m{Wz9orBlP+V=4&v65>LXjgdix zuamO*_&O0K2I-Fw^A6nE_u=>w{W!f;hDVa$)QPp53~QWHIFY<5k?*2|N#@w^RWb?5 zunHz&^M`@1WRju$Lvk^GCtgFT4Wq8Tt0NM=vV)1J<~= z*!!1kP}h1f#Me3*;yxn#;D}N2lLZJmX3L6@3`f8YC-wmE34j-ZXPe1(00d6wf!D1X zjJYH~&Ul7d5|S%N0oEMx12FiiBAWWYbQ< zTB;5F4zA_E5A~}}TI~ z55<$wbJVp{8;@|zElodY1s=7H?lkdW9OT7B@|D=u)~($jbNd5#_isxd)ECa({ZJ3P zV4cDSk-6--K;F6pE=dbr&?#yA+XIF0M*-2L! za{dxX4BPNiNa$L8@Mq3CFnP0TL*q|w*KRb5i8)QA)jx(v{GC{|s1mM8_Q`8cpXNk& z4;aA0mRVut0Yx9EPnIYZ5vK*^>)RHpg|7ln&fX!Q9d8mI}MS)IBZ|( zX`hRM-qD;qS*f4x^E;@nppM3&)K?WHlAGzT>oYZeyNPLJ`Ax;4n|ym`YAO}>mO3;j zOK#t(kpKlmy0>0exWMTU%jky^n-&_JytH>w#B)dg4$5obi9w{yW`Ru^++LELKA(o zt%eRCNUW7d>1!(ps~lw2uN`};(8hCi@&(2(s=rs);j@!_!u4*hli7N}rKNL$P2}fK zgy-tNY;-bvwxEZ((m#GYVgAF0WQ5azL-z}|VOF5JNt%!*q%Ozl1Ze`PmP<6wOnFq8 z(ME&eoXvm+VG0q-M>oW0$Gg@BNQ|Va9Mnyo?19}KZCI^E8%8tMuIhFc5#&H;`Z|Y_ z)ej|Fd;QvFVrw(fRW9L6M50)di`*sL-d4Bd{Z%kO0z2P+aQUz+crd?lRMYo1=^Q9WJgbtw4dw^@X}>+yuHY8uYCVHW6du*YGj$%tQQhnc zw(FshZS9jVoEt1eo&=3Giaq|BHdr4Jk5Gqh3KkjE0@b$m$-Z5<#dhI@FZ*-Vlw~Jd zO@sVxk2_k%Pojo?URY)HFy7H_hgXAHMs2h$+?qH<2KDnuW%*Ocz5zf_DQiP{gdxij zHzEwFMj2ytDpS}m}CMYPA#l_g~JUBQNESeZW#gldSg1M za)u<`hQVj6z4IETM(Z%Jz);3YoKi{LmQyMVbb9v^H4$pkH%0zr052VruyM43qRFv()XlDqJ@=075g+L-uCwk{Cx zv9+B9AJ^!p!Z&~m1xPuyNp%35+RtXZ;&n&~6QCwDn?Yta#|P!Ic0^F}UK_q93O0OA zz$BTo{ zf3;h~E7PwAvp9d#5)L%c4^PB=z*S6=QyN9sp=qeTjp#g}eNYG^(?Dz_Q@|B^^5!LC zAm#^4loCNUss3VYK3G{0`JF9$ioN=9`Lu5O$gJfviq#4%QEOrAmOxE>F)U~^;`|Ws zFO1=WSplewS-q>(!X|a%`|Vxz6b7Kn_YA>rT<;okt&J_5zFxjdldgAb_s#&~$!aLS zbsO($xC=mNBfifYFrZgq7$=19DU@2NV{}rprqm{T9o8Wv5Ra7 zh7NPJM~-Z+c0h1*-Q6CY9C$W7=&aDkZufv8hkCEs+CS7M%EKHTf{>X%TPrInp}wf| zVzq;|!+CK$pk*f3JzF#9g}aDxuS1BPpuN*TYtxmxo)Bo~1lqX*v~$%AYq4qY?J^2_ zgBIkt8dw;#6+xS42!ieb*|MG^gRIVc)l{PH7CH{dLY6%t>wb7vD`449$lhU)C02AI z`7jcn0wP+BG&A)T^?9h-Fe5QTlhCTq7MKV&F*=xy=ns^N9g+`rO$38hXcZGdOf>lA zphHt8tY}nIuJO?TzNX8ALly#UO{EW3l&M@JGFM#k1-_>rm15N}m~fSebdC#f!uwV- z_bT87jiDj7Gv0wr*)&W@kY~h~E?B&w?M^ryGB_Qh25$d94^Hf`Fih0pbS!X!VtT^K zS9@65Leq4@=@x_2O2O$}@xQlM_nj4K{ipWoDv+?7eUAa$S~cwD)%A5YRuA#&c7pq6 z12;1qyt+?FFn%3}P5$*L=p0PrPA@u)A{E``AN)u0CL>|Kh|Xd1Sm~V79!)l=bG>xV zKUJJ9C2of8e4SHPbYzn8m>!^A3233!o|4g5Gg*zr_1X#An+&u#@i46j&!s?Jo&V5b zE>kdi!VdG5J@7^P>JfTF*4VQ7a@t_E z9glD))(;rgap>X^F0p!JJ@hd8dg}$=EfPoPVW3C^bhW1k5IlpDY?%VSnzI&`})fT7VPpktrl2{{w}KPx7VS3l(_x8D{|jsP zr1YOn&YYZnPwS=C8WWJJ90iIOw!?>_K$CqXfzqLJMaMccD#F!@qtMpT_r&HeU~rCO zuYaA^@C+9IQCyYfQ}6hlY_!w>?%+HyffSrzRg}Lw#w-EQ5mKfDtJSEh`nvfa-)teGo#Dh!jCbxeU19 z=$q;4MDog#zRO99*?T6$0Rc{nkU_84lHjf6oy%|SgJjuLnXl@i*xpNmZ>{O)zJgDK z&JcYL0Sns}YCcx;;Xs@HJgu$8+D7>LsvkzH{0oi(P3FI%bbN*wEbhU4l{ri-2@||n zti@{Mp0D~bvmIa;s^v|yhWX~O3w=SlbXed^U8Z!)Et}hTNDh%a3Db`bjLaEESZYxI zw0U}_W7^o9K2nS@>LbF)2Rkr=3+u_p##c**_`zXgsq;q%Hd3$w2lT{-$4Xghtw-1t zSmTeYHHSADwfC^rs|jZ$!IKn|@ZJg+bu{!L7v?jCXErGV6l}X@ohgj`>rBxRpgx#0JPm9j=rA2?d$2t-}kPg(63tD+z zyt^cxvQ9bk=!l8mu6e z6?_!c21$E^fH(Wd4UiC8V{d3MV|}NHwh05q7AX4p{%UkuBC(d-I?!08@ys;P4@R9n zOrLyCKe{cwLqCMOu`H=WM?w0K4lH2~2B?YCXNTowZL5d^B!v*DjkO_5 zZ8NUtC)W{mSBs@BmY%TcTH~yrsO&9cs>6aFGT9{d0}fkJ{=jrOsi;NTLgR+S?=PH7 z@_Cn{SuZg~s+T|mZ!bBjMLk+(QzEh7@8m0T;Qpgb&hx zDdqDQhL{6>Nv=P(ifgFa9j@kBOR1V8hwQo0B{)tvTJ4r4=S7<+_C7wTTuF$4x8`4|a|WAHl^28}xDA+N-_5-rdvurHUuz$9l2a2dw{ z&s6R!ei$@s=1dXNAV_O&+7;5!JZwmVd$KAaV4kePUcqAmU6j;3&t4f;qjk}Ii_BVv zrnM7KuTEhi$1wFCPNIsx_#jWDyE=mIzHe$jBVq+wKWoSI2ua}C=44zhX!~1UXQ{{@rMdr{zDI3CX+@;(S1-)2LiuZHYo3>)v;+b^T&7ljqeC@OI@Cjyaw6;qJl%6% z?0b{g+oN9UnVb}KO`Hd}KJDt_atj2&`c!`4SCOcWKY`27 zFEL{-C)6iLv5U)F^;y@!QmERj%Sa99;`)Zq3QZE&M9B1`tgLb}BoAnfv*%B*YIC#> z-Zsac%LQ1d&d1K-nD;*3UQ)@Qo?xu}FXDntuW2DHk%NTn1AZ59u&H|p7N>3p9woh%1&a)06Wdf3=r8?!X=BSCmWJ4K!{{*M1 zl>_BJ*HpDHz_uR9(ge1USoc&_b7m3P?O`9ND+c6bjSN=_!dB{paVE48V_o0}sRm&a?R9I7h0d-x<`@{QCY7iCd1krgul(M=bn1m|lqF`Gm zOm?Y@=(-8hd?>y(T;YW>GitEKN((zPl&U9LSTa6IBv~FUgWu%epCpqWBuSP-g=O|6 zNk6`akH}OA!1H^{todVP5wN|6Z;&IXwM0J$2~14=x4l-#ng6^oPBST`ImG*0IT;O@+r^bMI% z^nm5VaZ8z$B?|49H+*2$*Ua&rdKG?@RI7j*0R=UvX>HJd8c=P`qvJPzqgwGM&Weto z=ZBwP97__8jM0D={x6G|ue9UInZ51gAjVn_geFHXUOmRn9c5<-$r%uaf`R^wc;}Z` z7<*N57EfM79g`Tcll>R3J~-Cz73fRIBG}Q~-_N}V3`Ck#`jot*o)_2q(xflVIB7Pl zBKAO;aV|cOClex?k`3xq+9p?lHd-`tj=k~_`=U<0U(s$b&dE!yW>7NO=hZfvRI9U( z_|UU1yvxjeM6?nzr2i-qQ)4~Kz%y3nn?k(EvXMFsP<9T)>x4h(DBzmk+R&g$CEQl@ z&94Sq*6APPe*?->s&nR$(**I44M6xp1a`52UnnswLpq#(()x!vsCPfb3{WTdgeeR5 zkCpk7l~L-4;$!8HWN;s_7Yx-uMx^TFay`aAc4#wHF9Z2j4KQS@$I5WKg6L~ismH7W z_?!xww?fua`#~|AQ+0lPLRWc@Eg`*h{dpF;*ZJwXdJ*ceajC<^-QWTioNRh$ty5po z`kHO&uf2r+dTrL=JgQbL4z`(qmw{)j?x1aIw+gNH0wu+djyItN?~#GoiWQjX`o;;n zbeDx*+Snda}UTf*$JK$wK7*Oq(<3 zJGz3QU~<2rCP3N!qoN4jlmgI&h!GHvD?QQubtOxAWAqnBKxeQ)p-@dNyMPNMFv1oC zL#wqhZd^MVjbloHz&QPefYWYh4|(yUsUM9=9G*5+O)p+el5}$3W<2o(;t958>t(T@ z|4eg{3|JXggW63mPC+r!irx6|wP<3dq%dw>H@ONt|bCx(6{30D)oijMa#tv9jDJ7A-egmizRg zC59+rLp*<5`iSxyFsMfQNqvCfCUMI2 zT6wc-gT-`<^P)T=yOCN0 zG4vCOKrKih)r$^rWZe+F30C;(w2VhdIsaaviP(pJWzn2mxx1&in$90 zZp8I8Q1hx3p?DqXx9k{gy0Q+)TD7X94D=6?n?QcbC8nbpVDEq0#=w1ADKi zAfoP?5ij1gBL=)ptzm6HQ^-I5tWm5uHPrSoMN}vV%3Ci$QA68n9BnKB$)Jw&v+U~C zeZatEK~e(bSV`|C`Tko)zJaiud>c-_&@HFDk64^s=#kMK{Kj7TLX_0#YIJ@RuV0+5 zoHcCnpMl{h4?*$j@H}7_<5$6Yf8=#QXsJW=t4`=6^E>p4Bk9m^LE%^yY7H8{rl4^` zS#wmH`QV!Ht=uq8R0w-NAgesQbWXg*A@FPd0aZ{n=ZCI%R&8gb?A2n;}yS4%3slPE(E zYRo!VHjS$yK;zAp`sJwPi!H5+T?fkg&M&Hai&a;^?t3n6WU{%idcbe2_vr^UY@oNi|ZK#_87ZhfI)4xxq zegHzQVB=ya`-Q6J);346DTL}j=(`N~j-3*7u`k&8 zuj}Jt&Bn#Iaa{S0%3m$Vz5l15*A(R~zC%%>wKi1XqR~E;*6p*4vK9uV?V(=wleYfC zC=bMngvuWxF2+`a-b7L)z*z;{+!(KKJcI>qdrSS}Lt$d=p9}7DOq;Ya)&1d|2(M~& z{)aa;)FT@0{_;TQm*v{@ftWcs=$O0u=?c-v4>W>LK+=J3xPw4H7?S$~ECZHSPxKI6 zgyelXRLxdZH`-DraWY-6*ZJ#nECwv=dVOjmJLvBx#;r9fc3;TI4_6ZcE?@@*A>JDJIEG#O-!58P(i!+PsPis4^J>gKof+fu> zrDBk^}R}Dl^e>f2Yg$}7=HmEifA98APV`F?-An)ZgjN?SDcfsx*@^c1w z#rf+sOr=QU^E+ZSY?)N3j@S>phI)QWtma5*72rwU1z2xF@HG};NB;6jk{9P3r7hsd zP{Qot?g10VB~=lPc(=%8m}o~`IfYSsoU>&_Lh8D7ed88g`$^rUD`a)Eu1nT8Zqk(~ z$pgAVysy-?35n{u{A|*tawSXDoUYK=19)cd)&0nN@|lKCvGM}7sOt~2h#zsQqqkgb z{;OC{i`= z@>qC5Ne+G?(~HhZ*gOA72k=f>{LSDcg0dPG-=I-MnU;=tjXbP+lo3_xoAxy<=^E%g z=yuB9+}L)CI0~DzwKZ{iovjMlX3`)z}4PW7@Zp{&P|CeD!2Q z=(KiTq+jXzN~`s9`PzyHrM{|C5)mCw%Wt2jYM&pfwRL+fs1^&3K&^AAh!Gp=cZ;ER zz*1r){aVj%ptr%225^2LU;oW-&9~`(23tV-SLNW-S`RS;yWx2#lp5DoSJTLH0Zz0F}4NQyN57OG+k zPepl7FCd63uzVJs#%v+RuVL8RYu+69OxN1^dJTK#?Bc5*kuEpt=rPbhY>H?X;}`8) zJ*`{&=)jMd7$b^ndpmZKrY>cX2rkZ#IXls*+kf>ZCX5MK%CEc7FcYWW1^m&t3Y8IH znHq@mV|CnaoPXvs_EE;|w-MGT>HJInDCJg5j68iFx56X07jcX9-{_ZfxZL!|Rs*XT z{KydI7u%gOIbX<=#<|f=dV{*Uk?Z8m)I*}8SLzuR?F-kvUQ|X0t;|v|Tc7OkGF$xe ze5)7V!r93M{sjKuh9i{EPR{3Mf~gDs(V#x`J5_6p9@(rvYtpysx2B9a>h%&Xx8H5O zr|wC@Dlg~BXI13vlJ~e}lvc4Fk;~m%WFFEWw}adQ72Cq1?w07um;u>sLR1B0RN{2Yd9~_(&)5amk?Q)nHr1Qm_kez!ZNJUF4N^m z!D~sL$*jz?EaB(~1N&o3^a39jrz5%$eC#n!O4Os|nHK2Aoz2*_9Qf2L^SOBX+{jKL z&X--qOpRYGUGuL0s`9lT{WMZNfFv=2o64?AQNGAyH;L<&Dwffzxzj4miHDR;P%lze z{6Nokp|o%&aVD!LYW;T(n!+>mmmz zJ%|{yk-^cy_0?S!zBC38lf&0$&D$m)i(k4|e6PS@Xhs8s)HJVlc-fq!G5Ln~eEFU? zyzk5R9QX4^XUwd`W9hFHHQQkHG*0(d&wc{E2WoXxeKctsTh(y3|0j~P^_+$J08k3L zP#aKv`s+tl<#WvxK=y!P!Uy52aQdP%Ou-}8_h$NmvQj7wOnYN(>fE+UE?;#G9v<`G6s-3mUc-&|n5R zsng$4k2F8$y@9fTA<9=Ufk_&7j4!tBeX8|^v zFlL2i4S%u0Gv>R4_Fdb*Gn?$s|5P>oNbSjY>`75~P=6*~pMaRU%{n^05d9u45B;vH zQ~zr`^sf3dmSNvuO}@F{+rENtAs0~G2at??#Vn?jocdS0{;pVB2%E>tU==_SC4b)<1lc>A{YYed&$XzoX;7x0Q8R57M`H{)Ycd5I%A7_r{{)AWy|!J*6L9 zA{G<^3(0d+@vV?kB4U|z(rup?wPk^Be>zmU5NbN>#y}8*zouS019mW;?_$g(N`EO) zpby8CJc6$+KP;a0rzYiFXVSGGElfDjQRJ^ZEQN-v%@cR$=`5B>YfS`MIK`N(qJkiz z4C|qV^mS^prJ)xcNndY|&eHcrf1QJL1=2Oh=HsH3w{(s-y}9!@{WUe(y3kD8a>NJQ z%xXsHaB{GX5r!7hyk-BvHatW-{!AfnX=-yp8d} zWP|=|Abwc|+cU$sZm}PS$SUR^#`HFP7`jW_Wp|UJ|74UYl#6CuxR@zbd#GbLO6%a^IKg3D zY~QOaGY2)?e31w9444%dxLcr&sW?os~DlHivg@zQ*$~h%B(s7qO~#b0Q6*8G3}(rJ~OC6 z77EzpzmMD>xZbbZL`NvB-`T||RDP>HI*c&rGyxu;uzp`BlccwI{s!$fb!>g=Kg_WH zJ@qIU)~NenUmckpT`T{CG@EP99L7riL0g6IF3~5ACc2cZXdvvc3OS{rqvTQOzC-1Q zsvaSNSamD=KZ#g1KK%cVSoQ99h}D3dPO%yuc8Jv@6fo}*$~vu$_u8Yw2$)W4Ix1`9 z{asDMx8CHU*2eFav<3MVtll~zYvYdj4Z09r)Y|x!s=>wlA3udwz$=p6(B{uRVsG{0`m6}eY1Q0dqtuUSHzq%)$;-;`?bM^GkZY)fRGmNV8ZsZ^Mm-|jSw7q- zKlv)kAqVs!aAKY;0?Ny3vR^ znHr;NL$ZNU;gX+Ae@U%tkiO?W&aY;PST8^E7i;I*jmf!>-g57fYqMxCmVbWWPiV1E zm)*p=;-bEi7I$)HT6aHVqRJF#p`trD0k0~HJ=8U(IR76c6~bt+&ReDPi(Ko~Em#CZ z&?Mt%5Qw4iH8jRJ|BXKhE_Zp3`Ta$HawVV|Rig(sq-Ormd#+>YMQ%(DXnrRX46iI^ zKs_MLWXRi=cioS=(mFfE@v{^#(*AyM(`$I z{AcTcZm^4+tVLllK|`g_i6A6q-<^-BFjHiaJW+5A@mYKEL#d=cq~8&?R>qt*x{~O# zne_YOA(f2AWq7R%-lQyQeLRW#ik{4|RF`;Hgn;5dIqpw@Oj9ieHu6j+c@^El$wj0M zR^t&>xBiG~Q`GVGv5o_Tb@PXAzH^RPerVu&fh*p&J^fr51GJ=)EFWlXW%0to>RgeV z0uU< z!BY&tD;z8DwLrvKioZKvZ2TdvN#RdaxUD!w3kz z9S6c{o^5{~+}Upq03^2r3~s1ra%mtII4M*;9?1I7116fq+h{1LQqO1)tj4d8`XR8> zgf|eY!TG*&; zO#f`i4AX|J_-QEzg#dSLak#b*lE4)I(Dcg!? z+d<7B;-ypkH<4?~n&Q7(UmI#B*Ts9|YfH6tZ`2`>Ov+iPNrO<6vA#HpBB)=F7ymD7 zj4e|j3L$7wu{(K5YGN25offgcypEB8((}1I;L_ooERpyk`YXTJ#TOaz`JwoQ4R*JV zJCinr1XD~~5Mnycg1QOkU*D+J{ph^9|MYRxogQJ`pL-m2%b*a+LJhTk-}FwCm^GLX zt0Wn8R4^g3PcTVHf~LCRF~R%Lyt+ep%~91&AfU;>&zKAx){psGinu^4bcdSEM|u}R zMOvY|tk78RLc^iZ=d6(FvH8sng+hO6g^)$P`b2o3HTS=)P%q()dL>%W3jM7WTA8DI75V$&mc;uo~xP-$Hs-E>tUiaK~V|C8z zSy92jOD}5ouf{z5H(MQ=`vPl38AbNl4R6elM?{M5UgD&?hFe%(=Um+PDI@RHSw5I4 zXO&DoVRsX-`zjwYp4m}TUueOyS<9=Vx;|%haZ(H>BXx08udA=B>v-4n zO~U?yqBm>ddd1TIH?O zS0C>29C9M#VtzHVg6-om>aZyzI*TcW?UD7-F6Kx2mjamP&=BP~E$M=Fdn#=VOup@| z{jbu$_RA(8`?v3X`)hymvB$36n+;4p@Uh3fuir1&yN_S@-|_Xo`_wC5|L*&vdNIAZ z?qx5XoV)%d`}QATzHr@3+XHMpknx4K+@1~mkAr#RDs_XXMXba`>j-`)u5mFmQ* z_$xy!N_KF(nf|GMv_XjM?nqV)Mxv;kduOh4mk2{rUToe-CkH~Biz`a1W&;dm z^b_kMshq+UR+d|g9d@GV!Uk%Fw{AJTtr)0gd)gVtl9OtH0u!X?wzV-2 zAyIpBPk1u@@q7^L?6e4VNI`pidK^vbQKR}+k05Pk2ZHrTusyrF0EEw@4O%%bR!SNJ zY%%oK7Q9cDwCNi6ppV-)w0nq-OY?@?Ni`r@<7k*>%iJ_j<$BlvUBZ0zS$Y{!aP2hAI>OX#J4 zZR~D(QPoH@25J{k)KKxn#fEtE$i&8z(3U9oh(y$<8%(y64HA`5SRVV_jt8)dys9uN zv$SM`JrVtY6V?cShDB05yG+O++g$0+5l@g=KKGJ+oL_`*ZbFhh|J56Bxi^|Y2v6q{ z&{q>hs|&hhv3kIIf8MxqyGN$cl_C1ppbzwdm1z3q?J()02e?n67h=?k#s<3^gPv8C z*(Qd|0OiLAY8_qtTla7I=Zp2Zc&8In>TtpS1ztqlxpwW>OweNH@NDY1DL{#&5s0aQ zW~74oz`*)6x@@G4NhBwyeQa(8^n*kbHk&lO^x6c!1qS}C$Y1{l2*fQwK-oqTFv&$zARcT+0@;r zMG1PHa9EY81(nOB4nt8<^q-X<#-yRfp;n9^^{1DKe!OqhwY{$sUQhZ5J*%L8Rkl#S zWK5IgH2t*1l0_;d61MWGS;z3He9FWG6_fx_l^Ct~Sr@3+29o}*DKwt|7=o~c7*6_k z_8e-|FAO0rgC1~gE%0YW{c9-tnpjW~OLRkamC< z*71t`4WT7|bhkvO`_#W;Bww_V;9@fH4AP)B${YCDgtS`wLTm#g&ICC?5nghaG5O8t z;?vs$+Dl;tH0R*WIxoNsCF9)$e3oD#8E(@*62+*Bi6oN~j?>@hx@*?IR3(T@ERJcjJwTo~Dzyj_L|HU>D3cv1gVCCNy;ghk+@p1WD)wq=IHtD81|2#JB`xZWqx6yqy+6Cy4pke+XYoK z925$Kexe`R(SXuGMz_pd!rbDSSuSB(XZ_OeeG`XwXW zZwYiVU%LNOMDyU-(BObeR1y#8-}SP1B=SeYElK3QA8tvXHm4C_l93bcCE=E|Z~MZn zW{2eQMu0T(`~T_V*Ei1Q*k%kbR&nwhR7PVzH#*s#J*0#~SJj`NByw~JQ^E1ua@>~l z#|cO0k9dy)N`?dxWwhm{8!D0t9lGd^>PH@{sqV6^8)KUucLNGMdAM{Ve>I7k2OAXY zixcu-VxGplZRBs}dEXGvEzPv7LPd&emfDXp%m>hz0J4t@K-5|d0PN=i@FFe@DdvI; zWKc^aQI^=G%690quEnO23SJ3AI6JsUj&`@-RA{pU5@B^%fr!x!TyMPMaUak)=sM~!!PnLF9XrKNwkUd%2 z9UUh7+r+e42}iHpE#&YApxxay7zOPfOd}h-{uJ6>T3@qtoZ6E0?A>QxG-4$lhsH;- z17Oqkwyy{(O#eP8O8VpKo(8qvP-=ZFMzk3=eIi4WPei+tY=L&)A_|twd|JD?n)O!Z zZmWBVI{VfJp+7$JbfPvR;UClw+GdJFK(g5ioi;*HscsT@x204U1W(o3BeWg*rH)Iu zJQ(0o7!b_lfP`^$Wk6s;FJM5hVkQHE0`mdn8DZ?wM;h6eX?uK^2|22p*JHo=_45PLE1*60^U ziPnM?2UrE5qQ-|lGKmx4|99QKVzX6OE%b|U6dZ-BOe&MQX(H>V3CW+*YxQxh-=byZ z8)mSnk9`IHVWztr^oNVbpfQqhVmWKXnh_65;rV|^6gHuX(wYV&#h2TxjBRl83mC}y z1IYRvWLeWD3l1tmbH65l2(#fy(}CCV#DK<=*epW%TitdPy+4%1gN1pF2dOWZ$0o;D z$kl`xunA?D=A>o-4@m$N!${;O8I*;|5Zwe-pnOY1;RtgEgOzH?AC;>~RDc8Y*W}#; zGZ;)h!>6GpmJGGoDLI7Q%Z&jp`f}TlyXbe2kAFbOeKu{NGGoUmis)1WlPI8oQ-5ku zp?(b`YfRqcL3sBZN8TWQhM2s2j(ZM0AIbYz@D~7uLI=r^OpzfMfOXZlYEW>tZOCyFVd5E~ z;!|PupYPP39Pj+8eDC&gpZVW2E~CbVKo;y$9N+r`N+U5oC}EE-0?`bmKn}eL-c>#w z>k8HH%Ry{+HS@l8>EPpG+Qd1Fu*a~Tj*PdQnzG?+Pz=GLYc{^HBVb50B&7p9r2aTB zYdcP`llSCei%IiOi@GQj2hUeup=9SvFljB2x9wsf%9^4;^j$G)~fzhuJnL;gpy-c<3p_~ zeb&i)+5`R;#y**EX`+w0yA&xi>7 z@-Z=+$lch@kn2cfEREUx!FOR0ZTry%7_aJsk5vJn;O=eh{x^hXAG+>^bYh`8HN!Ah zIwCUbehUr2}yv|y$XVkW?W$EXbYh9EVmGFXU5 z3uaVzU=tCr4S28z-;;H6o_I92Z~Z~sv8oYJp_T;sHT-wpoGr%|K1Vy!J-3 zMW!|$i)NWn)@ar#Hj7HM6*qGgbj&U^QLJrmD}wdW8*PGcFKC`-vr3sj^5}43jX}LP zn&qAM0jFj0mqDfPwJaR)<>h$) z2H>xRV*E0^a8G#VM6waLCFRAd-;~L(XBW!0#3;qY(GV`zV6?yAYv(2mQ2XM-vvTIZ zv|O5~0dg$jMl`1by#C%RKb6XfUZh>DWo%e2X~aDtAq%ks5_Ay^zt090K8e}Qz?uY) z-y)Q@0l_6c$c^P7ZFtsqDyaG{?9w$oEBh|wH#TYlfz6XR?HODlZ-bCciWE#mNx&q{ z8j7JN6pH!{Ga(pL;#reO>{9T_g!qK-?9~(ElVPe~j86y~Gc;zV`E3|BpoxT(;$bBJ zAavj#?30qW((7uaZ2+t03)#4fBO#O6kyl~jZ6zic>%jU3G%4kOA(y^$qm7`)h%w@( z@wjk9hZn{Ty1INxs}Q0oaYqdA&{lcBtT#bWQC%#1EFf+iFai={3CTl)uq+tL0fDF0xh4;uOZQCF#;- z%U7&C=Gay4r(HY{PYbTjj&C$IV}Wd4o)jr1iLUoriC)X1MTyT?iQ`p#fja)dN*uRH ziMfwUgZEk|En0b{l~}$=9d9{oiT7HGUJ;B%D|a5Y#GhD+#d`Xehppqm!De-4k;*>>7e8);GhL>Nt zORX#hk2hM0Ud!3VSUzASdeM4owFFq4SxRL16)Ey}Af8SISv*(Haw!7};0w2fD(xb43dUsHoD8Ev9b zuC>XOa%QxLuH8$_Y<9!mHVJaoFDBgAYNmDZZOR19tNr`-GT|Q3ZY*@}wK5B?-Mbf8 z*Fs^T8k!bn((hQ;`w)S0?=uk#;!s`ZEHgbRyZ#Gth{9~-cSg2L%RIyw3QxWAws!Ld znRZ!YyMFE8M~Ep4u{YRym4K|LH;gBfkuP15bKQib`nW*7Wo1-cv_ZYHi<8s-&~8)7BU;(;WW1kr)K9%(A1<3gevCs-x(sRB z>fKilBWt0-=2el3+dYk!jHCXt#@x6(4GptoZD(jpgeYR&hd-z>*B;hy?q1^0o!0%G z`p4`2+2B64Oc}#o%L3fHx(s;eC=JCRULLxq-oW_X=gVJq-wGJX1_K9v!x9`#2M54; zu@Q_x1&n}(aa<}LFi13bU|GUI7@IRdQoGC}bx~F>tF^H5Q?tf3?IGc;J$!IGtgsE< z8+!KY_CPo8au7b(c^2>)q8t zo)FdX5Mv4I3lDMDYZ{hla1Hae%aBZf5B11nn88eztH*hjEZwVk$Zi(VWa$vA1)f)2 z0H~;0;7T7myo4$1`apt1RV0XwW$O;?^pq2m5E-^c6J5uKPx;{?A>Ig(G|{K%Go0+F zDQZBo9HuRDPuT1QlBO@9UF@~@$~F<)d`ANaCqh1`61WeI$J7LNpCwPKR2EZIhOc!= zce;fTmLXNaMp8ZI+gajqS6w-t&^uy;xx;5Y0-j31AB z;06Vn%c51VO6T~PYTEc>4U7R-%;YL!=m!-3fkkUIvN?=%VdrL15rhYH5r0H z$YZ&^wZcfo&@0;m+r`t?@umQ(y|cK>DyXWkJGKBP{!D`f88?0O%Bw>o#LUQ7>rf^9 zRr{R*f*ped5(Hm5V4KKFAghQ~%n>6X*gv6;Ss)Ee8}zW>pv&TlLAPF?I%@T?Ff?0$ zxp7qhb6K?z4SWZ)VZo$N7Z{`=2v9>tepTTN1bGi_=oP?Kst}G9WxAh~-Z^C|^%B#-_sU^xV_cNI=drd$A=e1r;%tDn*c$p{dCwF;LxI&;ETCxbmEbv$GhA(a zD9$qoc{m!5AO_|R^2Th|KkY(e7KtOF(US!wUuyk`S{v{^Tib~OVzD`k6ojB$%%=-> zl@Jd{I_EN>#i=GxHnvxG=F1F1t$+Sp5=Z&m+@0jB{ao@3`Op1KHg)yX<~_4pckRq} zZ`!$a^Y*DN*{0d-lFgfT?BMn}Q!{&Z%$|GhmKR?3f;~H5G`(r}#Hp8L6yCHmyX2>) zr!UE_+O%WO)VWy{rO|~^6#YNH{Ni)%|NnjMb7!WeXVzYE6@RyGUVHlHP1Bd{T6@{n z*|nQ5pW3{A*Phv#wOglmUB2nGbw7UA)aET`Z&|l~)0vyky!4#4XZ+ZfAAib^ZCSf{ zdeiJwDD{GwD>hBfzF_mNowL)MHqX9*KJS=WJ2Sm`EqyzEdghEX*PnUDGk*5spL)*E z<`-s@&wcv2*(Fcgx^v4#Q`1*$ota^PGn3ckn>X*;vvc+tTQ142*fTSm?VO@_*`=Gd z?syvi81L+^?6RrZY?GJEE}h)tO%elh=Yv*RewPt3r%Qwwjer~pg?@!_Ti@1tDW@mR~S8d(3LxgP* zoSvd8OMe~B@_uFczNFgeT|1_t8;frx zH`M+mQFMrB!<7HR+fw7fT|0MNWALo;)^xTRF;&)8qEMC2@a;X+aR%2C9~~vKotv%@ z1g5XpG#f>OeQDID?7aS452NTT-dFv<44wtr(=>k7uI*Eq3W;U97@hhq<~ziAsP~Fp zTee<$jTPtFD|xrHeD}gV)5s3VlNpyw^D4WA^8Z&^{)(-1A(R)oYf@;Y1d20ghxD0= z?xUWkmi3hIdt7y~${qb=Sy!hlo5|)&upN}2D9hLA#3iZ8hwg#DiEnMU9_m?~}5eBS9o8+PthU#5NQ%BK?p)@+Z{I2Ac z!+v-n-;qsgK1>e#Wfbk>Tgfe#MMnguP-_(3$+s1pOr}&8pczLJd50hPqtsK$2$MCB ztDXyn>-8Kt-iiUelJ6_L?b(gw-7*!7+Fj_Kdw73L2duoCj1g1v(yf>63F>S2rfK9o zHrtFTN6ga>L+>lp^Aptb?`GBR*!n`O+UTrS8ttOp1N=LVf6v}CHGK_+_pa%m3O3HO zc1}Hg*X+;k+Bwzv(p)mD&u&8|Hl&kegv_v|#&DVv#^$}XRs z-92;e+O=DDZJq&kYs*U4nz=PwdvL|3&C|P1FWB`3UfT=G4^F>)_KF>+XOkGXFWNMX z9Jri0k+oYkX!D25wqh;HT%D1vfGLOJsM!%(9E+WOB&se|Z%rjs3!cAv9W!<_nE?xV= zO*2zxpLN>0)6YEf^fT;}shyW?-8luAcTP=j+VKLqh^aiacFWY}U0bF^%~ABd(KNb> z>v#Ak+ot&aUzteh_cL}fzu3AZo4MwS7w+1TtzoE_O2XYZmPSi>|8}lJTwlAy?Y^S? z)}6cI*d6p>7OOjo?xLLdzIeZ56Vts=>6dsXTYRCqc5m7uGdD_ULv21Oz}m5C`_!2L z>x^}$pKZW$2A`mf=hFtF%IA{IlXr^xkw-IAP{8bz6p-0HQ&;Ssy(ZIiL2!0BZQ06< zI@sxui@)5t=ZY8d(d@2W*$!siW_n&qF$&D;H`I8|?x|WS=GHrQ$Ut4N)QdEQ(3IeR zAVo|??A*2UH2a~t=zT?Nzrg+T`1gzaGur;;Ec@l*iQ#ou$N$0qqeD;de?+)1^1nvc z|C;(=y~X}GZp6)`Z(tx992`o9+4elvOyi}=vcBa@SHvrmW0T`XPv|>w@Z|WEcw2LO z@_UWL7P2x^85cK{l~Gi-N-0!IrGbVL zQqj;*TBM$&Hg=RD^*&pEF%p65B|-oo7# zz9-OvYsIx=pYS}zbrX7Uy|g~USKK%JcdYQFDN~(Ya(C|BwJdw%=8_||D-ZMX2^gAB z_4?R+iy$FwXyoOcQdW8BjKLG~s?|9=2_m8-vZ{{0sqJ)o2WOXH#=K+4W##zz1%)J} z3{6b;A85NTV3fChKcC=~sq@2fH;|(I>w4eK3HE?ysml zeUVp4m?CdF&34wl(red?_++R`6Q)kUW>49ns&mbiha#iSZuC=H#)Btl;OFD9TAHcp@^~FFIfAl)0?%X~8-l1> zY8kIGL7AY!uP@|mon|B;DabE9#nuEL#4n&N$ukZw%Y(HrCd}l~A_(#c@LA9%5rhQ{ z@uoafK7ufxtG$t)h#sFNzhK%#x0#dq)g-ACGe1@jR*7feLo~f~oublx&3rc}2ucc?AvC2~w#i&4S&9?F0m;+sfMUyNlTK z38sFYE+~(mVQ+*N560&&W{&Ly|~6PNF-C6D4AQ9KBM?# zx(S~eVIJ>9!Rdl3JmTq9a~U%UCVV6d)FleO@@KZF36ylF>4{?0%i!rnWcUfjOCA}OkXM?EFtVIAd|W(Z3cdYl^7+{RgsrB_1QIv+Fr#sJl-={oOB^k-5Hb zN8^o~A|zGQDYo|BbLaW_2Q${KKLA-SHFk78?-L=}+6OaIGmo4;TX(Ou?|sIK>^=L= z)?K=Cv;BeHmNVBc-?(Y-?Bea?=f659_wcdfb>}Z%X(dTY&7Jr8%df%Ih((V(L=_{W z#p2v?bwE~ zDA=N%t9bkFjX`IZIdl2=#fX!%df!Dx8JSPBvdvrX9unWs*nF$)e)q3I49#CDy@QZ$ z!!JwVC8d>%rXJ)`6iAcB%kX0fS_FLpADkfI<8Jo)3?MVM>_5 zgBRk(ic)x-`DFRL`Ea~a!mb2syatRN$n8&uoG`2kTy>u z^#p%v6OW+u6ucm>G5>UaVcs|)1^gU>k3edMw49)%fFmJw4e!A{!cqjCVnSN`L_T32 zp45HBw0=G;O^p{)*AY_B;$`t-B4`xGV=x(@FJI3SfbkVC!jPqCio&!2#dqpOlhw3o z>QVcisN?nrXefLS(8TF$hM#qOB)aUPf_PdzI;>E3U;#`!e&6#LLHy*_=|lsTAa z3?C?q!K)npVeN#pDMTy-gpb2v3FEN}vU7z@1q86ta26dV3ZBV$Gk!H`EX@cq5comJ ze1bT6ES!eL;t2eJB8a16aX1s0Q3yC_RICCH562%M3`c_rSP7gY%r}4ywE3}octM;3 zIQL@VjIRJz1;_(cJP$NCADnGLR1r&1C=P|?a3;VXrxbat9TtAZ7mvmAV`pJ;e8T*J zSe$?mpFK_%=wY!&qUbO(j}TT_06U+6!Jq8f)#*hdZ z@uvJZ+!j1m1j~mC#N#eoV6Yd)Vesp)0W=J67!E_g3WBEr4n`&5T?WU4Ex=L9BG`%i zGD4boZKxX#HwkMElE=YaM*MJ%C)~M>$KiOO-fB30Y%dZU78YehA`t^rIM4lV0h)YRbG$NGOs9fRyS@MnwOD^V5+w))y90~o zr!Xap#Y$pD`S3g!_)%q~kW`_q5FQry8hGOcD2wytM==YKJRp^UheqYW2w-vj(DKkD zuz64(0qpuJyv&y3#o;wU;21s-2-Zy!SOF?ad7%K1IrKJE6c$ba;q-ZU&^Iiv7zW-y z40ak}7Q|yTaZ(tN0fC2~AIGOa$OkWFf-XN+6f4Pt6$7dyCPkiLY!T!!Cx8U_BKR-? zseMDs?4VHCMuX-(hKBY$u=;0NJusM=R3e59ub?kL^e(yt2h-RKP}s~cSFy3nAq}m| zIcs*-VwSzAhxjd!j`U|V_;BxS=0F_U+f22FeNvnkBghPcxd-@YuW%P2Y%eed+T>!qAdy24-NH8G4 zsy&Vt2y1Mp4buFh#Wbvzbx^tJ;fBspNMRmIqlbq?#ejA;!X_*PECICGu%!&oNj-i77(3s13wD1oFy|<38u_`xFrapgUB(M!; z0oJM?%8EBOW$z_m%L&^LL>08nQQ=@SK#KRF@`maoAxFeag8DInbqx%3Okx>9(YgkP z3v~j+WBntM?mQfQV=^{WRcG$)3DP*l8|qtfWC8T@fG(1`EsL%@hptt4tTU4=d~rv+ z7Qngc%EE=O%m>MOF8ezID2(=4oCk${IRStu?8g=M|6dOO9X|nF{L#6>fn4FBzX|^x z{(m+7@5<*+=Pr*s{BQAtx$6IS^!|=MYsbqXiu%udF8WN{Av+GGhjOKdafKIfg}Kug za;2kw&v_922u=VX3UlLg)92&&@B=F>xM*zl0M2h{D|bapzCq!UvV<(1Y@G^Up0$ZhA|H zamdB!qlb

uVBSn( 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 CRgz=? literal 388835 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

iiqw#u|76enBh!uH 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ℜP?k`T`T!yr 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 *^ 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�KlYEjuymcNm#LyISv>6Cr>e-ofc=eFE zqN-3Wh;FW`9<%z^pq{WX;y~dEAw~yUk6Aw>`gLl7=fvYV>GQBA1+HUo?NSUS{kYbI zbyc_y``3o`Z95MGKU4<2kQco5lEP2wu9RVCgFl{H1_fmhjX$(aoH(45{0Ht*@mKAz z7u|M?g|rO8P;EGmf=_N?MM92y)Anw=dPr>V9vP{JZ1(Pv$TSZr?A;^mEF9k!lXj$& zm(Cj%($%|CVxuAvL?i4*#xxffX#Ux(v%+JjE-g3h!B&^ME9$?N2^yh?_FqD@?cN)4 zA`Qwpw)kufFG*eF^vhe)+M-nh_fdH`57N;o=FV>xWG4+P z7Z9R0%z~mkIUzz~>rElKI?4~s9Lh;5+miZNnlbMQ;(q9CUF<<;57dnL$-x>I8?RhrXGo>re{<@2oid~Z~~*h^AZqm&g>#7PXVjrLF{4;>IWxIjcz~jL~xmtqF zmc^Z;pxN|uI;*j#K-A zQy=x5ofUaQ8FX>{EOaOIGw-rqG*J9K%fZiilS*{8d*YN$-60bwBAumCqIg$VyD`UHw4GDN--xV-*|8Km?-MaE$uwNw{Gc# z3$Ai0yn)38Og1N8e0be?OYQS}=~A!yo&y)6Y@JH{ym8*r;`w{1;5bgpc=8!#9r&Dm znca^}p0~7cewOZ0xqshR&iu6NmKOUSPw4ZxrS=6L3a%G)Okw~spVP(TetQ_e-9Y-thWgmy^n^rd2Hv?GNtjB${ z@++bG{il^Ds0wIhwx73tRWD}iyfux}uRD#rSC^JY89lI(O>0G1sz$54F=$a&eXaR#>x8ThBTGSb z)*Tp=&7z5D!Ph6}!XEE8$)?l$_MmE|sP}LRhYs!8fc~@%;ulz;$VF{Ma?GqZGt&M5 z8bgxg7q^%F5=fiO>T(O8I@aDqVQR@Iz1Lc_HtkQ-TL`=jc0e96?vxKUfs{vcPLyt%l4}#r$dD&rt=iZK!-}&p+nA% z=g^zpZGC~9WOIJTZeA0YHG|~DlQAokxYumLqc&tla{d|4%6#`LZV^$y5KGApi`38( z9ZwYfL6y2B0*4#dFRntYjn;ay615bmbT_FELuqmUr9pXaQkvW)l*z7Sml01-=Zy3) zd4W0onGQcfWE2p;W&q;%7Z9s+#H-{VC;=xLC9A+M+t?_f2Cf8Q(ZCJ&?(IWK*+Blm zvS!y7P;N0qlsFpRhFYkQ=ID{~!vr>KBQ@CX%1C)0IpC3+H)0AnN*%Yam(#e8i9`k`ZXMoN9(J0~pUKwkg z$;^*Y=#;(u!suT9jrH<_b;fHr#&aZ%(u06S&te%b>m=E{NI{-yT~xB>Lyo*mx**kp zO!46aChOS!<7JAdwjq}XB1lq7Ro?y*<7ZXLLIUjB_l>@&P~qKi85mY_qTvXGD^cZH z9-9<0`JCie++ht6+pY!{z^ll;XPE{Tm=#J~rGG79Y!gfR4ZfAl0~Xdb88;<&kRl2T zySA(i3@FCzl_fJLCRG(C;Q}fav5l$?bS;>n(wm`F_;)rw?$|IEave$kO?|iuIjLor zIQ_6hZ-O{-{}e5#bQ%0iSuhOZi={H=%_l^^YQah2oAAuyXqoiH>HTUQB=POBvV5rJ zm?+&5i9)geg)Ie3N0EEPH})tkADKZzskVQlB{|Ix z)HAmZpr9*r4muYMb`poo(mF%V$Y{cBt5_PW1#HddD|JL;mn9145%WsE&>H`p+E;mJ z;}lM#f#!!ujySXrI6W=4I%xjm_6}SukSnGsn=HwHn?w-#(LVgmfi%w{Y}7tu zL?grMUqw%JlE8V4|1GDJ##K3HWJqFis*a)tsAbC7S*f&jz@VAgskTF9+XL@WZZd(+KzVsF*1z%U&$$z|lMvv1C^%z1pLb_1}xblQ!&r_n~+;c}g z4PV{}h|)$tz19vr7Zq~S&<+dMXWrVVQeabd4al`c$d+AY6Yhtj#EjxS0gfQWBK)}X z{jq0|u9VNnNF3Gpj3kIgy+iP3Tz8ej8{{I(-;d@zqnYDM3!^DU65_z~*8-R73+S>O ze~$%2FbGUA_#(%F29$B2u2fYx%(nB>B%Thgyh^w&MNGU5VM1moHtY&+^-PE`ESOND zGIQscR+&&Mri)0;CbK2`?3c`tYv5{y4k z`o=(STLPpSM8u}?-WL59SU|39+0j_YBj&Ks;>a4rx0}{4nq~Hrn(;)k?NLbl zfhn(h8cEE8!%*dA60zWuD(%BBVgcipxrPEbHLjS(yU*6xa_1$S|JpN9!8WGBjuXRt zA;_TPI2cyo6j-uT%50&ezLvy-k)DsCK|VGl zuj^nM(-{a88$O3)sl?AV@B%n}SkR2^l1 z_gy)w8TwsPW4K}_bJ<#m#8u5?u2C}MYsk}N?u3O=BGFXZ-vx{^lW|m76^6m$UV$*& z?1W)Cx%rmVxCzJwB-_FYg<)vX3&XK9otF$T;^qg0p;^1{&w}&+l)C9$ARTK`OvASsY5cH=5lEZXS-2wDaG12_-AwA2#H{iSAjYDOQ|C1p?dzEwi zL)*dfw-wYMY7UlvJaFVcx)yZ5Dl_^0gaGF6Cv?r^%=}n6b3;JBP+YJNSzTLuEGd*9%K)9zQSB%dW~F0u$CX(65A5J);4VJt~Gi#j@vZu1v#@FpX@kinNhy? zhSIkdp9>r{X2s>t7-;ZEGUsh4f8s!71{J3d7f*d3R87<8fQa*=r~~@PMd?PUqw=Ej z)S}OJbbSF_31+SL229Z`!2Cqjcb;4a-X?#Btx7dz)fTV7pSEU~HV97xkFFO?NOjTf zMd>?*Zd#u|T|>tjE-`qq%~*e^MtO6(qQ|uZubXJOwDTJR!;hw`C)`+T{Fy15Jb(Du zy-;Zsll*@!4<9odfO1$0OpFaTwE{; zZT4b3V-1RnKlk0~7Z?B4D=sHjYvjNIvyCXxiER~{fKHr(Q4T7t;WZS+6lX!cY7{P1 zTdM`|r6T~mD(O?Lh%{6yBrWlblvWC@5o*;@6CWs~z7fS*t1bKDrJ%{Fx^6Aduq`@T zVJqb~qsY;OP^}Un;-Y~e9P)jQh~dML3jE~*wRv;IUUdFvF_Om3^}IE<=2m6{9s-6W zReJdVSNSFe8Oy&gX*qtZ2c`VW{8;x(`R7!+pzKvij+zexY)gE_AbNVMBaa?@ztB=a z0u+7ie6^pHoR#+TGKa;_+~o*za#GSzS(B6^GcQB;3+rzhh4qqtLT5bI2gI^#o;Vum zJ7+=$j)XS}|8pi^jY550s}trIk0L^QF`f{%4hY#-dO~=X6S7-_kp1*DQ$I_c+DtG*o*O)*gQZTulAVu z14kX319eYK6OiONGdXza$1lYi=p_mx=wZ5MEVpz{)az+&m~t|; z#l|-kSH@abKGq8s6#Yl>DVyl5B39zge`NDTZnZ0bmtutCvg6FkvRIi>mN;&OC#Mgq zZPzSMJ6k+d$0VD}X8H@Qu=-GLA{w=@mkuE9^U876wDs z(SXE&PDRiXUsvf;`qr|Vt^I(7Hfw-^p)CryZ~&BTKAAQ#=L~gS>%*d}ubXIy7LzUf z#92~&K>|n{03Jp_bdr6~@~*l!?`n7Tc%+AV+T-i-a9F?G_dDxw95?>^r2vQj%DOUN zuVNn{oM`A*udA5zU|^n9h>hbc`iSkR!#@V?c)}}qA74u#*>ZeIzTDr`(;M+Q@r%T9 z2CFB9ypct}l{|B4{zbjyDn=+vma+@3+T>^_Fv(zLn+$Hc>={vG>tXEtUXsv|YlaaH zMU06x+|Belkzw%x(I*DPW&uI61b}FGAfSG6YNscDh}|SK_~cx@Vt9g~lFn}uGox0^ zVQ{r>8SGl9^}M)%RNuj@`jZ7_%j29wFaA7;plEJsF3dYPzjGB{`8?zm?4RI@p%)&_ln~euc?8^)W64OTh5fr3E+4&mT6- z{RH#9^^FOF?HWQ&<803pFvud2W`>qO=rV4L$?q%fO!Vq1=(d1=BH2~`)Avzta_P@r z*lUvuLzA-hQuA4xij3|mnoTYxze`_ZGB(35Mymn_tL|*>d%uXYJEeF^ zqPmHcU*?A37kl|HazJvQu;F*yKYH_mYHw$0W-h8^1D#+5NQ!>a_A?+Wouzy+Bu2-sA5B^w;})7{=be*WaTtr_%Si z8|^cOr>19S2jK%BWY^H_;RQlACCh_UTN4H)`&g<_7W_|z1|{#E(wH^`O9M=~Kv=H? zrVCsm0G=^`HE144&A+Ulp{DTVyZXA?+3zp4@!S2gcG)b?$(e}li*xOr*iI7T-u(cwASG;&lsAc_Lg8{AwFg9y~vl$mDJNYg1L&Z!n9M=*IP zkbwGRg47fQElp+0uQMUPUYt*PY0PCq%98MA;un&qZ6XzU>uH;i&KwybfieNV2VN%s^nH}B6He%RHe=E6&)rtQr;IqLObph88h%lecUjJv>v4c zR#0Kig6fA1d!T}*qK(o}vYz#Ihf!=+1_?TndPNJNjgx!>>Q*}Y3=O#18yYafj;vEN z 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

uVBSn( z*)}-#KaM?twauVmgjHDSE5W};2#Oo>DjK4I!Keccve|HG#Iqgb7Sm(G&~_*wKplBW zu{^N=&y|f&2Pn+00@{nAPcBy&**npL_FpJ{JqoZNB&!YZfqeu6T&LWjgjn!bWFQ-; zdsGDD_kHx=8Mk0Z3fnQ(8)C%lo=888(DYZ^^1w)IC+5EAlQwOHCCM#2*z-*B7=`74Ee~- zUaRR^hPrapm~=n3_7# z6FiV}HE7t7dpOKh$bmJM7LSy0kZd`7MDpl-_QMXv|2!Y)t776nKMAfbL2>R#(Koil zQ8**Z1TX2B#NT9~(^!5OY}3C7%VW(t3OUa(J)l|c1h8(3j|FjodUJkQI8x9u-!B$6 z>LqL;1TbG_59mZgZvtdxfQAyX1h~Vn4hg6!*^_So$W=m{<&Va6OQJ;ufx|pFM$?vr zf=fN>^s$KkPzKISWJ+^|eA#yjeBEijr9vBuL7MExZs@o72BOXz4^zd2nu#y@b?*hjL zVmNpl-i&pK7_?{j9dBc54tSh=cOf5I*Z(fx@8vjrpkj#baMX~{IP`^ei5QoEMc*d}LAR zANGS$Ej!#sa(YBe`oH4IHUWlpc6WD2a|Bx6{ZmGU`bHI$i}Wt=2EwRHb7#cOWF&f_ z^FCu^m`;;4JsP}k$Yn3qRG;N9&&Fi+3$E;=BUu!5hbUk$i9iGOO*ReBp~Ea=B3OBK zIC&w@NytkZ&WqkKb}saFY+3IBUv?PZ3Y_iP_~`3cd_{v%_{@m{w$$uAoFFUTuvEZq z1^E<*%VBm}b|&U`?vk3BJE{$uryG4U*#Bim%UAIs6chY?7S(+7}5Y-p0N7z!dWG*?ZVa*c;o31~^vLtB0 z>D94oj9C8rjxYy?13e#C7GHjB7z7ZN7s7@M+40c;(SCF}K*ZlVfM`#@1)w0n5`ZEA z1p)E{Bm)!xC<_qbs{=&sqz4ey!-Sn~#SU}iVh3S_uLAW&<>>=N`Pg+H-2vGl?w+^U zn21prQN}xvxj2Mzjx1h<*-#Q7vK6ZVM7*=h7|}0TJscKxXpR0i$=qCEFt33REud=z z^if@`0V3J52{|*Cpg9L*4SfLZfo{04WXkDVoW8{AmENhJLY5uMcl(R;K3AR4dOTseh-IXo^Xlq<;19R`y! zg*8_QL4G6yNr32GPz8wUUIY9gzRmzdeTma2IDMoU;!$5{2Z-`N2Z-{$1c>x%0|3$Z zR|fPDohwc({1X5X-flMh01&0$0*L5z0YvgS4G@)k9w2J(HSG8!Ko801EI=fWO91fz zIsKx9-A~E@qH-$Pa40{75r1p}ac^mC(GFlba})FT7~E2=H)EZDnE_=W-kjNxP01b3 zCI`pE@j&*HhaKdm0%M~&t8G#tKWgLE0FjJ_I2zhl{*K+>C9=vGxmH*NWoQi3WNu%_ zQsa&u%WECbnFMq=V-4s1?FF7uyM1EIpq^cat893~fh8mE_}h?<>imG6k6q`{ONz0K z{xO}Kp&aNuQ3yR#^cN@39&UUk$0E!ANe!tQ(c%+FYYe@f=2iopm?W1ahA z^N1#cvE;a7x$8LxXrM7}sLwDDn~f#IegQ@#a8tryih6InG?pne#bo0PeK`_gp_4@{gQHVZ$~?&)~^A;T9YK z<#6__MNmFk@Ba>;TTjpoxFhxxu#RDgh%Ne|FsqKkqmi%`Yd^(VBQi%FH^u@m?!ct$ z2Ci^Xk?{7!G9qK+V@D@4uLFQ}F4L`zIrD+851msTGDyIc40JeW8O*XwjLyv>jTwMB z1kGi5Sl6IAgAX8*HD_%;%s*Gp{$m2GhQq6Cm>;2zBl;AR5T{ErRou*D)WbVeWowo! zIqT!$YaWKz&LfIvb@wq5+`S3b4?uSu)Qz(aAF_wIGiN0aIN;B)1sje%ng$aX!LCuT zrL~NSp(lceqZ2*aC7RVH=ro#DSX=}h@FS6y5DsF6fzOd725>=j74zdjD~!o9!_WN&mIFrHlq%9 z*aE(zFnWHl(~ymT6GxoE!XLU4f^8q7MQ|=Sffor`3egQ9kWU%#CjjK&dq5bi2hkpq zLz4s7d$Ptb&Q&5{)*6G83i${j{NLP; zgH|a2;$EESp{s93UX3$s1Vcv)V}RtyRBL1n0F@g(J`OaIpvtBNM=@fN+cDE>jLx=> zAPY{&=(s0X4M16fPGhShBVY^zL=C4Qg8spXg_FL_iQ-T91^fnec+&XeEd!%-A+sLXV%YtWmBu`WJX(rue&YV-27^(w zSyt9R^5GE*2E8aKhIQc!3ZPq8hAnZi=y*12P;>$~7SfsT=x@56Wq7zHdpaC*6Vva} znH_ZuF4HQ&wmGn^6>N)->rhW+;tU7b*xVX$?U1Bo@dR%dwT95KVOCIOgDz3H(LLxB+pu_yt~k+7VvX4u&~%ye{e zc5$8M=I-I?|oGIz{(7*ZBQR!b~aWw8@7v#u+YG@E{l<+X0(lkW0#19D-?nl z5wRi6H7uwcZnXCy2v!O9uV zm>v}q$cl4eRt3dzbYh(S4lIe_(2GY{1V<+JkshH8S2*rsi>d`GbLOfBRwvBsO@Ax zhlFx0vo>MqRtl>`biIZ%+bt2^rg#QRTqBBLULQBSVjpIn)e2Au+o(Piwq<+Ixv}q) zg9aXAiaiE^Wrn3-jUF2DVwuyUe_Ryu1>s0NJSqfS<5-uo*@F@U?xTbIBV6D*38)c^ zRr_Fe+rk$#jSUZe>$8e8xo5! zJg`<_4v_5k(I2)JoHYzw4-*99^hXkQM;D*P#v@gCm+99p4)5 z4l_NT5$?qFb8$zWo%E2fQ7H5ww-7oF_OxTq0B(W#6Z!hS&1dQ3;VW|uj`ovVQGorR zxz?8x0Eoie=dD(ArElX37jlKSbA@+sg?Dm=cX5S_xWdI;;S#R!Zm#eiuJB&2@IJ0^ zDOY$uSNH%|xQr`&kSkoy6|Ue4S8|09afPe6!iTxSN4UaAxx&?4;To>+F|P1&uJ8%2 z@JX(4Em!yySNJr9U71%yGT1NWuwBI!_It?I;LU~{&DRKzC-!0(c`~ys4^HeWC^;kl zAEL)7kIJD8r0WkGUj0GVA-#h?+&>B93KumtNfgak^v-a7HV1GIqTw#d;BVa5m zz`F619uAuof4EPHo(TSbqbajwLl0+8>3@~RDt@FsQP-P@QHSzjj|G=*(L-Q41smFU zn0aYzLZeec0Uz1bAePhYtcjT`%jiU~<3m1VmxO%7Ye81dV5VMtxHRtcKc}#&Gh|4? z&t~aHo1rXZgG8J&FRNsg!HYgut`gx)A(V;iUuFQ2|J?|=aIH^%U4KTdwz9mMxJ65cvs=6c_4R-r#*ZycQqs zIzz(#50SVzc>v|>L-|_(A|IU5vi_?=M#%j?M&srN=7V{x{zU^wWATGFcFb=4Cz<@G z2;8N=hBBG&KS1{TkM`n!S@wU5z+HBTFRN^Ifb6n48~48~|G$dF&BtpfAN7a*0NMRv zRF^|qPL9VTcc1-3FXb)*GtZB;me2-B{B573qaHO(j;pKvF@dY3i$EWZBl!T?{)*t;ZPg=qeSi!jRII}AOb*1mW()kh^<8!uF*eD;4Whq&_-<=2XM?B zF{YH^4)pg)+$DkCna-Lc+MujabHo^8EV2G|^jP`}fj(*<8-VQg8Lb=~7S}(E=PKel z&_(-$JpkEj#!-y^sgc?B_=m|{g+h5#0$Fn$0U&#hb04A1;$9VxN?Q(jIDM75jz(%H z?i{QYHZ!FP@Y(BVwvvn`D%eVlUVC$;K7o9w|FE@i7>@t13OEI*fG;r86R5JGdmOrj z6OK2*t@z;d02&rp_;C&tg2DxkI5NEjIJC?lAF>6q!yHUFTf@3t2b>?^hajSumV3DE zhk2frhJJ4&8dBhlQy`ofVt}DA4(Ln;I_~Je>j)~K6-CFwKwpNg3q?9o=8tk#&=033;x5|srV4^X9Qd%n?8VOjQXwL z!B`9UqEUu+rv4Iq6rzz6%s+QgaHPYv!f{OfCM_-^dQ=^987#d4^T$k>$5`3fxEsLuBk26z0_utWg^d$HLJ?^m`d}_62ogusKH& zgE*JnjlmfDofX#a*}zHN2s*gD!KDIWzbSn*HekY!&&1Mc^!ezRCi9YT7{JDq0cZMI z^k4=7iwB(sLml$&Vx9mVo|w?sM~5??;3uZRtUbF{VUhDS;NwhpX385x&3S0swvKva zD3vpwE|nPm^H`ZTZIg9&c=z`M?{7N=5;xx!2vrJCSh`o;TJCkHA@!hjM&WW z-IvMj8yV<`U2k0xHu?1Gwt^$KT^Z;68~3@L5^t)!Xi+bnx9`COA#BcHc3C3H2T#f0duT2(E7;k#pjZt4De<3GzBsrB(aY_Qq9e6C{c zl9v}HR05wSP4YWf;AQXleZ#69M3Eh#jcttwKlF(%{d#=wChAnFTGOS)r{~Uz(bU+O zX+vqU{jS+Sy?UrJCwq<64m`XK(jjGHGHs>GqqwZ4a^{B0gQ7@IlD@iR^>%ucu4$on3RmSV3j?Pe)1n zW1hE3;lCoc2h4PL(P<@#u6cLNMZDl}K#1)M>GW*5y~TB3W5miQQBN)~s=&5LDmZTq zsE_eF`82>&UHOI$d6Q)Qb-aRizrl@D;t|hGdrxkLO}IaR^$Vf&-Kx6XMVsR~qdSz|YIW|dv?EX!@>Ip<_$?ib&=ch4uHsr~v> zuf2Mb63fyaE+H-RHtTHdKKQDhL{z&O;FIq6;j-bxedT3@V=|}qrp^eJ?q7Im)@v`% z9qT1FXJUBYCaR6URjSnSC@GHU#izgfY3`$2X~MU3Hve#^+J=Abp~iNV>YJB-viT`S z+3EGwy;DWr-M7HacR|5@VxafBllTYp*P0((HxcXlsXexPuH3Y9K0SMG`=fn~^%UB| zjPUz+76nywK9y2buq0h4?W#~&DYwgxfd3dAR46O-K>Dov!m8)II}CE=Us5DXC^MSG zR)2i8&|!T{7wsU)==7ol#|I~DrkBZPMqq8_{DaP4ZlPSk^LX0h&u-fxDf9CBLfgm2 zhDJ;H!hTgsk^M?=^dNjA+5(4{|p`4&F+W!*(Q!_b(#ns7UR7<7s(AQa^?M zFz>u*+e&ie3@?KuWf}u_r8~51?H>6FCJA4(2R zRQXr3$(I=_?#}c4J&Z#sAIj$_XsX{i884KSVjbXaGk1-h^z88uuY9?uz4fNd0mJ1} zBE%=&9*9}Hx;p1buIT%L$rQyCmYTV{`P5=m_6dEua{7_A2jNqhB6KoW8UM znH$UL_Xz|%!kOlQy+=C2jyPAz=gJ6H=!pk`B85%_noAN8;+K^h~BL+&=`81 z;zM5Px?^ijP3Yd`a~H=^yynW^-skXi>U!F&pOj0VAK5II5>+gr4q7;sUbQjWaJadV z?9deUCHO|A5GiuDt4p<*!W6UKORjC%W~J{FW2fZ_OE)&YH)>B5xVqxgm3mzZbMXgO zFY7+n?>`V#E4=gg{04<*g|*iv-*g{0aZ_}%x?7QSy8Wi;)iDRCCmu~?^u-+&-w~fh z70ZnOvQ}#%VG@I`wLFo!uw{IkxWOI%;vdYEoAOxPUq=MQI~LhHRIr+ z%b2G`Bc5Apw~i;ycr?w{aZkvNZsmK`Gjeas@E*RlqvfSro8s|D7k0($moT0rIMcTG zL86R$a+pm0N}^BO0aD2`f7RUS+G4qei>OP*PnD+09j)EF@MBw>-z19GflY6=JyQvs zwK})r$;>xIsrYwKz8H({=n-{1w5?oRHc`!ox>2L8$~~rKLZ{aOil*lbJF&Bg>mHte zd_2w8gS7mVPS&3H(3DJE``CK0bk@N7k4F;v z&zvRYRQ$aCYnoiW+?(Tbl!Aig+SUYH>FQNsrTY9SH8scJ<;*C|srSK_`@DFRcX2X# zH{QfwitzbHdHwDm)VpN)jO`kZCDZ4?nWu2b>DG9^e_Fs&(n+}+lqOOuqZ>R(G2UveYCv0uEiUW%@9_`J)rsxyB=BAVPfb^A5XOd<;YDro8v3T0l@^9ioy;_Yunr8Jgh zhm`dB61NuRU#hZtt?(%>f7*g>E$Y)3iwTo(tDnzPd!(DC_)((!_2eBZZWJA_>a9{K zN~tHdb#&099I!ss4$g6U*P5vnjxV|=+`IlnwPb2uZc8lXeaozsvz9D!>aA|NACsU; z>hXTr(sQrq{m@g#9MJ^+6PnPs@_CC`m_bcncyxBi2pZy|@cbE`Z zoxj=ApS~`@kf%xRp*M-dGDsR^CyRm zuYYyk^h5odW%BZmTNGB;rr$WFA2=81y;(|Hx??6^puyfBpQ}5u<&VieAA=Lywr5Sr zf4|DeP+UjhX@AC*=?)P;9?s#tyxwY(G<7nbcUPphw$!1Ww@M4$#Pc5CGHXhjK%F41 zBe!qED+P<^rP^k{A|G!@W`bdiCz>Rxe3z0{f(H zHLTdLxF=6;DsJ3^IKC4d7N$GhWn4uZny}TBFFXMX^KBuWMO1qxLke>FO~)a^%x z0kQRw@c#8y+BrTa)Q)d7c_$-2Q;;T#TQ~LTK<`&8dYy!r8Gq{3LUTsLQrnuMLrVg>&)-@^YxJ#_!qsa^Oz(@!g9o=IK5mXx)m`9aiF#Z{BiLr8@ieB~_a zQq^AsZJ9c)xlPtSzROvNRZOOe_>c=zdTJ&v_d*jh(GreVO z?*EK*uISE?J7D@bT_AA={%OI4y=&gwl&t-JG4yUg_|4SB%vX_p)5vNAe4?xLmpfD*B_GS*+`sL$)SBG~_LeN$U73)4crUF}N&EoMfszIOx05Cn)Rb&9 z+^OJkiV6;YV#lqc_Hhaub zoYR7FE%8wnKKrglF@Z>tq1bM_pC%z6{p-V*BLnw|5=#~=lPI*7I`?btWfje3BE%2Y z8{S^z`Ec#3x}a#%*EO+rDgyedV!@ZO!Ql;p0{PH?1%u#aFFS{6yXP zv)p+9uU`Iq*)Kl#j;J0wTySRN$}JQ4h?45dmh{(7$SE&)xKmsqd>={t(rl&40!d5j zG=80EOf;8Uyr9DQUC~eaHSeZ?;`{>1OTA}=e5k*=1;hoqogR_NriXvn&h-u2_b^km z?a=pEat-UW7anquTT#_KRs3V1lGNSSiKjnAK5L%X-V|TolSW>-cF*NkQoE{KRj04s zQMz4zVYDmHyAEl!>Ai$vsg+eyt3Te~G2!SFkA>MgoDz3_B*(dZ4vczzeN}?3)^e2s zHwEAQe(7~eLU%4NsB2tFwvz5TIWzQ{teM!ZtU=S;qM_mus)-g$)dQrrv~O9T(Iu>? zJT70a!RzRB@lJ73L-|(eV@}qpMG3ja533*US?|yxzUI)v{qrZK%n2ArFHSFOQY@)^ zck=ZLU5Zn+Q+45~C>iIiYw4?R<&>G{?fKjp=p!Ngw1rw++SYsZ{;|m}=`)D7h01<~ zF_V%>pVxF8#tTyk_VUv9{VRTne4QdQH>^dXxyV8MuJ6vKJp)=2%U2yFI$=p}?u|hm zrt@B$91tp}E(&Rn6DyXJ(W+AT{w>Oja^B5O?S5)i#e{P+wX{BxNcyux%5wC(DFWBY zN0MK=$X*m#)H~Hz@nD3Yn2PS|`;;Af)@3uKWKMhY3)58YE+yrgE+?CP_@wS5^5ok6 zlV4=5H*J3K~8^8_tJyJ;?J+jJ0a&n?e(BC3QJxy30S) z2&nTlXmQUk4R(#eFP4(ae!)1bmT+M4n`8TOZeApRvuTa0DVr$vUOc-s=?I@f;DU}i zH6^!cldPl4gH?E?owHK5W;s7#C~p6-+LdN3?jUkaCC=ee6l3Env1+|@3RCt7tomHM zz$a5oDfV;yR_V>h_`<(-_f{C*ukK%OP$}-^E&Sx;v}Akb{#vCBr6fh$@)pO>gTZ%S z=56W;?a`LGwK~E4>tKd;Z>-H*ciJS0xZ;fkm#=NV`92r_Ud&06=!QEvVb2VDiri72 zo|MWa88L$^$6wxdx+XdA)|DLHMeN3-7JpO*s^N-SG@BkNuim&)z*Mbs-%#?OfU*$iLru(D;Scz9X`q zG<&|Al$f}O4Q^EUn5iP^`{9k&_v$P0s|Ll6^y6zuny+TOSU>K*(zL;pV@h}C$$jwP zU16EFw1zP_xV~q9m1MuQG5qvK;Kk#*dJk5x?^Y!{Y6e0O+na`67 zPx^g-5_USym1HK>vea*7=eK07?o~m)7IB-&Uh99hG=C|0zUaPj;PsVffGqS?+t< zE3<;9VSJ@m`O;Me!ymq^oE_nMZEKSFo=u@5jLLumUF+c~2rRLPAl%=aNa+H~yvn;Jjsev#*?m)@#S z9Ul8(z5SjWT-+lcLdbqAaqqA+wmkXx#W49~w`TscM5SYM3KI(^6pLwTA3s{!NKNyj z*wf38JKdlC@oT+eB&Bes4PV;$%dHhp`ZpT9P$o?-zcaOv$K1zW-)p6kd8F*=)eoB} zJAXcjxIp4bzxtjMRQxQ8B>n5Ca+sx2;glTGt-{+WH9kQr`Qi;GT)HGFC;CiOZ@t9J zTetJRxEk$DkQ9=emfOC#HZES|vW2?zH&Vi7o#%PVU*4Xw+a2=6=YpID&)nk{^6J@* zcWM-!DsfWEgysI%lf0tticNkIogGT%jkvtUuCXuq?Gci>GdWIv*O{G9c#F?%@vblZ zxkofl>c!QWPPbDrGZG8mTy@=hpIl;-XeWOI)0T6o!X}MhRUy4uBSNZ8Pkh=f?;YFj z(4=qdQ&vu#{&_#6wA_KR*hxHTk7-ek`I)$=y-Sy5d37oTyKZ_hRVUbY?eXuIc*!-= z$M==JZd!NDAzFR&t%af&#l82Gk;NsINz@sAJ!GjO#g3P~q7Q8{+9kq2x?6QP%A}5~ zYg@hp*J(Xo)jBlATtY8Rcj?chP-jCqSVrsW5Kr82&D+#y;c({i$(gFNdSosOmF`<| zSC3!k_LZnr?I$G`3cOLcyjZnpo#>sq+m-pmjtAwzyS=S2_EIMX<&#%YWuA?HRnvjJ zUPKPqdRWJVQduLHwchbYv{U?xib*-&h@GDK`)VqlQ4gJpwiixPlkHhzz2c(x%Vi$| z*YTMboT986Fd!^QT-BIUBgh-v5lC88f0~z=yEncoYe`Eusi zqoin({i4`swA>@Kw#7UWQ^?CT#nM;s6ehpA?(=?%`(*j6XZK=v8XaotZJqH+>!GJq z@s>>enFF&0>dM0}td%^7Oo}5PWXc@*AT#pFM`mOIl5qsExONXk1XvpvZ7Y^Bo2Pr@^P&%zCF=l>Faut8p zyLIgLBb+@d8Oc*qbAsI-D=GrEH%?c2wvW|*7BAWo@XOm?6*jZluP1lagnKKefFXA1oW@ZGA$DiJzAhn67ZRSW@lI4Q6{(t9@6RFYmDZ)2ei4 zd(-<*9<19l@4|c4Ak=pVqd0eZPE!sKHy6^Zxz~9r)8(iEja#_#g&0bzP zOzKLX%*T87H_R=nJ~}CrgrW6BO_02CyEdkwxJc(Y1*6j0R9Tp|DlFIZDu1${EXF5d zniKZ$r{b-_$(KZBNfw9fa*HenlbPDkS^(g-a4^a{Aq)ietYN@Xp`l4(f zd{W_`8u=(Zyqc)|{Y{f3Syyk(^+t)TRZk_}n)D=Z-~6lYjl~a{1utc&`pUCzj#C)? zvT?t;Yp0GY(K2F!b=mV@{U^vyU2~=eOKfQ9y(6(JSueypV8?r>B$;DNU-7q3_rq95 zoFGINKU6%jc7v_m8`B~?n~(KfT`$ESYkl#WQ)=HZhf?)X-mgo#<$LuTZPL7@hpF46 z_r}XBGUVTHJi8|GO=TW^{;IGT@w(u*#*uFeO4~mTOnZrUk$!hZ zf4k$xBu|;2q+LO~x(+sElS6Im7nS)hZ&_(}Q;0fw%C`hD-4_3j5%zw%6o6pwy| zzw8dfjg-g4^D-5dzPxE$i~?;4U$;>xx&hJ~KFugjzO>Yn=NNV_Rng4l!PjfbQK!N^ zFOZ%l5GM(ZCmUgU9bR2g)Ay1okm$R9u*D|zz@x52gYySFPRkq%n9Mu5Z?&LS`1#pQ zLXyNT<6~D0!qu;vUU{#1Hb+)M{>p9>>s3oq1xzYyBVv?fx=sl5ON4EDGV_X$s({!+ z#hj0PE6VA<;kj~cCmAnG#AEvG_es^p%{V&VS*31wwsdaz!`vM`vt)|O=^rZBRw~@T z@G>z_=Z;vHP?GmsDGl+P`oYqteqIrOrg-YV&_>d%w2^8=5z1;&4tx3U+V zY&tdW_;&f|E4~7?XVcw^KNa=@?S>+$nV(TI-wPF{YSfj8}?%qKoo&5z} zSwFj{AC>(0fOK{93iAzT5@&v z+q)+6lhVKG2|W%y(E8wK{^c3k4wUf&m>kN5jo01GO;7lo-cCJMcrM|s&+>Eb^OeO< z^cNF%*Y~xAMi*A~q`Z}y7<*O1@ngAghGYH1&W@fP@5Fw}h)KWcz7;jl_%{1+eZT5d zqPRjg{c_V1vzNWTda>0`5?h`Jd^>)2Q}*r!2AI5YbeUfY178`M%OV{wSz$hfomBKc zT6k*khwvqrQ>v-Pop;2IiqgxbnYkVtuclvgxxGQ!#%}y3mziC=%k?eo5=h?_CW{!J zAsvc*@%o&K#_Lz}#N+ca)LZ5VKAHGF=Ih=G`qCTY_8iZCFT5qXB6qQvmZieOhRbeW zB>Da4Uy~^dJJUlJUzRYbM(*n8lxam07vGdfwQluV)VX{4Cx4d)nf}sj`H8fal@Twl ze=XFJ*B-E2Le}1&-NPS%{enwYUT!2ykuuv*sU&pbe09bSjk!F5?Q#s+ihf@40oR!H zAG58K_{q}(rH?jv8$B1@Jw+>j`x?ocOCNXCYOL6KJ6mwdNox(c^TMy2^3B9|2Nk@y z=-L^^&n{H@YLw3>>RYbe zC~~p$^}{%7jj?yCMB1#Vuf+HV6D7#>PTq(jnfDuP3)NKZw>TbL?xbu(AXa>lw2F_N zdseaKL4bxQkHnUm?Hk-&KU9=9kxwR+@yZN#S{sFQMQ&Z6?A+?E4_QIf}_^5!S3GYzL-fz zP2WA25?B20Gg!R9KmJ^wzrezdM^fF1+9?jU$2au7Io@RJeNSH7F*(;c`^a3$Pj0)i zz4nsLI(+q%GMu4{HVxZ}vj?@gMkW90&JnwNBvvP)bNlBS(8Xdn$7 zzDSwdqLCfcGA~!%+EjAMV}l3pXAVUC5Yj*T%KKSzv9rsjk!d!?)4~b@09(S zIw6JA6OKw0B%jOvp}y<(^Pd)0v%Q|kD7egSm0!Ml_o1Dks$bwz_!ohiP7~&?T|4)3 z{l_?KBZ*z#6N`Em9g6y}5Hx3uIbC|9?+pMWTZ{kjQ7ajU-2fEo{&7}tfE4&;pXajtKY=-m6ZMj4K zdEwO4qX)b5l!R{_Id&~e>SwiDd(q}`29tBs{JRDh$SWM4lcoGiAG>Uz>Qrw>AerI2 zsI0;~{rr8S9SdF+e3z`N7NN*o@6>5tVZ-x0saEbwo=Sz*ISs{OU|SJnAnQ}lSZ)CFkWvCt4P{b_WSA^QYhw`BXz3_CMBn_q!D6-jLuD>vbP?wK=l z&b>3=SAU9-b%*%8}fQxux*LDVgpJU9pQE0ZYf)nHW_ zCNVYZ^VvnI=KCaa7cRXclPTk@R;`)yqF}yx@wC9S^+q56e7Jf3Wfp3qIhWHN@8n|rnQeSFiQQ`e#vlLC-jZS>c8;_Isu)*4qHy*|3E5#O?dW|E8ZNj#4f)aG=0GY|!;~~`i3pEMN&8;V zy`5rjkSh4&SJsS~9rSNW;|Q|Oaot$*KH@}lutg7Fm&-d(R%;N0})l6k6 zg8G(9xW)$=V)+@oHT;3pmFGe|i+#h6tTrPnFS1P{miE<`3Dn>f%bO%4u5aEhajQI* z;#hKVVnOn}hSbv+Wblrm>!O~UCMeuANow|_67l}^(M>z;C0|%&ZMS(%leqZ#gJUx9 z!@^zeWfv$DRb>`eYdw+YzmvYICttrXDps+vS-zb7{K8=m(j(0I3H!x=*i7*Deysoa zfTx6|j@Ab0DVuxM-%{#5B^LUu|5#r+u6nd6EFJ4+v| zlaZ|dC3WoAlO18J>mICkd%vqN=9j$Au5w&wjkjvyozK?Ae0Ahsm%TIQ?5_Bjmh~xr zbz`K|nG+hyI>K9{OUiV?UzSMC+`Umm;8ne1`GI(X&!FWt`97td|h z?vxDM=kc>UzQ4F6)gy**W}6(g$KzL3n8{v7bKDiBV^2sprB~+i7gvd<5Zn?EKASC> zUKYGgxkmN&&K3K-H_N?~UH{6j&5$(5IzznS^P@%aB*VRnb22w+O9V?Vjq|*5o08!y zapZZenM~5oEw^5!&5$J@cFeu`>5`Uc&|tmpVPTTjBgI&J%<)sVrqsozJaVCw-|cqE zbl$6WS@4i+$KBo3*Ij*w$+Jq^PtA|mAjH^5oTw1t=RIN8tp(@!mpK2rDN)7XH>`-< zyJAJ(Rf*1@cxukHOP1=4Rk7|ZzZ@%)t%!?q4c(SZ4Rh_uo?0|p!Ck^x@8U#CPDXI2 zrgKB@^AH&&i}>hmi}w87R!d*HpyRwE#m;^u=E};)MG{GCOD5kJr*3;tdM-glve9R| zR`%kX(#5H_Z}n|HGIvUJ#&-=5ykcYmvy5h$J<_h$T?6}$Z_4<*03 zu+>z0$NFydkdU=sw$9zzt#4tkfICH8UUcrbsl`A&aa_Y&@`aZYg$-2<`@G{HJycB( zNa-oJpZ_LTH#cstcG=Oajq*iaDktS)yibOP_&G!yEGOHA$8_%oOO+M&^SoS@NF>lx~Wmlf0rUsux zis;SBYaEv@5xk-=XTCf$Tr7+}wg{%3A){gVH9H;$g4>wl3aQUF1ghxk8@^h6_q^!%IVo!L9 z$f&g{K34dsDyjDMect?XSH-0-?l^ojYImYeDWINPxItXzNtS%yCD*4<1kA@(@h*{8 zlzy!o{$-DhkKyQzFt#}9qkYVuP~ysfNtx#Ls*?RyL3F{{c zzwS@T%O!Nls>x?L43-70ENpbCy`LUA%ap7pU$^N;2=4SVmAvs+pEpRxb!ndZj>R98 z(~B!NQ(Pw3=={^e{OQwI?{_u4Uh(l7X<3O`*;=1%jNU7?^Fy>PB&khJci+9k48BYZ zvq&>*mhJN!?CReXFirQ3Wkd6XKvKEkG{4wW#y6*ixP7xZR7>$D+%#}~#hW3D?KYO2 zt15deuy|aITNmj-K;E;rZ3D#MQvzk8A--OB65{5mx)@W;)z*64KKE%df5G~r9|KoX z=WlC`%lMig%lKvL+V*oJ5tAn3w#U#r@YfmpVCSDFBrKlh&37Wa{g$LL?`N@Dw@kxY zYCx6J-P4iVeWpHNp-udzH7;S^WP$KC_`Y?1rDhUem#J>nTP(yEK?v6|yfstibNkU{ z=iG1DW$|1&lW}RMVtc5o)9g>F8u3Bfy<(lvKO_(w*9a);&Ri@`hr){$~-RA#tYVd%nfln=rjd}+8>0V%)GDGG3%kAhPe za2x}jWd4X4?i{?rj@};E(VAet!x@VY^k5vE- zvmfI5Af9!t*xW2tF5Q4uWg`hsBNTetZkyBt)ru(tD~o*uVbKNsAHsK ztYf09t*fJ}tE;E0uWO)dsB5HatZSmDt*4`>tEZ=@uVXlP_;Y-nPn zZKPwQYouqSZ)9L(Xk=t$Y-D1rZLDLgYpiFiZ){*}Xl!I`Y;0lzESf;^CP3N*vY9{> zRF?VlO=Cf23l{WYL5o}#%(}pW3%)X8YNn`gH_BO^vex22BDY$uMB*9WDEMlt%*+f8Gc$9;+%RL4eE+rgIp;ku&AdaB?cbMHp3!LD zb2jg_p7pF}ovM5d6Yp1(8Xmr{GO+NQm4SnQs=lpZ;2Z8T@NZ|=UuoF);kyjn`|e!^ z=Kb9+1Mj+Le^tY}2hTQe?vu_oFz!dsHt_8qobyZ#+urn?Z)&)9>6}Evw9h){xQ1sx zch0#6mfdaO*j>8~410&&mudL*rMs6k?E3ZH72JCB$7z`L!kZg-^`193u|6tfKIYv2reV+z zo%>J?e@>nEGYxx2=NY(j;XDI#KJ7dMZ+_}L18e@t`MHKO&p7|48pb?!{`E9``GWHe zZ26V*E4cCk15=)Rfq^IQdcl9zu;eQ*FmU8|E_kelA^-Ot13zB0r=wxV`|UAst1)!zi625M;94*?r$#sa}CSg`eFmeJ@n$= zX&CMu7aREP*B2Yu&AQ|+8g9!k`I3g&9(&0HG`#lVOMakXwdq?P(r{XQO9P`V-qOHl zPrs#s%|3lgU&CeBztvkbOm^n23_Nz_tqd&oqFWg_>?^mbV6aOK{B_=?j)uMNcBz58 zUUlh{G|ctgOAWkrgIgO|>*8BKK*L!NxV3??-g0XLU;X^n=V{pL?=Q17T$NmQ2Mtp_ z^0HfNc_dcDH%EhM%5tn^g@vef%~CZu+C!8kp&3w>9w6 z%5C4TVWsEZ_Rbnk`r>UX7^!n>4IiD;S<Zj3)x3gNioevb%K3$XQ|?}TOT#FyE)0C~{o1>^Q#v0&W&XD%2w|KApFWZe5j z7#e#E%zdybr`-Sm4L*{|L6*BtqG?Uw)Gh;hgN z`ihIS8-B|xjQjndE554T?zdg>Iqh!$;);FR&Hjg_k8AfjUAnJ!s~^4eeCAF#iy?rcX)NhxWUg~G4Ah|SN_Sk zy{mt$-QAn79?)*?T~>{I`-;^cX}9*h%8@vDLjkWuF-=nY7ZtI(l{wM9O z{^aPT+D-ktW5zx095Zg|!;ig0yQA+ucA0iVe|OBdpU#!9)^6v4D~-GP#4C-P`Ozzl zd-(^)@21_#e>!e!cXH{taU-8~{5dx9N z{Q6auJ9ztl({A9N+kaHMfA_roF75Wc_V(v$ckhR{?`Svgv^yC0?pAmBwRYi?cfI;P|VBaL;S`2~!2$*80(CI8XMa+y?XT%2#! zwEVlvRje~>Tst{a-%2qpzR==-EdyK5lLdiCp&c+?d3%(W$XOlgTLPTdbL6&d1+lI=b(>amn4kgA!aBuiycvwQ)~ZhfrVYlvc^X&ZgANRF1zfq8()@QR$jJn+0tbzT^(AZ zReS5(-01dqyveDjUiU`Vy~(Mo)&J6!h1GJY{#*C!DW}|k7j5o;mu>E2C-hU2wQ9D~ z&G%h!zHzzhl`ISLl%3VZ{r&I7qn@PF!}KXL)T;Rd*3TdHz4N+Y1=qv3zCP<>Gp*U` z=Qs1t|Nk@Nj(}8vKlK#rl$)Kh=akD&IdaNfPI*Y*EI;Lxmz?tEQ$BpkmrnU%-@lCa zj;(%vytiCie@jlI?^Q?AH>8A4PjErW@t3bsXX+FD zk*}YtzRLIV=R5q7->?73*S zGpTtd_0FW$nbbLx8fQ}9Olq4+T{EdkCiTpumYLKslNx5C&m$x{`C9*Z)SvPh{(Oc% zzvs{2{24dUFCTmTX;EZ9<-h(HBOh|R|{D!YqIv&Td{{S}YB{=NV7l(RdRp6^)Z zmwGE}cn24kSM1n)sOYpbH|_AC<#~2gT4569X_!Z;nz)%fC>Zvj&gu$v5M6Yj^&{mQ zd4iwEPLWt?=45sjCTjAZc!KSjC)7C@L43b!5#Epx&nVk>nqK#IaGvN#J%HFM7i>4W8TPCIx1 zX`<#bJ1gQSv$IK_9O0Yg*;x?c+1c}wBk~)&PdoFpU8kMB|FqLq9qY7YS$}DNOe~}o zKBN^^D1kjYyIZtY_)b3MVJxl4U?d^$&$2QKLqACib)DPOjM#0pV)2MP1v%v_JKFH% zLGqWqVuWt(y}o}CGBFnO*;z!I`D%t@%fsM@nN=2< zW5*uL!cWy7-ruw&(k;;fEwi)Oi1Vg)6eE(ZEEUX=o|9V?$Csrgw_s8(-uk3?MN-6( zn+Bd2l#W%XKU!r{qCmIBEb?waoY~o~h&s)Y(n7PdTC#ju4Bo*R(gRqHpS0E2KVU7C zR*|J~o)l%8Qve}S*F9O&5ob=BlxdPhVQytnr2cqA(;*9e8>fSKK^DikWyyrNL9VWM zg-nOpse{vz7-h|7E*gFM4NOI9IY}x13*ywH2E6){hwAlcueCGE`2>~vh1uC%eA7B6 zF4~@>!g75p3EZ@F-7F{qTU}o<44#}ho@~;nKB&T~A$CZq;0~o#7CMVdoeckOiB;xU zX`cGTaqKW6s1vC_eS+?q##;%_x zw&kWtVI}I%s-{$g`UP{+XpzMl# z+_v}!Zd;_G_3>PWoXlyQW_}`zPyIjVG3LHLkHV$oSm!8*mbEuIMiI5$3n*JkTTa&x z3Pca61C*d^0&oX2_PC9C=-E!IL8)Sy>|Fmm?<5n@p`Xd5*b|j6&S(tcihkf8Kwzx9_+1RaP&o z-Wzam=Z(2ihD{5X+S1~|gjpPXELe&h^yXw0u|7S|^>5bZM(;T+pIPp7Pi8KR(^kWj z+nWDy-~w`Rd4{?Cfd9w^w(Sp;hsu%)4+gQ5rdDFxnU^|co~XZk?PPoEoG{+TsjF^F z)|1!`D~la7&%60nHmuD5;2?L0su}9mCAQt;v;J&!2QPARHwz0LhAxXTQ2*)VpT!YT zZmUeZ$aeFBt3v(fO`XMs>&Cw8S#f5inA3s!tE<&nY(=q?CyrkR1)==dQUB#(`l_g0 zg{}?c>zyA~S48CN%i#=jVaRfmyWv9q$oChvui?RUSe+sI39@^%*?d^Ob75n!mwYcN zEjNx5w}jW=dFsF3maSy3(SkKJ-^7?0t!y}Phc2cQD;pt)s=>mF}CDh`~ybigKHXoY2# zs{i?SJj$4zE}sdch-e}&g}@~}wDLUQoGw!JzXTQXjBm8&OU3kUz0$_=4FE!-lIsk& zSDkuO9<(MZgr)3vItG$)oYIMWKTXRhjq<`(|NC5NhYXjtO`U!O z`UNJB;L8_uyyJbB~d;RyN2^G~kIkf;Xs`JgxQvG;8alQNu`MI`HSqD-5 z@4OsrjQ83>>N!DT*`@m1XUI4->&tcq4d{(GqqhwgEoi={hPceLj!2>FmARt@-o))F zjyXFkRfA=`s_Ba2!VNMDXR+Y!C^Pkc{)JZBj`_H$QS3?4BipCT6nqwgNE;xPaZ{#F z3{lc4BPR>3I8lH1&pe>o_~IZsje{sV#qIGiWt_ayie1Ob^0f4lB2zca`FvoO%W12A zDu<9SUQZXaG~&P=Ee_n#;=qEmi6-!@T99v~b8(@+r9L2UNs&%YgR=0$-1Cw!QvbKI z$Su7Xq>$^Tpo@-R{pyhkR`s_INabh;lLiJ(T5>uTSrIvD#QwR_A*Ln_^^jHP zK!qsKAdM*0qot96_LSAf3F}af8tx+gDh^Uzsi<5Zqa&ilWQ_G+@hv+?!{hCAbdi z#-XgebUry$IJS3&{+cq-GR6@s0#U(V=7VnGrD+H;*aiKB1FWole6ZQu-r&}*hD*PH zc9t^bGE&?mdR58B2oDxHPIsQ#d68sJf*Eh`=b`;E3ft;hy{wt)1nfG#woQ#MU6{F( z9_Oi6&djA@41gnngFrb~tBXnQ&6F8T-7?C2uT<{I1kbQ0EISK`6_u_hP@eY*?LLME z)HjD>4d1k4M7>CkF69DTo-FK_l5}OUG^C!*;O5}|qWCIXe*e<(T`YE4Az}{=-U{6n zFbesQqh@94ctGc{IWYUg@Ad}AGAzAE^mzRu)$9V-K z-c>> zVI7BZWIoiK&#npree=2~Zh9bmD=Y?8u{f#OOPzqPk*{@_tF_!eytt&fMB z4-PlZYQMINp!BZ!!6*{rD;?1j>zAQLFd!^heSWTP@}AyK1i`=(s_zS_H!=tVn>E`; z(+4}f_9hwDpW&`l)sLz#pg1{)vv0dDfhI3i|9CY3n2G{4uJm#zwrqBgtNv+w0j45j z0)02mJz!sQbkt3+R(A*n9hp0U@5fFOlu4}q`DET9QD(7g?ZOGO#Evsp{mY~D9b&id zkoGpJc4xj!6jp2uDRa=l(#Yqe!Uy+A^)u=yn;#h?OV(w}9IZEu#F^(fea@I$xjsD_@uhon|imQzZ2VVAQZyUyxGl%4VKzT;5dctC%D<_^jG)x zV2I&0crfhHX*jH--7_%3$q5Pv=p!VeX65RPtHHTZ1~zV2Sj0&XB^+n!%-e{?xiw%q zFx9l>-1k!gkcm~smha)>sk65CSc<(U<=GBilx^o;tkk7#!(_;E9$X9qvsRt+#7Ic- z3vvsuIQ7yD@gzZ-+FtHOu+PKNPt-Zv;RV?od_j>#FJ|bB zjzpP--q%>E=ku2#Jsn|QyM<*XN$TTPkfA-%6d7`a8Td9z#egkK9Zb3Rnwo8c zZ_^Yru^I=F1a@nlrg=j0t_wKjsPndC1u@D_o`-IdSvcuMtj_;{SwU_8WZf0ibq&q> z(QeC0Sv_9n<4};fOzyLdRiG}|!0PeS!jHiE%Y?XrZ5L|Kyv%8PDB2dz5Lay@4w~i1 zSfF?gVe01ObgK*H9%;~)U=X|>JjsSP!T2XOl&Kmu3*dJ(1wWWH?RG-k10wzVHAP#&RQ#B_Fbnyl@m1pN}m<3iA=WawyPF-?DHdTAM z^lYjPkOoH_&9-Hgb_6d0nJxTNUkF7rQ=~yLi$`Iielt;#ow9v&bQQM~S-i zb_`tNXqMYDk5oq2t;>Qoa>>>bBc4vK)^RCP{J#xMA)(s-tl(>V@iv$ySZb6MK@yq&p&s z;w3_;BA$Qwc8m}=VoJCkNVCN0#BNAFWQ?dbGkV=^TZ5*}k#Atrld?w>7#dMYtN^xT z5hbZgw`H6dBixlB&n+J^g{`v9>`~)Q$|!ZqNuSU~6eh9c?LbC$6E{qJm0!gD(jULZvD2- zGVE!d?0X>>VwM)fI=tAiReAHVpX?mL8(CaV<~t;e3i^@QUIDelO42Y$3A`P+udMYR zBe^$GYF5>Jh8C_jc;g;rd;s_^mM`KsyO#b*XGzB!I+aBvtsq`Zmdg**DGT66x^b3xa5dE2U8QxgA!<~S z(~+4pXY41drpjF~*)(SwKKtNOU&CoE3omE8;RApzLfBNd^Js#JD4YM(&|&x4AXzDB#Ga!IqXe zsh2USUe)$F{Rpe^sG*(9VuF38Uog0u%mWNleK!ub=!>!CBtp&F@~Qx05kl_B;Qq#W zUY1Fy=C5k6pJ*^bR!tiW5SD78Qv^2pa%ljAjL%nQL4;MDmE?ap>hQ(9dlRRKM8@l( zlF4%kYjVB8vnvwjUo9NqxnVnkm$Zs@RQhCBbl^`1C zIKH1iGgz$1CvA(XZQ8dZ0?SYyG64LJruM)(tNy-Ul-<^d1XPErkpA@PDlMu{S~_0@ zrI+PlP%^0^n5K?gF!rE^^&ocShUu`jWHciuArl4TvJ{*oR#(Vqj>3{%q8%Kx1JMpA z7#;0!$qnK~87=owWpkngMK_W$mvkQF&J)aRT{*j9m*oJg7&AFoNap#Ori)8vWO9PIxeXGDsTcu*II+5F3yjIW_Q)%SoSlO=()!klx%l1d1pVjVZR=Qr}LsCr!n0te*TkBDh4hYAjPFyihli~J^LsfK^ z^%i5KJwTHnA~eTo9ggW?i_M zER{QN)=@G34@sVLkN|kHohCTtxo;H-shMS|?lN(!O?ANb8n>l(7T}5%1&mZYq7qVx zt?oLpXH(A(78Z|n4hvs0&0;opSwQ$N3lv+`-6k|eqw9cJgIHtRg48F*I7xwPo3qtb z#YI)*aH@!V+hLG+>h2RK-s7-}5c?A^(MC}L147+nLWgK=ui9IZUD~K<^pFil?3X_C zeb7K%lVI2m!VOZz+ib#&Y>N=mxL4XSN)VR1=fwKPiLsFf4Qg}9ZRA+!>*krKb@%=3 ztloOiz_kg%ey?UcX9vRbgMbmhFs8}(n#fqw&H4)l6Oji`-?i74EORe%p)Qh1!)*Z6 zrS84yU6~h0<`<9S)01XX=p=X-A2a9RMnWVjlU&_r;?DG-$G+OgDApe0;3^sA#)N5< zWNu=IF5nAPQgz=6p-a~$es}$NvV1&AG^mVOvEj$v4M%xq%k zzL(~?&+2)=g!akCy4UOg+Uau9Id+g!5(=v3x8o^sJ7n-zg3v)CL_Kgq61>K{DTQcW z9BS?|+E0!bP)(BAB7UtNWNwA=S{LePRVsHKaYfiJPUa;6S2!1B2DjBy51u$i^FovR z(caZ!SCCI}Iuy2LEt{h6@;1Puf7=)!-Cq>zCluKloi_j}x3i3fA8&?I3l#y61+)iR zqop1)5%6YTKLz8#*XIZ3fDu^i%ohs>R!EmSi24i}a{)9hw?#t%gY@^%FH3XxqY)WavV@JpovB&_wrt1Ehb`loTI zRW@QKdwy3Y({CAq%%!lm$=m4H&F7qq3iZ+_kLx z?9vFB*NID7;`nGhW$KZ}tQavxV3y-8=w@x2O-7XUL^3e|%D?l6hW*AsYAz zMteqzTHy!kG5YH1&av6AevY4~S+kvTu9%md?t(IvDD{H~1VI`E>ai1|jI_N|;_E5V z_H%v0xIW32MV`hnJ0-L{^|%xB-h@OxaW*h5QBwmFc>Khp`!2ZgS-x!xdyK6?&w4Xc@|GNK|?}m2?vTeDKKs+XZsT;E@TOec?(8n$s6@woII=}mQ_e{r_f?B z_VPSU9QC9Lf5-*m9-c!|3tYKgj;O$uBzI*YiEe&Qy5*B6G-NZ@EgIsx5_{0uaxoxR zM0Q>d*BpC6Jw@9JjTz$&+OzGg-)|+$7K^B=k-IU8yCtERTs?I{(r=n4k_1G2tB3Ep zanl{3QHRJ(MvRgZ zo1T(DSU8zaim-a-M8jtbOv1Gn_6r{kI!@h4gdEJq7+qWzy9#+1(r#^TW}stGJ@u?H z{IfwLw;yaW?zcv-B;i@>0yaraYiA90eS;Bc$QgN8cEA#5c3Fo1X-m(-%kNf?N8_1uYV#f*a# zW692_d{Y2lCboLsW?C7Pq3xG(?u7UP4#I!WpU@cGVCsPO$LzqkWvdHI#Q_A?wMU!y za2qnz9AgJ5MLSe4n9z}&=Exz~*ni}VLJ>|ocMrLe{Mj&Ho*~EEN_5yacgO-xBK5+F zn=o<1g-ZS1g3AQUt0{@~e3&#~(Kv%l6`^s4AkvE_ZZYK8Xs7K4hQMO`#3RkOI$>9A zs+^~VVPPi_N6FC%)Qcw$^R%A))AnWpbR35*JyO7tkb90;5(*lr3ltTqmrT4*%mo74 z8{sUq7&#X;Q*2l{ZNt*cUK8Hl{ybOU9iL=LIr&H($Q||42~of6Kf~LTfj^s(akT=B zvD_Twl0Ple;l*&}M9w1-(OB+;mrZPn^<8r$;o@}12jgE}d_o7vg76lm79t23rm^d) zmrq>2&H!;0E^9^HLaXs}Swe4MsQP}`EMZ`(AVXvU?7?LcO7#luB1i27)eZ#e2Q|3` zr^{ozyvw09@lgO(97HLOSC;yOqM14MuM=O;i#b{sQEexS_V-M)LR-_;+rkq%eQ4}Z zFf9c)!O9PT;9j|blL{S@IP%H*5Cj2cpL*5Ar_AuQVYs0f;=u3>8>T~x%nK3jiEZ`T^$*P|6G|VN)%VQ-U1l&}=7Lb$4HtaCJfl zh=gxRd?;)AP>cHi3yygVo)--%RnA8Y}U^Dt0vS~H{1+{d({|it%X}J+V)8xamkTC34|vc~MZPcTQX)2V8{`^@^?XN(n zo+n3CyosS==1AOmD59zNjm!3+P(xfIsfVFkO8iT`f8s52DUF>K(Sck!lwL>(LwEq& z!!8_%MZ`Sb@D^EMc8;P_23bhd&N2Vh2R6F+N%}@vF!4FoZP*-^`ryR#wY%+_41@O3 zQw7%q(jQPxZ2z7n?GpYa5X3-0kA(Ee_rm)$%DHD&^%JT9t8p0wt?yPs8>a1Qs5%sD(BrzDqCeR%^P z7NaBxeDX_N^qq*+d}RY4j*+3EIu^nwjveGkPJDF(ABN%*;0sz-K~*D?P1M&m@?rKw z9^@2fKqI^iEcNvbe3%Q^j!`-&2}?VO+^KJD;KS%Ha1te?R=6;WLHxhDkq?un4UrY5 z8|t_bq3UmKE-gf~gMdV%)l%NY1x6@?nr}#AIzKVQ$Hs ztM6>!!U$H<)P}%d zuv7y%;2%{)A{Mm;knWbe&>Ppe>G@dKTof0AfU>elT$cpI*aVxL|eV$m&XbWOexnzKdVs~=vC#;PqSp1>xuxaA;~kwl7V@FUGOS<|(l6eZOMOhHP*yM99O z95pEydFD+0ctXk#n6dV?`R4Q`2Wv(h*;pcmE>nk`HFILhbQL<0g;fjli)+kMKbhEM zRfVv`U_uy#hmb3d1oBTOBoo@8DP-QoyL2H3Ov?BeZXoHOx|9Uhug#%|dNMiY=!&VI zP5f>9W4``n7FkZ#O+YRzCkh;S2x>n!Jk~B;gTB`Au>Z(n1ih--#u+x!^$7m1rceUm zW}9MXmGvtFC|eW61@j)A6~vw)pQv97#K^8Td`BsGl-2jMh5EhF%x zYTxx`EYve7qYny_vu@tlua`OGuuO}Ya3m1ZR_K*FD zuJyo$dn;DQ@buC3u`eeO0vO<3oC^&oQolI~2{}?oFGT^&h1&wNFI4|Au^A!ge%jQq z#MZ$v9eF}mE7gJRhq>i)7jq9|as9SS8q+G=(Rd?C?lLJE2F-Q` z*B`#zYY=i1X;;}ZmsnfE`s+H!GL>)SL^7?0T7*qBGZbKM`oI63J z?ln2C1nzn(xM%uCBs2EHb2Xse4l9j3&Fag&VDmxGa9z%}0&nl$lP8AJoDnI+dMa#- zssbJ(cc00R_0D@ZJ_o;EW&K$w!gw6KMn+7lUIf)TA10(D{4UZL1YD)A%>1SM_G>a_ zbtqKh37C~8!p@cKYaf}O`%Zqow_DMuZjD+H?dcqMmGdN)|q*G#enqr!6h@$Q|hvU>vR^#f>3ZqqswY;f}lpr3eDMWZ6=G9JZ>j z9=#*4L6Hlu69G|*x!7pHsmJW(6xpEk1$CG)4>*YOR6TY_Iu&p}rKN+nh&COmZ|ZS7 z*(u8EQN}K#lqT^P_{r+=JJKn;Kt~O>K8i;L!iuGO!j8O#*pF zl;Hw+0X~w^B;8R+?nyh+sVv8-_aZzyv~I{!R!`o^PO;*sH0N+Uz{esLPd#NvIt2ua zK$?-L^X;ep1zZvLcS$MX;vhr z2^S~iJnl%RNXsBPOW|3xPy^AMdge}cDksRt4VV^?d$8ye^{gG~RKY>+`vf~k$bcDM zs%P)WYceN-|A62QbqR^-7wS1X@)`$8X0He`H=qih6i9vUPEJukm>zNg`8t+MIMh?m z+mTKYp>g1Tq*;Q}B~&r>{2h5sp$p%l21ktq;xD;+!A_2yORZRVNyu-IkcPgndf|?A ziVOynsR#zf)MhBi;&{=HyoUUFkJvDN4k;rA$tN$~(Xq?1D04t`oEpFxPrYPEIzB3Ox7bBI@qO!I4Yq*E^G>}8IiC&g%B zZIT5yDdkrhV28NraI|A+sAWx1TjxK3c|fzXiI+2H%oiH@>UEP>^t^Humb8&qHlbM) zdU0j*QvD)>M?@utT)lqsvjXB8;sMQBoEN=mC?d;#x`MKLw2&N~J3z(?Wb0m1?izUV z0^z0E+4K4D-a=Q5KVuO=zGG6Y9*S$N(!TBk4r`6!+1Ya;r(UqMdjZnHLZW#q8glgJ z69V<~{9~uc4~TdIo7nP*^c0ff3`0%5VN&aQ={LDB6#~>q4<{?OW4=P3Fp1uj-f>b& zTE*}ZQ1MID8z&P+B``dks-e}Fv*#C6S}`D;SN-$pLL1QH7>szNe<-6TJRo6KTD(OH zp*e+m)8tktAJ9T`D?!xIMjeTw>FUjsOEfvEs6$#kvW>5sB`I;g+1Y+V0t)fHbz4TI zSflKW*#U8bx^rY%d+IH%KGYf)j%7414C4ZBvgS0~z7(Xc$HUN8sI4fhbrks$U><}4 z->T8tpj{4R5N;kA`H}Jl4nSC#LTD-h$0EcT-Zm)}j)I;N_K;{AiTX7HeIs82L`8rJ zdjdsKAmLQKee$ekNBNqYVh4hBG7`=6MaJt`XLVt2VQ$5Y1>gpPt3gJkLh9NOF@DFS zs8B@td|htftm->?kRH;Y{+ENOOM^VytZN?*DtQ3!oD_Y_O2uImEfJgz+@pcfUf9Fqfa5O`oA4&wUvOYSe()0B zqappC(vbBcL~QNg?Cd%G_X2&cjTk|rP(HVO1ociis^sY51aP@DNj-5rADtKng!a9Y zqQ~f&5?_YFKhW+G&w`YmQ@<6aMhZ6+5#;wxijtJMulP)tr{y54ldc{x1q3Q3D!wet zEsLTdxpTAzouD*`Ln^7N_fKw;IYu!S6uzhwhw?*=<)%Kc*(bTsF2fwR4ZbQkNT5DA zc(iRo1;r3W3X+LLrJ64?H4F~lF%T5MMG#v;5U7+=BvgH9azJ3Uz3hetaddz~=`t=g z%W_~sM{X~NdeLm)981w5^zNz;>wtBSdd0de=!TKTe=%~7ZitXJX9&7%UZ6fQscUq$ zkKy)zYD}HqIJAtefg6z#R#E44MZcr(H*Fz$Ze;{H{lS%O@ruBqmuU?OT}@ zEyIio-(s2ZPRZ-vK>eE$O>p(kJ7gBiW7!G??gN#Z16o9&hxoxKPj-taQcIn}ghYu5 z)dbQzKBZ5)wW!HxQ&4@Nqwn92Ce+e19V14Ad7V&l&q^))M031j;)3QMuQA&vQIBH1d~rnR@C= zlOpHew5R!ISi_>Z1+pU1O%_YDX&n_?MOV)?JOM z;3jtuuA47ToBGNo+BcspQJ1TJB>AxL>m!Oo6rqrn)K@pszSV{KxrIZ`!@Lml2-Rhe zWM<4!Pkn78?W-Qv+deFP-*;n5EI>6%tVn%*BWnesmSk~AJ&&uj(@V02R0;G^lmyev z)HfzY^sJeL=9^)&frRdX!=j9RaB)6Isgwodp)ik3HYH)P!gC56eRCrnmYPnhG)}G( zHb-7u$s>VwOKePhh8(?b3ITp=QYry9Eo;6R(nQBa1iwhw9ILX`aujxTi>0oF)V={Z zc8LDvlGvsGee&Y5pX*g~Q_d{`BlNBC2-*g@&rpd_SS9N6?a9-}eK0lC^esxdSAw8w z>AEN!(mwSaeP=a&ZN3@OY4#m{;mV?Dy;7PtlMFCeu>z7O>bocVHbw&-qC9ybaD^>! zK=r-J_pb>ec>)M=3AGTRHOv}=9@XH_1!(c*+k+a}Cf5kNKm$oYM@I{hQ7H*iQwhD` z2tpN;+vEFs#gD|qbaxzEU@7U5_~QoC5?2quo=0*7S&~4Dz>DKTqEbJYe8m_;WXGEs zqVv#N-vq4I2Gl&s!lK=7T0~H=(3wkN#8|2N;p9ukX}5m@+b!cRwoTn;vS+AkNhud1 zzqsN%`txIxJFxb8q;kb(=3q z*GmXazWT{EW7UJ+`3^cIWCpvgPb~kZSN~N{sZ?@G$%MwzgFED@pIx(8eNtwqhJ@6) zKs(S+9rg2T%Bshya`UuIZRq0&ai!`P*NjyUz=}@1gHnTw@-bG~FR%WqK93R{2J%zU z_3+V`Rll07Gd7n@#^$dl|DsCa)Fwvfs$yxe$bU0=2eIGUN~haWaLBF-4&l_)rE@t4 z3#xEX1=Gz?jfBx$s{feWj6P^fR=E!2oeWXsJc;q=p$!sRF0o^OYk2+JKbVeVWWsBa z@LG?V5e-2K1K6{a8xfI?RQ+!9_A;R++J%pbWR$5|#`mbxR+VMNG`j@bXqVhnZS+Qe zVs=*l^1fR4=e*>I#!Os(Y?Oei3YiuLFAR0`-8rBTcUQmHrhL1$fPAKlx!c7156mre zsZM~1~C0Sgy0F4f(q+C_TX9c9>hr>>a|tywhwly_*c`VPHG_=1)VMOB3T9MzEjt@;u2ozCTMf9r_d84(yQ(_ zCD}mRe+Jue-x(~)P^?MEAueSjd5z#Gwc31j|0z=?c-ya3$FEy(bn#G8-vPSTIPLJL zS5Ee!&jF>w`sx8wcNYhB`$xj@Ogj#U7HWSpNazs`REkno1T86651d-wkycdGVN^qa zrAwb|q7d|u626Ig(A3^F4+aow$JPe}nVmfZgzlk04Oyt!NQF^ei?q2wJ$UNYYd%z; zHh>3Y-C2HR-pj4%9*XMiQib$M(IE zd$oEpNC-tk(=-oVqOw`49yYa+w8oL+H2Cs0gbYwqw7{V4jKoHd>I&-NQy&@!mN{8) z65;_cz95nTqtDIfOT_|$nF(LuYXPnccFR$ckqtlsp0EkyR6Sx!gNSxe>E4X4f7_Mb zq~NO#wl9j!M{$iKY}ULm0eEW24}_z4u=a?kiK4|x$`v(3NFGv;oZ8O{?3dzftHj$; z-O{dvgDu*eQhy{z6NzCeBw-9P0QI**7rRb9YU;f*^N2KTq(VzuP2aq4RUX^)(Nizez46+#weFm@XS!GE;zUlZZ&Q&6qD^6;QzL}e$4u#}vCw&j%)wgv z7p+#CpziRll7p{9JX(f(Zz1=fc1-*x_Oqma$ok+yh{-@HsH*4L)T2<3oiZhA)~HTk zd&7_0x<2$Sgm&e!SgVP>vr&6j^&veNv2M>~#n|dDdg&Ztlf}bwl1ru#2~gk?)HosZ z`M4M2{Co2FAIbZ*!#(C!JUq8DMa#?(`%HdFeneX-Uc-O0FFJ-`AV z)F5*pDU_1N^O-P5a+RE7(79<`Pe zq<#GeOW0A*+|-t8=%rZnO}9=$u{<(la%6&C(qs^}L?z@|Q^&DHqPEeu2^wGWX1=Ny&QXYofKtj+JYPe*hF~d>g0A~sJCj3z zg+1+>;{r*Wy5nM^*JiBzRD&9ht~GC$en|3dYLk%|6?owhMRhH zF-|*@td5UBhMI*y_QI*Bnv<*FJZ_3mT9tXz+gwI#b{4_Sxs~PFSuxJ{F^=ta_CIfS zw%J3Kt$n)LKL~+gYDc<~22W)eeHSJy>K$bH!g@~%^`fc2?)06h=GG8SSF*62=O!8%9jh)KLt9u6`&{s&LDI{=~t^%@7Cwt$7-&MV8c2-rW zz?qA1eXd-QP6wv22wnCP#AmUTog7CLX>0Y8$_X71WVY>Am+64rmjbud4z!+*_S)P5 zy#D>&G45@3OlfygZ?s@Ynpm!S>D0b@kB9;&B9r|IiWSF7Q=lP=n-nCbT^=ld7z@c0 z`~GVGL;P65A5#7k!8NjBq6E>5#I-A#+g9mFx?r$RJRo{Hb0&^~K?*m9Jmn=F9WwJtJn3pBKRp$9$GLe5HE*)K@pz$-d%3>rdU< zSM55TtTTef>?TP^aKpi^Jo5HPKzf6YzxOVT^^3>@ol*Z96DcHa5xDA&Q_qvZYR)CJ zrp7p!+C3Y4-wmE`HI1dZ87c}(wL4kAPL7RB4gj@G9KqPso33>yPaqmG1?4C#QV4v2 zpf_)7S|f+V{j6Y#K+z2-_c-;UzG)pa0tV+}o2E6LU(60Q7uOl`w{y5ps5RA{+CW6@ z9SYeyglrKPQg6N1O>G!Zs)_V<(tcvZ1TFQpsb}|1$_9ioH+IJj&TTa*#+KA`(wYsV zHMwxSfD$?(_6j8?uXVGLNzED1JPNH)O^W=pcZ|`+;df!5@4Ca+#QDkLV!SKDL0Sm> z$U@%&!Qj$W@0|MDCU3&NFwhQnvGGC2>nDPe=pg_MSmfiuYE$o;dR6bn@9ngJQ{7?k3lGn&P{y~n*i%Y$>Wi?j;8k|65 zu%O|@m0VHpoq9oUN8Iql*-A|~p;~BlD4~0$+I9e3ld-@MV8ZHG@4MEmEfi5H)WEP) z1B_s+tKNSy?VJ%)VxY8Y5mDf*B<=zfiryPl2h<0yb&~?Uz$FsvBfSfqws6%4r=HWd zPuvr?PmUBq^R70@9{$oZ9YG3Jo1DI!+-Enp9QC152%oQmDGiQfZ?glepWd`nhtj&S z8Pnu0C?F~1*kc~X1L#&E+wp~c;h{pEs4K&@bdkLvf2>}^3 zM}7QSw>NBZ`En$WD5J>2@>2DQYsKCGucoMDMz>Npe~3SS@?_o{J*7Pi{@B_VAovsu zqJ{`5It9!+^{FY*i)&yr3c#)p=dZbTDO!-%7}{dL(&Zt zK5EN+W;1YC5PE(AU_lxaidd*bf7aaM&2)fQk1-$Z!+i@VW}7V6*d0rU=a!cRx$fHM zPK=PclZM2lfm(7DaISUJOMww`8$*mM>LJHgp*}bDtUgn4oWf??G%*8Px-}UQQWddV zIHcoQa`ufQPYQ_mjd1%w2E&;I)KZ2w#^^L1@WR$ueh){_PqelvU zV5x6jz5Pl=8A1!eH2AtU_1jDJt*h@@ff$)g?HJ{oL`(AIZP=8_w*MSEaL=#>Zz z*(Jwx$p4q>dna=(jP1}M1qQSYH_Rr{nSjIhPv!`(4g9(+1SE{9TTI~^D8=drC-XuY zCvre0q-&wBLLCx{R5Q9iJef!Qh!(d@EJ)-*7!=Z6yj-dP|7b^!O-h4%79y-7LJ5^A zRX@Jw1b=gMJ*gFk;fCg+pQ)c*Z3!U-Wt>ASW(Qgl0@}Iy>C|8K6H5=zk!iS6{7h?d zY*vEAcF1~IN#ONXiaIIoM1YDxj+z0fahdx0)C06#Yi%g2$D9V_iJX@#BnJu!1TD9% zZ4*^k&JGrb6DfPKvbaxwFAF->!DX><0p&P2IFeDb6$J#F`e(n`Cdm~dWukr%i)sU` zfI$6nYQ0+bqx_WK&Iqp%{TL;hF|GZ{p24;y*DwKYg> z%tUO?G-({QVkA7^6b@bN#u-&u5itFasfX+S*cIt#yhN;4e=b^BLI!CWVbLx02-O7i z5TLvS$eb4xlKbt{-K1Gj#nb5vk->;wJj|YI95nN4OpX>Yd9C5J!_^~3Nmy@+4#FO6 z1*Gr2(n(W{DU0ZPseV`GI@=q{Qmfl0n{zRrE03Gj)pXc#+t{;9vjA28Fbr@vNiQSy z^!J;Zw+5kaEyU9Y6U^2cx}Ihweop3fT%vG-?h}b(cbR^qSx!|rdA#M+ZdP|aZKYwT zg+Q$Jh=gYmVaZJ0b=rvbv~xn+WT~bJ6~bM;e5*?e4zko4A$mt@Kbkq}Zqtu71GFI# zi>7tWnyT8jr9~wPP#)8UdCQ4H1(dr_KSMXpX^+ynhnq&GHj$M%_A1M4q<_##p=1)- zAZ4oVF|AQ|XcP6Svgsm<<6g%)`?bzlHgMS^VdrfOHJesLn9yfEcX~4BRW?Nc~6!i?E7|?+F z^pWc%>fX~&G^=q#S5t+PwhuTN)zOj;V=u!nFDaHr5pMYGh^|NKKGRP&4cypaXQrG6 z_N~2bXd>x-R2t3$E>XY>j=lSC?zm~1*eDciL*qQ5FiX;8kKV0yBsAfF^-WWR}Y%Li;Pp$ zKJ(T&g13C|lBP=4p2&*HT@CzHJ$U;5X0A4QQZ(CeQ$s>V6%$296vg!-N;9a3Y_U1b z#@k$TBH;-{i47A(L}k@Ox44pfw%Vqe6v6R?kU}9`6bH~CRS(;o9ouZK*7dlhOEIGw zHB=Bt+M#WQiLD+!y%~RvXc*o;J{sAa$-=&3Wl#Ns&4C6mg*S>i&XE0L;t#PnuB z3n>FU=h|Kx)^Ro@I}F6j4@~s|}DK&~X zm2AmcB40C7kJ;1>(zH&Nl6JYbGB{K%Njz*Q52*`F0xOT5Hd?{WgQrIJ69he&m0(A?@f0YAM;ZPp>*6w?)ku*>S;Qhn0&i5F`HG((IF zX`CE&u`-R+lc)cY;a&@v46B@e#Jd8QtNl#YrKmQYWb{%1a|Swlwo$6H=pS_zQ% zL0khR&84|=MScQ&H@Cn8$YGKK?J!LFKlteCsnd-pPtOAmBFLJ@h^WlZ%jZ!ZHO1b* z=|xJOn(JU$usT3UDUIZ+r%kVl1-T7XK}Qs#M6r>*jYeo$2AI@2O0Khk?>v241-I&$+Lmj1QRw~0tq@%DLz=zxl?1YT| zXHLIW4uviaj7m9U(7;YRcTXkA**4o-CQWrGow>TavUs?$Y`B}w+|1`r+q*|=#K`WV z7gTgCDI%D9R!P0&ELYDmSEcQ=Pa!HIR$BI9W#ZRq0{nxNgy)N7R8+sDt%+J|sr?*| z1ry!Sahm3#v?DGk&`U`z%El&v)USW`w3h#-4p|G#X{&OXst`9{hNRmvUd++bNO6g% zk{m<2nN_6)6jfGf^2PF{4zScBrGX>mu;l`k6}w|b7=V{2`3J2*DCa0Bzm>y9u&*oYqDH{Q;X)Sh&YEr*6k}oPENZ<*D8QqUgu^>O7^3noz;$)rqCE=@* z5;Tbu_=w9rZ~9VM)&{h{WxMl(4{vmrlzyrn_UZ-t;c*h>WaA>wpHiEfvS81jex1JA z2J&`9mZy?U;x!09ldfY|PG`Ls)_?!ntTZi{!-cT0Y+h08JvEkvMEBawCzfoL+<|ds z1rZuI>IJ>7U&Xo{R$~`bpsKNpzhHt%Jbi1US-6>mSA70ZiWb3^7jEd58d>O}-Ksi> z$UQ5k3o7WZ+7~XHffbD4pi37oCJgP~Z%vW=2s8i{luM?2D&ADC=tE zVZW71f@g^?J*QzUSHH%rFR-=5Kv_B@2bL6^yI_e>q%IpMgNPEPsWv2aI1|)}lI4s# zDhw;Mcr@%tAwjE#RLMZSWLos@x0_ZLCsKT%DA7um;$NP6>5jaH^M(UIwy78rhS(MA zWjpd35C`)7bC>cK@bQQ*zkK@7JDmfC>~Z3VolM_pubAG|EREsuT^pNpMe5m@dw6~> z6YEs+#z-Yjqa=*H0)yyZ&B>_ee{Hd)+Ad?h7g1*9dO&wc=KCQ3(RDGxAVJ9-3B3YV zmu1`PmD5u9*DT<*A8vaGmKKk7lEc^wlya5T6Ht>HOrk;F+phzN+N@S`Y0HFiF! zUNbG~Wr4Z7tL;&JF%K9#VXA*VeIET6vCCz5MEZxK1%}}u>3V1dQ(2jt(!rv0Upp-& zg?dM5T}h+FCYltakm}KyOe|ZyZhDhi-UK3(m=Y!);*2(0rRw#@J~jq~$m0#z38spD zk**$)?z#Mxp5;`7K>iq-D;0u05-;8`ZP71d*YPX9uFzCfXEGmQ7dbF0(K+&f*=$d} zar)fmBckCqs1#F;FU{ic!gkVMr4_UQ^Be;mD>jqL-el9h$ymxJZaMsu!~51>Op4d> ze1Iei7ltCQkYd1*)tjfKTvb(6V^hz!tz%NRin0)iyrF>9EQNW%sHu}ygz7DNR(scm zW9?0jLFL%JumA#ul~&goX^vo?#2FZrdFsOGjgd(z)LW;e3i4P_3YHHtx`!w*3=bkZ zq<13pLC>XKsAstt=&^d+<}5q}=cuSkIqK4d#^%TB?bEwu%8f}R0;A~3Avu~D$j@Bc zX1!4pd_K|Ko@&K8SiV%}q9zm?sV;ZRJEmuw<-=#X^~c;JsDCkm8I&WG>nV#>1~4Mk zJA3YU^Ri@VDWTB4xGRPtC62YRbk01jBTH?tf##RT^T|1`q~?^=%85!4CH1apDTr0= zlK{BDSnjoTh#9L7k!+rj2)q$lCJ?7fk~=I9#!f~VuXh_))UXFkH(0WDC(dMX?Os5R zuop))zqgU5`)qL5RYFmC#Mm-Ry=VFfUEhs224)EC8WXGgP&G*|AQ~lAu-UruH=0#k zsXdKKhO=$ynosF6FkE~G_~>5wvVT!Nuqx%g^=!xy#NEiako9E&Ho15Z5odU&-aDMNPrl#$U1sdFjP30l6ic)Wx4XGQdmF*;tt2O^}|?w zX!?fD6WFE^lUENXBJ>0eiD{4^K(YEjeR#T?am??!3#*4+u4}(fdDhHa&pFXvNtHrn zb#8b?!E{kHsszcU%9{E}?@d*|B;OjC3GwG(P<&q4Vh-!VV?13 zR|f6dUv~Nz5dS7mv+c@JUR^08 zx`PBk8d9{B>xIH1exyF5?O8p0V+oJ^I|0hj@bWvKr_#ZaG}mU5KMT8QeYv+c9Q zyxOOWs0PNqr8Tg{V6g%QCP_&_#YFwvwA3aG+OV?p5(HowWTns#88P)|4cw<#?trbF z?{wNCK}UVAbu2O3C~_?vrE=nOto?~Go}@(TDd#W76w5oNEyswoHLtWp7!dI3s)EB1kj4X?qG@o zZTs37<74Ovb9qox%ZEvAF;-vc0@~GUfXVgi#B^!QL~Xm&&*eEHepot50^}0WtXzF{ zI;meTCuMyM`h5mT>!hjIP|sN#$v&!%TJ&wW<){i+I%vdOiTaub^eSQ9ba8Qh?A7Um zQ+tl&rvY|?h^w!+jt83C-8+_E_FAB(Z<)oib5d?y)XtNfAl^5o|Eb;Oq0i`UKZm>5 z5)HlpL6VRreA67|)eS61$OzlD&sT!|o*`I@?hG;D(Dl@}M%@Vx*`=~#*nX>^oO;vP zd=ZCN)&f3HL<&{l0_dd#CH{RQ4|2K>iYU_RrA1*;P1q@@>GkdDE1Hqv<&|X@^hqR| zwV+M3%B*WFy4~71Yp)C*BR})?Z_@aJlDt^roF7Giy%wnNv=@h*W21(1;ON5OqaLRu zZ!kZo#;EUh7e`N!$804XB%&n56@-bBBS)4N_5JEHfVqP;s_&5=J@bRGu%PSU`IqVkBW(Wp#pPxEmy5W+&OEqEalyes+=$H|<1>{7 zJI~2-m$;_-;r3W$#;d802@XF7oNI&_6nu6^{m7shdgw9v`mg@Vo}<7UfeP6h9qJrv zBMD3!mFFCRfx@zLgpq!%FA{UZ@}%mjY^1Wx0_F*8SCnYHjdraFqAu`Ve2PDjsFvnr zHf_t$%=HWnCruptn9tba$Q`HZr<(Td7?Ez^RP`luKu`_OZ zGPu+%!qh*X{$H$T_h50QOI(P(%;8gFwC6$|kzK8Ru{nGICL_)bu|eP@VW6vDY7A~C zF_u|Mw){%pycIaeY5-gc_USKmj!X_vJdk9_sB+m-@Bumqim8dZ%Zv~)#{6`FeIHU{2s7PE;PU`Amh z=x1#;cFn{vKr@#U8;#S{$}nT@HglOgyUosBvs`g+w0u9c90>IDd}mJMelZg9C7^1E z`jMP`cb^f^(d^r?ytrUxvBSb+Ilu^oM-15?PbnrjP2FSW?|GISg?{^b5?*ta4;$RsSv}b26!Qoe zj5!k^h;X5htR@SMDg;pUXIj<4$6S;{=NQRf>}ME0xd=LNeLraCAcIted&lnLPt&ulUR2B;>KW#4jwC;*pH51G-{x>@->@rb^$*}rIv1ij-} zE5>qQ!ol}*A+tnf=3^Rp>Y+VHt(oQSI>YuAL$+ROZb1BB1m%EY0uSAohs_9%9k#Or z*IX#;GfL!$XkWewyn~#rFXmxMLaBPV-WcPUHf(5Oy{Pq~^q1jAsz=OhBA^)*zPPbP z?m+&**HDkt*GsJ$MTw!-sjx=>&Kgo)2QOzC+A z4p}(r(LK-JQoAY5zGhlh^=*Gf~*stt6QbFTZ) z+1VEBj*;&whQ&6x9vcTdD@`4;2cIx=NOpS9rE5-=CfL3CeNcKCna4SoZ|M>ncGVMS z7UXR`0rK7}p4M(*b3mC5Jj^7rBa;y0Q$1xu}t)u7w-w0PJSgZx64wsHI&Sb%j06kEHG0CCxQTunPi>Fr;kZNza(d z%Y!X%my`61rKQECrUS0o0S!*G)edNSBs@{XX=i8ktD27N7v`k-r@cj0dTno!2t&4~ zV@Q6WgyNQ&P#r_V#5L*s79&>}`4s(4V55mjt#` zvclCfW}Y^DH8m4p^)Z&WIsp|O8~X4Z3yW#k1+Bifl^o6q;7VxWr@BbxT4qMkLQ3pWgzMxBGYV!xK;ymx?~9&r?tD6$nhhEBgzvL z83?92>e(~T96oQJWX*M(+846f>g0{kaqBiTNHNB7uWc}NkV;!UXXY`wp%owASgYQ_ zgs4TQK1{c=6KeBUo;W*u4*$KNG&l}>ws%=!pOHI3+%(1aqD+i>?#MwD{iGcmL?g~r zO}9uh_0P7{ARvYTpiH3-N|LGP&4@PAwwV3HtRfWbypZq`aXE3#ef9hqUFv6WC-fGV z-DXkM5%pdL#Oa+#I8UU)cxb;ma6GvaUoc~oD+X?szA`4(HeV(~cJ5$nsUwj(Achv1 zgD#vA^}?Aq58t~c&8+Xb=nr{pbqf!@E-sXWHj{=p^hCDM=9j<|-aP8udeC_gu8NIshi@1vkW$Aei^!nHLWqxd=7~X!%Og-L#dD zyp^-1ZTQqLXsiVRSLGLamuBh$uBE9DGD^4`Z0jX6&mG?6{-rs7E=aY72OW)edwZ9r zCz7$&q%6KW4HLhKth{wVb*#7Bn;&{OpLDUFww@)@~*z7!;i!oSY#G z)m+{(K?Exy1);;jGf8{uclHj81lg#!0@V(< z7MxMNdge{TTU}+Z83(CpxV_B{@A1zn8|ji{`S3oHj#hB$`FDzq_pG!4%|h|UN-zyz z%UHceBX7;jBK^>xM>;sO+W4qNZ@MMsV>?9mGP4Rvyro8$dhLu5?Yhq%rv{>ac2}CA z`*e~9kz8a7QchoLl&jaxT-5XQamt10r;FxF_qm)Egm;MEM3f`R%1pg}vm>H?VswhS z&&EXb2<^jM3gomSy+eoSx+5}9@loAo5(jTl9M^fI-Nz%X2)UNL0CcNi$)@U!Gm=}; zJU$qENcI+o7mpT$ZvdbsgzLcMBsql2zv@jh7q{Qw4L+S8twqiEO2&?Y1{g<0}JAS3K5ItnFg-CIeXRi;Wbr0Gx&OPvTK;rBA`RI1!-| zvulviBZWe}Wk%BSnkIu1uD^HIIc#_hHIICF?xcGcc}ZYby>;gDp4W^s=4)I#yaLiO z#1kp~OC&4JZS}U9hVko44$-I@Rka7%1pDN4k)a{6fwJ8QICus6ES`G%Ow!Zlaf&R} zYM<3fc7Acp$bDAtu!Ucnl1wB5-GtTEJ2ruIH1dz#msI+X)mw--qyJzLnSg2>;4i&% zMo6{IB!}ZH%igPxj%YKjtL|6#2qO)@EJPNUTySVg@7l!i(EBd^qU!Nfjp1q~1%bM0 z5zJ@x?imq5Xu2{)GhlG@_Ly<>WG|3O^?XVnpb><7nR4pqWTL%i6IOyg-E^ym9G~1H zocEwOh@v8KrQSR9y`DpYLMdZxIsFRm!fvW}{i<#VxouVUuaSCz4AVg9TeD`tV&)9{ z-BHhF3soZ;z;%i#TuT}O5qDy4@0gl)*!+rh3b+F^Ddvo|?51l}nj%rGBWO>msladP}^bx2J7?7^nMK+1=JJPcC zmkY^IXs(lMLmZ4u0$+V_=1IMyMj6PRX`7K}s}51UeY>lmHF{xzIGqde!=se0Pjsx(@QCr ztUfaH)V}78V`~g>6vS|m<#GoMS*Tmfx-q78;SbNjAWoTH()T%!ff2R zIvQW!ygE2vnJU!w%bX-Gq;776vXuJlCY-P#_MJu@s&@z>lu%_zLT2FFF3FVF^!Z`T zsJMur21P_m!ky}Ko0^}74$++cCPY+662!3&LNef@f?N%<7fVNdex~eM3FDwaq&h9E zi0~oY+<8(~<*&Qu=3z8im}s-)$YJO|F*GM`(EHOCMD?oO zkc1?kj-Z#kO0(yT_m4IX8Tq6zM~LvCkEOmib7i|@n5q5m8+=vWu_JRw3LynGUEEXs zV0c$i{6I!c>dL?c!-f8mCOtJ>jYc6E?L(}7wfqcfupZ6s5TC_QTkozmLP|w)OEO`F zBuA}6^<_g+Z{8elq|=oQW~bTb_4Hm@WUDK+CfQ&sd=3}5X+St&fh5kUugpB8=XM|& zePHZIg&;RDC;D16XVJcuWMy@^WqjF`PYVhhl8C~!l9v3{byvgqEgHcGs3wJ)5mA94 zFS=O}=d(?VZgxPLl8dU?J;05HT0x0{GH-LQl^_i>M4IpW_eSe z#6RgaVGfcz5Hy7NSGuYCo=zcX-Wv|?pTTYqoxux-az>=94t(-}94>UkOLPs?_cw8W z>05eqSC67Ts@a3>z9M~Ez%j<|@h}p+Q2k&N;k4Q^$h)=&2Ok*{Z3Ms z6Ux>gLxm_cLQ?9-dRtVycXN>A_RY>NEG}GCEG-gUUtGA9Zv-)r8r}jcZl2;p!6v9@ z=m4`;T-f32Co^x6%YKl0)(x72r6OX5VM7#e8|e9Mt7$Nj)f0DaMo@a)<ABy|UAYVd5ST)=LW%$1F$v zN)MDi)dyuRhKQk)pBHg9N0LU&zRT3FXEr5RO+eoz)+avqxlS&*#5;3(f95V-arqG0nBy z7TsEH>Us$4tsoqol$|0!pwl%iL>}$XA~p*_Ja*N8jDb~-S_q?lzWobC_lA48u;5>j zP~^EDq=!`fc18r@7qGk%B zH|tp8?`Cw3fyUH`hq&lN#oGrPGT!EphLG44XD~-Zy#|df^?SoQYZ`%rJ7DK&pkN!P zp#>u(6e}Rj8Jv?mdsMB|U9R(?HTQ=Ra<=2vVqbS-)OyV4t*!voZdk^7cT2#TQmbq& zb}UMy6uUsEe7VDo0wB`?z&IrN&jIY8$R^_&)jaAS`0B3L`Ty8^@9#>EYu|6J`vZW% z0Dpm(f736v*Md6-zh%EiiklMemBbN;mh9`b40jwtoB<$&A?MofJ>{Hp&Y4uAMCF`w z&N=6t^Yv#}_c^Ce0uFi(a0c^u-xE1A98_0TS6A)Y`x}gDWp9chDh!6w^%$C*vMElu z#vuHU&N(rPXb58B8snx44S&GgfMQ+KC4!}ZNrd?mewMUST0+F*bwT=q9QeSw>-XBq z%&T(z&h+UU)1auDf4bwY7b-)H?|P0kIHX1*gcwcy2hEwn&Dbrn*7CO7EP-opf_iqb zi-2HES;%zX=ofCS8)X-2ip(nthG;Vc@R{Yob1L6h4Ws!_#*FYMB-v{|czUbCK^MXl$&c_&60SC>d9 z($M;HQi37LvGQ@**&jNmA^kg%O600kKApWgRa?v)$R*t z8>mtWv%}#(BxU& zRzhHbGO;4$l)Q|PHtmqbFYs4&n1e^nb=3!lBck}eyKC8v>h99}6^&RHnKq=uFp04& zoa*J#b1JQF`ZC-|wR_mLV;Vx+tj}x4(LQw;_8f4(WZgxXU6o2uh$Nh){)8+(m3IvO z=H6yP{2{tb2RV)(v;D@<5=;d8S4q74Tg3Kp=0||C)$e(U(x`OKNutBfY+33WMi?OVY{XK7(k`6XuS9 zIAfvdgsce*nM1Hd`TmJV@l*t5(6{0CM(T%4y(dqaQ}LeRtNi$7=2!0@qqgdTADP63 z-WK@65$c4bhUggNFZ5yM$#awX+7}=k(Pl^bYIm~sr#ya+MOT}JnOn}y=(_(J?|Ay~=t=Dw&W zWcOtg`3_xa#=Y%ve?I!Yv-e84^PTp%{J|4nWq(8uq}aJva`sOL7*xGv1el`|yB0lx{HxbV2u08<&#s=^ zRbfqC*@=ZuipzZwK$^T_#HIHjdqI7Zvu#3ZO$n}6SGu5#TqM~@BLLX}D<-$hC9K2R za_@>}TvctB+m#`R$u1f@kb1A_wC{J@SChXjjW#mRA`gLwl0vb4-;!Hf-1mG!a*ArO z%^XT@$Y{QD%r&j47Cq{|SC%+oAxmNbPLH{$$g9RQwBLQt#|p&B9lXUrnrJ!h)d#=t zq0);6S(GLbwn{k)YOk5QW%PY-kb^!T>djPN)J178++E{}gcXQYqQ_BkMJ)k2ytc|G z4&NKRwas!n9_VDfg7y<`9^R3)u`VF%8h&$%a;%=3O>serNI2Y}txh3;tY9v;nLABw zJ2G0DoG)l)rPc`7Z21oPDN&UaSbQH+HOMXTha=CF$Q$R3Zmwm1+}NX<{zrJXo=dPIHQo!k zszLJ8*gM$Z>Tuh0jYq1yX>N?l$|xnTK`DdLJ#MB5hgbaGr~2S%@ofP->XCQKxpxP) zym?Lyf9!$L_Kb~eLZ>rp>#G~7if1umlv3>ggM)l3`jGqf$eBM~m};0? znO$lQ#7ArZvkVz z^W1#>L%l!U`Bscm+2s8kA{Ics z^xbp+^T2X<)VWkEBh?3;SfH$f(kmlBNs!Ex_srFLnZ4KIb3xn1HKN$+lwCUt7o&UC z{D6C{tgM)38m7yAT}NpHC2%r+$b%3$m-61ZYw3D7?#FR`@XoSV+q`$~5kxZ7_VJf1 z;j_#8=8Oh(l}T;>aE&yoAVp&)y^A*rD#KD;|Cfff8!RGaIU6#>LVQC$1D{2(45*l?XiW{HjwMPXDiFFB*ANgu6YEN)J8r$gIU@( z6@GHML=2d*WehzeT=>Xbtz6wF8afKS!B&ESB0*4Jb@bw*mxx7!auLoDpbViq%12FH zR@d()S)f(iScz8;*~p}TUcvqVo6H=JK}S9|r+TH$7gx!2+15Fv{a4Lb!19Q|TkyhB z=_6PKDl8vA(3jZvF|k4Eg2Rj!{Tx_{K3=ZwsWegpNjt*gMP ze@1+}wRWDoye6N}@5#;E>{!;vP#R2SW0Xui`PAH-M_))rMLx(t_ZwmE zaV?R`roFj~wh4o}^8LI33ji407MHCaSw6IKKW&omwH&_5p8$lMTz0wcq8>lZ$8h57 ziX$vWmXb49K4S{SVYTDd$7Q;4vpQEOGL`7$dZLr6u-({qJK0CBHoEB#`C2y;`-{Ge?rDK!>*(Wx7J1+GNkn9RmHIwc;ez?J>rNVshq>rf*Aeg$8=bFT zbD-wqTv=IN?Jgm07X4fts_~RpjURr&*e3jo9b{bn111dbO1pNC9zE}Qn_!dk0^cOS z7?%3!$mgn?Lv^W~UX5Hpc4&h4k?G5G}WzJa0xrOqvk zEWri%seEb9NZfT-yA8#5aO#`O;9i9>m^rMe=)I;8)TzaZqbx_*SAl%l+{e2e9l`n< zxhqUQJ@xv)*CxPE2D1j+PVrooub5Aw_uyfI(TE8;@MD97qz{l4h;A{!>0G`#w;zYp zEXoNV)L3KK@^XP-UyZm#vW3gn<{sO(<6#{#v<43Gg|jSe7cul$9Tzc@RRh7V&waSR zOCyAr>XA1#VQ!r*HsJ|pP?zRJdn%ss_y|$%2FlNO7Rfh`WKVUd)B&nr*!@+ zKOCRezqyLpxDE!tTLAS0w5r64S=qObs_(5O)m_NxoYJfK^o5d=Y)&`{YZ) z9E$^Wxt%-ymDfYfVDP;gdVRGB*4A0!n#={ogkHW{t0FQKBbWcPxym}_=(by|UAy~Q z&teH{j0}(!-++3?dxiXb^m^Ru-FEV}P<}Ak!P}Rr44R+vi#bDKsFUyY+8dkW7(0v2 zZMXB~jlG~bd{&GJXBHJ5EnWHLoSM{m6+~FGzuY$+>rQRD$KTLdjcqA6{5F%#m0`{iF^2at) zg83d^a>#p9Rs>;*U+dg^`XkyA(u^ZE^Umincdi zd&)oUb<$OI9oxDq;9~SXIeGWk&({YThx`8BizHzw5yLFRJt2Qpw>pm!Sc)bnv#L`X z7k8Z*;I5P$2m(@^v%)--f6P5&l9}-?&6y#82!0|l9zn#96TgTtvjfEgm2dv5r|1!qy2SA$hxMCtkl%m)Vy!7P_(o^QcY*Jv*dodU=8f0xa9!M-!kyydq@jnx zt_$eg0U?OXmMRaN|E(SfoK96b-=H*_{Gk!>gw=!Jj9cXU2QJL3t5>fTXY*@|HI`u?7@4okDeoCGsNxy<&gZ42hSVw)PZ9( zJgt#sH%=E(9FYlqNXv$F?V;FYlkca^ypV^^E4nJG6&EIh33Xod!IlAJ3QGZP2%tnI z%H;B}c`YDzFP!6&4FE1;G`caAj=+Cdi9CG%+a{?M)jkVDUrnF3`l+gU8PI8N>F@DNkvxgSN2M6@cgT+}YLJ^E92+>FyN9htH;A z&MYsW2{PiY3d))3aXqe8c_fdU-(S^v+>K=T`F&i*I)7PH8uu0lGcQ52LfE>3NQYIY z+Khobe%|<9H7-oUYK7yvr*}NX4s_HWdXsLZwPViNE$;5$(N1lcN#!MTLrO}Z?}hT% zu{@V2%pZMv2g?zBLW+Pjk6?yn$rI;~xf(1Q_nfX^dWolD658^l`H$&#zRz{e36E6Z zKrdL=ZZ$6xcD%W}eM48`0OgnSg+X2A>>`Orv7AytitGB5=l^SWFCi-(Po7R6{^0gd zA7zo&UlmTjb`eAQi!nn_agupT%LvF^b13_RLt~#UQh932h9a_j+$XV3r#lvi>!-~d zF=~J$W1{)`zfW3nM*=%2E)+8vrk>kiBdHV4m83z&D9l6OA z0uBaN)Mv@K$TQ|c{VdHbhRTF*icz+|yME*P#!c%aTd5gVxfO~#5%-r+{YTxzmS@g? z*#v0E@of)AWdvkkd|g#5h9eK>;#u=X=B2t7G_H8pt`~U8Ho~Rq+!~W=$2vfP+mytZ zHjZq0cFRwVL!Rt{4+J+TF--{NIV~GPHydd`$1d#BOL(2~+?EYR0n}j*cw{*hLZ8X= zS~g@kDY9QslHu4!8M5}zZ`)8DU?TvE3p5)(J&C-aWkZQ$j2FG*#7WcUon42 zGTS7xIhFySAY$jESE%2}E%SFIv$p`~nAyq5tis{LAQ`+my25hnd{1X&;$*h(hsZ&4 zW+mt#fFqGtwrK^Vd;0Vjh|fq_@I{K9Pjuu*{Cmzuwl$dK2xY{|4VnNHaYac)$7-iU_uBB5`CR&a{LlC9xHM{n^+!U^&96^ zhp5VU=t+OIVSiGzif@8HU99qFMB{OmLCj{^WCER2K&6s_q1#XUyV42=jdCI@Ts`Sds{Y?gZa%8)C19Y z1u>Dz`&u@nzB61OQ5;~x;RMP1+cxBcK(bVqmyL?8LO#&4A!J@{b{tY9D2HGOAs=kn z5J5pvMhOBJVX4$o`B2M-xESXo>Je$R5)X|F`S85MHrh>Wbc$;=mbuFF6!4hs5`}gy zG3>(-829|4H3NVyi8>vm(U3?l!USaPNB8`p8Z{jO4ujSja$63e9mvP_{Gn=7cR;m4 zhH$eSi7gMKlaEhUFpOdct#sBe7pWMewtS-Hq{6dLI19OxBI)CXv3zpAtDLLgxrvW8 zJ8G{FlLh^u_L?Ki=>_m%ejz%$*qsRxjOw~>Mk z0^|JeMZO zngSTk+NJ`N!R}WsvZuB-RO^O68r|dOz`KLHd$M(7uh$%3;OAXZ3d%4-$%BI9 z_YdX$0?r1UhIl&{f-s7F`N90#`zOX9uGQCY%kwIdTytUfo~w&^zaxQ1owuu3Xil0K z+wEMF|9n{T!$X-TxIJWoqm0^_ZR_j!(fs@S=P8(o5_@R#H0C?#8P?TDVOj>zloa2I z#2QjM^5a99FE7BznGh7n8I_Tk0GvV=2(&QKO`!UCd-^>0_<4I^) zgBG%q0^WEIFH3&eNQ`%svF-S}qF!V@I)C(gaGH1Neil$gd9Ny+jx? zgJE;Sz#_VLOZjyLEb1NKsG!gCGprB8`tat=KevW7;;5HgFKBS%P<3NOAt~;u_33Zs zU)%pxdczy>@T+bf!Xr-dE3yo|x1DS9=^W+>RRI9JK;o2MK>q!=ZPpBt9v9gR?VG^$ zNLkA74rR@x1<35!+j{KGnItk0rE{TUD+kC4Zn1++yU<^ZPlkPIO?5m{dJBux{QmkoC@- zh7gt^vAJYsf!3$;m-+p*HYVyob7Q%Puy+LS;@N@J>`+lyz7@rw0l0_e(5t+{2o?UR^Fyv{VvF{R1Mx zVMqSaX1j+o>tIjp7J&&vv8_9l`HoOpiX5<W^LAG9R$egKJD2Pr4Wz z7Eq+HJN6RF1@gd!!$=1e2*o9-8+bV=N$NK8poMqzM_>N1P~1`OoAv%*T@}okI(@4hqLa#EvHqUbwV&{t?T)x9A226NAMqP;o%8EXGU9mWLe5TSxAdsDSN(s-f|a zc<92z^sUDgEp(jt@BoF?AX%<6BWU1f_d>Fu2hV@5#fNv-4Z2A+TM(XRt$Sev$v_^q z@XvImslo}2*|GazF)*FXgN-S{cCosa1G?lc=W%PyA*)y!PC95u$-@^^@4UNjjL=uB zBAcyZd-p8Dgx8sWYo1SeD#mJMB6+M7ln#1d4hVDZfG~I-v2eG^N8uWVk|8OO>eSnB z2B9_ssS)Pr<%g*}azTym1}4RJPARi#>mIx3QdLy%2x`<~Ll!kyB^W3JnEI3}k6L)R zzU2JJ(-ntgU1Z1Iik$=j0GdkY1c9l^-g&J%`Lq! zH-Zk%&v7O;W2Bhz6#-<5(HH7Bl#(-f=E5wc&aq7=wPlk@qs5x=5U%<#M^PaoK)&;q_$aXcrxH?%g z%;vt$2skDmLkRGi0Jg+*^~DPY$uc|)-HdumrKV(0Yu3js6?GvP+;-9wyo7RKEi$`Y zF6AZT7I#opw0oT%U^QOsoDUSt?@`>;tC{yra$={BL-rPtOu%fIRK0ZJw$Y1wc&D85 zL=P6b=ybhV4ox(wk-+ZI|APj?O1I@@3vU?R>w!)<9CY;| zSeWGNYE`Dbm5hp;Q#v68wK5Fh^~fz%!ghFON5w97Ez35o=^YijoLSo@6Qrr5(NPN= zA8u!Gc}a1W=!MFym(~cb+{MVz^#0Cwx=I(z(1PLq4`_i~H092SqL#e!xQ)QWtqLp3 zAb}urx$t|Q7*4Nt|RftmZ?0qhkRI!5WL*BU?78& z?Y2(k@H(|)c=$WP6n_6}qQW-eme?@J13MtXeBCh|1m-TPN`&(=bX*U_)$5PpATZ^^ z#zFbSP{0ZxOt&AyLBLVMLJ@5iqNW__8F|C;%$|^`;t+=df;%NXeo(xR=Qt7or)g0r zEyf1YQ_7o;=Qtt{d3yXEEE{V@q}k=o6>ep+z1E)cHEnpWy~`H5S$hYDnVki=F<@Z~ z+|q|!^Oj>b1eZKC!dX#aVSGUHO5S?xhCo#T>l#Y6HcVTHkn*;L+eZhtF$oBSKDn;+ zE_G8*!F8X|O^u%FJagz?0oWazEzi+|R?^#G_$*=MUyLNEk=^lOt?l)n|=^GSSt!R?`y?xJcohdv6=xK)7 zc8S$GM?69s?^}43`J}8$$!B<#R^&ydSzSucZSsrjiqfnzI&{(NOwF*fw1lIbdN?iT z@_qwQs(tFmRh_TD_y<$A$~}r8z{;@W1i|uwBYH6R4nMO?hoYv3Z8^#kNAzF|*$)hN z(ws$x1*Ib&T2Np4pb8WWOs)14+XAJJ$MMeAb^M~a=!XB2`5UYP+X95Xu~l?j;=xZA z2;_ziP(+{4<--ei*ALI?wXg?>&8yqO^Q5ToUvU{DvKuM}7BNOUmX9nLRZmkWH(;lr z3wEl>NbcswCLb=y@f5)*)FlvlK=(vGy0A-6!iMl=J!(bsVV6bnx!B&;1wMrGGM%rq zt$Ke^2k#q~G~*btx=rZGbAh}1@RwsAj$#t`vyUx2R6n%Ch7>YZx>-XCD|f~c^cY$Z zK2A~v5*@yLd|a}BWMOD91>Km11_seAlZz>!+XLnwR#}8Tz|0gRlY02dCuT5#l}ri1 z2)D41heh5b1}7??TzH7S%c$D@duzH{8~-~%&U;m|vXd>Q{=dwEa;){@Cd1mQQD&SS zfPd)@~|s6JT=HayN*E#%<7G_$T)K4#TL3A)Y= zT(UUw<%PZcD58NBN2`Nrq!-2DS%j#ZZ&QarOb-fpoXA&ZHb-fO|63LYsHLR^c2n}z zg(sQ--f04Nyc?438|>BAGt`0qXfrD-cjcdmf)f%|fwzV{1E)1?L(1|I@eb>nOP73Y zW-}DIhybG6N5TMoQtC!upIKMbmy#SemPi>kArwZxvG82;vW8HMeUKZdK?j^xFQ%3P0L!?B*GmHi zH8{!~O^!SPM9Phwa3YoO%xobCh;ga3Cca|eZqRZ4?#$u|n5UMFOrGzgxHA{>y;=1H zkwY7oVImtW?_om7_h~HN##Oe!=D@%fgdltWb{tc#5Bg!h;K~YrrvU{S?4~xYm~b> z2-3kl$1PC|&m(Bk$mG*m6fky&YugsO{>wET48rtz7Z)5U!!yKMLVqJ}Y{ z$=noY3w5dJ+_K>sm!*%klkfVFFcbON(d3Mhq(qN|@C98DL~}58pV{Om0O>P4kH~oh zagKh(FDho&aQ=T}&d8odSa1LY@!&GX)jQ1GBM0{#1=nj)O(0MNMz3p)wOKwJKBG}|)T$}X8Bc4o|_eBYBl&TM_! zfU;FS#>;`KhH)u>nps!MEW;=;hVh^%aeUSOd{pZINq+Y9B8tHW*beoKzZ}(*ElU-o zl8_rvh9<2ee?6)v$1&daF_;3lTL|ul^0%W|`xtkGNcg#4XgjE5Sn~HHdM+-~ehCah zt#A;3l7Ae{bGb0&Ma-kgtwpwz$iE-e8@ACYC=e+E@4>>hQ@P)XBPmqE-H$;hqr2yU z(aK`E|A`|Cv!gt-V4EUWW7`0IEP23*7mmIa^^;=i66(c;YW+l*yHjdT(#rIEFlfWC zE%pmLNMg(~(=?L@9?grvgaL;d3@O2kb0hQQK}YstP~|G{EKzW7f+wpy_-IDV3t@A0C%Lg$Wx8i+2d1e|h+c8I`=@bXjHT;SYlSRSsh55wn{Vz!mtfxKW&W zY7r)noYkZtt;C+mZ88SBlsT3>>V(?PO_l(+qb5cK9HELO@$Dqg!LdFofQV%1M#-aR zHqpA@VNm2zO83AkdGeTxA0CX+5_6Kg#8*$DIr7+<4UZcP=AD#V${Zmfuaw7~c-!cM zuLrJ#h`F9?!GO}o04KE7rSBk^%E5gKNH>@wP_8+GgbqxB$DcR=pm>1uJf+^>8CS)P zb6qIt=wcV~BrL2rb}7hVrWDE(j_OFoMV6P2ARkl_9|2l<;?W$b>{Fn=!3#Ml2n;-f zpER>oj|W3Z#21lcK^!ay%Y>{gbE(Y04em8Q}yY-nf>k7_5Seg|sj;(G8tVW)7RO zpzq?_!>uxR3iz(iK8o)Rue%swM+*Z$Q1o16pK~;;uf%}B<74Cgj;sbbx^W&Tar)YuAL4L$?QhDjoe17QRr4$jZ$m6snH6<^b+2j-BApefPGpwQl zNke)0QB6Mh!!WV{@?tZIUy3KMIGV|a&B10*q6pHEXJ@(GGPB9I@oxeJg)ta#W(!c( ztuyNiJSyA={W7;PbVGMUUU?L|kZWgLLO~l9#2FY_$*WGhar8Yptlh&vjA_2FahaY9 zyQS+*HjwqZqH@U_k?Qkteh9gdVLR(%p%BTdPmC$|4&=TEq-I*(p8Ip(SEzPXrK~uj zqZUfuxC#P01`Cq8uDs^NIlVj8If$)|8xl+n*KjpjJ71uBeV^?O9J~IRe-07HDt1hh zGc@9PeiWu8X;3~#X@qpUy!M2;)DL8~`jx)@^OUevn7P2Tic2=uz+T4o5Xx;wwH>84 zX)~;@0t6In^!Ma-CyeU89SjrA3{R|@48>F*q>f=;cg-!ih=UA4P)fytyx{;pTtw)SK;vcxJf!oH!#FWUvMqu!k6!#v(kUav(@1f38ts-4 z?p{A-ROP_Q0A-*x>mW^xNM0y!s@|CGR;&P$yeeWJRO_cEKOSV^^)&;!9z~gtq0Q zY7cob^yMulF7Welwc%8ZV1A_1*N3ILd3J5*9{L@f8YBf*f49=}rzSIjC_i$a4n;3b zQIRpqTzTsWrO4Lv)f~XeO05N42>>^^_SI9fjrH@z7M$s;w>Hjc?@pWE@uhhsf5JGU zBmu&af>R?`fIPjt?S$~G%9?=z4(f68M`pSmezCTxMzZDF%{pJ~n6M1+dnz4B?zz1E z#D5r`?~ToEKiS$!F2MO-JHMJh0i(P#RY3f?r5(ex9t?? za(VZOG18O+p-5-Xu&n{ngjOf}xIpB(VzWqgwnu%hXnx}|l32#|k!2+BIdSXg2@i_% z)LFNCJ)Q>0vud-u$%#JV>b0{-kc`2frA3x-%%W?LDG2vIdGE{)rz9p!DGFxJ^TUh` z@B3!f6;ga`o(O4?fb?uY3h%GFQq|6>nESfhZ$}4TWP58cjELYu<|EEPxkD7eB&?JV z%&seWN&YiU@HPg$NA&Q)nRUeq$*~tN zK`)b4Oh5S}uHwOs^I3z5fjj5wYUfJX2#6bjOy|GqsbQVhyD7-6U5$pV0=^hGHLD2S z0;LxD^pSm`P{T_62}tC|KGj3{%*>W&Uc#dGAf#e^LLBVLXOCvHK(7L}5j5a1B!}k( z^0}E!ft?VILb(E@L*fb1!_Uv`3-!^O=YEEbIh0Bi#^nn$o0X8e5Dr!90BVIO!^szC z))g02V2LPYLOLePf=s?Nix*VfmpvoHACVj?T)7NbhnvWkXV#UHdNVi=yg`9*LsOBj z%&aS!LuE1wLbog_i{!C%s$}3_&hZzCE*9iCpj%z`=b&XBSg)`OeI`f}v;%=mV=#P`Su%$aiPhyavo0W|JBil);678Y@(9!p2HY>T~QAkuTPE;E$qPQQ-VphzRkGRPO9Ai0D zr4{umKQz&NRB4RX7lJOIqbh}wG2bEgrz)f77oEGpzBh@wbX8q85rQk&T?0&hp$pia z{OCjrvvDVbND{*JLuwCTM39B_@;MCBC|`wYt80_N-P|lav~(jkRh*p_gjt?@!!g@+SRS3c0v>b7P(3kp_W% zAru4p(y`rKArXH#k<(yURpY7(e}%%Sb(}HqEGAcS?ikc#y%ae`T;#b8oEoXwKc4uX zc#L~PaWfj4Mzel(XJb{%>n4APeg`0nLS2?AHprh&T$>b_A^wF0jV*sY@jrCllT*K^-AyF+ z_`7^wDB@FA_j#d~gNne3O7X5wJTl&9(Iq>(TZO$ks6n;IJX}?%pMe=bzYcU~l-*_- zPUi_aoPcTMC+QymGi)hcHz(Z|vYzDcCt}9Zj~%Iw5Jiym%>xV@bY>AiV_#LBPWeZL zIvB>C_$*s~dR67cx7HK$k>*(rol;3*D4QVg`R^xocyLs`tlEzIyuNLIs9N+ZE7$PL zYiL6A?$=|;c7+b6`2stoQ?m5=*2d<_%2oVR|B|P_WxOcNuq&hy)G&lk!OGlk@jg7Z z!hme4S_R@Nnk7TllZb0oQM>ok2Riatr2(x=@hKqx_M1oP-`1 zf4TqSQH(Kx>SejAEdZCC-^c?N)or*p#%R(pj({y*1qcSUZ6KY^k!BecFWV=C_bjr> zo;>hKM(Wz!Is&i&j2ARuArD&Ajk!Bgg60X|=8$%0b99bflxdEX990796|nQ$E*cWJ z8@qbtsuv9cYWn-;!;o*r5}ulMr1cTdSPxmeS945=%8wjV{mJl|t*xKodpG}XHtYuu zNZ}$UdXK?+`7<`4r+Pm0=x2v#T$80?dM&;iLKH5w<{KkN|)YO`d!w|H0I3CWpCh6roWIEG%IyYiUD z|HN23=P40_bGj2)K!UaPKh#DNM4m=pqd;k&Aj2o-NZ{o=^4J46VFhplfuRJplGn0S z9(Uj-e2SEaU>7)TaL_xkJpRB1@xxWj@(g! z{V?Zcf=$3v4*Yy_LY_z5q;hcFaZ-8e;uzrL7`*0a1-k=%1Eb)YBL!FbJ_k2T3m?gA zm+C5eCp>9$j`n7*g3Q&ofkCkJ9vuW(YxbG$=fegOI+VbWd~+KaNT`5ixHYTEBX>1<#-fprkE=V+oepi|b{f0M zfVm0NW22uOsi-~J?-GA1dFJ8^CfGlxuy)4mpB;VNz7^y1sRt!l3d-;ZucY#<#q+$w zj&$e{VrN9aYT6x6X%D<#J*Aqf2OrBK1Q=>x}4iB;3Gc-KAmlIT{FU{a4HEzVfD=I|1qcS&?B1Ch$rtl;X58Z6kz=U)=t zg2jdAe32qG6Qe|y$qO!tZrK2viwtECB$^=|#`3~TqFcJBqYjB^8yp056XivhM7L}U z=W`tXJhZAHbd>VqOQKsbs)Hm3EL6^8ba^s)$tBS(6c`<}@BFCn5>QQrymWDk<0Tvi z2;D3+Gg#lzD{-xI}JjYdQ~)rHIHdx3L7sLXJH>aOn*s}anm zIr&<7<$*5_h&2>wckt7iOCU-2s>RhwyBgM+E8DMARwFx^pxf+W?gIKgh|469S645; zNnLJUrALHoZQel~gxJJd0L>!Obg)iev-p2aI;*ws52IVcMO0=PAVT}WjDagf(8 z{uf%W>5;=}su6?gz1ud!1CNA7fdx$)kJ>Ov<+cOA`jq-rk&uYCU9t&)yZ9R_u>ZmZ^^w$Ysf!58OmiqWa)~l}84oK>kJEa!H)vSm|-6M%U4a zp`Alsed{IBEi{5GIPf_WJ>ot8FUv09tTB^2+b(6iNEJ1vLuT`ESFF+bD$xt|#cP?JTZt7J)HO+?L zr``*x8tLS#*0!n1UC_|OCBIBtdQ;&jELhVvn6W_KwPeRC+v zCB^9gM@0D(-j@?Z^8Uq}ndqoiQyI$Kj47wKIWH{`nGp*NFrsQu=JJ8|OUz3wU9et> zSqP?`o_w%XVGJIW%7KFho=w91qwOb+Gu-HF zdlvavoRsBb?b`xtoA_>#MaudlE|iZis={f9?me`=Cz_HycRLSE6SJY^ZWrlIOIBRZ z`9%8>z!uLS=lbC8EznYqe6oF8_%LH%#&<%sH_E|5eri#z6gqCG!?U3ZNZp(C!2PFx znd~_y8R|a(QV~K^q1!T&PcNR~xnXsh49Dif-m{aQHBLx`0aY?|sUM+rFP~{YTc|1I zA*z{N(c@Hu*w40aE2l7+v!h^q%3cTe|8woz0)_`p1>(M{7x-9!e7=2K0Vo3&7A%Sc z5Ot8q7ZzKP57b zA!lPJT1!X1)(zxq?c3r)nD~G%^C0G+!&dL>?b}LYpgmck3`n9*QitDI{K4o#RppE4 z=G)-Qb}nodNFQxyDEDZ6ZrfgkV^s0Hk>xPKSQ}(rGka0HZoDhk z)ne<^*2aB6P$+1Mkm>Hp){OwgG$!PKJuDt5f9kpfEYRjuYEizqxUQR7)$JxEuDj+3 z;>!I;)b~J#oQchi-6~m+DXxp(TKq}7sr3g`PWJCeGsGO;rzf9Ub;_P>dg1Y+7^Hw_ z0GUYF%C{H4-EOp=d!!3VGcVWVlMT`@Qs7puk3=Qb!Pv2U=aAPBAjuq=2`HAF9HfEd zyNlm!IjaMO_(NVp_ejnalg()ibQAA|q(tQq5{@O`JLEaVi-xd3uc;mdaE^%YFMhA( zoDSff4tY-N-0-A}mAeZpk$^Hg$pF+rvh{-kj~45>{&@hw zSwBBK{yy%QGln?rse zOOzyhrm36^2Vz@(d&mz&XGl5L_y{18hTEL{uJy4nc>r8l@?bVZ}7YIZ0U2H_|NB+!wV_5;sLkQSJ|m-`V#(iVR!?)Q2kC z=4+W6oN+lGkQUt|Qatcbhaae#0~Pe-RHqMmGrqoaDefC3`Y}lsmjH+g5D=K#{P8kf zw_)lamuQD%V8W!dYm+$1~tsD+8gO$e$N4jt1KN{PB#{C3!b;??6O8iMefsd#u%kpt7W6{EfaPyf zTqt>(+bCaWh`5tlgnIt>%W(=b&~OoiXq`SUOKkba;*a+|BSwD?ljl#T@i|PGKkfS} z)Ik8^2X?ED6Dd~f->11=!T_#B2FDN&pd<|BekXt4ZYB?qE}imB?w2m@n@#9u;C4yk z!`&>SD3bf1ybQyO7&4a{iDWs#5ndk315W<1-D~wG&$dnDwN8{R>3g9*`5-8KC6z4D zxn&{`JUP8{H?<*IVEW;gXmi<|yAQe?R}0QhDU@@LBZ%4oqkQnmU$$E<2S@=;W3?P8 z1=P1{uq7{Z4C-M!lHrGH`;aNFnu2RL3J^9j?Km{su+lHbRipCjF{&p;N)0n0LG-XG zPN7SN4pnPij)1KY=X?0&IE6Njswp5KNX%aB@ZmjTno|h3h$1LiPM_Kfapog0$0Dbs1+s>FUF z^9V!?za&&_@X*NN;K^ez#}5OrZBVFQ7+%H>Y(sh66jw_CdXl?{&xZ#Eqe$fOm*W(& zF{468^amOnp@>wTFwH4MZY%LHOo9uJb_l``m*W(2w1un^_~zW$VYkSWrZ|Oe!l8-J zT0+tzL$6Dod|6ImX0hipRtj+{1t(9L;uMB9`JxgLp%{Xj1w8Vpm*W&h8C+O5j43Y` zF~B={+7zb{R&qoV3ML~(``oeQ=_lVh`u3!%J+*!br3lqwT(#}Vi{=yEn2ZvIkus?s zfwJJuMYg+BbhO++%OTCzlP|>h80rcFG=7OmMI6dAPToGc`!Ov7FoOTmGjFR|#S@hL zC+dCo30)lZsm?PiHb$f4InExqW(OAXD-i%gdFIJ?j_&x#d7pCPZ+PDCvX!8MMg{0v z#Hp_8R)PBFK7s<7tCT}v#F^z;$8HD?ly6+)io(gb!sL-W`}hqZ#CICE#k7P9>jSud z&dK*pzL1Ohv8YUu>k3rMTaJ)YwL0)?$9 zLY(YNIj%YKyyH2J5TGLzBR|Gr02#kro_{>YffOZFZIyMfaLoh``+}3VjQ&3QUB>Zk zoETF)(djUPg$}P~@H0piBB&=lrBYB{mb~!fyGM6-)VbhH88a~aIiqi}|F`TQz=FI8 zg;3NVA~?V=I);M?cn7YN!=q2J`^Xb{@i81kj14tqMn(WsgR@#*atsH7cVdRDv6~S7 zBD|2wOHY2_0N=!vAw$F8#P!5V+hrw!e421+e8?1mgHlpn#?`NcA}=pHt|Retuz7Ir zNJHhW+Jn6OxQ+zgDQb40(l8fF6YNr6aa>1&CNh*@rFT(%h>BQlIr)yszY}{vNs!yj z+RlYl#9q%9t13>8@^}5OiO##>@8rteEkm~&|9xOgTSQTbpbi{w9MI*~ldm2fPn0T|`1cwoaqRANt%C#rev+49Ph4MD_;E4yJBZ^O!z4XW$@vpx7= zRUHgU(6I=wlsxOzkCg%4(*+vpc|@UJrB)D`i?XcrtJC!HG5jZM>TeVUiU%Jk;3)wNr!`Fl7L(fM1r} zc4_Tf*A-{hwrh#)Yqj?yMnEdkwICzI*T!~8UU%{>W7dWtQr3zlMz>DWXj7i`nyguD zZEf__@vdH5&y9r2Q14-P_?Yq_MP{*&_@2D}h_*1bjdD_yn{nMmB`%TMPrmm6)8u}a*uqyQYiEb%uXIb2sL0`Bf|aGv$=)!<1Z|MJD3fBsSmrpr0-$^2 z6dT7jHbz_k4;?2#dDxaWT`mdqW}=eBQc-4J4w$=iF+Y$uUyh@+5pl{r_y=L`J19@c zTQ0{@MtD|m9Y=M=SGT!b-g;S8`kTwPu?Z@PmP6qdE4mHNJ6;EBt4p^*(hylFga{NXS=Y*Sz)<5nx zIKQAMce1TO$dq$8`z+jv=w8kD8M#gvL|D$c>cfd}_`5F0_i00Di(quSAzx`qDd63g z<0x?{3Xqi`%;IE0?M2>mIgZlLfK8y$Ru@-9^xq2k;N|#Y z6C@wmb9uWV^pwPs4_%IU=40@2%#v~7voVN!s5NwGb4K@-bI+qQ&ku!Rd+gj+luf6&MutJ1lZ9$?pN zOZDFTbY}~0{JPql+TlI;*L6jy2%}m@t+wUTzq+zw{;ulV=9)e<@@%BfZ(1*M>TCbP z|L(>ACjP;@;nSxR8LbyLt)AsKXc9PK=42Lv#i*C7BCdS=ZE%6Rt9MCD)J9& z=a~k$47Pi2ZF`$ZUM<&(vpO4g;A7HPQZYW{Ll37x`P|7{$K-cY)n@FKAttXyjFS zrFT!Y+)A`@JG-GcmsHNor_Ha;t`Y8TG9g%gnm<~tybmc{a^>M}XZaaox~_cjWD7}H zG*8f2LaY?`&;&THeCgzWU=Vg~s9ilV)VsAhYB~sC?<8yM+p9Mg7g*Oth$<~10F?l6 zT5&30K6!etZP=yjj(_F#oFz1;=SSx_Fy7PdnL>r=QJe@I7Ca)z5T)UdeC6cbyRC+` z5v*fXMzGhcuUFs=(}Eq`w6=4@DjugvrUme|b=phtBPyuvz-7;HT?pi>)rnap)^?+& zmVEzvP`A4Z=jE*FcMP7W#3!ym9jz!){gJP=J$o~ZNE0M$p<(dL+>@`jZOL+S3y6MV z;|Qvv(ejP9E#)i)hxDuuu?ByXP`=r=r3mIl1WE>cx|Ky)F5ha~Qm*+^z~Logkyezs z^6j=QIe2y?&={a~!U)L%`A*xGF#AEb66OpIMNtvSciXmv`GXpZBT(bmiuIE3wQh+I zFhNC+%m4u$yY=_mw!}t&+;C7}Elae@dGmv|Eg?1SV))|1G{SM&3*?7wTjBsite*W2 zP-2OLko>4^OQ6x9RD~W&C>A!DvHaMah+R8~p3_F3(M7C2%e-$JvM1-FBP%u)jGwgb z1zw?v1ptfq9nEQ!0Nb_%34uZ^{^J}*3@eqNwQUKON}7{aLIwwW9C*(^Z`~3AQcQgz z>V+rS(9CYiE%m=c1eJWH+ql8#k?I z$u$gf4mRgPuvKjDp53wI z>&(9^X}vpFK19yOjXHoLD>3UROFSBJX!7OnC(kiS)v2<%vjuQ?Yh#mWbQRB~tk4#! z)m0dV+{V^w^TKoe)`hFLHqKpzQRUsqp`5)oRk`~v{6}9(606ia$1_slKo{j7C$DWj z525S9=kYqbZk08*sM#Wdq!ulf?0yb+0$cw5C}$rWWC=_rFOjihC-CKdOKLgToj*U^ zb3Eshv%934`fZo=f}trF45!@GV+rS;gNAd0fb;#A)J`R=?y1d*8QIWQ^XM>td+l`$2sv|q!nWskg>&qRGeG(6FOEV-@F~5D#l5Wi1 zmx3PX;36A`m>tp4ic!W3s$UX@qj1M!PI*U@6(|8M>5}fhi1z#h9qZm)^l)F=DQ-4Y zM2Yu zP$&;Q`1=DFLCEPMSzuGuisfNTnv^(%_vco5H@+e*x0Gb8699UFJbX!$61_F&ufdqz z4hKLbBUgr5IvwM(dJku1li0%D%=}y5UGJSRWto*DHBIp3mi*62E7bDl*cZe()DKMcw7m=u{Ei$ zRfJv&h?#TA@Y7^KHp?nqK<3n!xYo$ymY(uY6SQgFl?*fpd%Z7LXd-`#1OHP>}< zkeY|&XAIKXwyHRcM6$+WY{aZ8AB%^Sj2*}R>QGol#WhMM;3PsuiKNy1c^l;MMLrtoO`i*DqX0p1AakNfwTG zX)c`RfTyu|EKp7nP(+_X0MI9S(o&0jagidBTaYqlUvtM2?y-M&5u}t9q2qw7 zJt{i#yrm<|BxdkzwMLhc)Swa(%JY|=WvcT|jk+Gno7V8@Zt`-C{N&2YJ(VG)FVN)W zc!@%&Q5i=x5(m|Vp!x|Ep4N7__2}>Php1L}eq3)q_4_7A>4H!V@mq87&a&kN<{sKj z9-#O&Y4Tt=4?D))+CV@{gqkK8I_n{Mz22sqpO-@5zwDkXU zZ(XDVsoM_@{y>9dfDpfenB)WqfU*pU=3czC*?dG8P4I|%N!01Ux^7}t#1LnWM~0#0 zxnObw7bBsZT*gZ-ttCg=lAxxbmg+=^|HbmsrGINq33-vhS?^rp)l0O=@E(2}1C;U} zpS-$`;F5!zJwBM&D-l|ysl4nc7o6phzs5?L)rPDzsjinduKBv)hQGE043T#aF&1tq z3|}B>smtN;ic9O==X~pY4#;JaErrw}w=6wCx5M6k6I{g0A5n7Z=bG1xAVkERKs4ku zKn1~$<<=uz1aYAkDYRGF@W7kNE0?rV)13mO76;e=@FLiEs4Rwp;sbd;DD_k~3y7z$ zI$&azEep^KRv~~*^eQQ@UQ#HX>8Wpm8*h7KYbV&=NmBUj`PN#wWB!DPWAJ~2HOie*N=Z0jCLYrUta(i#X2`a@5 zFTB<$XJ|gI+GndW+RDm^GMausaitx(v8|mXYM}N3mIaCyD56N-u=KXR4;s4m1j~8C zpr`r{m@*cILfp2JjB@TZ8bc8d4Syy32Oz4LT4;R6aS-E)BX6AY1X%>15i-H3kmI(2 z!QPvejA}vma|gmOy9wIwxKsj@qtGtIuru}Kee;y3r_9u_h9w>&vXUW<`j(~l46L7c zcGI)(E?XZcP7FfK#?K+ZzBo$)dF#@DP;tl(O`T%FK%8%%IXYt&};NJ*Xgf^ z3l;~7;R*IUAOIC2~dE3%!`{$7Y!2ZWd{T+@Y9gk6@AO7%~?R35F`W@ie zJg9Y`hyWthu_7nNvGnar*XRyc3Eu8W+gRJCLVrQ0zeC(WK^oY0%9jkr()HyXcO;p5 zNhT`lTHh{n6}l(`U*5U&NnIXevj#PVByLkWXjy=1=Fwe?kA@?RZT<#8JSZV=ucF>W zxqbEQ+WL*#EFRa2$(dQeUC>hjmn84HBOP6(qpi$UkylWLNgQyqmv>)u?mtLuPD%h- zaOEHyl=7abWVn%M=Jjz!1`5kvHI?@s&kQ$S(I8jSEXA2SLnK(6?TzUV}>o4W)!c)4IMx#NI2bgQ($CZF7@#F(bM)+*MZSLs#W_ofpnR2*VgP#v< zFLnb^5x#tI={1wgxPOEjbcf;BnQad&D7j)_H)W*wU-?iq+r7{hg^IzLW84*^iXl2U zyOovAV#~0zG~si_`h`>7-*yB2&fh%F-*6}= zyC)^68j(R^AVt3ev`p@+&vAM>PVR+6MX7TaJZp);%i;Qq+cNA=|b_N?TO%>ze{ zr#THAfR(sDKEla5BEdYa`h)G^0Fvv`dCvcpl^Ug}*E@}K|R&VKhV_XgkmG!jr1J5lhnW}GksIuL zas7+-+V!&+?ozB5+iQJqXRmdBiu(poxqMCYoMzSmI<5gZ)th!wAS*#_#v-R15Y5Ra zmL6X9rHQidETaCt)b|+0bo8MlTX%+SmK1926vW(M|1>9AP$HbVS!_pI&baAC43>Fmo_waV(#id~&*(l<9RRAwy+zTP6{nf&jJTvj+wc z^18X!L|keRLBg#|K6l_IEI3qncS1Kx5CH=c{`sYp&8&Nd1qLTL0utUtf{)+f*kCj+ zu{{q@ZqCb)GyxFZFC4g^AO!LN^gXyuUE7v?@xV>+UBCwMb4dAMPGLoUsh7-gC#^n= zNQqR;ONOaqEL;o=@s`LG_x9xj_t8&MQbJLPVr9(slFC=A>}jP!*~j~+v9Ky$AUAJv zS46jf>8|quo|j}X)yo1CZS)so`D)9CC>SC3hlYb|Fj=L1tz|>hfzwFQt`Hl+VrKI7 zDb~Hlz80MlUJV}_^rR3fO#myN<@1e}qX4i6E026T&cPT0LOxykFU{|TE5qoJZ&;ss zI276QJE}*Lpa(_@185Xd&}41pTP;UILx}r0u5TeyfdGztyJbUYg`_r;b4fxuDQ4M! zr)5KWzB9W78fv&rw*I><8%hJOFqNMetv_0o@3m}5CG<)A!tV|-D#7^X`z;$nahU5d za3J-jbg&orLCc2FMgxJEKr}^3%q?^I;c*A3#17Uee4A8_0@Qjk`BBTMi4a!sU@-Vz z%2$qEz>k-dg&8(48Izq_Ly(d###}ep8c~jQWC9!7a`f7o`LYt)&QI>h!Bsi92)suE z)?RDO+#nqJ=~NPC&@E6}K+Bq)t4JYz|Lk}s%#cBLkxTI+kK#`bTk+?2Wb1p`dZl>7 zw2L6+d+NR@zgT+Vf6D;*xKj)u1JWr05YzAp*obAKFokjm(Xsq;>34d&+9%r=wIrZi zNkwAgCc|NFA&=FpZji#-gWI&;r^nTym=IrdG@E=h4Y)?2xXooZC|voK0gxOv)fWK4 zuiF4tQB+R~TnwR&sz7)mziE5EQ56C@OQ|&ip^8@XZ(BA*so74kzXO`$Vy>IW?^-tG zhoJKj^FUh%6M91W-?wZi_QN0rNQ|Th?lQOo{Gnw-k)lPQp(>RY;Gr*nY}pVhdZv`^ z#ca`tp39$>ZfeH)*f0#n`Tg0XzO-y5_y9SZU%*Pdd;P11_QRDMH+KSjU_(I|AW4Dq zO2%vc^U{5rPbMdK@lWpBO;pz-TzxVB1^c6}JPG1sX?{(b45^u)G$4@Q#CvHRNUJlCdN(Q9yh_gq>i zaor_}%I->)1>U(ALdRcL!H9u2ZHI(9KYb7LWBz$QK}GtLesj>tVtznk#-Qfzzia?+ z2hOzQg^w0Fu-YUixq&#+0}jv&@(}=m;r}A7%OMfU1D7wJm&!y2nWG^=oLYrEX!#Ca zYW2$TSr2STyD&(A3+3|Q$&oX zmJOwlPdIICPiwR>FqB8OZOFG0QrFNgJkYn~L>{$#^ydxI4{Yx-bjvid!-%Lx#lqy# zEyskga$edovA09f0A#{rS~djf0e?dR)Qqwrv86n=WkW>}1fHVVKsKX)SIXmBHiVW? zPSP#K57F*Ma<%0-YS{P2SG1O^Op-o9yD=V+17>4 zosE^18U`h5Cq#0ZXzC@e4NS$>B3~@NZJ*9{qSV)-{p1f%JD&0&>Q+vxZ zM`y@%u5OrSI6YLR3dOewTUHka>vFEm9Oj;cwypgV^O&%bJgSF(Uj31~VqkZ!6pos& zx0=3<&9Q1vXy@?hkgOPBQ;?pGM9>c^Ay3&7?oN$JKm(|9$iw!}Qwl`ynj z@f=6#0P$mLrIEbsqVKSNOr*`qv5_=$p|{D)@3_NOg*A90;LU)-F)d}m?fw;0xx+^2 zn4!Cq66+>DZbov;@w~%g=?(E08BhgzU}Ye;-f@TR71jV}pu0_85rfODL{;{cjeUJ$ z9S`3oVFo9bdsSqmT&-T!rWI)5z?1R_d@vC$LF22J6?j(TSL>Zfl~`9+U^;E=5;)w= z{JW9^9om>o*mu={OfuT%hzR?b+5q3checkqTmx9EbEn={M@j6NP{l~>fi%_(=#bjP z=6Lh^+AxAWvS<82GM1$oCyAeNF9m+~+T|L+S{>ijkSpR_k|&#}Rj`dKgm!B!JADJt zOzp)r6wiiovCSWyO!p#jT{5SRsw8kz0v>kT^1(zWNu0XS3@ozBIc$4ZUS}E@!;Q8< z5kihOjOKF~Gnn8JC3pzSmW}*j;z93S7T*7G1A{zayVjb+;6XiUIGZhUs5lKpm=|S{ z+`jykJ*%M6dUAg4jDm`5e_CFY|qm2l5 z>OUIjUGFI=@r zRW&}|4E_YU$B45MfmODqw=ExBm;q#^iwJ^CV3v@ofh1fdSM*~ZCqgk&m;sXu%X6Gk z`AXc_9eKx?h6Xp>L1Bi}De!~L0(?r)Kea7+=kgVu8R_fM9>NR=kZ>tXT?S+k>1Xn; zgLEe9sYKwAQ8*rU$NawpBCNc7SxtEMKSttoEnicLEnJg?H&$$!4L9-Kz~Z{@5`rHvgqT@JKgvbe%Y&yyx!ASH_GGhUNQ}B7z zdax2C$s!+Xaadyql2ArP@Qxf?2`}*DV~(|kV${gPy2J&=N&>u`Fbc#}M?SG^q~W`9 zGmx~wmo*}89$sp-GD*F+-cw~2uif3*+}$x|Ff|ITUg5DiIYzdPh!s^U%-=p~(#_pI z1jF>^v3=;IrBCgqsDl1WVYEv+&#|#nz+05lh3W{YfKM%}dqnp+5Rh7p^&ED93i$7q z9Mm6B|3IHxKikeqR1m3OCTN2sULl`ezEAVnbZ6pcW371(O6U24d;5L1mAU=T{Il^e z3?9&Wq3#3o#>cKwKC`?Zv~TQ$Hkk~={OsNU9XoLX+edEPg2V#B@3YJ5D$<+WVSTEJ zo;k9p(HJY_Go)U*kMVz&s=a=0Ixls6NvtKBNFRKx z>y~K_Y&Xc|OQxLJTU)~?O53Ln`mm^B2Aeg&M#QyC+mSCXtK?Mo(Hs;Lf49v~X~abL z6$^WdjO#&;vlv!jrSF$XC|_Cr&wV|Z-jw%x(3pHkFlmHsOAi02;1VTYoz7;mwQ&~w zXMI3i$8Q?X1SF*3LWr)2`a)%suPv*XaCg?ZBe$CM;pn{^?>C;VhLMo0&_7_}DLBj5 zm-kiAoM^rEABuP0IL9^)o%VW!%C?c%tJMg!C&VLp;^?7lr73!CEJOLm@@)fw)I@7< zTx2_ZW*fo5svj#W{VKSPE?!rt{T6+_u1FfkPTgzVO#@W7V;5gYuI`C^b2=NuW}))T z^=diAZ@8cJz7Z&@?1U5x3No{BAmm%qdFs#_?R#nzAP^4b87VX;KxtgQJ)P};Rv4IJv@FvBLjAmA2dp69c%(de#uRP)&3?lL80TgPpLQz$3IBYAGT?w z&^aW%L~+mt4HnCf+O$Fyhl_%e(Jb0Z9r>~O(rbLjxV`RTYidAg$snp%vR(LiBFazN z^xZ?^xA5!)O&7i(u6{pVKGR&ffb$1WwZY}JveLIn*B^-(+eFo~t#@HsCoar#yTC6z z#US`+ZTg#7DVbN$H89G6wEOb&Hm#7z5AoYfkbQN?E=TfeI&nX(@KKb6pRNqaT7@L&|QArrWKa3XQ$-aAw}uMP=2#-#cFsp zjB)twvAhueqq2~bZYEC#f<}J3+;cpeRE(rvX2iy-lEl$}H8s(CsgaQ)EJf{t8awLA zvHWh?D9a9Sjd3^niZiUqD#0aZ0GM^L8)Wwx-81a8${4FNqN*65>ZEtKwfnt|GG~3l zc8pZf9S@*Les7XL-D52nzF`c%j1ikN+RmFB7?aeKg)d27l9B}qog>6r${$Sf$FZu$ z`W2V`YZTdNyA}7XK>eB|3V~q|vxMPQa?xflWD)w0^i#gNi6ZwJ*0;p}1i|Ldy6UwGJ{X?b{cprM znU35+H3gwt*UcmO^YY6E`a2vh4?k#H{oV6E>jU#n{IpOhbeDix{xZwH?j2g=AV92z zqz)mcDwE1zm*3bwuihj=`cs;R!k9IM>r1Tqx8?tCb<~%(Y9hqH zFaP(W|0|L+irDzavZ^LW$<|hK0fglL-`;ut$dQy`+?D{JPpDSnFSrkf1hRJ3)wu;o zELIsT?gZkv<73m&9(i|Wnc2Z!K3yi~3Z+;(b7HukPIFoNHC5F25(fcgm=$G$>b-f)qI=h4PywJ| zn5}?xen_qXEHP48NCrGs-Dm#2V>?&9J|LT3*(@5acMu^gz-p4nC$h@H{Zag0 z_vC0r;>9sf>NICuLB)W?`UT_zNAZ)Feq<^&(39j3^?Fd+n5T5;bqVsksxZO=l;FT2 zny0F8{%mVI+xG0aY)2|_SUp*BzNG*;*V!*Gck z4+esQP|rML-%d|nOtLDnHX{T?LJ&fT>;k+D%`>~NO=O4}>9T#tt&ONc4AGo}N-l8C%ewR(0vazv#RMAs^-1jZp%y#lB9g1he#t^bZbVVgE;aQ)h zZeG=Wzp?hi>#Ou484 zfDqL$$Zfv8%VR?|Q~9Dy!eWm|)tPs6?>l#|@W>+3orUwtHSb)u?+&5W0wE%?^_cd| zysJy!Q4$IuKq@uGt#A`%=H1ph_l7%TiWuCH2)R?ZIO-K69d3>{($Pr@8^lpfty@xI z0>Fty6f%w}iZ0B1l$1`+yWVxVe!I7YCpV~Z=1x~b`4F&K@yP5kF2PXV`_l2ud+lo@ zt%L+=wzqfU>I?xa@YyaE7|2;JOuuL&Q1kAD<^$^fT-%mg zoLARqSN#sKFR0!Kc4>edG-*DlZnZ)Z8%gECmJPR3MXg9_KBOKXy^`F7kR~VV!xQ68 zMs(zQ*+>w^+r+{)Hg?ie{lV$J#1j}=WR?JglPW<~ml^iWnr3)DtfVG1YATT1QgC5W z!gCw*W5UmT9MytH%;IlnzB>7iL>5{O=NKhZ5PPz31Eqm6;v>u6=JIT7`P)<;86X%A zihy8JO;P$s)nzg;4aQiei$`C+xg?`1j3PxUDyW^M&go<7=Cgq*nhJ^dBF)R5+NeKF za&S$O$m%M#N@0|ih=jBi3X|B4^n>BCeVNq!PEt!?u3B9&D=Bsitp>SdJnB7aieLz= z{ur|uxI}5$n<;Y+n9jm{+-}VF{mRFbISj-5*&o{DKAV|{mBZFA6*&myN|wvTy9tqP zE6gXcX%hXWljlj?RZd=Bq|vgl_j&n!4BYoCT|<(3CVx+8FeAZtni)dB;@oVTF*hK&1co^lFW+09F^{{ zvQZww?wOmVVzYo#n;j&<$cj0ME8W#i6S3Hpu5ae-3; zDZTlE5;}^g+1KsamNq!p7PKUA*ei*)v}y%2g(%G~-qi5!(Kh6yg(EUXJwou=luLY3 z_2fQ{risk~z`SB3{L{+CJ#AZ31iSyY%9CK-2qhR4c$Rjtiyq|I%J-7F}O$|b%FyJ!UPR|WGf&{|@C>0p>v z0|+}$R-`UG_+-Gp_(U}#^R)#xqI4QfN%lvyl5_fQzODrA)Y5g#E`52(){c><++#>U218!~p741*UMBlh`-k*zf5`9iBS-bf^p>f)GK!S%9-Z zGUA&}#$kqg)6RuXL`Nn;F}I48J*ql%`8k_z_o4NElXpg4LHW0VYe;sFASaCTy;3iw{*u+B`6 z$BIghSxc0JWJ1z0wMkB%(-9mG;u0`QRfM>JSgIRjBbe<*VEqtjWFql4*$wPU-9uX? zo9D#7o?XkWJ9CwIHL`P_!)@i&aFaL%PJ4kG9-)%&?^$K%K8AK0*RxM({D6q%AiE(ly6g&ECbq6IKpu&n^8`;qk#W~W5%shy*g$eMPy6Lq=v zT~DVP=ngDQ;-EkT9AgKYA2-`fBl2b+sog*LjB=a}4NTX`etV7m?%8k2M9!`#z`FST zlx>6rX`?tWKiTslNbf^gzc&Azvkg+9D%4_JLP79P|4&PhaB@bFj+KOI!%=B|ri73z zy3oU=opYu;q!3gSq0EW4kxtLe&+Q9rBMYs{ybjK)%v;c7NP#XpG>avU;1YAFqF@&Y zq-N|Fs+LYSR#a=<mG&hN> z(H?=+f+R4=J?sUMh5c=(_NYg)5|To!K=?znF##^e9<4!6!?A9Dr>Mfq&*L3t z_XeB$Cnbe)QFHvvK8M_$2-|v5RHKo+k9!Dt?6=p}&i$g;b%C`z?Kzr`h;VaX5;H`} z;7K8ODm)M7&+6gaH*CUhv-h1HzoS@(v-|sb9VjySeu6Q?%L?+m$jx8WLniaqFgCcm zWJ7J?FVVB0YzifVVzAW+pkm4ql9TZw0fyG3uB$R2-shOVs=I7fo5j}7-_+qWg?^CW zw)giYVG{|)u(v^kJ0JJ>_x{M^wf6`ddzbTvpR`y*Oo4))Pb!y)Z|<9asEbm#G^Cw> zD&Z%>KA+c4V1w}fI=A%YzO)sQ*oMggiS)>YV8S>5TB3o=Mkj~<27l2&M*0Z9N|Tb7 zv|nicZ66QPoBzn;$+zg%EzPDkzgs#P;psM(h2VD{nGUN>?T*0#O@G6HbHU<>>_v%a zbB?ib^$P8e`8w@ivts?1IqfslVKdxxmTxaQUvyogpG7TtfO-p*9n?um z^7_UVyL>jc4&CkGft6GO@WrVH<5mq1UwrVup|#;aO7#wy!&`hB7Z79}yel8&HLS|j zeCObu1#ef}U9ZL7nzP#PojAF@v2)2iGT`l`L*ncb7n-|OCs}pkdmcExvYkQtL2S3m zw#UP2bf+U1+r?&I&m$|4xCnHA^~A;?&o)L!R)zr7p~NYw)os`jM@KF~%%i`GBl%w< CRgz=? literal 388835 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

iiqw#u|76enBh!uH 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ℜP?k`T`T!yr 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 *^ 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

accountPermission( + permission: P, + destinationId: AccountId, + ) = GrantOfPermissionAndAccount( + permission.asRaw(), + destinationId, + ) + + /** + * Grant role to the given account + */ + fun accountRole( + roleId: RoleId, + destinationId: AccountId, + ) = GrantOfRoleIdAndAccount(roleId, destinationId) + + /** + * Grant permission to the given role + */ + fun

rolePermission( + permission: P, + destinationId: RoleId, + ) = GrantOfPermissionAndRole(permission.asRaw(), destinationId) + } +} + +class Revoke { + companion object { + /** + * Revoke permission from the given account + */ + fun

accountPermission( + permission: P, + accountId: AccountId, + ) = RevokeOfPermissionAndAccount(permission.asRaw(), accountId) + + /** + * Revoke role from the given account + */ + fun accountRole( + roleId: RoleId, + accountId: AccountId, + ) = RevokeOfRoleIdAndAccount(roleId, accountId) + + /** + * Revoke permission from the given role + */ + fun

rolePermission( + permission: P, + roleId: RoleId, + ) = RevokeOfPermissionAndRole(permission.asRaw(), roleId) + } +} + +class Execute { + companion object { + /** + * Execute a pre-registered trigger + */ + fun trigger( + triggerId: TriggerId, + args: A? = null, + ) = ExecuteTrigger(triggerId, Json.writeValue(args)) + } +} + +class Upgrade { + companion object { + /** + * Upgrade executor + */ + fun executor(executor: Executor) = Upgrade(executor) + } +} + +class SetParameter { + fun sumeragi(parameter: SumeragiParameter) = SetParameter(Parameter.Sumeragi(parameter)) + + fun block(parameter: BlockParameter) = SetParameter(Parameter.Block(parameter)) + + fun transaction(parameter: TransactionParameter) = SetParameter(Parameter.Transaction(parameter)) + + fun smartContract(parameter: SmartContractParameter) = SetParameter(Parameter.SmartContract(parameter)) + + fun executor(parameter: SmartContractParameter) = SetParameter(Parameter.Executor(parameter)) + + fun

custom( + id: CustomParameterId, + value: P, + ) = SetParameter(Parameter.Custom(CustomParameter(id, Json.writeValue(value)))) +} + +class Multisig { + fun register( + accountId: AccountId, + spec: MultisigSpec, + ) = MultisigRegister(accountId, spec) + + fun propose( + account: AccountId, + instructions: List, + transactionTtlMs: NonZeroOfu64? = null, + ) = MultisigPropose(account, instructions.map { it.asInstructionBox() }, transactionTtlMs) + + fun approve( + account: AccountId, + instructionsHash: HashOf>, + ) = MultisigApprove(account, instructionsHash) +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/transaction/TransactionBuilder.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/transaction/TransactionBuilder.kt new file mode 100644 index 000000000..bcf70f6c5 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/transaction/TransactionBuilder.kt @@ -0,0 +1,67 @@ +@file:Suppress("ktlint:standard:no-wildcard-imports") + +package jp.co.soramitsu.iroha2.transaction + +import jp.co.soramitsu.iroha2.* +import jp.co.soramitsu.iroha2.generated.* +import java.math.BigInteger +import java.security.KeyPair +import java.time.Duration +import java.util.UUID + +class TransactionBuilder( + var chain: UUID, +) { + private val instructions: Lazy> = lazy { ArrayList() } + private var timeToLiveMillis: BigInteger = DURATION_OF_24_HOURS_IN_MILLIS + private var nonce: Long? = null + private var metadata: Lazy> = lazy { HashMap() } + + companion object { + val DURATION_OF_24_HOURS_IN_MILLIS = Duration.ofHours(24).toMillis().toBigInteger() + } + + fun addInstructions(vararg instructions: Instruction) = + this.apply { + this.instructions.value.addAll( + instructions.map { + it.asInstructionBox() + }, + ) + } + + fun addInstructions(instructions: Iterable) = + this.apply { + this.instructions.value.addAll( + instructions.map { + it.asInstructionBox() + }, + ) + } + + fun addInstruction(instruction: Instruction) = this.apply { this.instructions.value.add(instruction.asInstructionBox()) } + + fun timeToLive(ttl: Duration) = this.apply { this.timeToLiveMillis = ttl.toMillis().toBigInteger() } + + fun signAs( + accountId: AccountId, + keyPair: KeyPair, + ): SignedTransaction { + val payload = + TransactionPayload( + ChainId(chain.toString()), + accountId, + System.currentTimeMillis().toBigInteger(), + Executable.Instructions(instructions.value), + NonZeroOfu64(timeToLiveMillis), + nonce?.takeIf { it > 0 }?.let(::NonZeroOfu32), + Metadata(metadata.value), + ) + val encodedPayload = TransactionPayload.encode(payload) + val signature = Signature(keyPair.private.signAs(encodedPayload)).asSignatureOf() + + return SignedTransaction.V1( + SignedTransactionV1(TransactionSignature(signature), payload), + ) + } +} diff --git a/modules/test-tools/build.gradle b/modules/test-tools/build.gradle index 14d66d38b..1eb0225b6 100644 --- a/modules/test-tools/build.gradle +++ b/modules/test-tools/build.gradle @@ -1,20 +1,21 @@ dependencies { - api project(":client") - api project(":admin-client") - api project(":block") + implementation project(":admin-client") + implementation project(":block") - api "org.jetbrains.kotlin:kotlin-test:$kotlinVer" - api "org.jetbrains.kotlin:kotlin-test-junit5:$kotlinVer" - api "org.jetbrains.kotlin:kotlin-reflect:$kotlinVer" - api "org.testcontainers:testcontainers:$testContainersVer" - api "org.jetbrains.kotlin:kotlin-test-junit5:$kotlinVer" + implementation "org.testcontainers:testcontainers:$testContainersVer" + + implementation "io.ktor:ktor-client-logging:$ktorVer" + implementation "org.jetbrains.kotlin:kotlin-test:$kotlinVer" + implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlinVer" + implementation "org.jetbrains.kotlin:kotlin-test-junit5:$kotlinVer" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVer" - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:$coroutinesVer" implementation "ch.qos.logback:logback-classic:$logbackVer" implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlinVer" implementation "org.yaml:snakeyaml:2.0" + implementation "com.fasterxml.jackson.module:jackson-module-kotlin:$jacksonKotlinVer" + testImplementation "org.jetbrains.kotlin:kotlin-test:$kotlinVer" } diff --git a/modules/test-tools/src/main/kotlin/jp/co/soramitsu/iroha2/testengine/IrohaConfig.kt b/modules/test-tools/src/main/kotlin/jp/co/soramitsu/iroha2/testengine/IrohaConfig.kt index 7a0e8ceed..432820f80 100644 --- a/modules/test-tools/src/main/kotlin/jp/co/soramitsu/iroha2/testengine/IrohaConfig.kt +++ b/modules/test-tools/src/main/kotlin/jp/co/soramitsu/iroha2/testengine/IrohaConfig.kt @@ -4,6 +4,7 @@ import jp.co.soramitsu.iroha2.DEFAULT_API_PORT import jp.co.soramitsu.iroha2.DEFAULT_P2P_PORT import jp.co.soramitsu.iroha2.Genesis import jp.co.soramitsu.iroha2.generateKeyPair +import jp.co.soramitsu.iroha2.generated.Peer import jp.co.soramitsu.iroha2.generated.PeerId import jp.co.soramitsu.iroha2.generated.SocketAddr import jp.co.soramitsu.iroha2.generated.SocketAddrHost @@ -18,6 +19,7 @@ import org.testcontainers.images.ImagePullPolicy import org.testcontainers.images.PullPolicy import java.security.KeyPair import java.time.Duration +import java.util.UUID import java.util.function.Consumer /** @@ -33,16 +35,17 @@ class IrohaConfig( var pullPolicy: ImagePullPolicy = PullPolicy.ageBased(Duration.ofMinutes(10)), var alias: String = IrohaContainer.NETWORK_ALIAS + DEFAULT_P2P_PORT, var keyPair: KeyPair = generateKeyPair(), + var chain: UUID = UUID.fromString("00000000-0000-0000-0000-000000000000"), var genesisKeyPair: KeyPair = keyPairFromHex(GENESIS_ADDRESS, GENESIS_PRIVATE_KEY), - var trustedPeers: List = listOf( - PeerId(SocketAddr.Host(SocketAddrHost(alias, DEFAULT_P2P_PORT)), keyPair.public.toIrohaPublicKey()), - ), + var trustedPeers: List = + listOf( + Peer(SocketAddr.Host(SocketAddrHost(alias, DEFAULT_P2P_PORT)), PeerId(keyPair.public.toIrohaPublicKey())), + ), var ports: List = listOf(DEFAULT_P2P_PORT, DEFAULT_API_PORT), var shouldCloseNetwork: Boolean = true, var waitStrategy: Boolean = true, var submitGenesis: Boolean = true, var envs: Map = emptyMap(), - var fetchSize: Int = 10, var executorPath: String? = null, ) { companion object { diff --git a/modules/test-tools/src/main/kotlin/jp/co/soramitsu/iroha2/testengine/IrohaContainer.kt b/modules/test-tools/src/main/kotlin/jp/co/soramitsu/iroha2/testengine/IrohaContainer.kt index 7edfabfaa..bc5002a0e 100644 --- a/modules/test-tools/src/main/kotlin/jp/co/soramitsu/iroha2/testengine/IrohaContainer.kt +++ b/modules/test-tools/src/main/kotlin/jp/co/soramitsu/iroha2/testengine/IrohaContainer.kt @@ -11,6 +11,7 @@ import org.testcontainers.utility.DockerImageName import org.testcontainers.utility.MountableFile import org.testcontainers.utility.MountableFile.forHostPath import java.io.IOException +import java.net.URI import java.net.URL import java.nio.file.Files import java.time.Duration @@ -26,55 +27,82 @@ import kotlin.io.path.readBytes */ open class IrohaContainer : GenericContainer { - constructor(config: IrohaConfig.() -> Unit = {}) : this(IrohaConfig().apply(config)) constructor(config: IrohaConfig) : super(config.getFullImageName()) { - val publicKey = config.keyPair.public.bytes().toHex() - val privateKey = config.keyPair.private.bytes().toHex() - val containerName = when (config.submitGenesis) { - true -> "MAIN_${config.alias}_${randomUUID().toString().split("-").last()}" - false -> config.alias - } + val publicKey = + config.keyPair.public + .bytes() + .toHex() + val privateKey = + config.keyPair.private + .bytes() + .toHex() + val containerName = + when (config.submitGenesis) { + true -> "MAIN_${config.alias}_${randomUUID().toString().split("-").last()}" + false -> config.alias + } - val genesisPublicKey = config.genesisKeyPair.public.bytes().toHex() - val genesisPrivateKey = config.genesisKeyPair.private.bytes().toHex() + val genesisPublicKey = + config.genesisKeyPair.public + .bytes() + .toHex() + val genesisPrivateKey = + config.genesisKeyPair.private + .bytes() + .toHex() + + val topology = + config.trustedPeers.map { + it.id.publicKey.payload + .toHex(true) + } this.p2pPort = config.ports[IrohaConfig.P2P_PORT_IDX] this.apiPort = config.ports[IrohaConfig.API_PORT_IDX] this.config = config - this.withNetwork(config.networkToJoin) - .withEnv("CHAIN", "00000000-0000-0000-0000-000000000000") - .withEnv("TRUSTED_PEERS", JSON_SERDE.writeValueAsString(config.trustedPeers)) - .withEnv("PUBLIC_KEY", "ed0120$publicKey") + this + .withNetwork(config.networkToJoin) + .withEnv("CHAIN", config.chain.toString()) + .withEnv( + "TRUSTED_PEERS", + "[" + + config.trustedPeers.joinToString(",") { + JSON_SERDE + .writeValueAsString( + it.id.publicKey, + ).trimEnd('"') + "@" + + JSON_SERDE.writeValueAsString(it.address).trimStart( + '"', + ) + } + "]", + ).withEnv("PUBLIC_KEY", "ed0120$publicKey") .withEnv("PRIVATE_KEY", "802620$privateKey") .withEnv("GENESIS_PUBLIC_KEY", "ed0120$genesisPublicKey") + .withEnv("P2P_PUBLIC_ADDRESS", "${config.alias}:$p2pPort") .withEnv("P2P_ADDRESS", "${config.alias}:$p2pPort") .withEnv("API_ADDRESS", "${config.alias}:$apiPort") - .withEnv("TORII_FETCH_SIZE", config.fetchSize.toString()) .withCreateContainerCmdModifier { cmd -> cmd.withName(containerName) } .also { container -> if (config.submitGenesis) { container.withEnv("GENESIS_PRIVATE_KEY", "802620$genesisPrivateKey") container.withEnv("GENESIS", "/tmp/genesis.signed.scale") - container.withEnv("TOPOLOGY", JSON_SERDE.writeValueAsString(config.trustedPeers)) + container.withEnv("TOPOLOGY", JSON_SERDE.writeValueAsString(topology)) } - } - .also { container -> config.envs.forEach { (k, v) -> container.withEnv(k, v) } } + }.also { container -> config.envs.forEach { (k, v) -> container.withEnv(k, v) } } .withExposedPorts(p2pPort, apiPort) .withNetworkAliases(config.alias) .withLogConsumer(config.logConsumer) .withCopyToContainer( forHostPath(configDirLocation), "/$DEFAULT_CONFIG_DIR", - ) - .withCopyToContainer( + ).withCopyToContainer( forHostPath(configDirLocation), "/app/.cache/wasmtime", - ) - .also { + ).also { config.genesis?.writeToFile(genesisFileLocation) config.genesisPath?.also { path -> Files.copy(Path(path).toAbsolutePath(), genesisFileLocation) } @@ -87,8 +115,7 @@ open class IrohaContainer : GenericContainer { executorFileLocation.toFile().writeBytes(content) } } - } - .also { container -> + }.also { container -> if (config.submitGenesis) { container.withCopyFileToContainer( MountableFile.forClasspathResource("start.sh"), @@ -96,8 +123,7 @@ open class IrohaContainer : GenericContainer { ) container.withCommand("sh", "$configDirLocation/start.sh") } - } - .withImagePullPolicy(config.pullPolicy) + }.withImagePullPolicy(config.pullPolicy) .also { container -> if (config.waitStrategy) { container.waitingFor( @@ -124,9 +150,9 @@ open class IrohaContainer : GenericContainer { private val executorFileLocation = Path("$configDirLocation/$DEFAULT_EXECUTOR_FILE_NAME") override fun start() { - logger().debug("Starting Iroha container") + logger().info("Starting Iroha container") super.start() - logger().debug("Iroha container started") + logger().info("Iroha container started") } override fun stop() { @@ -145,9 +171,7 @@ open class IrohaContainer : GenericContainer { logger().debug("Iroha container stopped") } - fun getP2pUrl(): URL = URL("http", host, this.getMappedPort(p2pPort), "") - - fun getApiUrl(): URL = URL("http", host, this.getMappedPort(apiPort), "") + fun getApiUrl(): URL = URI("http://$host:${getMappedPort(apiPort)}").toURL() private fun String.readStatusBlocks() = JSON_SERDE.readTree(this).get("blocks")?.doubleValue() @@ -161,7 +185,7 @@ open class IrohaContainer : GenericContainer { } const val NETWORK_ALIAS = "iroha" - const val DEFAULT_IMAGE_TAG = "2.0.0-pre-rc.22.2" + const val DEFAULT_IMAGE_TAG = "dev" const val DEFAULT_IMAGE_NAME = "hyperledger/iroha" const val DEFAULT_EXECUTOR_FILE_NAME = "executor.wasm" const val DEFAULT_GENESIS_FILE_NAME = "genesis.json" diff --git a/modules/test-tools/src/main/kotlin/jp/co/soramitsu/iroha2/testengine/IrohaRunnerExtension.kt b/modules/test-tools/src/main/kotlin/jp/co/soramitsu/iroha2/testengine/IrohaRunnerExtension.kt index 214c18202..437dcc0ae 100644 --- a/modules/test-tools/src/main/kotlin/jp/co/soramitsu/iroha2/testengine/IrohaRunnerExtension.kt +++ b/modules/test-tools/src/main/kotlin/jp/co/soramitsu/iroha2/testengine/IrohaRunnerExtension.kt @@ -7,17 +7,14 @@ import jp.co.soramitsu.iroha2.DEFAULT_P2P_PORT import jp.co.soramitsu.iroha2.Genesis import jp.co.soramitsu.iroha2.Genesis.Companion.toSingle import jp.co.soramitsu.iroha2.IrohaSdkException -import jp.co.soramitsu.iroha2.asAccountId import jp.co.soramitsu.iroha2.cast -import jp.co.soramitsu.iroha2.client.Iroha2AsyncClient import jp.co.soramitsu.iroha2.client.Iroha2Client import jp.co.soramitsu.iroha2.generateKeyPair import jp.co.soramitsu.iroha2.generated.ChainId +import jp.co.soramitsu.iroha2.generated.Peer import jp.co.soramitsu.iroha2.generated.PeerId import jp.co.soramitsu.iroha2.generated.SocketAddr import jp.co.soramitsu.iroha2.generated.SocketAddrHost -import jp.co.soramitsu.iroha2.keyPairFromHex -import jp.co.soramitsu.iroha2.model.IrohaUrls import jp.co.soramitsu.iroha2.toIrohaPublicKey import kotlinx.coroutines.Deferred import kotlinx.coroutines.Dispatchers @@ -33,8 +30,11 @@ import org.yaml.snakeyaml.Yaml import java.io.File import java.lang.reflect.Field import java.lang.reflect.Method +import java.net.URI import java.security.KeyPair import java.util.Collections +import java.util.UUID +import kotlin.collections.ArrayList import kotlin.reflect.KClass import kotlin.reflect.KMutableProperty1 import kotlin.reflect.KProperty1 @@ -44,17 +44,19 @@ import kotlin.reflect.full.memberProperties /** * Runner for Iroha2 Docker containers */ -class IrohaRunnerExtension : InvocationInterceptor, BeforeEachCallback { - +class IrohaRunnerExtension : + InvocationInterceptor, + BeforeEachCallback { private val resources: MutableMap> = Collections.synchronizedMap(mutableMapOf()) private val yaml = Yaml() - override fun beforeEach(context: ExtensionContext) = runBlocking { - // init container and client if annotation was passed on test method - val testId = context.testId() - resources[testId] = initIfRequested(context) - } + override fun beforeEach(context: ExtensionContext) = + runBlocking { + // init container and client if annotation was passed on test method + val testId = context.testId() + resources[testId] = initIfRequested(context) + } override fun interceptTestMethod( invocation: InvocationInterceptor.Invocation, @@ -71,22 +73,27 @@ class IrohaRunnerExtension : InvocationInterceptor, BeforeEachCallback { } } - private suspend fun initIfRequested( - extensionContext: ExtensionContext, - ): List = coroutineScope { - val withIroha = extensionContext.element.get() - .annotations.filterIsInstance() - .firstOrNull() - val withIrohaManual = extensionContext.element.get() - .annotations.filterIsInstance() - .firstOrNull() - - return@coroutineScope when { - withIroha != null -> withIroha.init(extensionContext) - withIrohaManual != null -> withIrohaManual.init(extensionContext).let { emptyList() } - else -> emptyList() + private suspend fun initIfRequested(extensionContext: ExtensionContext): List = + coroutineScope { + val withIroha = + extensionContext.element + .get() + .annotations + .filterIsInstance() + .firstOrNull() + val withIrohaManual = + extensionContext.element + .get() + .annotations + .filterIsInstance() + .firstOrNull() + + return@coroutineScope when { + withIroha != null -> withIroha.init(extensionContext) + withIrohaManual != null -> withIrohaManual.init(extensionContext).let { emptyList() } + else -> emptyList() + } } - } private suspend fun WithIroha.init(extensionContext: ExtensionContext): List { val testInstance = extensionContext.testInstance.get().cast>() @@ -97,12 +104,7 @@ class IrohaRunnerExtension : InvocationInterceptor, BeforeEachCallback { utilizedResources.addAll(containers) val properties = testInstance::class.memberProperties - - // inject `KeyPair` if it is declared in test class - setPropertyValue(properties, testInstance) { ALICE_ACCOUNT_ID } - - // inject `AccountId` if it is declared in test class - setPropertyValue(properties, testInstance) { ALICE_KEYPAIR } + val defaultChainId = UUID.fromString("00000000-0000-0000-0000-000000000000") // inject `List` if it is declared in test class setPropertyValue(properties, testInstance) { containers } @@ -110,28 +112,30 @@ class IrohaRunnerExtension : InvocationInterceptor, BeforeEachCallback { // inject `Iroha2Client` if it is declared in test class setPropertyValue(properties, testInstance) { Iroha2Client( - containers.map { IrohaUrls(it.getApiUrl(), it.getP2pUrl()) }.toMutableList(), + containers.map { it.getApiUrl() }.toMutableList(), + defaultChainId, + ALICE_ACCOUNT_ID, + ALICE_KEYPAIR, ).also { utilizedResources.add(it) } } // inject `AdminIroha2Client` if it is declared in test class setPropertyValue(properties, testInstance) { AdminIroha2Client( - containers.map { IrohaUrls(it.getApiUrl(), it.getP2pUrl()) }.toMutableList(), - ).also { utilizedResources.add(it) } - } - - // inject `Iroha2AsyncClient` if it is declared in test class - setPropertyValue(properties, testInstance) { - Iroha2AsyncClient( - containers.map { IrohaUrls(it.getApiUrl(), it.getP2pUrl()) }.toMutableList(), + containers.map { it.getApiUrl() }.toMutableList(), + defaultChainId, + ALICE_ACCOUNT_ID, + ALICE_KEYPAIR, ).also { utilizedResources.add(it) } } // inject `AdminIroha2AsyncClient` if it is declared in test class setPropertyValue(properties, testInstance) { AdminIroha2AsyncClient( - containers.map { IrohaUrls(it.getApiUrl(), it.getP2pUrl()) }.toMutableList(), + containers.map { it.getApiUrl() }.toMutableList(), + defaultChainId, + ALICE_ACCOUNT_ID, + ALICE_KEYPAIR, ).also { utilizedResources.add(it) } } @@ -142,48 +146,51 @@ class IrohaRunnerExtension : InvocationInterceptor, BeforeEachCallback { val testInstance = extensionContext.testInstance.get() val properties = testInstance::class.memberProperties - val urls = when (this.dockerComposeFile.isEmpty()) { - true -> this.apiUrls.mapIndexed { idx, url -> IrohaUrls(url, peerUrls[idx]) } - else -> File(this.dockerComposeFile).readDockerComposeData() - } ?: throw IrohaSdkException("Iroha URLs required") + val urls = + when (this.dockerComposeFile.isEmpty()) { + true -> this.apiUrls.map { url -> URI.create(url).toURL() } + else -> File(this.dockerComposeFile).readDockerComposeData()?.map { url -> URI.create(url).toURL() } + } ?: throw IrohaSdkException("Iroha URLs required") - // inject `KeyPair` if it is declared in test class - setPropertyValue(properties, testInstance) { keyPairFromHex(this.publicKey, this.privateKey) } + // // inject `KeyPair` if it is declared in test class + // setPropertyValue(properties, testInstance) { keyPairFromHex(this.publicKey, this.privateKey) } - // inject `AccountId` if it is declared in test class - setPropertyValue(properties, testInstance) { this.account.asAccountId() } + // // inject `AccountId` if it is declared in test class + // setPropertyValue(properties, testInstance) { this.account.asAccountId() } - // inject `Iroha2Client` if it is declared in test class - setPropertyValue(properties, testInstance) { Iroha2Client(urls) } + // // inject `Iroha2Client` if it is declared in test class + // setPropertyValue(properties, testInstance) { Iroha2Client(urls, chain, this.a, keyPair) } - // inject `AdminIroha2Client` if it is declared in test class - setPropertyValue(properties, testInstance) { AdminIroha2Client(urls) } + // // inject `AdminIroha2Client` if it is declared in test class + // setPropertyValue(properties, testInstance) { AdminIroha2Client(urls, chain, authority, keyPair) } - // inject `Iroha2AsyncClient` if it is declared in test class - setPropertyValue(properties, testInstance) { Iroha2AsyncClient(urls) } + // // inject `Iroha2AsyncClient` if it is declared in test class + // setPropertyValue(properties, testInstance) { Iroha2AsyncClient(urls, chain, authority, keyPair) } - // inject `AdminIroha2AsyncClient` if it is declared in test class - setPropertyValue(properties, testInstance) { AdminIroha2AsyncClient(urls) } + // // inject `AdminIroha2AsyncClient` if it is declared in test class + // setPropertyValue(properties, testInstance) { AdminIroha2AsyncClient(urls, chain, authority, keyPair) } } - private fun File.readDockerComposeData(): List? { - fun String?.convertUrl() = this - ?.replace("${IrohaContainer.NETWORK_ALIAS}[0-9]*".toRegex(), "localhost") - ?.let { "http://$it" } - ?: throw IllegalArgumentException("Invalid docker-compose file") - - val all = runCatching { - yaml.load>(this.inputStream())["services"] - ?.cast>()?.values?.toList() - ?.map { it?.cast>()?.get("environment") } - ?.cast>>() ?: return null - }.onFailure { return null }.getOrThrow() + private fun File.readDockerComposeData(): List? { + fun String?.convertUrl() = + this + ?.replace("${IrohaContainer.NETWORK_ALIAS}[0-9]*".toRegex(), "localhost") + ?.let { "http://$it" } + ?: throw IllegalArgumentException("Invalid docker-compose file") + + val all = + runCatching { + yaml + .load>(this.inputStream())["services"] + ?.cast>() + ?.values + ?.toList() + ?.map { it?.cast>()?.get("environment") } + ?.cast>>() ?: return null + }.onFailure { return null }.getOrThrow() return all.map { - IrohaUrls( - it["TORII_API_URL"].convertUrl(), - it["TORII_P2P_ADDR"].convertUrl(), - ) + it["TORII_API_URL"].convertUrl() } } @@ -198,8 +205,8 @@ class IrohaRunnerExtension : InvocationInterceptor, BeforeEachCallback { .also { check(it.size <= 1) { """ - "Found more than one property with type `${V::class.qualifiedName}` - in test class `${testClassInstance::class::qualifiedName}`" + "Found more than one property with type `${V::class.qualifiedName}` + in test class `${testClassInstance::class::qualifiedName}`" """.trimIndent() } }.firstOrNull() @@ -210,80 +217,92 @@ class IrohaRunnerExtension : InvocationInterceptor, BeforeEachCallback { private suspend fun createContainers( withIroha: WithIroha, testInstance: IrohaTest<*>, - ): List = coroutineScope { - val keyPairs = mutableListOf() - val portsList = mutableListOf>() - - repeat(withIroha.amount) { n -> - keyPairs.add(generateKeyPair()) - portsList.add(listOf(DEFAULT_P2P_PORT + n, DEFAULT_API_PORT + n)) - } - val peerIds = keyPairs.mapIndexed { i: Int, kp: KeyPair -> - val p2pPort = portsList[i][IrohaConfig.P2P_PORT_IDX] - kp.toPeerId(IrohaContainer.NETWORK_ALIAS + p2pPort, p2pPort) - } - val deferredSet = mutableSetOf>() - val containers = Collections.synchronizedList(ArrayList(withIroha.amount)) - repeat(withIroha.amount) { n -> - async { - val p2pPort = portsList[n][IrohaConfig.P2P_PORT_IDX] - val container = IrohaContainer { - this.networkToJoin = testInstance.network - when { - withIroha.source.isNotEmpty() -> genesisPath = withIroha.source - else -> genesis = withIroha.sources.map { genesisInstance(it) }.toSingle() - } - this.alias = IrohaContainer.NETWORK_ALIAS + p2pPort - this.keyPair = keyPairs[n] - this.trustedPeers = peerIds - this.ports = portsList[n] - this.imageName = testInstance.imageName - this.imageTag = testInstance.imageTag - this.envs = withIroha.configs.associate { config -> - config.split(IROHA_CONFIG_DELIMITER).let { - it.first() to it.last() + ): List = + coroutineScope { + val keyPairs = mutableListOf() + val portsList = mutableListOf>() + + repeat(withIroha.amount) { n -> + keyPairs.add(generateKeyPair()) + portsList.add(listOf(DEFAULT_P2P_PORT + n, DEFAULT_API_PORT + n)) + } + val peerIds = + keyPairs.mapIndexed { i: Int, kp: KeyPair -> + val p2pPort = portsList[i][IrohaConfig.P2P_PORT_IDX] + Peer( + SocketAddr.Host(SocketAddrHost(IrohaContainer.NETWORK_ALIAS + p2pPort, p2pPort)), + kp.toPeerId(), + ) + } + val deferredSet = mutableSetOf>() + val containers = Collections.synchronizedList(ArrayList(withIroha.amount)) + repeat(withIroha.amount) { n -> + async { + val p2pPort = portsList[n][IrohaConfig.P2P_PORT_IDX] + val container: IrohaContainer = + IrohaContainer { + this.networkToJoin = testInstance.network + when { + withIroha.source.isNotEmpty() -> genesisPath = withIroha.source + else -> genesis = withIroha.sources.map { genesisInstance(it) }.toSingle() + } + this.alias = IrohaContainer.NETWORK_ALIAS + p2pPort + this.keyPair = keyPairs[n] + this.trustedPeers = peerIds + this.ports = portsList[n] + this.imageName = testInstance.imageName + this.imageTag = testInstance.imageTag + this.envs = + withIroha.configs.associate { config -> + config.split(IROHA_CONFIG_DELIMITER).let { + it.first() to it.last() + } + } + // only first peer should have --submit-genesis in peer start command + this.submitGenesis = n == 0 + if (withIroha.executorSource.isNotEmpty()) { + this.executorPath = withIroha.executorSource + } } + withContext(Dispatchers.IO) { + container.start() } - // only first peer should have --submit-genesis in peer start command - this.submitGenesis = n == 0 - if (withIroha.executorSource.isNotEmpty()) { - this.executorPath = withIroha.executorSource - } - } - withContext(Dispatchers.IO) { - container.start() - } - containers.add(container) - }.let { deferredSet.add(it) } - } + containers.add(container) + }.let { deferredSet.add(it) } + } - withContext(Dispatchers.IO) { - deferredSet.forEach { it.await() } - } + withContext(Dispatchers.IO) { + deferredSet.forEach { it.await() } + } - containers - } + containers + } - private fun KeyPair.toPeerId(host: String, port: Int) = PeerId( - SocketAddr.Host(SocketAddrHost(host, port)), - this.public.toIrohaPublicKey(), - ) + private fun KeyPair.toPeerId() = + PeerId( + this.public.toIrohaPublicKey(), + ) private fun ExtensionContext.testId() = "${this.testClass.get().name}_${this.testMethod.get().name}" - private fun genesisInstance(clazz: KClass): Genesis = clazz.createInstance().let { genesis -> - val tx = genesis.transaction.copy( - chain = ChainId("00000000-0000-0000-0000-000000000000"), - ) - val transactionField = findField(clazz.java, "transaction") - transactionField.isAccessible = true - transactionField.set(genesis, tx) - - return genesis - } + private fun genesisInstance(clazz: KClass): Genesis = + clazz.createInstance().let { genesis -> + val tx = + genesis.transaction.copy( + ChainId("00000000-0000-0000-0000-000000000000"), + ) + val transactionField = findField(clazz.java, "transaction") + transactionField.isAccessible = true + transactionField.set(genesis, tx) + + return genesis + } - private fun findField(clazz: Class<*>, fieldName: String): Field { - return try { + private fun findField( + clazz: Class<*>, + fieldName: String, + ): Field = + try { clazz.getDeclaredField(fieldName) } catch (e: NoSuchFieldException) { when (clazz.superclass == null) { @@ -291,5 +310,4 @@ class IrohaRunnerExtension : InvocationInterceptor, BeforeEachCallback { false -> findField(clazz.superclass, fieldName) } } - } } diff --git a/modules/test-tools/src/main/kotlin/jp/co/soramitsu/iroha2/testengine/IrohaTest.kt b/modules/test-tools/src/main/kotlin/jp/co/soramitsu/iroha2/testengine/IrohaTest.kt index bbf6a4a54..f49265370 100644 --- a/modules/test-tools/src/main/kotlin/jp/co/soramitsu/iroha2/testengine/IrohaTest.kt +++ b/modules/test-tools/src/main/kotlin/jp/co/soramitsu/iroha2/testengine/IrohaTest.kt @@ -2,8 +2,9 @@ package jp.co.soramitsu.iroha2.testengine import jp.co.soramitsu.iroha2.client.Iroha2Client import jp.co.soramitsu.iroha2.generated.AccountId +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.transaction.TransactionBuilder -import kotlinx.coroutines.time.withTimeout +import kotlinx.coroutines.Deferred import org.junit.jupiter.api.Timeout import org.junit.jupiter.api.extension.ExtendWith import org.junit.jupiter.api.parallel.Execution @@ -29,15 +30,9 @@ abstract class IrohaTest( lateinit var account: AccountId lateinit var keyPair: KeyPair - suspend fun Iroha2Client.tx( - account: AccountId? = null, - keyPair: KeyPair? = null, - builder: TransactionBuilder.() -> Unit = {}, - ) = this.sendTransaction { - account(account ?: this@IrohaTest.account) - builder(this) - buildSigned(keyPair ?: this@IrohaTest.keyPair) - }.also { d -> - withTimeout(txTimeout) { d.await() } - } + suspend fun Iroha2Client.submitAs( + account: AccountId, + keyPair: KeyPair, + vararg instructions: Instruction, + ): Deferred = submit(TransactionBuilder(chain).addInstructions(*instructions).signAs(account, keyPair)) } diff --git a/modules/test-tools/src/main/kotlin/jp/co/soramitsu/iroha2/testengine/TestConsts.kt b/modules/test-tools/src/main/kotlin/jp/co/soramitsu/iroha2/testengine/TestConsts.kt index c17e8733b..d2b5691a2 100644 --- a/modules/test-tools/src/main/kotlin/jp/co/soramitsu/iroha2/testengine/TestConsts.kt +++ b/modules/test-tools/src/main/kotlin/jp/co/soramitsu/iroha2/testengine/TestConsts.kt @@ -5,9 +5,16 @@ import jp.co.soramitsu.iroha2.asName import jp.co.soramitsu.iroha2.generated.AccountId import jp.co.soramitsu.iroha2.generated.AssetDefinitionId import jp.co.soramitsu.iroha2.generated.AssetId +import jp.co.soramitsu.iroha2.generated.BlockParameters +import jp.co.soramitsu.iroha2.generated.NonZeroOfu64 +import jp.co.soramitsu.iroha2.generated.Parameters +import jp.co.soramitsu.iroha2.generated.SmartContractParameters +import jp.co.soramitsu.iroha2.generated.SumeragiParameters +import jp.co.soramitsu.iroha2.generated.TransactionParameters import jp.co.soramitsu.iroha2.keyPairFromHex import jp.co.soramitsu.iroha2.publicKeyFromHex import jp.co.soramitsu.iroha2.toIrohaPublicKey +import java.math.BigInteger const val DEFAULT_DOMAIN = "wonderland" const val GENESIS_DOMAIN = "genesis" @@ -20,11 +27,42 @@ val GENESIS_ACCOUNT = AccountId(GENESIS_DOMAIN.asDomainId(), publicKeyFromHex(GE @JvmField val DEFAULT_DOMAIN_ID = DEFAULT_DOMAIN.asDomainId() +val DEFAULT_GENESIS_PARAMETERS = + Parameters( + sumeragi = + SumeragiParameters( + blockTimeMs = BigInteger.valueOf(2000), + commitTimeMs = BigInteger.valueOf(4000), + maxClockDriftMs = BigInteger.valueOf(1000), + ), + block = + BlockParameters( + maxTransactions = NonZeroOfu64(BigInteger.valueOf(4096)), + ), + smartContract = + SmartContractParameters( + fuel = NonZeroOfu64(BigInteger.valueOf(5500000000)), + memory = NonZeroOfu64(BigInteger.valueOf(55000000)), + ), + executor = + SmartContractParameters( + fuel = NonZeroOfu64(BigInteger.valueOf(5500000000)), + memory = NonZeroOfu64(BigInteger.valueOf(55000000)), + ), + transaction = + TransactionParameters( + maxInstructions = NonZeroOfu64(BigInteger.valueOf(4096)), + smartContractSize = NonZeroOfu64(BigInteger.valueOf(4194304)), + ), + custom = emptyMap(), + ) + @JvmField -val ALICE_KEYPAIR = keyPairFromHex( - "CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03", - "CCF31D85E3B32A4BEA59987CE0C78E3B8E2DB93881468AB2435FE45D5C9DCD53", -) +val ALICE_KEYPAIR = + keyPairFromHex( + "CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03", + "CCF31D85E3B32A4BEA59987CE0C78E3B8E2DB93881468AB2435FE45D5C9DCD53", + ) @JvmField val ALICE_PUBLIC_KEY = ALICE_KEYPAIR.public.toIrohaPublicKey() @@ -33,10 +71,11 @@ val ALICE_PUBLIC_KEY = ALICE_KEYPAIR.public.toIrohaPublicKey() val ALICE_ACCOUNT_ID = AccountId(domain = DEFAULT_DOMAIN_ID, signatory = ALICE_PUBLIC_KEY) @JvmField -val BOB_KEYPAIR = keyPairFromHex( - "04FF5B81046DDCCF19E2E451C45DFB6F53759D4EB30FA2EFA807284D1CC33016", - "AF3F96DEEF44348FEB516C057558972CEC4C75C4DB9C5B3AAC843668854BF828", -) +val BOB_KEYPAIR = + keyPairFromHex( + "04FF5B81046DDCCF19E2E451C45DFB6F53759D4EB30FA2EFA807284D1CC33016", + "AF3F96DEEF44348FEB516C057558972CEC4C75C4DB9C5B3AAC843668854BF828", + ) @JvmField val BOB_PUBLIC_KEY = BOB_KEYPAIR.public.toIrohaPublicKey() diff --git a/modules/test-tools/src/main/kotlin/jp/co/soramitsu/iroha2/testengine/WithIroha.kt b/modules/test-tools/src/main/kotlin/jp/co/soramitsu/iroha2/testengine/WithIroha.kt index f0aa049d9..7efbc1179 100644 --- a/modules/test-tools/src/main/kotlin/jp/co/soramitsu/iroha2/testengine/WithIroha.kt +++ b/modules/test-tools/src/main/kotlin/jp/co/soramitsu/iroha2/testengine/WithIroha.kt @@ -34,7 +34,6 @@ annotation class WithIroha( @Inherited annotation class WithIrohaManual( val apiUrls: Array = [], - val peerUrls: Array = [], val account: String = "", val publicKey: String = "", val privateKey: String = "", @@ -44,8 +43,9 @@ annotation class WithIrohaManual( /** * Empty genesis with no instructions */ -open class EmptyGenesis : Genesis( - RawGenesisTransaction(ChainId(UUID.randomUUID().toString()), EXECUTOR_FILE_NAME, emptyList(), emptyList(), emptyList()), -) +open class EmptyGenesis : + Genesis( + RawGenesisTransaction(ChainId(UUID.randomUUID().toString()), EXECUTOR_FILE_NAME, null, emptyList(), "", emptyList(), emptyList()), + ) const val IROHA_CONFIG_DELIMITER = "=" diff --git a/modules/test-tools/src/main/resources/executor.wasm b/modules/test-tools/src/main/resources/executor.wasm index f51b5112367097b7fd6d53cb3056c6d74b61f1aa..11cc0f19f937a724d8ec886e2c69378864a99189 100644 GIT binary patch literal 1052756 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 z�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%0ALw}`{qZai>jbh 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�KlYEjuymcNm#LyISv>6Cr>e-ofc=eFE zqN-3Wh;FW`9<%z^pq{WX;y~dEAw~yUk6Aw>`gLl7=fvYV>GQBA1+HUo?NSUS{kYbI zbyc_y``3o`Z95MGKU4<2kQco5lEP2wu9RVCgFl{H1_fmhjX$(aoH(45{0Ht*@mKAz z7u|M?g|rO8P;EGmf=_N?MM92y)Anw=dPr>V9vP{JZ1(Pv$TSZr?A;^mEF9k!lXj$& zm(Cj%($%|CVxuAvL?i4*#xxffX#Ux(v%+JjE-g3h!B&^ME9$?N2^yh?_FqD@?cN)4 zA`Qwpw)kufFG*eF^vhe)+M-nh_fdH`57N;o=FV>xWG4+P z7Z9R0%z~mkIUzz~>rElKI?4~s9Lh;5+miZNnlbMQ;(q9CUF<<;57dnL$-x>I8?RhrXGo>re{<@2oid~Z~~*h^AZqm&g>#7PXVjrLF{4;>IWxIjcz~jL~xmtqF zmc^Z;pxN|uI;*j#K-A zQy=x5ofUaQ8FX>{EOaOIGw-rqG*J9K%fZiilS*{8d*YN$-60bwBAumCqIg$VyD`UHw4GDN--xV-*|8Km?-MaE$uwNw{Gc# z3$Ai0yn)38Og1N8e0be?OYQS}=~A!yo&y)6Y@JH{ym8*r;`w{1;5bgpc=8!#9r&Dm znca^}p0~7cewOZ0xqshR&iu6NmKOUSPw4ZxrS=6L3a%G)Okw~spVP(TetQ_e-9Y-thWgmy^n^rd2Hv?GNtjB${ z@++bG{il^Ds0wIhwx73tRWD}iyfux}uRD#rSC^JY89lI(O>0G1sz$54F=$a&eXaR#>x8ThBTGSb z)*Tp=&7z5D!Ph6}!XEE8$)?l$_MmE|sP}LRhYs!8fc~@%;ulz;$VF{Ma?GqZGt&M5 z8bgxg7q^%F5=fiO>T(O8I@aDqVQR@Iz1Lc_HtkQ-TL`=jc0e96?vxKUfs{vcPLyt%l4}#r$dD&rt=iZK!-}&p+nA% z=g^zpZGC~9WOIJTZeA0YHG|~DlQAokxYumLqc&tla{d|4%6#`LZV^$y5KGApi`38( z9ZwYfL6y2B0*4#dFRntYjn;ay615bmbT_FELuqmUr9pXaQkvW)l*z7Sml01-=Zy3) zd4W0onGQcfWE2p;W&q;%7Z9s+#H-{VC;=xLC9A+M+t?_f2Cf8Q(ZCJ&?(IWK*+Blm zvS!y7P;N0qlsFpRhFYkQ=ID{~!vr>KBQ@CX%1C)0IpC3+H)0AnN*%Yam(#e8i9`k`ZXMoN9(J0~pUKwkg z$;^*Y=#;(u!suT9jrH<_b;fHr#&aZ%(u06S&te%b>m=E{NI{-yT~xB>Lyo*mx**kp zO!46aChOS!<7JAdwjq}XB1lq7Ro?y*<7ZXLLIUjB_l>@&P~qKi85mY_qTvXGD^cZH z9-9<0`JCie++ht6+pY!{z^ll;XPE{Tm=#J~rGG79Y!gfR4ZfAl0~Xdb88;<&kRl2T zySA(i3@FCzl_fJLCRG(C;Q}fav5l$?bS;>n(wm`F_;)rw?$|IEave$kO?|iuIjLor zIQ_6hZ-O{-{}e5#bQ%0iSuhOZi={H=%_l^^YQah2oAAuyXqoiH>HTUQB=POBvV5rJ zm?+&5i9)geg)Ie3N0EEPH})tkADKZzskVQlB{|Ix z)HAmZpr9*r4muYMb`poo(mF%V$Y{cBt5_PW1#HddD|JL;mn9145%WsE&>H`p+E;mJ z;}lM#f#!!ujySXrI6W=4I%xjm_6}SukSnGsn=HwHn?w-#(LVgmfi%w{Y}7tu zL?grMUqw%JlE8V4|1GDJ##K3HWJqFis*a)tsAbC7S*f&jz@VAgskTF9+XL@WZZd(+KzVsF*1z%U&$$z|lMvv1C^%z1pLb_1}xblQ!&r_n~+;c}g z4PV{}h|)$tz19vr7Zq~S&<+dMXWrVVQeabd4al`c$d+AY6Yhtj#EjxS0gfQWBK)}X z{jq0|u9VNnNF3Gpj3kIgy+iP3Tz8ej8{{I(-;d@zqnYDM3!^DU65_z~*8-R73+S>O ze~$%2FbGUA_#(%F29$B2u2fYx%(nB>B%Thgyh^w&MNGU5VM1moHtY&+^-PE`ESOND zGIQscR+&&Mri)0;CbK2`?3c`tYv5{y4k z`o=(STLPpSM8u}?-WL59SU|39+0j_YBj&Ks;>a4rx0}{4nq~Hrn(;)k?NLbl zfhn(h8cEE8!%*dA60zWuD(%BBVgcipxrPEbHLjS(yU*6xa_1$S|JpN9!8WGBjuXRt zA;_TPI2cyo6j-uT%50&ezLvy-k)DsCK|VGl zuj^nM(-{a88$O3)sl?AV@B%n}SkR2^l1 z_gy)w8TwsPW4K}_bJ<#m#8u5?u2C}MYsk}N?u3O=BGFXZ-vx{^lW|m76^6m$UV$*& z?1W)Cx%rmVxCzJwB-_FYg<)vX3&XK9otF$T;^qg0p;^1{&w}&+l)C9$ARTK`OvASsY5cH=5lEZXS-2wDaG12_-AwA2#H{iSAjYDOQ|C1p?dzEwi zL)*dfw-wYMY7UlvJaFVcx)yZ5Dl_^0gaGF6Cv?r^%=}n6b3;JBP+YJNSzTLuEGd*9%K)9zQSB%dW~F0u$CX(65A5J);4VJt~Gi#j@vZu1v#@FpX@kinNhy? zhSIkdp9>r{X2s>t7-;ZEGUsh4f8s!71{J3d7f*d3R87<8fQa*=r~~@PMd?PUqw=Ej z)S}OJbbSF_31+SL229Z`!2Cqjcb;4a-X?#Btx7dz)fTV7pSEU~HV97xkFFO?NOjTf zMd>?*Zd#u|T|>tjE-`qq%~*e^MtO6(qQ|uZubXJOwDTJR!;hw`C)`+T{Fy15Jb(Du zy-;Zsll*@!4<9odfO1$0OpFaTwE{; zZT4b3V-1RnKlk0~7Z?B4D=sHjYvjNIvyCXxiER~{fKHr(Q4T7t;WZS+6lX!cY7{P1 zTdM`|r6T~mD(O?Lh%{6yBrWlblvWC@5o*;@6CWs~z7fS*t1bKDrJ%{Fx^6Aduq`@T zVJqb~qsY;OP^}Un;-Y~e9P)jQh~dML3jE~*wRv;IUUdFvF_Om3^}IE<=2m6{9s-6W zReJdVSNSFe8Oy&gX*qtZ2c`VW{8;x(`R7!+pzKvij+zexY)gE_AbNVMBaa?@ztB=a z0u+7ie6^pHoR#+TGKa;_+~o*za#GSzS(B6^GcQB;3+rzhh4qqtLT5bI2gI^#o;Vum zJ7+=$j)XS}|8pi^jY550s}trIk0L^QF`f{%4hY#-dO~=X6S7-_kp1*DQ$I_c+DtG*o*O)*gQZTulAVu z14kX319eYK6OiONGdXza$1lYi=p_mx=wZ5MEVpz{)az+&m~t|; z#l|-kSH@abKGq8s6#Yl>DVyl5B39zge`NDTZnZ0bmtutCvg6FkvRIi>mN;&OC#Mgq zZPzSMJ6k+d$0VD}X8H@Qu=-GLA{w=@mkuE9^U876wDs z(SXE&PDRiXUsvf;`qr|Vt^I(7Hfw-^p)CryZ~&BTKAAQ#=L~gS>%*d}ubXIy7LzUf z#92~&K>|n{03Jp_bdr6~@~*l!?`n7Tc%+AV+T-i-a9F?G_dDxw95?>^r2vQj%DOUN zuVNn{oM`A*udA5zU|^n9h>hbc`iSkR!#@V?c)}}qA74u#*>ZeIzTDr`(;M+Q@r%T9 z2CFB9ypct}l{|B4{zbjyDn=+vma+@3+T>^_Fv(zLn+$Hc>={vG>tXEtUXsv|YlaaH zMU06x+|Belkzw%x(I*DPW&uI61b}FGAfSG6YNscDh}|SK_~cx@Vt9g~lFn}uGox0^ zVQ{r>8SGl9^}M)%RNuj@`jZ7_%j29wFaA7;plEJsF3dYPzjGB{`8?zm?4RI@p%)&_ln~euc?8^)W64OTh5fr3E+4&mT6- z{RH#9^^FOF?HWQ&<803pFvud2W`>qO=rV4L$?q%fO!Vq1=(d1=BH2~`)Avzta_P@r z*lUvuLzA-hQuA4xij3|mnoTYxze`_ZGB(35Mymn_tL|*>d%uXYJEeF^ zqPmHcU*?A37kl|HazJvQu;F*yKYH_mYHw$0W-h8^1D#+5NQ!>a_A?+Wouzy+Bu2-sA5B^w;})7{=be*WaTtr_%Si z8|^cOr>19S2jK%BWY^H_;RQlACCh_UTN4H)`&g<_7W_|z1|{#E(wH^`O9M=~Kv=H? zrVCsm0G=^`HE144&A+Ulp{DTVyZXA?+3zp4@!S2gcG)b?$(e}li*xOr*iI7T-u(cwASG;&lsAc_Lg8{AwFg9y~vl$mDJNYg1L&Z!n9M=*IP zkbwGRg47fQElp+0uQMUPUYt*PY0PCq%98MA;un&qZ6XzU>uH;i&KwybfieNV2VN%s^nH}B6He%RHe=E6&)rtQr;IqLObph88h%lecUjJv>v4c zR#0Kig6fA1d!T}*qK(o}vYz#Ihf!=+1_?TndPNJNjgx!>>Q*}Y3=O#18yYafj;vEN z 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

uVBSn( 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 CRgz=? literal 388835 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

iiqw#u|76enBh!uH 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ℜP?k`T`T!yr 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 *^ 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

JaJPbj-%sY;*d#-@lcTJg<9SdJ&sky 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�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 E0n^jJ1^@s6 diff --git a/modules/test-tools/src/main/resources/genesis.json b/modules/test-tools/src/main/resources/genesis.json index 8da79f092..1e0d19a67 100644 --- a/modules/test-tools/src/main/resources/genesis.json +++ b/modules/test-tools/src/main/resources/genesis.json @@ -1,59 +1,35 @@ { "chain": "00000000-0000-0000-0000-000000000000", - "executor": "./executor.wasm", - "parameters": [ - { - "Sumeragi": { - "BlockTimeMs": 2000 - } - }, - { - "Sumeragi": { - "CommitTimeMs": 4000 - } - }, - { - "Block": { - "MaxTransactions": 512 - } + "executor": "executor.wasm", + "parameters": { + "sumeragi": { + "block_time_ms": 2000, + "commit_time_ms": 4000, + "max_clock_drift_ms": 1000 }, - { - "Transaction": { - "MaxInstructions": 4096 - } + "block": { + "max_transactions": 512 }, - { - "Transaction": { - "SmartContractSize": 4194304 - } - }, - { - "Executor": { - "Fuel": 5500000000 - } + "transaction": { + "max_instructions": 4096, + "smart_contract_size": 4194304 }, - { - "Executor": { - "Memory": 550000000 - } + "executor": { + "fuel": 55000000, + "memory": 55000000 }, - { - "SmartContract": { - "Fuel": 5500000000 - } + "smart_contract": { + "fuel": 55000000, + "memory": 55000000 }, - { - "SmartContract": { - "Memory": 550000000 - } - } - ], + "custom": {} + }, "instructions": [ { "Register": { "Domain": { "id": "wonderland", - "logo": null, + "logo":null, "metadata": { "key": "value" } @@ -152,7 +128,7 @@ "id": "rose#wonderland", "type": "Numeric", "mintable": "Infinitely", - "logo": null, + "logo":null, "metadata": {} } } @@ -161,7 +137,7 @@ "Register": { "Domain": { "id": "garden_of_live_flowers", - "logo": null, + "logo":null, "metadata": {} } } @@ -180,7 +156,7 @@ "id": "cabbage#garden_of_live_flowers", "type": "Numeric", "mintable": "Infinitely", - "logo": null, + "logo":null, "metadata": {} } } @@ -236,18 +212,13 @@ "id": "ALICE_METADATA_ACCESS", "permissions": [ { - "name": "CanRemoveKeyValueInAccount", - "payload": { - "account": "ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland" - } - }, - { - "name": "CanSetKeyValueInAccount", + "name": "CanModifyAccountMetadata", "payload": { "account": "ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland" } } - ] + ], + "grant_to": "ed012004FF5B81046DDCCF19E2E451C45DFB6F53759D4EB30FA2EFA807284D1CC33016@wonderland" } } }, @@ -285,5 +256,7 @@ } } ], + "wasm_dir": "libs", + "wasm_triggers": [], "topology": [] } diff --git a/modules/test-tools/src/main/resources/genesis2.json b/modules/test-tools/src/main/resources/genesis2.json index 2221f050f..43eef77f0 100644 --- a/modules/test-tools/src/main/resources/genesis2.json +++ b/modules/test-tools/src/main/resources/genesis2.json @@ -1,7 +1,29 @@ { "chain": "00000000-0000-0000-0000-000000000000", - "executor": "./executor.wasm", - "parameters": [], + "executor": "executor.wasm", + "parameters": { + "sumeragi": { + "block_time_ms": 1, + "commit_time_ms": 2, + "max_clock_drift_ms": 3 + }, + "block": { + "max_transactions": 4 + }, + "transaction": { + "max_instructions": 5, + "smart_contract_size": 6 + }, + "executor": { + "fuel": 7, + "memory": 8 + }, + "smart_contract": { + "fuel": 9, + "memory": 10 + }, + "custom": {} + }, "instructions": [ { "Register": { @@ -139,7 +161,7 @@ "Asset": { "object": "123#test#ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland", "key": "id", - "value": "123" + "value": 123 } } }, @@ -148,7 +170,7 @@ "Asset": { "object": "123#test#ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland", "key": "wt", - "value": "123" + "value": 123 } } }, @@ -184,7 +206,7 @@ "Asset": { "object": "123#test#ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland", "key": "ef", - "value": "1234" + "value": 1234 } } }, @@ -193,7 +215,7 @@ "Asset": { "object": "123#test#ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland", "key": "cd", - "value": "123" + "value": 123 } } }, @@ -202,7 +224,7 @@ "Asset": { "object": "123#test#ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland", "key": "ab", - "value": "false" + "value": false } } }, @@ -210,7 +232,7 @@ "Grant": { "Permission": { "object": { - "name": "CanSetKeyValueInUserAssets", + "name": "CanModifyAssetMetadata", "payload": { "asset": "123#test#ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland" } @@ -220,5 +242,7 @@ } } ], + "wasm_dir": "libs", + "wasm_triggers": [], "topology": [] } diff --git a/modules/test-tools/src/main/resources/genesis3.json b/modules/test-tools/src/main/resources/genesis3.json index b69226262..91dbdfd76 100644 --- a/modules/test-tools/src/main/resources/genesis3.json +++ b/modules/test-tools/src/main/resources/genesis3.json @@ -1,7 +1,29 @@ { "chain": "00000000-0000-0000-0000-000000000000", - "executor": "./executor.wasm", - "parameters": [], + "executor": "executor.wasm", + "parameters": { + "sumeragi": { + "block_time_ms": 1, + "commit_time_ms": 2, + "max_clock_drift_ms": 3 + }, + "block": { + "max_transactions": 4 + }, + "transaction": { + "max_instructions": 5, + "smart_contract_size": 6 + }, + "executor": { + "fuel": 7, + "memory": 8 + }, + "smart_contract": { + "fuel": 9, + "memory": 10 + }, + "custom": {} + }, "instructions": [ { "Register": { @@ -107,18 +129,13 @@ "id": "USER_METADATA_ACCESS", "permissions": [ { - "name": "CanSetKeyValueInUserAsset", - "payload": { - "account": "ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland" - } - }, - { - "name": "CanRemoveKeyValueInUserAsset", + "name": "CanModifyAssetMetadata", "payload": { "account": "ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland" } } - ] + ], + "grant_to": "ed012004FF5B81046DDCCF19E2E451C45DFB6F53759D4EB30FA2EFA807284D1CC33016@wonderland" } } }, @@ -157,7 +174,7 @@ "Asset": { "object": "foo#wonderland#ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland", "key": "key2", - "value": "123" + "value": 123 } } }, @@ -186,5 +203,7 @@ } } ], + "wasm_dir": "libs", + "wasm_triggers": [], "topology": [] }

JaJPbj-%sY;*d#-@lcTJg<9SdJ&sky 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�zu&7ufZ0aiggq=px5zXVrF8gD6i^UdqG1YSs`;%Rpv1h}xYzfrOx+n}k! zEN&T@6qFj7rdeyXUoyR-QYxdC!g!)FrsSrM`WlF?db|73H^qItv*ya%I!!a%Ob!+D zang(kM*BNx9&TqUC20m*XwDqXQTSz>36pw`WFol@k+Z2U-NgqX1qh$vLe_H4VF!W6 z$OMl{kRJ@M3kCdiC;u`cSnSYruQ`y{>v$7tZ!U#x-Zx3(zQMxK+nqcuEdwrT<)zZh zz}sSsqO=(4>g&$o(3+`NEsz4HTAHDGKDniK7)1D{TRH?{X{foEEozp5pR7pk)9TS* zlJl^zvpU38u)_}LwKUX5R0Wzru))erc^NSoE@R9`8m^HAIg4UImld-=^&7pL#jCZhJFy+4gZTv z1jwSvUDZlp-bH1+oBwE;(ZZ8IxjTw|-rZ614tGc4E5M)GQj(SKj)50=Z3xCv^5`!g zSW%cR-#A!*%+lmKkL(kIgYDJ!5ZmA7xz`8f@taIom{9c=a@D*)SjoPxtsgKj4ap?C z(GXgGH>E;?RdA|X4kB`8>{lpzThX(KEfYCl~F zt6s^kz_G{@@s8|4(x%i_)}Ph%Mq4yXBGdiRbrz=>DPovtm%ow)Zf|xZ?Q_^Qz;X{l z6pv7~zM`RDCwPN$bW<>IYM^}3$|k2!l1pkqMQ48R>I#wrpZelm&qbO>~=iL6;IOt_P>bYy&xS z08n4k<4e7fzI_p^6i_t-uA4;Lh{$?{d?^ZZCu)GUHtvLstc{S6+UQ9rB_Q9zQv?4m zy&1$5{GtM}`Nacy0y8^$DZwn{mNvC)K)3Ojgr)`fnKvC{Gof!G53jOw8`0|}7Yg^m zahY+@XuAk9o7H78jsn%>p2$`s(uxH0Op~+K$YOH0Ozm;$)U}&_b=^~&e{#*gI;;rk z)ugaI+4d;o@8Jc68a!d&;0>Tm8b{*tZOziVJ>c!vT%^9Ov|3`4#kWKN(Fx+xdr~}D z+dRA66f(Ut*Gk%Cv((so;I0%W+q&(Tm3ZpG&`fvOy3~xWM(!((d;H&;+~D*?jB_bX zbj`UNkUF?LAv(_8K$_)Tb=6hoq>7DIWR2YS_EyPW{8#nH`1kXS@S5X}&XEabN) zKp_DW!=+91Obh^KJVtl2!N*OUa=M%?u|$mZOqpQX_#Au$SQ5b0;H=JkC>@6SO70fu zcrVE~D|4x}ZaK3$rynkN`eDQ9oKB1A=n!i*--ja#4r(if(J()10)J!RmaxtALQ4w$ z%!D?88q&CFme>dj%(%4Ld75ZoqZJnA;bK@sId@j;42#~<^zY74 z6Guork3}!qa1;^ah zB>?(64f5h*GXi)UzQ?iWIY2Odk!_!^movE-zqHXt-G~Luog3y&X*Y0SiKe$*ZZILs z%JKnq+bEFB)CGpo0NjA?aq@-9ta<7AO1^oHR-lNic|q+4>FJPO1bs8%VNxL)p% z6X?QEVkb5QAOY_g8xafC8{;iVaVu_QvV{po%O*YT3oK~xbY~^d&5{poLS)e2AiNlq z-C!j_+=CSL_zaPhO!2@`)CdZ*s6o3h%fwr7bLb_DTatEN-DQWH;ePKtUQ)PY+l#<~iWi4vi}p_Is2PLX^jN~8uJfrQBl0IFU>VmL~Sj1mE~ zTS}BfKtnT1M1?k{xoA)=M)?QDQZt#L`YFF+&s;bQ0J}4lrbPQk#T& zqj|Y}4>WeQKSn~S#;>!k>Eg2Y^ zI?qALXE-5#<>LOuOWv?JzBDT@2!fFR`gdhe54yR&WZvRKf!_Dp1|+d$&Az>C@!r)W2ztVLFgt@c(0BQg{yw#8$;AuiEvNQ*WL!bsW|mhCzkJ@J z%ld?Jnl};`ukTwvZ~naH^WuvK`V81eR0OvJ^UMt9K;P?^T;AuwTJQa}fS&>G+zf6G zPnY)f4e)+$R1fy$s%{_XyLicK7cW>gq`9=Jzi;ufwEr(9e=K;f>$|vr!Q$7(7Y4yv z-nH}Yf-CAqC$2wpWr+w$zdu*ja1zTSI4$c@@*k|SjMgr?Yyg@Poh@_pI*gjIiWlm^ zlq~=27c5?$=6}P2<*&<8=dz4&9bFEg%4NYxz&Ry@GnBHH#eW&BRls^l1}ldX$1&Eo z!yB@NZw}AC8Oj&S;*s1?EY<_;iXKlpp~s8}M}B`i-_Ojx-xclc0tnwP2hNKH2Z4mZ zS+IE7@`1}PmN-}zFMHjR%N8L7`r_BkTRdL^3c+x(%h-2C-^G_LUovq2ka}e8PNm2Q zDe&BocIR;Gz6g#e)r0-Bb_p;2eOG#>qI3^8ZBr1OMgA83cs%U-li(`8nVOZ+q7^S# z_e2Z^cLD=9Bj10yb_^qor^y#*`9}0}+K^EwBnT#z^YU`^KHe38^Z9;8R<`RgB;LS+ z*S;2!y)y|P1h??rQQ3DHes=pI=V8fnaU@Q5`(+SREA`-*?AtxUlZP4vr}AxUTrrvB z8mmFghTQm)B?G%}_#kjvGQ?!jUj=8=5IB3@Z)t<-)qKBQcIj&e=FRVmQ;tLalfK^& zT%~EWcJU<(UVGWVJR8t2oi{KK0_huY5^%|7%kv^TxD+@i14sN*%>B7JG;1az=KXTs>#{huHixQ);?Bds|Jmufpi`(YE`O1mYe>d&0SAXN`k3M$qQ-65FzF#`wtLyiBZ}j}~XO3R@ z;NnS_UU#I+jYmjqWRQeM_m2h zX_r)2&z)Rfef5nKJ8yg4njil3ob8WypK#s$eNTD)6WtHL=YoIxhx3mW*{HzVg6LuetV(&%NV2wI7W6*H_=R?wkK~ z)z$Af?13Nc|LE^NcXt0HZ>=7^?%T_M@TT~y4PP-5h3&PzDq>l z`4>pA)?;$fk^vM_0Qq-)^OO1W2j(n(<+48AkdR!?6ky&(i~4#8q`S>saA{w%2-S1` zm8Xf)m%U0uaqprf7x&LuY*xw1<40)g|as;g5*c~^oL{1VOR)@QK?dis@1lry;O_3iuG`8v`=Z=*zR!OX#ePd&Pk;M zs|SaZ!-d8E=;MXEqWhz7Mh{2d?)XmIccbq`KM1#$eiHqnxGnlkyuJ8L^lafzVaK5- zo_zK>H@*M;ANZ%Yyz^gf`^0_M-&L-(O@Hyp=RLLM;bQmr=`+rI)ioda*vCKn!mazf z>4vwxzu4I|cAu%o9Dl-Tv**0@>~rS#UGT|IO`KGzw%5A%pZ=l~)_?es@3+lZ^Y-OzAmp<_TxK^sKqBc;$KLzxsmL zTzGNcCH>2;c;hv1zWpN~zjNc3k9~aclFz;KHO+r26^cg|E-8dZA2oRGfrVqnOe#)p zJE(Mc>C|G^VS^tjPcBX__Ee9ro&Ay(GurlRuZ}}|-YoC4E#51a|=$un&AN>97_5%y2&zVu^sa`q~#&4l7p7r9v2Tv-8#aEUl9v`jfI-)qgV>*g6X+*E*=Jnae&PPb@!A9nhKIMXc_{X2Fdh6TX z{*Djdb>C;c_@%FW^+%6Cu_GuNLC-kh#23$b=|8M`8;N)SzwNzuSQI<^2E2t{cNdnj zv=vbS=^X^6D!mtxUX~)ArT3~R3aBV5qM!mwQ4kOX6~zLGilPEy0g+}y5D`&@B97!`L1ucLMD?;o+Oh=a^KIB*@nhjx9@cf4xxT@_jOQzclM;D?a41_yVt>r z7gJlOXJF^x=DInxUADd8M5Wj#+e8QQt ziH(=IxCMnaZZb84`hP-V-OWdjpN&sUg;KM_!Vj#Lk}f@4-_+94-FFzJnRieoTd4EV zy?Il!Ee`Yy?6@`3V;=&8lr=VJ>*egR@(yopyZ@l)$;jM1itHks(nph`%fLrNhfl6x zODd-oVoc`4@-m=lq-hjr=&@*eI(j^lIXi*gh8|19&%}sjz|vzeV2om+p~W)Oq1lME zru2ODcJvrJZWePI9jqi6pYU|-ENV0Yt6azdG+S3CwbG_kVM%l;vsin2E=C?ksK;%k zW1=I`+0(D3-N+;Xc2S_Qvdj`RBsyknQU!>TmNmg9on%nQvSZchRT$RNrp)7c7^Lx% z*cI$6*pqhAq~!536EkvYrD@lJuExWdbVWFfC8>*)jH6BJWBzy)tIU|}$eDD3A*r2~ ziDw;_iB5%KBLfRv7_%UD3ynQvQYsHW6BpR&m$Z|v{3HuEjcgH3a_?$-7Fyb*5?t~W zJ(?^|2V!^ABwfMsVcA(7!(&k>EDDthsI)z_t|%vtLKK0UEW|=~75X4ixK><-ED==F zFM&DbDk=EQRSGpnRysQGsx*s!sf1=)p)A7sQn{SXO;wtwNL7a4O@C6b$XHXs&3t@o zk%d{%3d@2^MV6=zH!I46A}dty3TssVOPezTZg%emSJ>YlEwU%0#_Y$@iCa*?D0-A6 zn94BV53SEEL&Tvep!G2rG|fu1AfE%X8Y3f`hX&0EW(wN1Sak+*9yD1Q+(5$sTA7{+ zBY*~Gsb~xh14zPzApu2|DwtAeFyN`81uTPiKx&XT1DYPogb_r8 z4HiJh!iW|H*@IlMwBUKuW0>Jwp&|jH7%0q-Q3d5&lp=uEN7Dea2sD}jZGpznvoN@$ zF^tUg1{gk&9~!O92H9}XGNVNp(OxuY@N1D63@?TTi=zQQJBgt~v!g-VV+AmR;7=3i zD;UriW=1sVYv^!{FggNDgJDF|VV{CV0Hvjea>OvuF=5a$Lb5b6AWVxEWn=*g3y=V- z0wTeUSTzO=<{%c$il&DIVllTgQRwS{J>QLXC8OwkF(?`|6B%QU0mBj~J1>S7orfV2 zSkbE)c$uZJGN5i4%o?-~Xn73KmoR`W8DIx77K5P$^%lo4pvRzQLxXi34u?a5Tn5nl zX;D~EOBzuu4Z0ZQkHVN^H!{o8#G;kh#Xvoou(BXedb9>sgci-P9@yh5FoLlb?Sh4x z5;O|B0F7lJ!YzwNbAivYV`;C09|A?AxuI4C&k9P1#=He(qXRx4#)bj9vK49%5KF;= zhf0fLL}RAFlLtKlode|2pvg?4bnug+!(gRAgQMs{gP<+BKv6(0F?2uxXmilpAW>+b z@Wv?6(n4owI(8Iz0a54;G#21GN(#e`0&PG;%fNu47o^Drn_t^PA$jdKBWBFY|{7Wxo%Igp5DW7>)myNX5~9F0ad zsuyAphTKEXpC7=~uyf=fX}I?&iPV4qr=0As&DXU(!WJ-D6Q6N(17O|WMt*! z6%>_}RaCXKb#(PME=3R!sD#KApcFtslsy7Xy?g;yiS&U8dj#P8jEaQ8?b5jQlk?De zdrcV=O5wX4>W)=n5|dxd>+DV4A`Qb=5*}7dmq#_Nqqb!wyhzos(CcFSzfKP!CFm%B z1KPJKacq9xx?+C5jDCkkg~lm`J5SE)zEpqNDey$`ZD-E=*SGeT%(!I5=qAx^PaLV z4F1>fB7``%Q6P@#DK#Lc2Gc%}vb91FUC7$8r{vT`b7%QN+YK;_bl9x!L_ zFensM3Oa);_Y1;?$mk#KXNtV}VL?HlRYJXiHVg1?;Ytcxiw%rIiSgr5jNl$UM2^*> z9BqH9DJ%w@SV2t)()g}M(yD@U=zyLd(CVT7*KlY!#m%2eaU&xm(J%FZ-gk)Lh2Hn2 zi~vM1{lKAM;s=AdR!##LK5&b@3WIbv3`(m5x(;Rqttt2fO4$fq0Vm_o$ya??IS9r; zFJB5^+FeoO0yq>qkg%wh@kPM?LWcu80tAtGX`r@&cn{C;V1Hi^prHDZ1K>448vK$x zz{8+~`g&LaLWK&r70S}usDpH-L4g#jpnzYlLn?u#=^&cWkQx+d1rON^icGSB?xKzW zCWyd84giyaE7jLK&<*GYqBRk^-c=7KaaT{>Z@fZ_@sJ`#^r6YyTAc zcXvtsl5Ro60hc}iP?)|xZd4zrvqJTtNO?<J z^)Fg15YV(M|3hQ_Aq{kCNoAL&_^q)2Chcz(TblFAm7p&y_Vp8FXoZGCAr<|L+QDkG zh3c(b&?7H)4GA(B8C;PR%j4it0~!OVpq_w?gcQ?&TU?aA=>JyLWg>p|p}#8#=okz4 zx&G3r|J*HHe{>7i-^D`@eer3MMSs@MRqUS?W$8W3+eFMa*o*2L?CTSpgbz7wfdx+z|hYX!xiSKtT_NoRzNRfu!7p#7j#qW#}xG!Fu^xK?PWTQpdnn79R-1tU~36^t|5zF`4wfY=VEfR%*18{m#9 z9=>3*a|!kbFgM8dvkVU(i8Z?rrsp*6NW?t$@6vVW<1OU$7Uro&&qLS6r7D6zwtPj{`O6dCE z(}Kx9G|UA&Z1_p4sVyu?sA_7q5Q7h9pFaqIRl%TSfF4&sMXXgVP9QTOoIG- z+b%qSg@y!;1q~6e-{gy^=F%5`WdhbSX-5glCKsPMCz6o5nMike- z<)sheECB*revbj1*P{K^ulYga24eE?Q8{32g65p%ek_?xjtAFk zK|C}Uo?l2;zYul;OV#}gW;Tx&uDJoN4~0sF&4(aJ42?0yzy-sP#RUv4zn0eo#4T+P zXnke{-e5`?q(9ORqK5eZ2i9`nIy6>7`I!L+jd)A%gUpJ6wh12c!hmLINv}ZWF%Z8r zJ%j|{H(?=mX`CpCvknS^Mj(Gm6s&Fvbo1APG;<3}&R_F_#%wFFETm}uoWqAikv9F= z|9`y)(oodBdazrErJIWpjEV@gn^z6@(8C`!d6&|p-o`K3A2O^!w}^( zWuX&+JAOQP8$`iw9ORAk2s2=n=LM!Z&`x@=%F`koq*g$hO}#@6mOto zkD$OpkvGKFH^?8>yDu2y{hS5BBna|^tN`Kn0-8)fy_UA61qd%R+K(i9unLs&%X?=D z(k%?Xzua#HuERGjd+`?DQKWz-3pQ<_b>IPiSsAQBc*zj`Oa3+>4tg&anh$#2RxYl; z%EggqXh{jCfMx=okl6*K2i+JH>h9|aT{8=W z{zKPHe8IpT=Haub$VA!@;#8pi4y_-+>;mvPWO?~(``UxJpHE@o0qG#tl@ySp6cKpNM@F)0u%#moVg){6k05X=Be zpY0YP8-9m=Hqb9^>j2`B8v6Q!{C|magyP)7e3s_t1ghx&qU`=e9- zT&6-Mraw(1m)enn1_`A=7I@)cH~~aRG+1;~sF2YpjF6zE_>vm|MF9qRXh{n#P(c5d zfJlZ=3RrgnrGFUE<3o3X2@&K7f)INGmXS+rN&hdzEm(m9d4Dp~(}9Zw*7;!UU9kE5 zD>JA+B>lP2{7d7hU+-F0U8Ft0ps}nK7s?a%9}Kg8$s0jKe_0M|AAkgcz{5fefuI0n zeDiY&PX!|x^tcv{amet3@DCQuTK@hEg9!CEv*kZ0hX#k=)Bd`yfY=om;2?G-9B@2K znH*PeZE4tTS=fD9*kf53y!yY~4~?};^YdC3_FfkDSr+zP7T&rn?6)ioF;+|E1uP2( zE(-@O3kNR?hb#+2CcsPc2ax!eFjxls5)NM$j#w6sTo#U67LHyPj#(B4>b+m&#Vrd% zYon#*O;{FAToz6OVbIrqPWM`Y(a_uz4$RacrVfBD@}J@vWPg~s|GXEO`H;8ePxm76 ze;tFE4$G1OPzwMJ!m|u$kUl=LV&px+Im>ZNOFmqTW0sqw5mfi9Xk}NL~ z3PrDg*s@&!W#UK5^hNv&zdm z>|d7qKO|gUsFjMyGwT6m`u&+9#@}En2HKLapM_cSRR3etGJ(f|JP1qs10TY8V9ffp zrI%;;?_-xqM4|9XICxHd24r&oMY}H-`&%>q!vxEPX9C&Kduk5+KfR}RK(qGe=e;ma zK<~+ak!X22*p+c81yGJVpd5lo8!UN>e<$SsjbzJ9gF@wl@+g6FSOcHDyga}HG!*XO zZcxGg)bD3V)<2&d14UAT$m>yzzj?Jt0w+$6D$*r+6QDq{a`cj7y1E|^&jf- zPcARd9fkS^@`dK#N5ID+?FqrBzpdMUn_#*0AXTJp3cz2e8h@1AFV7u?>IV5j zb*lpYLfsZgj=!zn|C(rdNvzb6cL)dkg?DIC#2@PVZ=#kd^dlYbES z%Sic;Xn_A?P4nv<^@psNkCy)?$+7}~IyVB@(AJeW;QySnf53X`vNbQL z_s=+#`j0-cWZ(*nhVa+2`+kd80QWAm_2LolMJ@pGj4w~@O>o5y<`pD=ZQFGtZyR^UtG~OGTkFfn10$wgx^A zB6o2R_^n<4X~c3V(;#n%cfA9A$lMClZE+C&O~yZsST4h1Jt9K}_zNAY#Cbx;;V6VBwF-mG-ojPvw5&{k78Ke?2{=>0qXqf`Lf;dzt8;w^ z@`T2Nqu?G4@E7etbb)Tk6EfTZMs@Jcaf+uD876xG#p4FdfB>06*2KZ(kN`gP&izpv z^}8lY8)jBLfwn3b=!pNM())vg3~V?7+fX2d(mz*j8M}eaU12as47xAi$Y5H^12STf zK@60ZU-pOZa0SFAAQJ(W7Zr1b_LxDp`a;SF2${nT5kw9S4T4B|WK-F~URAH~Kv)k6 z=t{7aH7qQcswOS%8RS8g3Z+W_$W$7T_rU0D$%OznkI*2g&;|8_3zD15j~k?X!UFuI z$l74{c%&PkJb|HC7$WzFKzN(KH^lfsR2yu@fM^AwEo`2?(2gjGZ-w@CgU1Ir(#2Fi zyG1Buy(Pf}bWF$rDee6zlwe2=9{`!1LH7XNEEU+OfgM@Ex(jrT;P6liwAb!uS2%qOw{_+2t8A7f+wJtvUON1-o0MVJ?NzLG;aH#QE}4O>Xd-q4zi0Hz#93lvYx?Nt z@imFO_&1Wthw|`WSi3Z@)Ur^TlOqg#npg4f3wa@bFems8I)81^w)`|MoofkV{Uwtt z@`<)1N6%sj%8Ih=ce~Sl*IwGulXtF@eLR;DEfIyUqWxZSw0(6 z?JI&$g@gNpgP!6ChMc)^WK}_{@qy&h{_|tH7Uu|>HIh81SDW3lG}*g(YiZW0L(O&^ zS|<~#>SN8e5zX*~rm;=7wf7Pfp33L&lHZvbC|Re^ferk0Xf* zf4$Nwx>}3Z)%?omDj{!%Fihq%$!p%5YD(suxA0mPiYW$Fi70G4*8FzPNT2g5?^w=9 zdx4yzi9S0hU8*=2v8q~u>)(v?HV zvo$dOws(60jE&=wk7DE#FxB zwbA&TSe9#vAig_oyV!Tj{cR_*teHvaJZu&BI~&?gmC>j6LP%)^ziXx`+)Y|yDx2v<+(Uxlb=Q6W9`%jx<|_2 zG~;pN9j^8%&L3|ntuCo3qdCvpSe&%UhiA&~ro~%Zn}R)@2hvb<@1w<6J}4FLdmbN# zv!z!!@iP1QgJhNmvIo9fk@WmOkCLc^r3xCQpLA#0iAQa}SPh5@SUKfcI&IB+f^)aq zeG&WA?XA>D^ZmG{DblFk$(9a%(@UEjdY_k2_7KT_ss2wMhImvCyyO-V)WYAzAFCAI z#(zwo20Q8Lke2*?W9kW(`Ws^Cdmr z>p(;Om{GB7>w1AE3YV9zw!wYTsfV^2HU|yo-{4OaVzo`QGA`QfZ=A%*mGi$I#`tvK zRdtJw{NAkT@PW(P5<`v-aT}4GY4f>Dv?pvcFF2G{=TjW#5D`YSbr9$*F?_jx57}at zc=Pjf-8gPGq2r`^O_S2wy2^X2@3#>Q+kK}!@10@B2W~but7R8lr#^PmyeCt=bRwF% zA%}&ht!+ZNH=6Nw`lps=IZX|Yr`oTZJ~y8_9n`>bwBD;#@Kt`powXfSD^~9hPLQxH zBtMCrWS{zu8oN_7>_TPMP+>u0tzvo1SmbGd}5kZ$#vA?WXKbUb^Z# z1zoQ#dxYwrUq2Rlic@6`lab!o(`a6a1Yh3fZ8-a$)A-}BT*R_B%CKiEg^*%68cUP; zYZ{9ECVP6E*AS&o?|*mrm8iSLj_k^Qqjxy&@DKgdDr^O#Y{q8~S8(t}i`$d-N%mA( zg?6nPusuzbve~51ekFSMvuiKvll83eagEHq2?w%?xkvJLbucvW*WRB=p1*T;c>x+~#J)+E^LuWh=jHC3^5MCAa6Uc+_2Z zbB)Mtg*z!6k@upkJ1#bP2eAa`tf*8LnhBA7UYvVJ$Ub;yhl$+`Ps^vv@fOd!5@RNd zHmtAs%E3G)-8L$9W&ZkwBXYCR(?VS$lZE6aSudrpT+OpBdwHV-97&`*Yc4o{D@V8c zhjY3P#>JjtwA#nhcFFtrxD)PBVeZW;?YDxT!g4ok9g!xz9FCw_gV{0UDE?e7Luit7 z?RgdrXiydE|lifunPIOsp zvxp2a8LMr75*j6jAGLekHF{+I^n+-Kn4{+yfKxWe|L+(pms z8EOEbc>gZ1wZ1Ex-&|As*!(V5K;T7};EslrdyNY24j8)w+&nyeM)dBA#os^I4xlSu z5bP&CqkE2ItjnF)uB^l%EBJCMwPmAW!1rfc=x*)NUc*CLi={gjXeYyc_UMDsd`pg; z7Z23i<5!VZ@yPO*?0qAsIaDg6J}01GAHC&O+Nnk!l*P8IZL&rWZ?>FCDX?nexLbST zuJ&uZC1VNqgVyv@LMLS<-ir1XgupM1XoThc<_5L=f%~{ICz?d)g z;)`-kjOF)KMO^oDmQ#DQWwPuqh}Z8^{lLp%#6)Jp>|XzJX6%c$TN5X{Iz!U>d=1J- z%jU27q(itt309Qnm)5{ymaLqaoGj9tl_w9qo_UyAe`Kk>C7fL+)wynUqh5 zNW^*ETDO|~8x7$tSr5q9of>8Nc96ulw(h^t$;>w5Q|*3@SQOiU&xpMLG-$oh_BAQq z`24+2{F+Tk62l$`*KfGr!)FjaXdr(_{<6jSjg)zoO`e7oWE$ko3iDLU;<;P?iD_zXSU zc7>Rs!&47&MkILw;apW_{~Rfc0dbvP2BIT(-RYLcmr62wlWjU)KEzcKwzEGGmI~?1 zIbt(}u}U5m@MqyP%iLnz%k@H_El~nI^);m z)g3>qbX3s#0XZcj@oAn=#k47LZvszbY0^D9uefOAmA87HhaKdYU`7uz1xsdE`kh#F zz`x~?$@7$JPVvApUmbdu`+m-vu4opFpi$ZP-@8Z1oYJEF(MxS9bE+0?#2Ph#u^mGl^A8GP5v z(yQXb=1oLn`4)m?MZVZj2w(3CeH~3wd(JB4o)5=&(hd> z&VGBt-@04I@2nwzde!~)9Fy+C+>g3fU-}sM>i+89_VDJ>WWu&xCvUysK33Z;wsA*6 z=@9|HU~}3JeLUhD$7qVUw^ecPn0!*Os;1xCFSEcT`sgGf%<{8)(A&G)qx7WXMDr{K zolZHYGzl|5ytTEdZ5u(GXYitt&mBH>_G20IYMpF8906j{nlTctJO_IZ?nxbF5fWLE zE8l8cvyo$fgH1`Go9DcVj#yz-w#u{GXD9a<_Hpby>vzg)P2v{U6>dc-W$i-8n?788 zn=VH*sWqw1Zw%r!J+#Yh$AhdgjhvI82i)yBSzdOLib{LNZa+D{)+}WcPA^}?IX`qw z0{-*PzG^HBiN-*H$6zXbj`hnrUI*VU&ijRi9FLriwx67l=8W53jx#~yEv?!-`qUhU zFU~MmkV3qB!`O@Xd8MlazkLm|C0?`C7k`peRk`Y_k+k$A95#S^&loRqeZ+NV}0s}AF7M)}7@zT4*Hybxwq%s#={`nulT|xcM`ODb?aprz75-FUjh-LHMfM9aLAgntg&JvpfDAy`cNnz9w;D%MELE zf+{>k>3B>t5)WmVKBWj9`MATJtioZ)dPg+O@MaKY-y8N?`KyBKPBL!)T(s3bja``f zx%m*!f%EkKUq;3%m7dg2?NL0#VQa_IKe-{nKxC>xI8``aNUx&H`18Eyqt`k6M}0hzFYnf!BOMdj*a>zMA)F=V;;NII+!Fa~Xh##zwDYnn zw$#7wG`Yj&_~70A#Bt6iIh`&m*qJp5RlO_a9a3=DM$8ZS7?r!3*ND@luiZ-WzNpFB za9r3_)6vFn>!lS$t6bFc+)-2Jy9TGK^s1>%ELB^w;0` z)PMUkzsGw{5YKwvHNH$oYq0a!s}Ijh&G6M~12L^k45xJFRfeTY&hdSc8vUkvT-C~V zexKlEnkbjk$9K}-YFom$&$FMK!ZzTg-fSA)v*L;HhWW(v!Vew!KU&kJYbD3jQRe6O zjGn6En$l4LyTaXX)XT{~-S&PpVeHuC1lmVQ%|7kzo|8moflS`dYw|BTf9vocrQ_MXY`+<wvDkK+JXdsN zVwmiHO1;Dpa_$&b!kRm3hWQ(sfsMoM-j8n{)|n>^V(`K4JX zkeF|zOP{>*R(ECp)IP;w5&YVUhwJlcHS7%(Y_|z(1oBI-WM=_5{(R z=v5G&XRb!XS4%m6T^9a9erIBxy~j5CaK%+OZ*uXoy<(H!!}_^3fkjWVgw+Ky~%iVa} zphxU$hl4YH2y_9r4(hj!C%iw0*Dxi72^_n8w4bi%>Os5a(%F-2Io!jyjZ8X|P@AIj z-`zGZenL2|8?7&J57m=(vr;#iK};~^zGMJ*k37eQ2X+OAACh_Qm57K$Z~T0UQd(h1 zj4(|rH%dRb4WUG?8?(h=%->PyPrw(mY~7%Xw%fgjrq z4!e_O1P(3{JZaPTD1p0BsPFX{+cVwNUQYi>EA2jG-lP>xJ#ht?0iBg%IzEXSobt(X zF|+YLrb_%^87(J^yKv7uXMdZf;pJNwjl?WQd2cb7mP9_1XOQh|3EJL!k<*Xyo#3qq zvBKSK51TsA6i<9op- z;lq_{vcBR5Y;sHLDqoS#HU=B8#EbKdM(U*BuzMZ*(S0|)MqVRv`-~#Z*68hRS#?Zw zo_+54kmgHtxa{Ka!Hmc*f64>CHHx?WN{Z{JUq9SiJ}#ieC3K_clAz!%moavB+uhZ7 z@sx)cH&2ff^ISF6JM_)s_${90o0#*zmg^JEdPMi6jf*YbAcXpgoPCbm6G6+lju0os zo{~+Eag`HLS|e3} zSw-VeTGQ|eC*WGEp)0&7tpm^rMpFo-RRW)7aGJ{qA9lAMIkkLQv=ni}YwR&(fx3`lex z4&(^lxWt9hdI$#;R!{lyqqGK~09{hQa`bgPO6wyWD(p$OQveB5YM{7QQ}2Lld?>BG za7bg1>)>XPvIq*%YwoIx5;#jlX;s5P^A7`EgCvml8Wb!P+xysru45chdBaE2XTz5* z7)eNd2Os3xf+x{BQIL8DK5}y~q7venKhj@Rz{=Hss)SUU(4jekPMaGHc><|*p(8^k znII%R0ybYDM_Js8?%}WfvJ2^x9zA`%t5DT`{X+V}HcOEzhKvupA=4#r&|InE3Z$*8 zy8xN^fg`=r^+?-B;a4S)nh!`D?uo+2^}NZy52?ygsL|~0Yg0^GLfy2H^aE7i^8@7Q zju`@+KB@OU)|1cIPUiwQoIWSRJw>p(h)ew8JxGm&sulkx>?L4$1o4Q!u zbkgzqgqVi_2o^f3TDMOR^OBUmIzj1MYc`2psdFvtzY#SBse2j<57kJ%ifZNg+;tA9 zkTk<+G;_Z1Hj3}Czx4rZjWgdvYhD{0a@0|0yxtF_KRHF`S=7sVOWyijF&#fDX`6l8 zi<75X9SUn})}-N4;pEKpsPO> z9r8@L$;OA*Jgc8wsP#OA>FVtBh)y>m?kTB;VXrkCt4#cU&P@%ZH?8AAdQU%zGOQ1L z?(biV6Z!V8or@qRzw>SzXU6uIobOdf6OJ61YkH^oop@s(3TRe-+RPJlfV+YkXhE)i>FSxhHhIbZ! z%;VT#d21%YN3S`g%q6aCn|jOht_CUY<}Nw5{gHgTPBE+Q-{t$2U-ed>=wSO2;p6J2CJc1F)G!csn16h~={TPkL$=B4%3A?b2bhfXyuiZ1>ASz*sKs84k=;)yYmz>_!p+G)o4@BG z<@Irn&~bwj?uM{UH7iX;n@(i%WcxqME*Q1oEv#_+cxKlb!6(;WN4v{DWFKUXw|mbm z$o zf2K^_UFG;`CXnYDS4PFhWNK4@mNYfw!cM_`{Ey3(Wl!Y|X3UOktl^q`iobmzU1RTM zfw$j_cwC=-u;hyWK78l1#L%j^+k#OK%SZU`IpH)(>SyzIujg3n*&dA74(Gg2X3n3L zVe3)Un7c#VyO)>d^LOP#+HR`>6+*KiC*O-gE;ad$^WRx+nl*|gsSG^iP%ca< z+n{cKexjvV1RsS;gV znEF>wgnlVrrNFZ<>|}lB1k1tT%IpYsX)VELt+yD*DLRfB^U##S| zldB`Atgylu}_=Q!b!H+;j&@CbgQV`%OoGoYn4$md5Lv0P(1 z#}ZDl-8++MeCn03LK4ezvYnc#y-_*)K4VZW|U@{ ztJV2j-C{|2L+T?b)#=-X>V{}th@u*G2Djr<2T1R;_TRM_wl#l2XEMhrlJ9ov<5$h$ zWB!Bt_4_qQ(_)h3^o9BYcBWi49hxVdJzy@SxSPX{QSwCa@fS@mw_F;GP6_6z zH2TucV$>ylIOMGp&xu`v#?rC#BV$8Os5LceABMO&gudC&7j1P3zdG*1=-2n0dn8&W z(NM2`@A$j=c0Iet0y4%4*`}H29JoGN9?P^XCaCv0$qP#z`^Z{Q#o2JvZL`v{C3p+m^3H+U844+_4PN3PNz|6hlXm2n)w77@i0ni?L*Yiyr3{2 zLlLv{VIQGR^EC1Y7pp0p;f}1StJl;Y7h%BSRr1#3Ubg>YEtU%7XDNY65nr0vk% zw7Np>z0$Sxvwr)saRj-$K{9rUr_yA-^EXD-aONdk&HOHLtaE5qQ+u;*Kd+$K=5B$w z6DQ6d^%0v^l)w$UOPQ>4*tN^yR`X<-jxy)5Z_$NgA!ma=M%Kt!a_aGJk2$En)ij^^ zgH8V>FZ%;RxyCL57`&Euog#};|MX>!2BCTe9UJ^LVV!K9p72VZQzL`7_m$a%yyc); zn?CFjY{PXpAKCeMHT7M~CtTVlj&F}rB6QyG9M2w^ktI@idDM2Uw9Y+M`Ht!qm9XWC zkf5j1fm+8M@2I2d%-LVM9uj7+H@>VXAITABxp(gToeb{TTJhe(11l8QW+%H0&TkbE ztlp9#GN*u!ovCUZ>vJbioI=VfHBzoUQ7+i}Chr?pQ!Oiz_wIn~{d8U0q4);==^W8Y z>8p}L#~&K5Je&0iuUHp)aGlId$<7RccU#VdaHY6sCm6=nn^(RODV-2x z(SHHAu0kS-D3pFca*KO+H_r&CVYhOBuh;7D7sl1@vi6ZlS;NA2^ic;3s9m~+KAF}y zxx%&cTTpXpI2PMh?K8fd>oY!I2}#l@;mr1ndB~f_YbstVmDPWz<4Gu;y*_zJDEP3< z^UW;%D_ZGKDoZMS;9$KL#~H-FS-gR9ce)DtEsyy`{u4uvv072%@se%VRta@Rpj+AQ zaE2U`wiW$!Fp^{2BXkU5-u`Z4qo15?q7Ba}gA|_bgsQ79Wps(NFSZIY23iDdGz;vB z755BsZpUzBwyk33d9~vnNl}AYDd9Tz*t!p_FB~LN+)`Mwt~=EVgs0cFZoTL*5%-`) z<#0m|p>ud3=4RmGHDAqk z1;KYey0(b8DF*omQu3o|QYE1B^!N4lgiL6jbdBHM16B~KHz)HLERfoL4_gNa^i^NgK z+YSc!2PGzd%NsdDG*C=p`aYMj$*9lmYy1itKGPLB+nkQov1G4}zciLRfGZMH7*(Ku z)e#zT#7|s}kI1B;C5&l%n#!J=N>|6=PTF?W$EL{1_uLM3f=Gy7Jg#)Sxs0(6D^$_W z6>#^!5zYq{RHE_m8>{mY99xqvUFXFb`|J)HQi~GoP>sKDL&9NQnuFVq8gLD3XB^Re zOXj@s`J-_H-Lw2-R%O?TtHpRDYNh)H7#^l}0TXl-# zyY4DGyB7*CPTO#5$x83#S$AMe;ytn1hSSe}&uqha!65;ndacQ!x_1NJF)tM4IGiaY zqZLK-1Eo)Q^Kv!Mai5>-FYw*b^mLEq#IgL)IRV*Y6_|lKJF)zSpLL4pn+S8a>{7R! zsGLmB_>{Y&Es*>21xXQEmP5hE%VfX4jWraA*mvao(NdRf#Y`@7)ZL~8>kB%b+xAS4 znBI+WxGyun70M z(dDl;bETAd?iQ&N>pYrXVt0W51K*xE&OJ)_Ejpm;U{a-JJ%Q0I+5dho%Uzb&E&&`Mx zk4DVWOpC>DF`YHIc5u9!U{TuJ=oPS+nNosVEg0Zzx60zd)~gJWrgI&fRTKuL z%E03E^zqxA1G89C)`pu}5|r&!tFAfY$^>m(NVbw?y)HdM>D7loYhyN<7Y!a+LxwDf9}C|8^P z5$Vi`4xXZ<&IjWM&N-|LPW>injTQ3DS($2k)Qor4YPritINdoC!rrZXmwv+K%-Mu@ z*AJ=j6zmz1@b=y{eaPYHh=QhpAf^!)S9rBvO>?Fhx1#ku;reUN{MIUpK~DXowV2vz zZh4X3YhU@B9Kwoa%4#z92^89jUgQt8yXfQXY#6KAxVO-o zy)-_4uxMYhd{`pK0RKVH2Q0yqdEM_ag{P#ASqWDz)8g)|-(b5=qjm4PV>w(>lJuO3 zY#nQN8plL3wJ7jw#HIPO`?@)F1y$_y`d)}P&M)3%bzSvid#0Ua(mF;iAxt)}s6y-5 zmB30B*PWSsR&F!whsYW>$`t>VaZ1YgQx~VLntXPNrzdQZ;G;<=5>8Eten^oHU+ru^ zy+Uu8#JuBB^y6v`#-83hHO03bIMcWD-G+j@nX?{f?7$3TiNeG4yPs2nvnKR*uTAaK zB|ZMo6jio?Zsxp^%C~A}KiuuNAGr2+Y^p!$Oc!(XUOMOH;c~~A>%2oIpSSaD)Gp;! z3Vs_cL6SK;K4abCw}SzvW9)UXp8UPnUq$@-t#T$#>%PQ|`!P}o9Fn-hgWj~|FiYmHD9wDB$BL34S zdF_pNi8;3B3UYiPycx;%-C$q zK2({}bAjmijBD8OVYfps9W)Ki$_U*@-c-|6xHil`3BAw%%9@*1m-2$P`^%}soNSsw zK5>Bz!}&6gZTW3x4Np=6Ez}6&0!{nBdt)xW63tn8d#IHwY*4E48yZ{AFCSK+E)>h( zW;$!F@$%)HiDU2&@Zn>RtC#JvKTH{GY4Gxv(c~hvw?F#u0X6?R+E+7K{XXBg^Zek{ ze%B3h@3dO)uX4v%C~a`2HmY>2_qP11d$xgSN7JEb{)R4<4Lzd5&ql^FHg6}}hf!gUVrD8t4e?#pomW4tWysr8GwHsK zyk~YF4wcMmc~Z&FeeSY>r|IkkPR*A&UM4i}zs5^C&K9YU@V4$ExmF23x)gZCe*I9o z4DPG+iYUjmjQ%^Z+LVcsV2c}NRdWtY*YORNXsnQ*K2t|5T51~ds>Ais|QL&8(73#8)8>T?_ zZA7Tg){O||Ikyp^I^{RLf+dugjyUo zya!W?B1T#;mAJ*|G)y7p7;(VV;SD2%GMq6&s6uIDgd+4XMySDq#(Xd(*kQZ}rUJ1h zQ!oXnVuDbAfhGv$ciaS_`npXJijURQ6Q=gGO*LRjFVd6+rt&IG5ejd>bb-1vLnu3A zGlZ&3HsgXRy7OiTHTTx+5KPIfFh{638*>+!g4=11P;Xbw5z1}KJQk+f#4Q3~ip|xc z6{gm5En;9wt<3_V(omKNg{EMMP-niD2xWH6QUIpP9$JdP6d8k6B}|R2w_<@QF{+gr zOof$NdB7Cdb1OlF`m#nSuT9nn)fI0Y4^v#{tPyH!*m{A|vKfV`EDM|CFom_v2BEGR zZ8pG^)r1W~Rjslmz!a5(EkaH0v7Lh{shhS474_8?p`c{!l3?n|)2<(;oDSLTf~lta zb{}AhiDt7OOf9KyMkuAA%?OorVlzS^^=wvzsUtS~YcOS`V~X6+Z-GPx>LydW}B%S6)%yIz;RQ3u$ zAo7ubU>F)d2w;IBFIEUtHYP{|hO|{d zcVH+x7?g-W*kA;@ng{E^kTosX8iuMDgI~iC^+PZMO;?84!jN=x2m(d3LSDfT^m@oM z7b+(cSD(BNQt2$P*RDS3`0nNDgqsgs0d{2qHcqs zB6Aog3=y@$5NH@4hCssdFa!#|3{yuSU^p`j{S3psVaS&hjzGQI@Cg{=y$MI49XVnb z4C$;Rq+uwxBcc(8a7__J7`jbHY=I%0Xe0vFTp|&OwlA^@hGwmijxZ#fi$tK9T+{^^ zf_XsDp4uLY#@d$+Rh-ZSK%fWaAvfPWWf}sjF;Rp;-loPNpGzmx;fFa58gkBhm zbSEGXgf$U?9@>dwFyx3xM4(1R;^J?7LmR35!B0$)!L}&>@Brv{O~F^Wz%NZft6ep+ z#Lw?$gWq=r`|H@i!fWw+%HX?i;EPFM#T*QMy_4+f3gV1G8c1=xxTX#SA1o4f6n1oU zly-D?^l}Vz40R0q`RRB!cMtHb4+kfS*myN22_`ji_`=~H78vdox)}QDqrlfFw7yS( z)g{^yrByfyPUe}QFW&!O9?;${4ESjX8Wb&x4tz$H0ep=6S9weTNU(r!`Llr!QvVwB z&qDv}{r^nL|DWo=YXKDK(q!{0doFH&3fqM_~ zf{qcyL%mt>-!AxQ;6rZ3g40^?|LXc9J{;;PaD%{&0Y?wgLuH5R1^G~2pmUl92Zf<} zL4!9`H@by$sP53c*oAAHVqhaRaI1k62Tlq&CE&DxGXu^VxGli>02c;aEN}_H=`n(x z#Gc_EU}G+t1)M@(45WBUx<{jFL%}cLdaRO_QdX6ckqq?p_6Y-9ZAINF9u#+Xd09m= zpfVIBWfUZ3mBmmJ>|xOFAB4GhfnSjZPm_vS%N`I8f6P+S+ds%1&?IXapl2-!enRp8 E0n^jJ1^@s6 diff --git a/modules/client/src/test/resources/executor/Cargo.toml b/modules/client/src/test/resources/executor/Cargo.toml index bbaa34bf1..57d45af29 100644 --- a/modules/client/src/test/resources/executor/Cargo.toml +++ b/modules/client/src/test/resources/executor/Cargo.toml @@ -1,27 +1,28 @@ [package] name = "iroha_java_executor" edition = "2021" -version = "2.0.0-pre-rc.19" +version = "2.0.0-rc.1.0" # TODO: teams are being deprecated update the authors URL authors = ["Iroha 2 team "] +[lib] +crate-type = ['cdylib'] + [profile.dev] panic = "abort" [profile.release] +panic = "abort" + +[profile.deploy] +inherits = "release" strip = "debuginfo" # Remove debugging info from the binary -panic = "abort" # Panics are transcribed to Traps when compiling for wasm anyways lto = true # Link-time-optimization produces notable decrease in binary size opt-level = "z" # Optimize for size vs speed with "s"/"z"(removes vectorization) codegen-units = 1 # Further reduces binary size but increases compilation time -[lib] -crate-type = ['cdylib'] - [dependencies] -iroha_executor = { git = "https://github.com/hyperledger/iroha/", tag = "v2.0.0-pre-rc.22.1", features = ["debug"] } +iroha_executor = { git = "https://github.com/hyperledger/iroha/", tag = "v2.0.0-rc.1.0", features = ["debug"] } -getrandom = { version = "0.2", features = ["custom"] } dlmalloc = { version = "0.2.6", features = ["global"] } panic-halt = "0.2.0" - diff --git a/modules/client/src/test/resources/executor/build.sh b/modules/client/src/test/resources/executor/build.sh index 0e095603f..68d32ec4e 100755 --- a/modules/client/src/test/resources/executor/build.sh +++ b/modules/client/src/test/resources/executor/build.sh @@ -1,4 +1,4 @@ #!/bin/bash -cargo +nightly-2024-04-18 build --release -Zbuild-std -Zbuild-std-features=panic_immediate_abort -cp ./target/wasm32-unknown-unknown/release/iroha_java_executor.wasm ../executor.wasm +cargo +nightly-2024-09-09 build --profile=deploy -Zbuild-std -Zbuild-std-features=panic_immediate_abort +cp ./target/wasm32-unknown-unknown/deploy/iroha_java_executor.wasm ../executor.wasm diff --git a/modules/client/src/test/resources/executor/src/lib.rs b/modules/client/src/test/resources/executor/src/lib.rs index 9fc907296..aa91df295 100644 --- a/modules/client/src/test/resources/executor/src/lib.rs +++ b/modules/client/src/test/resources/executor/src/lib.rs @@ -2,33 +2,31 @@ #![no_std] -extern crate alloc; #[cfg(not(test))] extern crate panic_halt; use dlmalloc::GlobalDlmalloc; -use iroha_executor::{debug::dbg_panic, prelude::*, DataModelBuilder}; +use iroha_executor::{prelude::*, data_model::block::BlockHeader}; #[global_allocator] static ALLOC: GlobalDlmalloc = GlobalDlmalloc; -getrandom::register_custom_getrandom!(iroha_executor::stub_getrandom); - -/// Executor that replaces some of [`Validate`]'s methods with sensible defaults +/// Executor that replaces some of [`Execute`]'s methods with sensible defaults /// /// # Warning /// /// The defaults are not guaranteed to be stable. -#[derive(Debug, Clone, Constructor, Visit, Validate, ValidateEntrypoints)] -pub struct Executor { +#[derive(Debug, Clone, Visit, Execute, Entrypoints)] +struct Executor { + host: Iroha, + context: Context, verdict: Result, - block_height: u64, } impl Executor { - fn ensure_genesis(block_height: u64) { - if block_height != 0 { - dbg_panic( + fn ensure_genesis(curr_block: BlockHeader) { + if !curr_block.is_genesis() { + dbg_panic!( "Default Executor is intended to be used only in genesis. \ Write your own executor if you need to upgrade executor on existing chain.", ); @@ -45,8 +43,8 @@ impl Executor { /// /// If `migrate()` entrypoint fails then the whole `Upgrade` instruction /// will be denied and previous executor will stay unchanged. -#[entrypoint] -fn migrate(block_height: u64) { - Executor::ensure_genesis(block_height); - DataModelBuilder::with_default_permissions().build_and_set(); +#[iroha_executor::migrate] +fn migrate(host: Iroha, context: Context) { + Executor::ensure_genesis(context.curr_block); + DataModelBuilder::with_default_permissions().build_and_set(&host); } diff --git a/modules/client/src/test/resources/genesis.json b/modules/client/src/test/resources/genesis.json index 955c808b0..58b096f64 100644 --- a/modules/client/src/test/resources/genesis.json +++ b/modules/client/src/test/resources/genesis.json @@ -1,7 +1,29 @@ { "chain": "00000000-0000-0000-0000-000000000000", - "executor": "./executor.wasm", - "parameters": [], + "executor": "executor.wasm", + "parameters": { + "sumeragi": { + "block_time_ms": 2000, + "commit_time_ms": 4000, + "max_clock_drift_ms": 1000 + }, + "block": { + "max_transactions": 512 + }, + "transaction": { + "max_instructions": 4096, + "smart_contract_size": 4194304 + }, + "executor": { + "fuel": 55000000, + "memory": 55000000 + }, + "smart_contract": { + "fuel": 55000000, + "memory": 55000000 + }, + "custom": {} + }, "instructions": [ { "Register": { @@ -31,7 +53,7 @@ "Grant": { "Permission": { "object": { - "name": "CanSetKeyValueInAccount", + "name": "CanModifyAccountMetadata", "payload": { "account": "ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland" } @@ -41,5 +63,7 @@ } } ], + "wasm_dir": "libs", + "wasm_triggers": [], "topology": [] } diff --git a/modules/codegen/build.gradle b/modules/codegen/build.gradle index c71fb0a72..b4856e3cd 100644 --- a/modules/codegen/build.gradle +++ b/modules/codegen/build.gradle @@ -1,13 +1,8 @@ dependencies { implementation project(":model") - implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVer" implementation "com.fasterxml.jackson.core:jackson-databind:$jacksonKotlinVer" - implementation "com.squareup:kotlinpoet:$kotlinPoetVer" - - testImplementation "org.jetbrains.kotlin:kotlin-test-junit5:$kotlinVer" - testImplementation "org.jetbrains.kotlin:kotlin-test:$kotlinVer" } task generate(type: JavaExec) { diff --git a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/EntryPoint.kt b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/EntryPoint.kt index 6b85c0fdb..21f8f4285 100644 --- a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/EntryPoint.kt +++ b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/EntryPoint.kt @@ -26,15 +26,16 @@ fun main(args: Array) { /** * Parse the [arguments][args] */ -fun parseArgs(args: Array): Map { - return args.map { it.split("=") } +fun parseArgs(args: Array): Map = + args + .map { it.split("=") } .onEach { if (it.size != 2) throw RuntimeException("Incorrect format: expected format argumentKey=argumentValue") } .associateBy({ it[0] }, { it[1] }) -} /** * Extract a specified [argumnt][argName] from all [arguments][args] */ -fun tryExtractArg(args: Map, argName: String): String { - return args[argName] ?: throw RuntimeException("Property '$argName' must be specified") -} +fun tryExtractArg( + args: Map, + argName: String, +): String = args[argName] ?: throw RuntimeException("Property '$argName' must be specified") diff --git a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/KotlinTypeResolver.kt b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/KotlinTypeResolver.kt index aa9baae83..21d538276 100644 --- a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/KotlinTypeResolver.kt +++ b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/KotlinTypeResolver.kt @@ -8,7 +8,6 @@ import jp.co.soramitsu.iroha2.type.ArrayType import jp.co.soramitsu.iroha2.type.BooleanType import jp.co.soramitsu.iroha2.type.CompactType import jp.co.soramitsu.iroha2.type.CompositeType -import jp.co.soramitsu.iroha2.type.FixedPointType import jp.co.soramitsu.iroha2.type.I128Type import jp.co.soramitsu.iroha2.type.I16Type import jp.co.soramitsu.iroha2.type.I256Type @@ -17,7 +16,6 @@ import jp.co.soramitsu.iroha2.type.I64Type import jp.co.soramitsu.iroha2.type.I8Type import jp.co.soramitsu.iroha2.type.MapType import jp.co.soramitsu.iroha2.type.OptionType -import jp.co.soramitsu.iroha2.type.SetType import jp.co.soramitsu.iroha2.type.StringType import jp.co.soramitsu.iroha2.type.Type import jp.co.soramitsu.iroha2.type.U128Type @@ -28,7 +26,6 @@ import jp.co.soramitsu.iroha2.type.U64Type import jp.co.soramitsu.iroha2.type.U8Type import jp.co.soramitsu.iroha2.type.VecType import jp.co.soramitsu.iroha2.type.WrapperType -import java.math.BigDecimal import java.math.BigInteger import kotlin.reflect.KClass @@ -66,7 +63,6 @@ fun resolveKotlinType(type: Type): TypeName { } } is CompactType -> resolveKotlinType((type as WrapperType).innerType.requireValue()) - is FixedPointType -> BigDecimal::class.asTypeName() is WrapperType -> { // special case for vector of bytes if (type is VecType && type.innerType.requireValue() is U8Type) { @@ -90,43 +86,50 @@ fun resolveKotlinType(type: Type): TypeName { /** * Check if the given [type] is one of the [built-in Kotlin types][builtinKotlinTypes] */ -fun lookUpInBuiltInTypes(type: Type): TypeName = builtinKotlinTypes[type::class] - ?: throw RuntimeException("unexpected type: $type") +fun lookUpInBuiltInTypes(type: Type): TypeName = + builtinKotlinTypes[type::class] + ?: throw RuntimeException("unexpected type: $type") /** * Define the package name for the given [class][className] and [type] */ -fun definePackageName(className: String, type: Type): String { - return "jp.co.soramitsu.iroha2.generated." + type.name.substringBeforeLast(className) - .removeSuffix("::") - .removePrefix("iroha") - .replace("::", ".") - .replace("_", "") -} +fun definePackageName( + className: String, + type: Type, +): String = + "jp.co.soramitsu.iroha2.generated." + + type.name + .substringBeforeLast(className) + .removeSuffix("::") + .removePrefix("iroha") + .replace("::", ".") + .replace("_", "") /** * Define the class name for the given [type][typeName] */ -fun defineClassName(typeName: String) = typeName.substringBefore('<') - .substringAfterLast("::") +fun defineClassName(typeName: String) = + typeName + .substringBefore('<') + .substringAfterLast("::") -val builtinKotlinTypes = mapOf, TypeName>( - StringType::class to String::class.asTypeName(), - BooleanType::class to Boolean::class.asTypeName(), - U8Type::class to Short::class.asTypeName(), - U16Type::class to Int::class.asTypeName(), - U32Type::class to Long::class.asTypeName(), - U64Type::class to BigInteger::class.asTypeName(), - U128Type::class to BigInteger::class.asTypeName(), - U256Type::class to BigInteger::class.asTypeName(), - I8Type::class to Byte::class.asTypeName(), - I16Type::class to Short::class.asTypeName(), - I32Type::class to Int::class.asTypeName(), - I64Type::class to Long::class.asTypeName(), - I128Type::class to BigInteger::class.asTypeName(), - I256Type::class to BigInteger::class.asTypeName(), - VecType::class to List::class.asTypeName(), - SetType::class to Set::class.asTypeName(), - MapType::class to Map::class.asTypeName(), - ArrayType::class to Array::class.asTypeName(), -) +val builtinKotlinTypes = + mapOf, TypeName>( + StringType::class to String::class.asTypeName(), + BooleanType::class to Boolean::class.asTypeName(), + U8Type::class to Short::class.asTypeName(), + U16Type::class to Int::class.asTypeName(), + U32Type::class to Long::class.asTypeName(), + U64Type::class to BigInteger::class.asTypeName(), + U128Type::class to BigInteger::class.asTypeName(), + U256Type::class to BigInteger::class.asTypeName(), + I8Type::class to Byte::class.asTypeName(), + I16Type::class to Short::class.asTypeName(), + I32Type::class to Int::class.asTypeName(), + I64Type::class to Long::class.asTypeName(), + I128Type::class to BigInteger::class.asTypeName(), + I256Type::class to BigInteger::class.asTypeName(), + VecType::class to List::class.asTypeName(), + MapType::class to Map::class.asTypeName(), + ArrayType::class to Array::class.asTypeName(), + ) diff --git a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/blueprint/Blueprint.kt b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/blueprint/Blueprint.kt index baace2e09..47e7ff01c 100644 --- a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/blueprint/Blueprint.kt +++ b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/blueprint/Blueprint.kt @@ -6,7 +6,9 @@ import jp.co.soramitsu.iroha2.type.Type /** * Basic blueprint for all kinds of types */ -abstract class Blueprint(val source: T) { +abstract class Blueprint( + val source: T, +) { abstract val className: String abstract val packageName: String abstract val properties: List @@ -17,4 +19,8 @@ abstract class Blueprint(val source: T) { /** * Type properties */ -data class Property(val name: String, val typeName: TypeName, val original: Type) +data class Property( + val name: String, + val typeName: TypeName, + val original: Type, +) diff --git a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/blueprint/EnumBlueprint.kt b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/blueprint/EnumBlueprint.kt index f1926dfc6..44bc01a52 100644 --- a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/blueprint/EnumBlueprint.kt +++ b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/blueprint/EnumBlueprint.kt @@ -5,12 +5,13 @@ import jp.co.soramitsu.iroha2.type.EnumType /** * Blueprint for [EnumType] */ -class EnumBlueprint(type: EnumType) : TypeBasedBlueprint(type) { +class EnumBlueprint( + type: EnumType, +) : TypeBasedBlueprint(type) { val variants = resolveVariants() - private fun resolveVariants(): List { - return source.variants.map { + private fun resolveVariants(): List = + source.variants.map { EnumVariantBlueprint(it.discriminant, this, it) } - } } diff --git a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/blueprint/EnumVariantBlueprint.kt b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/blueprint/EnumVariantBlueprint.kt index b9b13cc81..646880d50 100644 --- a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/blueprint/EnumVariantBlueprint.kt +++ b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/blueprint/EnumVariantBlueprint.kt @@ -12,13 +12,13 @@ class EnumVariantBlueprint( val parentBlueprint: EnumBlueprint, source: EnumType.Variant, ) : Blueprint(source) { - override val className = defineClassName(source.name) override val packageName = "${parentBlueprint.packageName}.${parentBlueprint.className}" override val properties = resolveProperties(source) - override fun resolveProperties(variant: EnumType.Variant): List { - return variant.type?.requireValue() + override fun resolveProperties(variant: EnumType.Variant): List = + variant.type + ?.requireValue() ?.let { type -> Property( defineClassName(type.name).replaceFirstChar(Char::lowercase), @@ -26,5 +26,4 @@ class EnumVariantBlueprint( type, ) }?.let { property -> listOf(property) } ?: listOf() - } } diff --git a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/blueprint/StructBlueprint.kt b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/blueprint/StructBlueprint.kt index db4bbf00e..19fd955a2 100644 --- a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/blueprint/StructBlueprint.kt +++ b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/blueprint/StructBlueprint.kt @@ -7,16 +7,17 @@ import java.util.StringTokenizer /** * Blueprint for [StructType] */ -class StructBlueprint(type: StructType) : TypeBasedBlueprint(type) { - override fun resolveProperties(type: StructType): List { - return type.mapping.map { (name, ty) -> +class StructBlueprint( + type: StructType, +) : TypeBasedBlueprint(type) { + override fun resolveProperties(type: StructType): List = + type.mapping.map { (name, ty) -> Property( convertToCamelCase(name), resolveKotlinType(ty.requireValue()), ty.requireValue(), ) } - } /** * Create property name by converting from snake case to camel case diff --git a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/blueprint/TupleStructBlueprint.kt b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/blueprint/TupleStructBlueprint.kt index 9381847ca..8efaf6af9 100644 --- a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/blueprint/TupleStructBlueprint.kt +++ b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/blueprint/TupleStructBlueprint.kt @@ -9,27 +9,38 @@ import jp.co.soramitsu.iroha2.type.Type /** * Blueprint for [TupleStructType] */ -class TupleStructBlueprint(type: TupleStructType) : TypeBasedBlueprint(type) { +class TupleStructBlueprint( + type: TupleStructType, +) : TypeBasedBlueprint(type) { override fun resolveProperties(type: TupleStructType): List { - val unique = type.types.map { it.name }.distinct().size == type.types.size + val unique = + type.types + .map { it.name } + .distinct() + .size == type.types.size var propertyCount = 1 - return type.types.map { - it.requireValue() - }.map { - Property(createPropName(it, unique, propertyCount++), resolveKotlinType(it), it) - } + return type.types + .map { + it.requireValue() + }.map { + Property(createPropName(it, unique, propertyCount++), resolveKotlinType(it), it) + } } - private fun createPropName(type: Type, unique: Boolean = true, propertyCount: Int? = null): String { - return when (type) { + private fun createPropName( + type: Type, + unique: Boolean = true, + propertyCount: Int? = null, + ): String = + when (type) { is ArrayType -> "array" - else -> defineClassName(type.name).let { name -> - when (unique) { - true -> name.replaceFirstChar { it.lowercase() } - else -> "p${propertyCount}${name.replaceFirstChar { it.uppercase() }}" + else -> + defineClassName(type.name).let { name -> + when (unique) { + true -> name.replaceFirstChar { it.lowercase() } + else -> "p${propertyCount}${name.replaceFirstChar { it.uppercase() }}" + } } - } } - } } diff --git a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/blueprint/TypeBasedBlueprint.kt b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/blueprint/TypeBasedBlueprint.kt index 0da06f763..1bb478395 100644 --- a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/blueprint/TypeBasedBlueprint.kt +++ b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/blueprint/TypeBasedBlueprint.kt @@ -8,7 +8,9 @@ import jp.co.soramitsu.iroha2.type.CompositeType * Blueprint for a specific type */ @ExperimentalUnsignedTypes -abstract class TypeBasedBlueprint(source: T) : Blueprint(source) { +abstract class TypeBasedBlueprint( + source: T, +) : Blueprint(source) { override val className: String = defineClassName(source.name) override val packageName: String = definePackageName(className, source) override val properties = resolveProperties(source) diff --git a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/generator/AbstractGenerator.kt b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/generator/AbstractGenerator.kt index 49fe2c233..e499c92bf 100644 --- a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/generator/AbstractGenerator.kt +++ b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/generator/AbstractGenerator.kt @@ -4,6 +4,7 @@ import com.squareup.kotlinpoet.ClassName import com.squareup.kotlinpoet.CodeBlock import com.squareup.kotlinpoet.FunSpec import com.squareup.kotlinpoet.KModifier +import com.squareup.kotlinpoet.MemberName import com.squareup.kotlinpoet.ParameterSpec import com.squareup.kotlinpoet.ParameterizedTypeName import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy @@ -12,14 +13,17 @@ import com.squareup.kotlinpoet.TypeName import com.squareup.kotlinpoet.TypeSpec import com.squareup.kotlinpoet.TypeVariableName import com.squareup.kotlinpoet.WildcardTypeName +import jp.co.soramitsu.iroha2.ModelCustomInstruction +import jp.co.soramitsu.iroha2.ModelPermission import jp.co.soramitsu.iroha2.codegen.blueprint.Blueprint +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.type.CompositeType /** * Basic generator for all kinds of [blueprints][Blueprint] */ abstract class AbstractGenerator> { - companion object { val ANY_TYPE = ClassName("kotlin", "Any") } @@ -38,7 +42,10 @@ abstract class AbstractGenerator> { return clazz.build() } - open fun implGenerics(blueprint: T, clazz: TypeSpec.Builder) { + open fun implGenerics( + blueprint: T, + clazz: TypeSpec.Builder, + ) { if (blueprint.source is CompositeType) { val generics = blueprint.source.generics for (i in generics.indices) { @@ -47,29 +54,39 @@ abstract class AbstractGenerator> { } } - open fun implClassBody(blueprint: T, clazz: TypeSpec.Builder) { + open fun implClassBody( + blueprint: T, + clazz: TypeSpec.Builder, + ) { implFunctions(blueprint, clazz) implInnerClasses(blueprint, clazz) clazz.addType(implCompanions(blueprint, clazz).build()) } - open fun implCompanions(blueprint: T, clazz: TypeSpec.Builder): TypeSpec.Builder { - val thisType = ClassName( - blueprint.packageName, - blueprint.className, - ).let { className -> - when (blueprint.source is CompositeType && blueprint.source.generics.isNotEmpty()) { - true -> className.parameterizedBy( - blueprint.source.generics.map { WildcardTypeName.producerOf(ANY_TYPE) }, - ) - false -> className + open fun implCompanions( + blueprint: T, + clazz: TypeSpec.Builder, + ): TypeSpec.Builder { + val thisType = + ClassName( + blueprint.packageName, + blueprint.className, + ).let { className -> + when (blueprint.source is CompositeType && blueprint.source.generics.isNotEmpty()) { + true -> + className.parameterizedBy( + blueprint.source.generics.map { WildcardTypeName.producerOf(ANY_TYPE) }, + ) + false -> className + } } - } - val companionBuilder = TypeSpec.companionObjectBuilder() - .addSuperinterface(SCALE_READER.parameterizedBy(thisType)) - .addSuperinterface(SCALE_WRITER.parameterizedBy(thisType)) - .addFunction(readFun(thisType, blueprint)) - .addFunction(writeFun(thisType, blueprint)) + val companionBuilder = + TypeSpec + .companionObjectBuilder() + .addSuperinterface(SCALE_READER.parameterizedBy(thisType)) + .addSuperinterface(SCALE_WRITER.parameterizedBy(thisType)) + .addFunction(readFun(thisType, blueprint)) + .addFunction(writeFun(thisType, blueprint)) return when { blueprint.properties.isEmpty() && KModifier.SEALED !in clazz.modifiers -> { @@ -80,9 +97,11 @@ abstract class AbstractGenerator> { } open fun scaleReaderCode(blueprint: T): CodeBlock { - var result = CodeBlock.builder() - .add("return try {\n") - .indent() + var result = + CodeBlock + .builder() + .add("return try {\n") + .indent() result.add("${blueprint.className}(\n").indent() val codeBlocks = blueprint.properties.map { resolveScaleReadImpl(it.original) }.toList() for (cb in codeBlocks) { @@ -92,58 +111,122 @@ abstract class AbstractGenerator> { .unindent() .add(")\n") .unindent() - .add("} catch (ex: Exception) {\n").indent() - .add("throw %M(ex)\n", SCALE_CODEC_EX_WRAPPER).unindent() + .add("} catch (ex: Exception) {\n") + .indent() + .add("throw %M(ex)\n", SCALE_CODEC_EX_WRAPPER) + .unindent() .add("}") .build() } open fun scaleWriterCode(blueprint: T): CodeBlock { - var result = CodeBlock.builder() - .add("return try {\n") - .indent() - val codeBlocks = blueprint.properties.map { - resolveScaleWriteImpl( - it.original, - CodeBlock.of("instance.%N", it.name), - ) - } + var result = + CodeBlock + .builder() + .add("return try {\n") + .indent() + val codeBlocks = + blueprint.properties.map { + resolveScaleWriteImpl( + it.original, + CodeBlock.of("instance.%N", it.name), + ) + } for (cb in codeBlocks) { result = result.add(cb).add("\n") } return result .unindent() - .add("} catch (ex: Exception) {\n").indent() - .add("throw %M(ex)\n", SCALE_CODEC_EX_WRAPPER).unindent() + .add("} catch (ex: Exception) {\n") + .indent() + .add("throw %M(ex)\n", SCALE_CODEC_EX_WRAPPER) + .unindent() .add("}") .build() } - open fun implFunctions(blueprint: T, clazz: TypeSpec.Builder) = Unit + open fun implFunctions( + blueprint: T, + clazz: TypeSpec.Builder, + ) { + if (blueprint.className.startsWith("RegisterOf") || + blueprint.className.startsWith("UnregisterOf") || + blueprint.className.startsWith("SetKeyValueOf") || + blueprint.className.startsWith("RemoveKeyValueOf") || + blueprint.className.startsWith("MintOf") || + blueprint.className.startsWith("BurnOf") || + blueprint.className.startsWith("TransferOf") || + blueprint.className.startsWith("GrantOf") || + blueprint.className.startsWith("RevokeOf") || + blueprint.className == "Upgrade" || + blueprint.className == "SetParameter" || + blueprint.className == "ExecuteTrigger" + ) { + clazz.addFunction(asInstructionBoxFun()) + } + } - open fun implInnerClasses(blueprint: T, clazz: TypeSpec.Builder) = Unit + open fun implInnerClasses( + blueprint: T, + clazz: TypeSpec.Builder, + ) = Unit - open fun implClassModifiers(blueprint: T, clazz: TypeSpec.Builder) { + open fun implClassModifiers( + blueprint: T, + clazz: TypeSpec.Builder, + ) { if (blueprint.properties.isNotEmpty()) { clazz.addModifiers(KModifier.DATA) } } - open fun implSuperClasses(blueprint: T, clazz: TypeSpec.Builder) = Unit + open fun implSuperClasses( + blueprint: T, + clazz: TypeSpec.Builder, + ) { + if (blueprint.className.startsWith("Can")) { + clazz.addSuperinterface(ModelPermission::class) + } else if ( + blueprint.className == "MultisigRegister" || + blueprint.className == "MultisigPropose" || + blueprint.className == "MultisigApprove" + ) { + clazz.addSuperinterface(ModelCustomInstruction::class) + } else if (blueprint.className.startsWith("RegisterOf") || + blueprint.className.startsWith("UnregisterOf") || + blueprint.className.startsWith("SetKeyValueOf") || + blueprint.className.startsWith("RemoveKeyValueOf") || + blueprint.className.startsWith("MintOf") || + blueprint.className.startsWith("BurnOf") || + blueprint.className.startsWith("TransferOf") || + blueprint.className.startsWith("GrantOf") || + blueprint.className.startsWith("RevokeOf") || + blueprint.className == "Upgrade" || + blueprint.className == "SetParameter" || + blueprint.className == "ExecuteTrigger" + ) { + clazz.addSuperinterface(Instruction::class) + } + } - open fun implConstructor(blueprint: T, clazz: TypeSpec.Builder) { + open fun implConstructor( + blueprint: T, + clazz: TypeSpec.Builder, + ) { if (blueprint.properties.isEmpty()) { return } val constructorBuilder = FunSpec.constructorBuilder() for ((name, type) in blueprint.properties) { constructorBuilder.addParameter( - ParameterSpec.builder(name, type) + ParameterSpec + .builder(name, type) .let { it.takeIf { type.isNullable }?.defaultValue("null") ?: it } .build(), ) clazz.addProperty( - PropertySpec.builder(name, type) + PropertySpec + .builder(name, type) .initializer(name) .build(), ) @@ -151,35 +234,55 @@ abstract class AbstractGenerator> { clazz.primaryConstructor(constructorBuilder.build()) } - open fun implKDoc(blueprint: T, clazz: TypeSpec.Builder) { + open fun implKDoc( + blueprint: T, + clazz: TypeSpec.Builder, + ) { clazz.addKdoc(blueprint.className) } - private fun writeFun(type: TypeName, blueprint: T) = - FunSpec.builder("write") - .addParameter(ParameterSpec.builder("writer", SCALE_CODEC_WRITER).build()) - .addParameter(ParameterSpec.builder("instance", type).build()) - .addCode(scaleWriterCode(blueprint)) - .addModifiers(KModifier.OVERRIDE) - .build() + private fun writeFun( + type: TypeName, + blueprint: T, + ) = FunSpec + .builder("write") + .addParameter(ParameterSpec.builder("writer", SCALE_CODEC_WRITER).build()) + .addParameter(ParameterSpec.builder("instance", type).build()) + .addCode(scaleWriterCode(blueprint)) + .addModifiers(KModifier.OVERRIDE) + .build() - private fun readFun(type: TypeName, blueprint: T) = - FunSpec.builder("read") - .addParameter(ParameterSpec.builder("reader", SCALE_CODEC_READER).build()) - .addCode(scaleReaderCode(blueprint)) + private fun asInstructionBoxFun() = + FunSpec + .builder("asInstructionBox") + .addCode(CodeBlock.of("return %M()", MemberName("jp.co.soramitsu.iroha2", "asInstructionBoxExt"))) .addModifiers(KModifier.OVERRIDE) - .returns(type) + .returns(InstructionBox::class) .build() + private fun readFun( + type: TypeName, + blueprint: T, + ) = FunSpec + .builder("read") + .addParameter(ParameterSpec.builder("reader", SCALE_CODEC_READER).build()) + .addCode(scaleReaderCode(blueprint)) + .addModifiers(KModifier.OVERRIDE) + .returns(type) + .build() + private fun variantEqualsFun(blueprint: T): FunSpec { val variantType = ClassName(blueprint.packageName, blueprint.className) - val code = """return when (o2) { - null -> false - else -> o2::class == o1::class - } - """.trimIndent() + val code = + """ + return when (o2) { + null -> false + else -> o2::class == o1::class + } + """.trimIndent() - return FunSpec.builder("equals") + return FunSpec + .builder("equals") .addParameter(ParameterSpec.builder("o1", variantType).build()) .addParameter(ParameterSpec.builder("o2", ANY_TYPE.copy(nullable = true)).build()) .addCode(code) @@ -188,18 +291,21 @@ abstract class AbstractGenerator> { } private fun variantHashcodeFun(blueprint: T): FunSpec { - val code = "return \"${blueprint.packageName}.${blueprint.className}\".hashCode()" - .replace("jp.co.soramitsu.iroha2.generated.", "") - return FunSpec.builder("hashCode") + val code = + "return \"${blueprint.packageName}.${blueprint.className}\".hashCode()" + .replace("jp.co.soramitsu.iroha2.generated.", "") + return FunSpec + .builder("hashCode") .addCode(code) .addModifiers(KModifier.OVERRIDE) .returns(Int::class) .build() } - protected fun TypeName.extractName() = when (this) { - is ParameterizedTypeName -> this.rawType.canonicalName - is ClassName -> this.canonicalName - else -> throw RuntimeException("Unexpected type: $this") - } + protected fun TypeName.extractName() = + when (this) { + is ParameterizedTypeName -> this.rawType.canonicalName + is ClassName -> this.canonicalName + else -> throw RuntimeException("Unexpected type: $this") + } } diff --git a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/generator/EnumGenerator.kt b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/generator/EnumGenerator.kt index efe137751..e5036d997 100644 --- a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/generator/EnumGenerator.kt +++ b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/generator/EnumGenerator.kt @@ -12,23 +12,35 @@ import jp.co.soramitsu.iroha2.codegen.blueprint.EnumBlueprint * Generator for [EnumBlueprint] */ object EnumGenerator : AbstractGenerator() { - - override fun implKDoc(blueprint: EnumBlueprint, clazz: TypeSpec.Builder) { + override fun implKDoc( + blueprint: EnumBlueprint, + clazz: TypeSpec.Builder, + ) { super.implKDoc(blueprint, clazz) clazz.addKdoc("\n\nGenerated from '${blueprint.source.name}' enum") } - override fun implClassModifiers(blueprint: EnumBlueprint, clazz: TypeSpec.Builder) { + override fun implClassModifiers( + blueprint: EnumBlueprint, + clazz: TypeSpec.Builder, + ) { clazz.addModifiers(KModifier.SEALED) } // class generated from Rust Enums no need to have constructor due they are not intended // to be instantiated - override fun implConstructor(blueprint: EnumBlueprint, clazz: TypeSpec.Builder) = Unit - - override fun implFunctions(blueprint: EnumBlueprint, clazz: TypeSpec.Builder) { + override fun implConstructor( + blueprint: EnumBlueprint, + clazz: TypeSpec.Builder, + ) = Unit + + override fun implFunctions( + blueprint: EnumBlueprint, + clazz: TypeSpec.Builder, + ) { clazz.addFunction( - FunSpec.builder("discriminant") + FunSpec + .builder("discriminant") .addModifiers(KModifier.ABSTRACT) .returns(Int::class, CodeBlock.of("Discriminator of variant in enum")) .build(), @@ -38,7 +50,10 @@ object EnumGenerator : AbstractGenerator() { } } - override fun implInnerClasses(blueprint: EnumBlueprint, clazz: TypeSpec.Builder) { + override fun implInnerClasses( + blueprint: EnumBlueprint, + clazz: TypeSpec.Builder, + ) { for (variant in blueprint.variants) { clazz.addType(EnumVariantGenerator.generate(variant)) } @@ -46,9 +61,10 @@ object EnumGenerator : AbstractGenerator() { override fun scaleReaderCode(blueprint: EnumBlueprint): CodeBlock { val codeBlock = CodeBlock.builder().add("return when(val discriminant = reader.readUByte()) {\n") - val whenFlow = blueprint.variants.joinToString("\n") { - CodeBlock.of("\t${it.discriminant} -> ${it.className}.read(reader)").toString() - } + val whenFlow = + blueprint.variants.joinToString("\n") { + CodeBlock.of("\t${it.discriminant} -> ${it.className}.read(reader)").toString() + } codeBlock.add(whenFlow) codeBlock.add("\n\telse -> throw RuntimeException(\"Unresolved discriminant of the enum variant: \$discriminant\")") return codeBlock.add("}").build() @@ -57,47 +73,53 @@ object EnumGenerator : AbstractGenerator() { override fun scaleWriterCode(blueprint: EnumBlueprint): CodeBlock { val codeBlock = CodeBlock.builder().add("writer.directWrite(instance.discriminant())\n") codeBlock.add("when(val discriminant = instance.discriminant()) {\n") - val whenFlow = blueprint.variants.joinToString("\n") { - CodeBlock.of("\t${it.discriminant} -> ${it.className}.write(writer, instance as ${it.className})") - .toString() - } + val whenFlow = + blueprint.variants.joinToString("\n") { + CodeBlock + .of("\t${it.discriminant} -> ${it.className}.write(writer, instance as ${it.className})") + .toString() + } codeBlock.add(whenFlow) codeBlock.add("\n\telse -> throw RuntimeException(\"Unresolved discriminant of the enum variant: \$discriminant\")") return codeBlock.add("}").build() } - override fun implSuperClasses(blueprint: EnumBlueprint, clazz: TypeSpec.Builder) { + override fun implSuperClasses( + blueprint: EnumBlueprint, + clazz: TypeSpec.Builder, + ) { super.implSuperClasses(blueprint, clazz) clazz.addSuperinterface(ModelEnum::class) } - private fun hashCodeFun(blueprint: EnumBlueprint): FunSpec { - return FunSpec.builder("hashCode") + private fun hashCodeFun(blueprint: EnumBlueprint): FunSpec = + FunSpec + .builder("hashCode") .addCode(hashcodeCode(blueprint)) .addModifiers(KModifier.OVERRIDE) .returns(Int::class.java) .build() - } - private fun equalsFun(blueprint: EnumBlueprint): FunSpec { - return FunSpec.builder("equals") + private fun equalsFun(blueprint: EnumBlueprint): FunSpec = + FunSpec + .builder("equals") .addParameter(ParameterSpec.builder("other", ANY_TYPE.copy(nullable = true)).build()) .addCode(equalsCode(blueprint)) .addModifiers(KModifier.OVERRIDE) .returns(Boolean::class.java) .build() - } private fun equalsCode(blueprint: EnumBlueprint): CodeBlock { val codeBlock = CodeBlock.builder().add("return when(this) {\n") - blueprint.variants.filter { - it.properties.isEmpty() - }.joinToString("\n") { - CodeBlock.of("\tis ${it.className} -> ${it.className}.equals(this, other)").toString() - }.also { whenFlow -> - codeBlock.add(whenFlow) - } + blueprint.variants + .filter { + it.properties.isEmpty() + }.joinToString("\n") { + CodeBlock.of("\tis ${it.className} -> ${it.className}.equals(this, other)").toString() + }.also { whenFlow -> + codeBlock.add(whenFlow) + } codeBlock.add("\n\telse -> super.equals(other)") return codeBlock.add("}").build() } @@ -105,13 +127,14 @@ object EnumGenerator : AbstractGenerator() { private fun hashcodeCode(blueprint: EnumBlueprint): CodeBlock { val codeBlock = CodeBlock.builder().add("return when(this) {\n") - blueprint.variants.filter { - it.properties.isEmpty() - }.joinToString("\n") { - CodeBlock.of("\tis ${it.className} -> ${it.className}.hashCode()").toString() - }.also { whenFlow -> - codeBlock.add(whenFlow) - } + blueprint.variants + .filter { + it.properties.isEmpty() + }.joinToString("\n") { + CodeBlock.of("\tis ${it.className} -> ${it.className}.hashCode()").toString() + }.also { whenFlow -> + codeBlock.add(whenFlow) + } codeBlock.add("\n\telse -> super.hashCode()") return codeBlock.add("}").build() } diff --git a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/generator/EnumVariantGenerator.kt b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/generator/EnumVariantGenerator.kt index 952918d0a..cbe97d985 100644 --- a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/generator/EnumVariantGenerator.kt +++ b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/generator/EnumVariantGenerator.kt @@ -14,14 +14,20 @@ import jp.co.soramitsu.iroha2.codegen.resolveKotlinType * Generator for [EnumVariantBlueprint] */ object EnumVariantGenerator : AbstractGenerator() { - - override fun implKDoc(blueprint: EnumVariantBlueprint, clazz: TypeSpec.Builder) { + override fun implKDoc( + blueprint: EnumVariantBlueprint, + clazz: TypeSpec.Builder, + ) { clazz.addKdoc("'${blueprint.className}' variant") } - override fun implFunctions(blueprint: EnumVariantBlueprint, clazz: TypeSpec.Builder) { + override fun implFunctions( + blueprint: EnumVariantBlueprint, + clazz: TypeSpec.Builder, + ) { clazz.addFunction( - FunSpec.builder("discriminant") + FunSpec + .builder("discriminant") .addModifiers(KModifier.OVERRIDE) .returns(Int::class) .addCode("return DISCRIMINANT") @@ -29,19 +35,24 @@ object EnumVariantGenerator : AbstractGenerator() { ) } - override fun implConstructor(blueprint: EnumVariantBlueprint, clazz: TypeSpec.Builder) { + override fun implConstructor( + blueprint: EnumVariantBlueprint, + clazz: TypeSpec.Builder, + ) { if (blueprint.properties.isNotEmpty()) { val constructorBuilder = FunSpec.constructorBuilder() for (property in blueprint.properties) { constructorBuilder.addParameter( - ParameterSpec.builder(property.name, property.typeName) + ParameterSpec + .builder(property.name, property.typeName) .build(), ) clazz.addProperty( - PropertySpec.builder( - property.name, - property.typeName, - ).initializer(property.name) + PropertySpec + .builder( + property.name, + property.typeName, + ).initializer(property.name) .build(), ) } @@ -52,27 +63,32 @@ object EnumVariantGenerator : AbstractGenerator() { override fun implCompanions( blueprint: EnumVariantBlueprint, clazz: TypeSpec.Builder, - ): TypeSpec.Builder { - return super.implCompanions(blueprint, clazz) + ): TypeSpec.Builder = + super + .implCompanions(blueprint, clazz) .addProperty( - PropertySpec.builder("DISCRIMINANT", Int::class, KModifier.CONST) + PropertySpec + .builder("DISCRIMINANT", Int::class, KModifier.CONST) .initializer("%L", blueprint.discriminant) .build(), ) - } - override fun implSuperClasses(blueprint: EnumVariantBlueprint, clazz: TypeSpec.Builder) { + override fun implSuperClasses( + blueprint: EnumVariantBlueprint, + clazz: TypeSpec.Builder, + ) { super.implSuperClasses(blueprint, clazz) val className = ClassName(blueprint.parentBlueprint.packageName, blueprint.parentBlueprint.className) val generics = blueprint.parentBlueprint.source.generics if (generics.isNotEmpty()) { - className.parameterizedBy( - generics.map { - resolveKotlinType(it.requireValue()) - }, - ).also { clazz.superclass(it) } + className + .parameterizedBy( + generics.map { + resolveKotlinType(it.requireValue()) + }, + ).also { clazz.superclass(it) } } else { clazz.superclass(className) } diff --git a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/generator/GeneratorEntryPoint.kt b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/generator/GeneratorEntryPoint.kt index 665a25ead..6e2982652 100644 --- a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/generator/GeneratorEntryPoint.kt +++ b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/generator/GeneratorEntryPoint.kt @@ -17,35 +17,44 @@ import java.nio.file.Path */ object GeneratorEntryPoint { @OptIn(ExperimentalUnsignedTypes::class) - fun generate(types: Map, outputPath: Path) { - types.values.mapNotNull { type -> - when (type) { - is StructType -> StructBlueprint(type) - is EnumType -> EnumBlueprint(type) - is TupleStructType -> TupleStructBlueprint(type) - else -> null - } - }.forEach { type -> - val typeSpec = when (type) { - is StructBlueprint -> StructGenerator.generate(type) - is EnumBlueprint -> EnumGenerator.generate(type) - is TupleStructBlueprint -> TupleStructGenerator.generate(type) - else -> throw RuntimeException("Unexpected blueprint type: ${type::class}") - } - val builder = FileSpec.builder(type.packageName, type.className) - .addType(typeSpec) - .addFileComment("\nAuto-generated file. DO NOT EDIT!\n") + fun generate( + types: Map, + outputPath: Path, + ) { + types.values + .mapNotNull { type -> + when (type) { + is StructType -> StructBlueprint(type) + is EnumType -> EnumBlueprint(type) + is TupleStructType -> TupleStructBlueprint(type) + else -> null + } + }.forEach { type -> + val typeSpec = + when (type) { + is StructBlueprint -> StructGenerator.generate(type) + is EnumBlueprint -> EnumGenerator.generate(type) + is TupleStructBlueprint -> TupleStructGenerator.generate(type) + else -> throw RuntimeException("Unexpected blueprint type: ${type::class}") + } + val builder = + FileSpec + .builder(type.packageName, type.className) + .addType(typeSpec) + .addFileComment("\nAuto-generated file. DO NOT EDIT!\n") - val isSortedMap = type.properties - .map { it.original as? MapType } - .any { it?.sortedByKey == true } - val isSortedVec = type.properties - .map { it.original as? IterableType } - .any { it?.sorted == true } - if (isSortedMap || isSortedVec) { - builder.addImport("jp.co.soramitsu.iroha2", "comparator") + val isSortedMap = + type.properties + .map { it.original as? MapType } + .any { it?.sortedByKey == true } + val isSortedVec = + type.properties + .map { it.original as? IterableType } + .any { it?.sorted == true } + if (isSortedMap || isSortedVec) { + builder.addImport("jp.co.soramitsu.iroha2", "comparator") + } + builder.build().writeTo(outputPath) } - builder.build().writeTo(outputPath) - } } } diff --git a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/generator/Scale.kt b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/generator/Scale.kt index 48ed9bd27..c6cecaf93 100644 --- a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/generator/Scale.kt +++ b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/generator/Scale.kt @@ -17,14 +17,12 @@ import jp.co.soramitsu.iroha2.type.ArrayType import jp.co.soramitsu.iroha2.type.BooleanType import jp.co.soramitsu.iroha2.type.CompactType import jp.co.soramitsu.iroha2.type.CompositeType -import jp.co.soramitsu.iroha2.type.FixedPointType import jp.co.soramitsu.iroha2.type.I128Type import jp.co.soramitsu.iroha2.type.I256Type import jp.co.soramitsu.iroha2.type.I32Type import jp.co.soramitsu.iroha2.type.I64Type import jp.co.soramitsu.iroha2.type.MapType import jp.co.soramitsu.iroha2.type.OptionType -import jp.co.soramitsu.iroha2.type.SetType import jp.co.soramitsu.iroha2.type.StringType import jp.co.soramitsu.iroha2.type.Type import jp.co.soramitsu.iroha2.type.U128Type @@ -48,19 +46,16 @@ val FROM_FIXED_POINT = MemberName("jp.co.soramitsu.iroha2", "fromFixedPoint") /** * Resolve Scale Reader for a given [type] */ -fun resolveScaleReadImpl(type: Type): CodeBlock { - return when (type) { +fun resolveScaleReadImpl(type: Type): CodeBlock = + when (type) { is ArrayType -> type.scaleReadImpl() is VecType -> type.scaleReadImpl() - is SetType -> CodeBlock.of( - "reader.readSet(reader.readCompactInt()) {%L}", - resolveScaleReadImpl(type.innerType.requireValue()), - ) - is MapType -> CodeBlock.of( - "reader.readMap(reader.readCompactInt(), {%1L}, {%2L})", - resolveScaleReadImpl(type.key.requireValue()), - resolveScaleReadImpl(type.value.requireValue()), - ) + is MapType -> + CodeBlock.of( + "reader.readMap(reader.readCompactInt(), {%1L}, {%2L})", + resolveScaleReadImpl(type.key.requireValue()), + resolveScaleReadImpl(type.value.requireValue()), + ) is U8Type -> CodeBlock.of("reader.readUByte().toShort()") is U16Type -> CodeBlock.of("reader.readUint16()") is U32Type -> CodeBlock.of("reader.readUint32()") @@ -75,20 +70,20 @@ fun resolveScaleReadImpl(type: Type): CodeBlock { is BooleanType -> CodeBlock.of("reader.readBoolean()") is CompositeType -> type.scaleReadImpl() is OptionType -> type.scaleReadImpl() - is FixedPointType -> type.scaleReadImpl() is CompactType -> type.scaleReadImpl() else -> throw RuntimeException("Unexpected type: $type") } -} /** * Resolve Scale Writer for a given [type] */ -fun resolveScaleWriteImpl(type: Type, propName: CodeBlock): CodeBlock { - return when (type) { +fun resolveScaleWriteImpl( + type: Type, + propName: CodeBlock, +): CodeBlock = + when (type) { is ArrayType -> type.scaleWriteImpl(propName) is VecType -> type.scaleWriteImpl(propName) - is SetType -> type.scaleWriteImpl(propName) is MapType -> type.scaleWriteImpl(propName) is U8Type -> CodeBlock.of("writer.writeUByte(%L)", propName) is U16Type -> CodeBlock.of("writer.writeUint16(%L)", propName) @@ -104,43 +99,40 @@ fun resolveScaleWriteImpl(type: Type, propName: CodeBlock): CodeBlock { is BooleanType -> CodeBlock.of("if (%L) { writer.directWrite(1) } else { writer.directWrite(0) }", propName) is CompositeType -> CodeBlock.of("%T.write(writer, %L)", withoutGenerics(resolveKotlinType(type)), propName) is OptionType -> type.scaleWriteImpl(propName) - is FixedPointType -> type.scaleWriteImpl(propName) is CompactType -> CodeBlock.of("writer.write(%T(), %L.toLong())", COMPACT_ULONG_WRITER, propName) else -> throw RuntimeException("Unexpected type: $type") } -} /** * @return the class name for a given [type][typeName] */ -fun withoutGenerics(typeName: TypeName): ClassName { - return when (typeName) { +fun withoutGenerics(typeName: TypeName): ClassName = + when (typeName) { is ClassName -> typeName.topLevelClassName() is ParameterizedTypeName -> typeName.rawType.topLevelClassName() else -> throw RuntimeException("Unexpected type name: $typeName") } -} -private fun ArrayType.scaleReadImpl(): CodeBlock { - return when (this.innerType.requireValue()) { +private fun ArrayType.scaleReadImpl(): CodeBlock = + when (this.innerType.requireValue()) { is U8Type -> CodeBlock.of("reader.readByteArray(%L)", this.size) - else -> CodeBlock.of( - "reader.readArray(%L) {%L}", - this.size, - resolveScaleReadImpl(this.innerType.requireValue()), - ) + else -> + CodeBlock.of( + "reader.readArray(%L) {%L}", + this.size, + resolveScaleReadImpl(this.innerType.requireValue()), + ) } -} -private fun VecType.scaleReadImpl(): CodeBlock { - return when (this.innerType.requireValue()) { +private fun VecType.scaleReadImpl(): CodeBlock = + when (this.innerType.requireValue()) { is U8Type -> CodeBlock.of("reader.readByteArray()") - else -> CodeBlock.of( - "reader.readVec(reader.readCompactInt()) {%L}", - resolveScaleReadImpl(this.innerType.requireValue()), - ) + else -> + CodeBlock.of( + "reader.readVec(reader.readCompactInt()) {%L}", + resolveScaleReadImpl(this.innerType.requireValue()), + ) } -} private fun CompositeType.scaleReadImpl(): CodeBlock { val typeName = resolveKotlinType(this) @@ -152,31 +144,21 @@ private fun CompositeType.scaleReadImpl(): CodeBlock { } } -private fun OptionType.scaleReadImpl(): CodeBlock { - return when (this.innerType.requireValue()) { +private fun OptionType.scaleReadImpl(): CodeBlock = + when (this.innerType.requireValue()) { is U64Type, U32Type, U16Type, StringType -> CodeBlock.of("reader.readNullable()") - else -> resolveKotlinType(this).let { type -> - CodeBlock.of( - "reader.readNullable(%1T) as %2T", - withoutGenerics(type), - type, - ) - } - } -} - -private fun FixedPointType.scaleReadImpl(): CodeBlock { - return when (this.innerType.requireValue()) { - is I64Type -> CodeBlock.builder() - .add(resolveScaleReadImpl(this.innerType.requireValue())) - .add(".toBigInteger().%M()", FROM_FIXED_POINT) - .build() - else -> throw RuntimeException("Fixed point with base type $this not implemented") + else -> + resolveKotlinType(this).let { type -> + CodeBlock.of( + "reader.readNullable(%1T) as %2T", + withoutGenerics(type), + type, + ) + } } -} -private fun CompactType.scaleReadImpl(): CodeBlock { - return when (val innerType = this.innerType.requireValue()) { +private fun CompactType.scaleReadImpl(): CodeBlock = + when (val innerType = this.innerType.requireValue()) { is U8Type -> CodeBlock.of("reader.readCompactInt().toShort()") is U16Type -> CodeBlock.of("reader.readCompactInt().toInt()") is U32Type -> CodeBlock.of("reader.readCompactInt().toLong()") @@ -184,15 +166,15 @@ private fun CompactType.scaleReadImpl(): CodeBlock { is U128Type, is U256Type -> CodeBlock.of("reader.read(%T())", COMPACT_BIG_INT_READER) else -> throw RuntimeException("Compact type implementation unresolved: $innerType") } -} private fun MapType.scaleWriteImpl(propName: CodeBlock): CodeBlock { val key = (resolveKotlinType(this.key.requireValue()) as ClassName) val keyName = key.simpleName - val sorted = when { - this.sortedByKey -> CodeBlock.of(".toSortedMap(\n%1L.comparator()\n)", CodeBlock.of(keyName)) - else -> CodeBlock.of("") - } + val sorted = + when { + this.sortedByKey -> CodeBlock.of(".toSortedMap(\n%1L.comparator()\n)", CodeBlock.of(keyName)) + else -> CodeBlock.of("") + } return CodeBlock.of( "writer.writeCompact(%1L.size)\n" + "%1L%4L.forEach { (key, value) ->\n\t%2L\n\t%3L\n}", @@ -203,29 +185,23 @@ private fun MapType.scaleWriteImpl(propName: CodeBlock): CodeBlock { ) } -private fun FixedPointType.scaleWriteImpl(propName: CodeBlock): CodeBlock { - return when (this.innerType.requireValue()) { - is I64Type -> CodeBlock.of("writer.writeInt64(%1L.%2M().toLong())", propName, TO_FIXED_POINT) - else -> throw RuntimeException("Fixed point with base type $this not implemented") - } -} - -private fun OptionType.scaleWriteImpl(propName: CodeBlock): CodeBlock { - return when (this.innerType.requireValue()) { - is U64Type, U32Type, U16Type, StringType -> CodeBlock.of( - "writer.writeNullable(%L)", - propName, - ) - else -> CodeBlock.of( - "writer.writeNullable(%1T, %2L)", - withoutGenerics(resolveKotlinType(this)), - propName, - ) +private fun OptionType.scaleWriteImpl(propName: CodeBlock): CodeBlock = + when (this.innerType.requireValue()) { + is U64Type, U32Type, U16Type, StringType -> + CodeBlock.of( + "writer.writeNullable(%L)", + propName, + ) + else -> + CodeBlock.of( + "writer.writeNullable(%1T, %2L)", + withoutGenerics(resolveKotlinType(this)), + propName, + ) } -} -private fun ArrayType.scaleWriteImpl(propName: CodeBlock): CodeBlock { - return when (this.innerType.requireValue()) { +private fun ArrayType.scaleWriteImpl(propName: CodeBlock): CodeBlock = + when (this.innerType.requireValue()) { is U8Type -> CodeBlock.of("writer.writeByteArray(%L)", propName) else -> { val value = resolveScaleWriteImpl(this.innerType.requireValue(), CodeBlock.of("value")) @@ -236,20 +212,20 @@ private fun ArrayType.scaleWriteImpl(propName: CodeBlock): CodeBlock { ) } } -} -private fun VecType.scaleWriteImpl(propName: CodeBlock): CodeBlock { - return when (this.innerType.requireValue()) { +private fun VecType.scaleWriteImpl(propName: CodeBlock): CodeBlock = + when (this.innerType.requireValue()) { is U8Type -> CodeBlock.of("writer.writeAsList(%L)", propName) else -> { - val sorted = when (this.sorted) { - true -> { - val innerType = resolveKotlinType(this.innerType.requireValue()) - val innerTypeName = innerType.rawTypeName() - CodeBlock.of(".sortedWith(\n%1L.comparator()\n)", innerTypeName) + val sorted = + when (this.sorted) { + true -> { + val innerType = resolveKotlinType(this.innerType.requireValue()) + val innerTypeName = innerType.rawTypeName() + CodeBlock.of(".sortedWith(\n%1L.comparator()\n)", innerTypeName) + } + false -> CodeBlock.of("") } - false -> CodeBlock.of("") - } val value = resolveScaleWriteImpl(this.innerType.requireValue(), CodeBlock.of("value")) CodeBlock.of( @@ -260,14 +236,5 @@ private fun VecType.scaleWriteImpl(propName: CodeBlock): CodeBlock { ) } } -} - -private fun SetType.scaleWriteImpl(propName: CodeBlock): CodeBlock { - return CodeBlock.of( - "writer.writeCompact(%1L.size)\n%1L.forEach { value -> %2L }", - propName, - resolveScaleWriteImpl(this.innerType.requireValue(), CodeBlock.of("value")), - ) -} private fun TypeName.rawTypeName() = ((this as? ParameterizedTypeName)?.rawType ?: (this as ClassName)).simpleName diff --git a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/generator/StructGenerator.kt b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/generator/StructGenerator.kt index 7cef21f34..78e3b1884 100644 --- a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/generator/StructGenerator.kt +++ b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/codegen/generator/StructGenerator.kt @@ -11,13 +11,18 @@ import jp.co.soramitsu.iroha2.codegen.blueprint.StructBlueprint * Generator for [StructBlueprint] */ object StructGenerator : AbstractGenerator() { - - override fun implKDoc(blueprint: StructBlueprint, clazz: TypeSpec.Builder) { + override fun implKDoc( + blueprint: StructBlueprint, + clazz: TypeSpec.Builder, + ) { super.implKDoc(blueprint, clazz) clazz.addKdoc("\n\nGenerated from '${blueprint.source.name}' regular structure") } - override fun implFunctions(blueprint: StructBlueprint, clazz: TypeSpec.Builder) { + override fun implFunctions( + blueprint: StructBlueprint, + clazz: TypeSpec.Builder, + ) { super.implFunctions(blueprint, clazz) if (blueprint.properties.any { it.typeName.extractName() == ByteArray::class.qualifiedName }) { @@ -25,8 +30,9 @@ object StructGenerator : AbstractGenerator() { } } - private fun hashCodeFun(blueprint: StructBlueprint): FunSpec { - return FunSpec.builder("hashCode") + private fun hashCodeFun(blueprint: StructBlueprint): FunSpec = + FunSpec + .builder("hashCode") .addModifiers(KModifier.OVERRIDE) .returns(Int::class) .apply { @@ -49,10 +55,10 @@ object StructGenerator : AbstractGenerator() { } } }.build() - } - private fun equalsFun(blueprint: StructBlueprint): FunSpec { - return FunSpec.builder("equals") + private fun equalsFun(blueprint: StructBlueprint): FunSpec = + FunSpec + .builder("equals") .addModifiers(KModifier.OVERRIDE) .addParameter(ParameterSpec.builder("other", ANY_TYPE.copy(nullable = true)).build()) .returns(Boolean::class) @@ -67,5 +73,4 @@ object StructGenerator : AbstractGenerator() { } addStatement("return true") }.build() - } } diff --git a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/parse/ExtractGeneric.kt b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/parse/ExtractGeneric.kt index eb08e97f5..a661fe86d 100644 --- a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/parse/ExtractGeneric.kt +++ b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/parse/ExtractGeneric.kt @@ -7,7 +7,10 @@ private const val TYPE_GROUP_INDEX = 2 // first one will be the entire typeDef, /** * Extract generics from [name] using [parser] */ -fun extractGeneric(name: String, parser: SchemaParser): List { +fun extractGeneric( + name: String, + parser: SchemaParser, +): List { val groups = GENERIC_REGEX.find(name)?.groupValues ?: return listOf() val rawType = groups.getOrNull(TYPE_GROUP_INDEX) ?: return listOf() return rawType.split(", ").map { parser.createAndGetNest(it) } diff --git a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/parse/SchemaParser.kt b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/parse/SchemaParser.kt index af337c2dd..39a7dd33c 100644 --- a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/parse/SchemaParser.kt +++ b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/parse/SchemaParser.kt @@ -6,7 +6,6 @@ import jp.co.soramitsu.iroha2.type.Type * Parser for Iroha2 schema */ class SchemaParser { - private val registry = HashMap() private val resolver = TypeResolver(this) @@ -16,12 +15,14 @@ class SchemaParser { * @return resolved types */ fun parse(schema: Map): Map { - val preprocessed = schema - .map { entry -> createAndGetNest(entry.key, entry.value) } - .associateBy { it.name } - val notResolvedTypes = preprocessed - .flatMap { it.value.notResolvedTypes() } - .toSet() + val preprocessed = + schema + .map { entry -> createAndGetNest(entry.key, entry.value) } + .associateBy { it.name } + val notResolvedTypes = + preprocessed + .flatMap { it.value.notResolvedTypes() } + .toSet() if (notResolvedTypes.isNotEmpty()) { throw RuntimeException("Some types are not resolved: $notResolvedTypes") } @@ -31,13 +32,16 @@ class SchemaParser { /** * Parse the given [name] and return its [TypeNest] */ - fun createAndGetNest(name: String, typeValue: Any? = null): TypeNest { - return registry.getOrPut(name) { - TypeNest(name, null) - }.also { - if (it.value == null) { - it.value = resolver.resolve(name, typeValue) + fun createAndGetNest( + name: String, + typeValue: Any? = null, + ): TypeNest = + registry + .getOrPut(name) { + TypeNest(name, null) + }.also { + if (it.value == null) { + it.value = resolver.resolve(name, typeValue) + } } - } - } } diff --git a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/parse/SchemaReader.kt b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/parse/SchemaReader.kt index 96eec8b50..102b977c5 100644 --- a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/parse/SchemaReader.kt +++ b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/parse/SchemaReader.kt @@ -7,7 +7,6 @@ import jp.co.soramitsu.iroha2.DEFINITION_SCHEMA_GENERIC_REGEX import kotlin.streams.toList class SchemaReader { - private val repeated = mutableMapOf() private val toReplace = mutableMapOf() @@ -22,6 +21,7 @@ class SchemaReader { lines.forEach { line -> line.countRepeatedWithGenerics() } repeated.entries.removeIf { (it.key != "Trigger" && it.key != "Action") && it.value < 2 } toReplace.putAll(lines.mapNotNull { it.getReplacePairOrNull() }.toMap()) + toReplace["null"] = "{\"Tuple\": []}" lines.forEach { line -> sb.appendLine(line.replace()) } @@ -49,9 +49,11 @@ class SchemaReader { val mutable = immutable.map { this.contains(it) }.all { !it } if (mutable && repeated[values[1]] != null) { val source = "${values[1]}<${values[2]}>" - return source to source.replace("<", "Of") - .replace(", ", "And") - .replace(">", "") + return source to + source + .replace("<", "Of") + .replace(", ", "And") + .replace(">", "") } else if (this.contains("Option>( - BooleanResolver, - SortedMapResolver, - BitMapResolver, - OptionResolver, - VectorResolver, - SortedVectorResolver, - ArrayResolver, - EnumResolver, - TupleStructResolver, - StructResolver, - OneStringStructResolver, - StringResolver, - CompactResolver, - UIntResolver, - IntResolver, - SetResolver, - FixedPointResolver, - QueryResolver, - ) +class TypeResolver( + private val schemaParser: SchemaParser, +) { + private val resolvers = + listOf>( + BooleanResolver, + SortedMapResolver, + BitMapResolver, + OptionResolver, + VectorResolver, + SortedVectorResolver, + ArrayResolver, + EnumResolver, + TupleStructResolver, + StructResolver, + OneStringStructResolver, + StringResolver, + CompactResolver, + UIntResolver, + IntResolver, + ) /** * Resolve the type based on a given [name]. @@ -64,11 +61,15 @@ class TypeResolver(private val schemaParser: SchemaParser) { * @param name The name to resolve * @param typeValue The type to try and resolve the [name] to */ - fun resolve(name: String, typeValue: Any?): Type? { - val candidates = resolvers - .asSequence() - .mapNotNull { it.resolve(name, typeValue, schemaParser) } - .toSet() + fun resolve( + name: String, + typeValue: Any?, + ): Type? { + val candidates = + resolvers + .asSequence() + .mapNotNull { it.resolve(name, typeValue, schemaParser) } + .toSet() return candidates.firstOrNull() } } @@ -81,29 +82,39 @@ class TypeResolver(private val schemaParser: SchemaParser) { * @param schemaParser The schema parser to use */ interface Resolver { - fun resolve(name: String, typeValue: Any?, schemaParser: SchemaParser): T? + fun resolve( + name: String, + typeValue: Any?, + schemaParser: SchemaParser, + ): T? } /** * Resolver for [BooleanType] */ object BooleanResolver : Resolver { - override fun resolve(name: String, typeValue: Any?, schemaParser: SchemaParser): BooleanType? { - return when (name) { + override fun resolve( + name: String, + typeValue: Any?, + schemaParser: SchemaParser, + ): BooleanType? = + when (name) { "bool" -> BooleanType else -> null } - } } /** * Resolver for [MapType] */ object BitMapResolver : Resolver { - const val NAME = "Bitmap" - override fun resolve(name: String, typeValue: Any?, schemaParser: SchemaParser): UIntType? { + override fun resolve( + name: String, + typeValue: Any?, + schemaParser: SchemaParser, + ): UIntType? { when (typeValue) { is Map<*, *> -> if (typeValue.keys.first() != NAME) return null else -> return null @@ -119,16 +130,21 @@ object BitMapResolver : Resolver { * Resolver for [MapType] */ object SortedMapResolver : Resolver { - const val NAME = "SortedMap" - override fun resolve(name: String, typeValue: Any?, schemaParser: SchemaParser): MapType? { + override fun resolve( + name: String, + typeValue: Any?, + schemaParser: SchemaParser, + ): MapType? { if (!name.startsWith("$NAME<")) return null - val wildcards = name.removePrefix(NAME) - .removeSurrounding("<", ">") - .split(',') - .map { it.trim() } + val wildcards = + name + .removePrefix(NAME) + .removeSurrounding("<", ">") + .split(',') + .map { it.trim() } if (wildcards.size != 2) return null return MapType( @@ -143,9 +159,15 @@ object SortedMapResolver : Resolver { /** * Basic resolver for wrapped types */ -abstract class WrapperResolver(open val wrapperName: String) : Resolver { - override fun resolve(name: String, typeValue: Any?, schemaParser: SchemaParser): T? { - return when { +abstract class WrapperResolver( + open val wrapperName: String, +) : Resolver { + override fun resolve( + name: String, + typeValue: Any?, + schemaParser: SchemaParser, + ): T? = + when { name.startsWith("$wrapperName<") -> { val innerTypeName = name.removeSurrounding("$wrapperName<", ">") val innerType = schemaParser.createAndGetNest(innerTypeName) @@ -158,12 +180,15 @@ abstract class WrapperResolver(open val wrapperName: String) : Resolve } else -> null } - } /** * Create a wrapper type for [innerType] */ - abstract fun createWrapper(name: String, innerType: TypeNest, sorted: Boolean = false): T + abstract fun createWrapper( + name: String, + innerType: TypeNest, + sorted: Boolean = false, + ): T } /** @@ -172,16 +197,16 @@ abstract class WrapperResolver(open val wrapperName: String) : Resolve abstract class SortedWrapperResolver( override val wrapperName: String, ) : WrapperResolver(wrapperName) { - - override fun resolve(name: String, typeValue: Any?, schemaParser: SchemaParser): T? { - return super.resolve(name, typeValue, schemaParser)?.also { + override fun resolve( + name: String, + typeValue: Any?, + schemaParser: SchemaParser, + ): T? = + super.resolve(name, typeValue, schemaParser)?.also { it.sorted = getSortedProperty(typeValue) } - } - fun getSortedProperty(typeValue: Any?): Boolean { - return (typeValue as? Map<*, *>)?.get("Sorted$wrapperName") != null - } + fun getSortedProperty(typeValue: Any?): Boolean = (typeValue as? Map<*, *>)?.get("Sorted$wrapperName") != null } object SortedVectorResolver : SortedWrapperResolver("SortedVec") { @@ -193,14 +218,17 @@ object SortedVectorResolver : SortedWrapperResolver("SortedVec") { sorted: Boolean, ) = VecType(name, innerType, sorted) - override fun resolve(name: String, typeValue: Any?, schemaParser: SchemaParser): VecType? { - return when ( + override fun resolve( + name: String, + typeValue: Any?, + schemaParser: SchemaParser, + ): VecType? = + when ( name.startsWith(wrapperName) || (typeValue as? Map<*, *>)?.get(wrapperName) != null ) { true -> createWrapper(name, extractGeneric(name, schemaParser).first(), true) false -> null } - } } /** @@ -215,35 +243,30 @@ object VectorResolver : SortedWrapperResolver("Vec") { sorted: Boolean, ) = VecType(name, innerType, sorted) - override fun resolve(name: String, typeValue: Any?, schemaParser: SchemaParser): VecType? { - return when ( + override fun resolve( + name: String, + typeValue: Any?, + schemaParser: SchemaParser, + ): VecType? = + when ( name.startsWith(wrapperName) || (typeValue as? Map<*, *>)?.get(wrapperName) != null ) { true -> createWrapper(name, extractGeneric(name, schemaParser).first(), false) false -> null } - } -} - -/** - * Resolver for [SetType] - */ -object SetResolver : WrapperResolver("BTreeSet") { - override fun createWrapper( - name: String, - innerType: TypeNest, - sorted: Boolean, - ) = SetType(name, innerType, sorted) } /** * Resolver for [ArrayType] */ object ArrayResolver : Resolver { - const val NAME = "Array" - override fun resolve(name: String, typeValue: Any?, schemaParser: SchemaParser): ArrayType? { + override fun resolve( + name: String, + typeValue: Any?, + schemaParser: SchemaParser, + ): ArrayType? { if (!name.startsWith(NAME)) return null val groups = ARRAY_REGEX.find(name)?.groupValues ?: return null return ArrayType(name, schemaParser.createAndGetNest(groups[1]), groups[2].toInt()) @@ -276,23 +299,27 @@ object CompactResolver : WrapperResolver("Compact") { * Resolver for [EnumType] */ object EnumResolver : Resolver { - override fun resolve(name: String, typeValue: Any?, schemaParser: SchemaParser): EnumType? { - return if (typeValue is Map<*, *> && typeValue["Enum"] != null) { + override fun resolve( + name: String, + typeValue: Any?, + schemaParser: SchemaParser, + ): EnumType? = + if (typeValue is Map<*, *> && typeValue["Enum"] != null) { val components = typeValue["Enum"] as List> val generics = extractGeneric(name, schemaParser) - val variants = components.map { - val variantProperty = it["type"] as String? - EnumType.Variant( - (it["tag"] ?: throw IrohaSdkException("Enum name not found")) as String, - (it["discriminant"] ?: throw IrohaSdkException("Enum discriminant not found")) as Int, - variantProperty?.let(schemaParser::createAndGetNest), - ) - } + val variants = + components.map { + val variantProperty = it["type"] as String? + EnumType.Variant( + (it["tag"] ?: throw IrohaSdkException("Enum name not found")) as String, + (it["discriminant"] ?: throw IrohaSdkException("Enum discriminant not found")) as Int, + variantProperty?.let(schemaParser::createAndGetNest), + ) + } EnumType(name, generics, variants) } else { null } - } } /** @@ -303,8 +330,8 @@ object TupleStructResolver : Resolver { name: String, typeValue: Any?, schemaParser: SchemaParser, - ): TupleStructType? { - return if (typeValue is Map<*, *> && typeValue["Tuple"] != null) { + ): TupleStructType? = + if (typeValue is Map<*, *> && typeValue["Tuple"] != null) { val components = typeValue["Tuple"] as List val children = components.map(schemaParser::createAndGetNest) val generics = extractGeneric(name, schemaParser) @@ -312,15 +339,18 @@ object TupleStructResolver : Resolver { } else { null } - } } /** * Resolver for [StructType] */ object StructResolver : Resolver { - override fun resolve(name: String, typeValue: Any?, schemaParser: SchemaParser): StructType? { - return if ((typeValue is Map<*, *> && typeValue["Struct"] != null)) { + override fun resolve( + name: String, + typeValue: Any?, + schemaParser: SchemaParser, + ): StructType? = + if ((typeValue is Map<*, *> && typeValue["Struct"] != null)) { val components = typeValue["Struct"] as List> val properties = LinkedHashMap() for (singleMapping in components) { @@ -333,72 +363,73 @@ object StructResolver : Resolver { } else { null } - } } /** * Resolver for [StructType] */ object OneStringStructResolver : Resolver { - override fun resolve(name: String, typeValue: Any?, schemaParser: SchemaParser): StructType? { - return if (typeValue is String) { + override fun resolve( + name: String, + typeValue: Any?, + schemaParser: SchemaParser, + ): StructType? = + if (typeValue is String) { val fieldName = typeValue.toFieldName() - val properties = LinkedHashMap().also { map -> - map[fieldName] = schemaParser.createAndGetNest(typeValue) - } + val properties = + LinkedHashMap().also { map -> + map[fieldName] = schemaParser.createAndGetNest(typeValue) + } val generics = extractGeneric(name, schemaParser) StructType(name, generics, properties) } else { null } - } - - private fun String.toFieldName() = this.replaceFirstChar { it.lowercase() }.let { name -> - val parts = name.split("<") - val firstPart = parts.first() - val lastPart = parts.last().split(",") - .first().replaceFirstChar { it.uppercase() } - .replace(">", "") - - when (firstPart.lowercase() == lastPart.lowercase()) { - true -> firstPart - false -> "${firstPart}Of$lastPart" - } - } -} -/** - * Resolver for [StructType] - */ -object QueryResolver : Resolver { - override fun resolve(name: String, typeValue: Any?, schemaParser: SchemaParser): StructType? { - return if (name.startsWith("Find") && typeValue == null) { - val generics = extractGeneric(name, schemaParser) - StructType(name, generics, emptyMap()) - } else { - null + private fun String.toFieldName() = + this.replaceFirstChar { it.lowercase() }.let { name -> + val parts = name.split("<") + val firstPart = parts.first() + val lastPart = + parts + .last() + .split(",") + .first() + .replaceFirstChar { it.uppercase() } + .replace(">", "") + + when (firstPart.lowercase() == lastPart.lowercase()) { + true -> firstPart + false -> "${firstPart}Of$lastPart" + } } - } } /** * Resolver for [StringType] */ object StringResolver : Resolver { - override fun resolve(name: String, typeValue: Any?, schemaParser: SchemaParser): StringType? { - return when { + override fun resolve( + name: String, + typeValue: Any?, + schemaParser: SchemaParser, + ): StringType? = + when { name.endsWith("String") -> StringType else -> null } - } } /** * Resolver for [UIntType] */ object UIntResolver : Resolver { - override fun resolve(name: String, typeValue: Any?, schemaParser: SchemaParser): UIntType? { - return when (name) { + override fun resolve( + name: String, + typeValue: Any?, + schemaParser: SchemaParser, + ): UIntType? = + when (name) { "AtomicU32Wrapper" -> U32Type "NonZeroU8" -> U8Type "u8" -> U8Type @@ -409,15 +440,18 @@ object UIntResolver : Resolver { "u256" -> U256Type else -> null } - } } /** * Resolver for [IntType] */ object IntResolver : Resolver { - override fun resolve(name: String, typeValue: Any?, schemaParser: SchemaParser): IntType? { - return when (name) { + override fun resolve( + name: String, + typeValue: Any?, + schemaParser: SchemaParser, + ): IntType? = + when (name) { "i8" -> I8Type "i16" -> I16Type "i32" -> I32Type @@ -426,30 +460,15 @@ object IntResolver : Resolver { "i256" -> I256Type else -> null } - } -} - -/** - * Resolver for [FixedPointType] - */ -object FixedPointResolver : Resolver { - override fun resolve(name: String, typeValue: Any?, schemaParser: SchemaParser): FixedPointType? { - return if (name.startsWith("FixedPoint<") && typeValue is Map<*, *>) { - val members = (typeValue["FixedPoint"] as? Map)!! - val base = schemaParser.createAndGetNest(members["base"]!! as String) - val decimalPlaces = members["decimal_places"]!! as Int - FixedPointType(name, base, decimalPlaces) - } else { - null - } - } } /** * `TypeNest` contains [the name of the type][name] and [the type it resolves to][value] */ -data class TypeNest(val name: String, var value: Type?) { - +data class TypeNest( + val name: String, + var value: Type?, +) { private var resolutionInProgress: Boolean = false fun requireValue() = value ?: NullType @@ -471,7 +490,5 @@ data class TypeNest(val name: String, var value: Type?) { return name == other.name } - override fun hashCode(): Int { - return name.hashCode() - } + override fun hashCode(): Int = name.hashCode() } diff --git a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/type/Common.kt b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/type/Common.kt index a3e0e330f..c2fb9866d 100644 --- a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/type/Common.kt +++ b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/type/Common.kt @@ -7,12 +7,14 @@ import jp.co.soramitsu.iroha2.parse.TypeNest * * The [type names][name] are resolved with a [TypeResolver]. */ -sealed class Type(open val name: String) { +sealed class Type( + open val name: String, +) { open fun notResolvedTypes(): Set = setOf() } /** - * Boolean type + * Unit struct type */ object NullType : Type("null") diff --git a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/type/Composite.kt b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/type/Composite.kt index f3cf3af4c..0613ec09d 100644 --- a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/type/Composite.kt +++ b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/type/Composite.kt @@ -5,7 +5,10 @@ import jp.co.soramitsu.iroha2.parse.TypeNest /** * Basic class for different composite types */ -abstract class CompositeType(override val name: String, open val generics: List) : Type(name) +abstract class CompositeType( + override val name: String, + open val generics: List, +) : Type(name) /** * `EnumType` composite type @@ -15,11 +18,14 @@ data class EnumType( override val generics: List, val variants: List, ) : CompositeType(name, generics) { - /** * Variant of a enum type */ - data class Variant(val name: String, val discriminant: Int, val type: TypeNest?) + data class Variant( + val name: String, + val discriminant: Int, + val type: TypeNest?, + ) private var resolutionInProgress: Boolean = false @@ -28,9 +34,11 @@ data class EnumType( return setOf() } resolutionInProgress = true - val result = generics.union(variants.mapNotNull { it.type }) - .flatMap { it.value?.notResolvedTypes() ?: setOf(it.name) } - .toSet() + val result = + generics + .union(variants.mapNotNull { it.type }) + .flatMap { it.value?.notResolvedTypes() ?: setOf(it.name) } + .toSet() resolutionInProgress = false return result } @@ -44,11 +52,12 @@ data class TupleStructType( override val generics: List, val types: List, ) : CompositeType(name, generics) { - override fun notResolvedTypes(): Set { - return types.union(generics).flatMap { - it.value?.notResolvedTypes() ?: setOf(it.name) - }.toSet() - } + override fun notResolvedTypes(): Set = + types + .union(generics) + .flatMap { + it.value?.notResolvedTypes() ?: setOf(it.name) + }.toSet() } /** @@ -59,9 +68,10 @@ data class StructType( override val generics: List, val mapping: Map, ) : CompositeType(name, generics) { - override fun notResolvedTypes(): Set { - return mapping.values.union(generics).flatMap { - it.value?.let { setOf() } ?: setOf(it.name) - }.toSet() - } + override fun notResolvedTypes(): Set = + mapping.values + .union(generics) + .flatMap { + it.value?.let { setOf() } ?: setOf(it.name) + }.toSet() } diff --git a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/type/Int.kt b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/type/Int.kt index 132ac4e5f..92122e121 100644 --- a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/type/Int.kt +++ b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/type/Int.kt @@ -3,7 +3,9 @@ package jp.co.soramitsu.iroha2.type /** * Integer types */ -abstract class IntType(name: String) : Type(name) +abstract class IntType( + name: String, +) : Type(name) /** * 8-bit integers diff --git a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/type/Uint.kt b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/type/Uint.kt index cdd45180f..ed1fb65cb 100644 --- a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/type/Uint.kt +++ b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/type/Uint.kt @@ -3,7 +3,9 @@ package jp.co.soramitsu.iroha2.type /** * Unigned integer types */ -abstract class UIntType(name: String) : Type(name) +abstract class UIntType( + name: String, +) : Type(name) /** * 8-bit unsigned integers diff --git a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/type/Wrapper.kt b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/type/Wrapper.kt index 83dd2796b..303200604 100644 --- a/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/type/Wrapper.kt +++ b/modules/codegen/src/main/kotlin/jp/co/soramitsu/iroha2/type/Wrapper.kt @@ -5,12 +5,16 @@ import jp.co.soramitsu.iroha2.parse.TypeNest /** * Basic class for wrapper types. The `WrapperType` data type wraps [another type][innerType]. */ -abstract class WrapperType(override val name: String, open val innerType: TypeNest) : Type(name) { - override fun notResolvedTypes() = if (innerType.value == null) { - setOf(innerType.name) - } else { - setOf() - } +abstract class WrapperType( + override val name: String, + open val innerType: TypeNest, +) : Type(name) { + override fun notResolvedTypes() = + if (innerType.value == null) { + setOf(innerType.name) + } else { + setOf() + } } /** @@ -39,15 +43,6 @@ data class VecType( override var sorted: Boolean = false, ) : IterableType(name, innerType, sorted) -/** - * `SetType` iterable type. - */ -data class SetType( - override val name: String, - override val innerType: TypeNest, - override var sorted: Boolean = false, -) : IterableType(name, innerType, sorted) - /** * `ArrayType` iterable type. */ @@ -65,12 +60,3 @@ data class CompactType( override val name: String, override val innerType: TypeNest, ) : WrapperType(name, innerType) - -/** - * Fixed-point type - */ -data class FixedPointType( - override val name: String, - override val innerType: TypeNest, - val decimalPlaces: Int, -) : WrapperType(name, innerType) diff --git a/modules/codegen/src/main/resources/schema.json b/modules/codegen/src/main/resources/schema.json index a77385493..85751191e 100644 --- a/modules/codegen/src/main/resources/schema.json +++ b/modules/codegen/src/main/resources/schema.json @@ -127,6 +127,52 @@ } ] }, + "AccountIdPredicateAtom": { + "Enum": [ + { + "tag": "Equals", + "discriminant": 0, + "type": "AccountId" + } + ] + }, + "AccountIdProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0, + "type": "AccountIdPredicateAtom" + }, + { + "tag": "Domain", + "discriminant": 1, + "type": "DomainIdProjection" + }, + { + "tag": "Signatory", + "discriminant": 2, + "type": "PublicKeyProjection" + } + ] + }, + "AccountIdProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0 + }, + { + "tag": "Domain", + "discriminant": 1, + "type": "DomainIdProjection" + }, + { + "tag": "Signatory", + "discriminant": 2, + "type": "PublicKeyProjection" + } + ] + }, "AccountPermissionChanged": { "Struct": [ { @@ -139,6 +185,46 @@ } ] }, + "AccountPredicateAtom": { + "Enum": [] + }, + "AccountProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0, + "type": "AccountPredicateAtom" + }, + { + "tag": "Id", + "discriminant": 1, + "type": "AccountIdProjection" + }, + { + "tag": "Metadata", + "discriminant": 2, + "type": "MetadataProjection" + } + ] + }, + "AccountProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0 + }, + { + "tag": "Id", + "discriminant": 1, + "type": "AccountIdProjection" + }, + { + "tag": "Metadata", + "discriminant": 2, + "type": "MetadataProjection" + } + ] + }, "AccountRoleChanged": { "Struct": [ { @@ -175,6 +261,36 @@ } ] }, + "ActionPredicateAtom": { + "Enum": [] + }, + "ActionProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0, + "type": "ActionPredicateAtom" + }, + { + "tag": "Metadata", + "discriminant": 1, + "type": "MetadataProjection" + } + ] + }, + "ActionProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0 + }, + { + "tag": "Metadata", + "discriminant": 1, + "type": "MetadataProjection" + } + ] + }, "Algorithm": { "Enum": [ { @@ -262,6 +378,10 @@ { "name": "owned_by", "type": "AccountId" + }, + { + "name": "total_quantity", + "type": "Numeric" } ] }, @@ -363,6 +483,52 @@ } ] }, + "AssetDefinitionIdPredicateAtom": { + "Enum": [ + { + "tag": "Equals", + "discriminant": 0, + "type": "AssetDefinitionId" + } + ] + }, + "AssetDefinitionIdProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0, + "type": "AssetDefinitionIdPredicateAtom" + }, + { + "tag": "Domain", + "discriminant": 1, + "type": "DomainIdProjection" + }, + { + "tag": "Name", + "discriminant": 2, + "type": "NameProjection" + } + ] + }, + "AssetDefinitionIdProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0 + }, + { + "tag": "Domain", + "discriminant": 1, + "type": "DomainIdProjection" + }, + { + "tag": "Name", + "discriminant": 2, + "type": "NameProjection" + } + ] + }, "AssetDefinitionOwnerChanged": { "Struct": [ { @@ -375,6 +541,46 @@ } ] }, + "AssetDefinitionPredicateAtom": { + "Enum": [] + }, + "AssetDefinitionProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0, + "type": "AssetDefinitionPredicateAtom" + }, + { + "tag": "Id", + "discriminant": 1, + "type": "AssetDefinitionIdProjection" + }, + { + "tag": "Metadata", + "discriminant": 2, + "type": "MetadataProjection" + } + ] + }, + "AssetDefinitionProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0 + }, + { + "tag": "Id", + "discriminant": 1, + "type": "AssetDefinitionIdProjection" + }, + { + "tag": "Metadata", + "discriminant": 2, + "type": "MetadataProjection" + } + ] + }, "AssetDefinitionTotalQuantityChanged": { "Struct": [ { @@ -476,6 +682,92 @@ } ] }, + "AssetIdPredicateAtom": { + "Enum": [ + { + "tag": "Equals", + "discriminant": 0, + "type": "AssetId" + } + ] + }, + "AssetIdProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0, + "type": "AssetIdPredicateAtom" + }, + { + "tag": "Account", + "discriminant": 1, + "type": "AccountIdProjection" + }, + { + "tag": "Definition", + "discriminant": 2, + "type": "AssetDefinitionIdProjection" + } + ] + }, + "AssetIdProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0 + }, + { + "tag": "Account", + "discriminant": 1, + "type": "AccountIdProjection" + }, + { + "tag": "Definition", + "discriminant": 2, + "type": "AssetDefinitionIdProjection" + } + ] + }, + "AssetPredicateAtom": { + "Enum": [] + }, + "AssetProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0, + "type": "AssetPredicateAtom" + }, + { + "tag": "Id", + "discriminant": 1, + "type": "AssetIdProjection" + }, + { + "tag": "Value", + "discriminant": 2, + "type": "AssetValueProjection" + } + ] + }, + "AssetProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0 + }, + { + "tag": "Id", + "discriminant": 1, + "type": "AssetIdProjection" + }, + { + "tag": "Value", + "discriminant": 2, + "type": "AssetValueProjection" + } + ] + }, "AssetTransferBox": { "Enum": [ { @@ -517,36 +809,52 @@ } ] }, - "AtIndex": { - "Struct": [ + "AssetValuePredicateAtom": { + "Enum": [ { - "name": "index", - "type": "u32" + "tag": "IsNumeric", + "discriminant": 0 }, { - "name": "predicate", - "type": "QueryOutputPredicate" + "tag": "IsStore", + "discriminant": 1 } ] }, - "BatchedResponse": { + "AssetValueProjection": { "Enum": [ { - "tag": "V1", + "tag": "Atom", + "discriminant": 0, + "type": "AssetValuePredicateAtom" + }, + { + "tag": "Numeric", "discriminant": 1, - "type": "BatchedResponseV1" + "type": "NumericProjection" + }, + { + "tag": "Store", + "discriminant": 2, + "type": "MetadataProjection" } ] }, - "BatchedResponseV1": { - "Struct": [ + "AssetValueProjection": { + "Enum": [ { - "name": "batch", - "type": "QueryOutputBox" + "tag": "Atom", + "discriminant": 0 }, { - "name": "cursor", - "type": "ForwardCursor" + "tag": "Numeric", + "discriminant": 1, + "type": "NumericProjection" + }, + { + "tag": "Store", + "discriminant": 2, + "type": "MetadataProjection" } ] }, @@ -595,44 +903,92 @@ { "name": "view_change_index", "type": "u32" - }, - { - "name": "consensus_estimation_ms", - "type": "u64" } ] }, - "BlockMessage": "SignedBlock", - "BlockParameter": { + "BlockHeaderHashPredicateAtom": { "Enum": [ { - "tag": "MaxTransactions", + "tag": "Equals", "discriminant": 0, - "type": "NonZero" + "type": "HashOf" } ] }, - "BlockParameters": { - "Struct": [ + "BlockHeaderHashProjection": { + "Enum": [ { - "name": "max_transactions", - "type": "NonZero" + "tag": "Atom", + "discriminant": 0, + "type": "BlockHeaderHashPredicateAtom" } ] }, - "BlockPayload": { - "Struct": [ - { - "name": "header", - "type": "BlockHeader" - }, + "BlockHeaderHashProjection": { + "Enum": [ { - "name": "transactions", - "type": "Vec" + "tag": "Atom", + "discriminant": 0 + } + ] + }, + "BlockHeaderPredicateAtom": { + "Enum": [] + }, + "BlockHeaderProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0, + "type": "BlockHeaderPredicateAtom" + }, + { + "tag": "Hash", + "discriminant": 1, + "type": "BlockHeaderHashProjection" + } + ] + }, + "BlockHeaderProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0 + }, + { + "tag": "Hash", + "discriminant": 1, + "type": "BlockHeaderHashProjection" + } + ] + }, + "BlockMessage": "SignedBlock", + "BlockParameter": { + "Enum": [ + { + "tag": "MaxTransactions", + "discriminant": 0, + "type": "NonZero" + } + ] + }, + "BlockParameters": { + "Struct": [ + { + "name": "max_transactions", + "type": "NonZero" + } + ] + }, + "BlockPayload": { + "Struct": [ + { + "name": "header", + "type": "BlockHeader" }, { - "name": "event_recommendations", - "type": "Vec" + "name": "transactions", + "type": "Vec" } ] }, @@ -653,21 +1009,25 @@ "BlockStatus": { "Enum": [ { - "tag": "Approved", + "tag": "Created", "discriminant": 0 }, + { + "tag": "Approved", + "discriminant": 1 + }, { "tag": "Rejected", - "discriminant": 1, + "discriminant": 2, "type": "BlockRejectionReason" }, { "tag": "Committed", - "discriminant": 2 + "discriminant": 3 }, { "tag": "Applied", - "discriminant": 3 + "discriminant": 4 } ] }, @@ -710,15 +1070,7 @@ } ] }, - "CanBurnAssetWithDefinition": { - "Struct": [ - { - "name": "asset_definition", - "type": "AssetDefinitionId" - } - ] - }, - "CanBurnUserAsset": { + "CanBurnAsset": { "Struct": [ { "name": "asset", @@ -726,23 +1078,7 @@ } ] }, - "CanBurnUserTrigger": { - "Struct": [ - { - "name": "trigger", - "type": "TriggerId" - } - ] - }, - "CanExecuteUserTrigger": { - "Struct": [ - { - "name": "trigger", - "type": "TriggerId" - } - ] - }, - "CanMintAssetWithDefinition": { + "CanBurnAssetWithDefinition": { "Struct": [ { "name": "asset_definition", @@ -750,15 +1086,7 @@ } ] }, - "CanMintUserAsset": { - "Struct": [ - { - "name": "asset", - "type": "AssetId" - } - ] - }, - "CanMintUserTrigger": { + "CanExecuteTrigger": { "Struct": [ { "name": "trigger", @@ -766,23 +1094,17 @@ } ] }, - "CanRegisterAccountInDomain": { - "Struct": [ - { - "name": "domain", - "type": "DomainId" - } - ] - }, - "CanRegisterAssetDefinitionInDomain": { + "CanManagePeers": null, + "CanManageRoles": null, + "CanMintAsset": { "Struct": [ { - "name": "domain", - "type": "DomainId" + "name": "asset", + "type": "AssetId" } ] }, - "CanRegisterAssetWithDefinition": { + "CanMintAssetWithDefinition": { "Struct": [ { "name": "asset_definition", @@ -790,7 +1112,7 @@ } ] }, - "CanRegisterUserTrigger": { + "CanModifyAccountMetadata": { "Struct": [ { "name": "account", @@ -798,23 +1120,23 @@ } ] }, - "CanRemoveKeyValueInAccount": { + "CanModifyAssetDefinitionMetadata": { "Struct": [ { - "name": "account", - "type": "AccountId" + "name": "asset_definition", + "type": "AssetDefinitionId" } ] }, - "CanRemoveKeyValueInAssetDefinition": { + "CanModifyAssetMetadata": { "Struct": [ { - "name": "asset_definition", - "type": "AssetDefinitionId" + "name": "asset", + "type": "AssetId" } ] }, - "CanRemoveKeyValueInDomain": { + "CanModifyDomainMetadata": { "Struct": [ { "name": "domain", @@ -822,7 +1144,7 @@ } ] }, - "CanRemoveKeyValueInTrigger": { + "CanModifyTrigger": { "Struct": [ { "name": "trigger", @@ -830,31 +1152,31 @@ } ] }, - "CanRemoveKeyValueInUserAsset": { + "CanModifyTriggerMetadata": { "Struct": [ { - "name": "asset", - "type": "AssetId" + "name": "trigger", + "type": "TriggerId" } ] }, - "CanSetKeyValueInAccount": { + "CanRegisterAccount": { "Struct": [ { - "name": "account", - "type": "AccountId" + "name": "domain", + "type": "DomainId" } ] }, - "CanSetKeyValueInAssetDefinition": { + "CanRegisterAsset": { "Struct": [ { - "name": "asset_definition", - "type": "AssetDefinitionId" + "name": "owner", + "type": "AccountId" } ] }, - "CanSetKeyValueInDomain": { + "CanRegisterAssetDefinition": { "Struct": [ { "name": "domain", @@ -862,15 +1184,25 @@ } ] }, - "CanSetKeyValueInTrigger": { + "CanRegisterAssetWithDefinition": { "Struct": [ { - "name": "trigger", - "type": "TriggerId" + "name": "asset_definition", + "type": "AssetDefinitionId" + } + ] + }, + "CanRegisterDomain": null, + "CanRegisterTrigger": { + "Struct": [ + { + "name": "authority", + "type": "AccountId" } ] }, - "CanSetKeyValueInUserAsset": { + "CanSetParameters": null, + "CanTransferAsset": { "Struct": [ { "name": "asset", @@ -878,7 +1210,6 @@ } ] }, - "CanSetParameters": null, "CanTransferAssetWithDefinition": { "Struct": [ { @@ -887,24 +1218,22 @@ } ] }, - "CanTransferUserAsset": { + "CanUnregisterAccount": { "Struct": [ { - "name": "asset", - "type": "AssetId" + "name": "account", + "type": "AccountId" } ] }, - "CanUnregisterAccount": { + "CanUnregisterAsset": { "Struct": [ { - "name": "account", - "type": "AccountId" + "name": "asset", + "type": "AssetId" } ] }, - "CanUnregisterAnyPeer": null, - "CanUnregisterAnyRole": null, "CanUnregisterAssetDefinition": { "Struct": [ { @@ -929,61 +1258,79 @@ } ] }, - "CanUnregisterUserAsset": { - "Struct": [ - { - "name": "asset", - "type": "AssetId" - } - ] - }, - "CanUnregisterUserTrigger": { + "CanUnregisterTrigger": { "Struct": [ { - "name": "account", - "type": "AccountId" + "name": "trigger", + "type": "TriggerId" } ] }, "CanUpgradeExecutor": null, "ChainId": "String", - "ClientQueryPayload": { + "CommittedTransaction": { "Struct": [ { - "name": "authority", - "type": "AccountId" + "name": "block_hash", + "type": "HashOf" }, { - "name": "query", - "type": "QueryBox" + "name": "value", + "type": "SignedTransaction" }, { - "name": "filter", - "type": "GenericPredicateBox" + "name": "error", + "type": "Option" + } + ] + }, + "CommittedTransactionPredicateAtom": { + "Enum": [] + }, + "CommittedTransactionProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0, + "type": "CommittedTransactionPredicateAtom" }, { - "name": "sorting", - "type": "Sorting" + "tag": "BlockHash", + "discriminant": 1, + "type": "BlockHeaderHashProjection" }, { - "name": "pagination", - "type": "Pagination" + "tag": "Value", + "discriminant": 2, + "type": "SignedTransactionProjection" }, { - "name": "fetch_size", - "type": "FetchSize" + "tag": "Error", + "discriminant": 3, + "type": "TransactionErrorProjection" } ] }, - "CommittedTransaction": { - "Struct": [ + "CommittedTransactionProjection": { + "Enum": [ { - "name": "value", - "type": "SignedTransaction" + "tag": "Atom", + "discriminant": 0 }, { - "name": "error", - "type": "Option" + "tag": "BlockHash", + "discriminant": 1, + "type": "BlockHeaderHashProjection" + }, + { + "tag": "Value", + "discriminant": 2, + "type": "SignedTransactionProjection" + }, + { + "tag": "Error", + "discriminant": 3, + "type": "TransactionErrorProjection" } ] }, @@ -993,73 +1340,366 @@ "Compact": { "Int": "Compact" }, - "ConfigurationEvent": { + "CompoundPredicate": { "Enum": [ { - "tag": "Changed", + "tag": "Atom", "discriminant": 0, - "type": "ParameterChanged" - } - ] - }, - "ConfigurationEventFilter": { - "Struct": [ + "type": "AccountProjection" + }, { - "name": "event_set", - "type": "ConfigurationEventSet" + "tag": "Not", + "discriminant": 1, + "type": "CompoundPredicate" + }, + { + "tag": "And", + "discriminant": 2, + "type": "Vec>" + }, + { + "tag": "Or", + "discriminant": 3, + "type": "Vec>" } ] }, - "ConfigurationEventSet": { - "Bitmap": { - "repr": "u32", - "masks": [ - { - "name": "Changed", - "mask": 1 - } - ] - } - }, - "Container": { + "CompoundPredicate": { "Enum": [ { - "tag": "Any", + "tag": "Atom", "discriminant": 0, - "type": "QueryOutputPredicate" + "type": "AssetProjection" }, { - "tag": "All", + "tag": "Not", "discriminant": 1, - "type": "QueryOutputPredicate" + "type": "CompoundPredicate" }, { - "tag": "AtIndex", + "tag": "And", "discriminant": 2, - "type": "AtIndex" - } - ] - }, - "CustomInstruction": { - "Struct": [ + "type": "Vec>" + }, { - "name": "payload", - "type": "JsonString" + "tag": "Or", + "discriminant": 3, + "type": "Vec>" } ] }, - "CustomParameter": { - "Struct": [ + "CompoundPredicate": { + "Enum": [ { - "name": "id", - "type": "CustomParameterId" + "tag": "Atom", + "discriminant": 0, + "type": "AssetDefinitionProjection" }, { - "name": "payload", - "type": "JsonString" - } - ] - }, + "tag": "Not", + "discriminant": 1, + "type": "CompoundPredicate" + }, + { + "tag": "And", + "discriminant": 2, + "type": "Vec>" + }, + { + "tag": "Or", + "discriminant": 3, + "type": "Vec>" + } + ] + }, + "CompoundPredicate": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0, + "type": "BlockHeaderProjection" + }, + { + "tag": "Not", + "discriminant": 1, + "type": "CompoundPredicate" + }, + { + "tag": "And", + "discriminant": 2, + "type": "Vec>" + }, + { + "tag": "Or", + "discriminant": 3, + "type": "Vec>" + } + ] + }, + "CompoundPredicate": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0, + "type": "CommittedTransactionProjection" + }, + { + "tag": "Not", + "discriminant": 1, + "type": "CompoundPredicate" + }, + { + "tag": "And", + "discriminant": 2, + "type": "Vec>" + }, + { + "tag": "Or", + "discriminant": 3, + "type": "Vec>" + } + ] + }, + "CompoundPredicate": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0, + "type": "DomainProjection" + }, + { + "tag": "Not", + "discriminant": 1, + "type": "CompoundPredicate" + }, + { + "tag": "And", + "discriminant": 2, + "type": "Vec>" + }, + { + "tag": "Or", + "discriminant": 3, + "type": "Vec>" + } + ] + }, + "CompoundPredicate": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0, + "type": "PeerIdProjection" + }, + { + "tag": "Not", + "discriminant": 1, + "type": "CompoundPredicate" + }, + { + "tag": "And", + "discriminant": 2, + "type": "Vec>" + }, + { + "tag": "Or", + "discriminant": 3, + "type": "Vec>" + } + ] + }, + "CompoundPredicate": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0, + "type": "PermissionProjection" + }, + { + "tag": "Not", + "discriminant": 1, + "type": "CompoundPredicate" + }, + { + "tag": "And", + "discriminant": 2, + "type": "Vec>" + }, + { + "tag": "Or", + "discriminant": 3, + "type": "Vec>" + } + ] + }, + "CompoundPredicate": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0, + "type": "RoleProjection" + }, + { + "tag": "Not", + "discriminant": 1, + "type": "CompoundPredicate" + }, + { + "tag": "And", + "discriminant": 2, + "type": "Vec>" + }, + { + "tag": "Or", + "discriminant": 3, + "type": "Vec>" + } + ] + }, + "CompoundPredicate": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0, + "type": "RoleIdProjection" + }, + { + "tag": "Not", + "discriminant": 1, + "type": "CompoundPredicate" + }, + { + "tag": "And", + "discriminant": 2, + "type": "Vec>" + }, + { + "tag": "Or", + "discriminant": 3, + "type": "Vec>" + } + ] + }, + "CompoundPredicate": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0, + "type": "SignedBlockProjection" + }, + { + "tag": "Not", + "discriminant": 1, + "type": "CompoundPredicate" + }, + { + "tag": "And", + "discriminant": 2, + "type": "Vec>" + }, + { + "tag": "Or", + "discriminant": 3, + "type": "Vec>" + } + ] + }, + "CompoundPredicate": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0, + "type": "TriggerProjection" + }, + { + "tag": "Not", + "discriminant": 1, + "type": "CompoundPredicate" + }, + { + "tag": "And", + "discriminant": 2, + "type": "Vec>" + }, + { + "tag": "Or", + "discriminant": 3, + "type": "Vec>" + } + ] + }, + "CompoundPredicate": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0, + "type": "TriggerIdProjection" + }, + { + "tag": "Not", + "discriminant": 1, + "type": "CompoundPredicate" + }, + { + "tag": "And", + "discriminant": 2, + "type": "Vec>" + }, + { + "tag": "Or", + "discriminant": 3, + "type": "Vec>" + } + ] + }, + "ConfigurationEvent": { + "Enum": [ + { + "tag": "Changed", + "discriminant": 0, + "type": "ParameterChanged" + } + ] + }, + "ConfigurationEventFilter": { + "Struct": [ + { + "name": "event_set", + "type": "ConfigurationEventSet" + } + ] + }, + "ConfigurationEventSet": { + "Bitmap": { + "repr": "u32", + "masks": [ + { + "name": "Changed", + "mask": 1 + } + ] + } + }, + "CustomInstruction": { + "Struct": [ + { + "name": "payload", + "type": "Json" + } + ] + }, + "CustomParameter": { + "Struct": [ + { + "name": "id", + "type": "CustomParameterId" + }, + { + "name": "payload", + "type": "Json" + } + ] + }, "CustomParameterId": "Name", "DataEvent": { "Enum": [ @@ -1262,6 +1902,42 @@ } ] }, + "DomainIdPredicateAtom": { + "Enum": [ + { + "tag": "Equals", + "discriminant": 0, + "type": "DomainId" + } + ] + }, + "DomainIdProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0, + "type": "DomainIdPredicateAtom" + }, + { + "tag": "Name", + "discriminant": 1, + "type": "NameProjection" + } + ] + }, + "DomainIdProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0 + }, + { + "tag": "Name", + "discriminant": 1, + "type": "NameProjection" + } + ] + }, "DomainOwnerChanged": { "Struct": [ { @@ -1274,6 +1950,46 @@ } ] }, + "DomainPredicateAtom": { + "Enum": [] + }, + "DomainProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0, + "type": "DomainPredicateAtom" + }, + { + "tag": "Id", + "discriminant": 1, + "type": "DomainIdProjection" + }, + { + "tag": "Metadata", + "discriminant": 2, + "type": "MetadataProjection" + } + ] + }, + "DomainProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0 + }, + { + "tag": "Id", + "discriminant": 1, + "type": "DomainIdProjection" + }, + { + "tag": "Metadata", + "discriminant": 2, + "type": "MetadataProjection" + } + ] + }, "EventBox": { "Enum": [ { @@ -1356,7 +2072,7 @@ }, { "name": "args", - "type": "Option" + "type": "Json" } ] }, @@ -1372,7 +2088,7 @@ }, { "name": "args", - "type": "Option" + "type": "Json" } ] }, @@ -1425,7 +2141,7 @@ }, { "name": "schema", - "type": "JsonString" + "type": "Json" } ] }, @@ -1469,38 +2185,11 @@ "Struct": [ { "name": "fetch_size", - "type": "Option>" - } - ] - }, - "FindAccountById": { - "Struct": [ - { - "name": "id", - "type": "AccountId" - } - ] - }, - "FindAccountKeyValueByIdAndKey": { - "Struct": [ - { - "name": "id", - "type": "AccountId" - }, - { - "name": "key", - "type": "Name" - } - ] - }, - "FindAccountsByDomainId": { - "Struct": [ - { - "name": "domain", - "type": "DomainId" + "type": "Option>" } ] }, + "FindAccounts": null, "FindAccountsWithAsset": { "Struct": [ { @@ -1509,138 +2198,12 @@ } ] }, - "FindAllAccounts": null, - "FindAllActiveTriggerIds": null, - "FindAllAssets": null, - "FindAllAssetsDefinitions": null, - "FindAllBlockHeaders": null, - "FindAllBlocks": null, - "FindAllDomains": null, - "FindAllParameters": null, - "FindAllPeers": null, - "FindAllRoleIds": null, - "FindAllRoles": null, - "FindAllTransactions": null, - "FindAssetById": { - "Struct": [ - { - "name": "id", - "type": "AssetId" - } - ] - }, - "FindAssetDefinitionById": { - "Struct": [ - { - "name": "id", - "type": "AssetDefinitionId" - } - ] - }, - "FindAssetDefinitionKeyValueByIdAndKey": { - "Struct": [ - { - "name": "id", - "type": "AssetDefinitionId" - }, - { - "name": "key", - "type": "Name" - } - ] - }, - "FindAssetKeyValueByIdAndKey": { - "Struct": [ - { - "name": "id", - "type": "AssetId" - }, - { - "name": "key", - "type": "Name" - } - ] - }, - "FindAssetQuantityById": { - "Struct": [ - { - "name": "id", - "type": "AssetId" - } - ] - }, - "FindAssetsByAccountId": { - "Struct": [ - { - "name": "account", - "type": "AccountId" - } - ] - }, - "FindAssetsByAssetDefinitionId": { - "Struct": [ - { - "name": "asset_definition", - "type": "AssetDefinitionId" - } - ] - }, - "FindAssetsByDomainId": { - "Struct": [ - { - "name": "domain", - "type": "DomainId" - } - ] - }, - "FindAssetsByDomainIdAndAssetDefinitionId": { - "Struct": [ - { - "name": "domain", - "type": "DomainId" - }, - { - "name": "asset_definition", - "type": "AssetDefinitionId" - } - ] - }, - "FindAssetsByName": { - "Struct": [ - { - "name": "name", - "type": "Name" - } - ] - }, - "FindBlockHeaderByHash": { - "Struct": [ - { - "name": "hash", - "type": "HashOf" - } - ] - }, - "FindDomainById": { - "Struct": [ - { - "name": "id", - "type": "DomainId" - } - ] - }, - "FindDomainKeyValueByIdAndKey": { - "Struct": [ - { - "name": "id", - "type": "DomainId" - }, - { - "name": "key", - "type": "Name" - } - ] - }, + "FindActiveTriggerIds": null, + "FindAssets": null, + "FindAssetsDefinitions": null, + "FindBlockHeaders": null, + "FindBlocks": null, + "FindDomains": null, "FindError": { "Enum": [ { @@ -1706,123 +2269,69 @@ ] }, "FindExecutorDataModel": null, + "FindParameters": null, + "FindPeers": null, "FindPermissionsByAccountId": { "Struct": [ { - "name": "id", - "type": "AccountId" - } - ] - }, - "FindRoleByRoleId": { - "Struct": [ - { - "name": "id", - "type": "RoleId" - } - ] - }, - "FindRolesByAccountId": { - "Struct": [ - { - "name": "id", - "type": "AccountId" - } - ] - }, - "FindTotalAssetQuantityByAssetDefinitionId": { - "Struct": [ - { - "name": "id", - "type": "AssetDefinitionId" - } - ] - }, - "FindTransactionByHash": { - "Struct": [ - { - "name": "hash", - "type": "HashOf" - } - ] - }, - "FindTransactionsByAccountId": { - "Struct": [ - { - "name": "account", - "type": "AccountId" - } - ] - }, - "FindTriggerById": { - "Struct": [ - { - "name": "id", - "type": "TriggerId" - } - ] - }, - "FindTriggerKeyValueByIdAndKey": { - "Struct": [ - { - "name": "id", - "type": "TriggerId" - }, - { - "name": "key", - "type": "Name" - } - ] - }, - "FindTriggersByAuthorityDomainId": { - "Struct": [ - { - "name": "domain", - "type": "DomainId" + "name": "id", + "type": "AccountId" } ] }, - "FindTriggersByAuthorityId": { + "FindRoleIds": null, + "FindRoles": null, + "FindRolesByAccountId": { "Struct": [ { - "name": "account", + "name": "id", "type": "AccountId" } ] }, + "FindTransactions": null, + "FindTriggers": null, "ForwardCursor": { "Struct": [ { "name": "query", - "type": "Option" + "type": "String" }, { "name": "cursor", - "type": "Option>" + "type": "NonZero" } ] }, - "GenericPredicateBox": { - "Enum": [ + "GenesisWasmAction": { + "Struct": [ { - "tag": "And", - "discriminant": 0, - "type": "NonTrivial>" + "name": "executable", + "type": "String" }, { - "tag": "Or", - "discriminant": 1, - "type": "NonTrivial>" + "name": "repeats", + "type": "Repeats" }, { - "tag": "Not", - "discriminant": 2, - "type": "GenericPredicateBox" + "name": "authority", + "type": "AccountId" }, { - "tag": "Raw", - "discriminant": 3, - "type": "QueryOutputPredicate" + "name": "filter", + "type": "EventFilterBox" + } + ] + }, + "GenesisWasmTrigger": { + "Struct": [ + { + "name": "id", + "type": "TriggerId" + }, + { + "name": "action", + "type": "GenesisWasmAction" } ] }, @@ -1885,6 +2394,7 @@ "HashOf": "Hash", "HashOf>": "Hash", "HashOf": "Hash", + "HashOf>": "Hash", "IdBox": { "Enum": [ { @@ -1934,70 +2444,6 @@ } ] }, - "IdentifiableBox": { - "Enum": [ - { - "tag": "NewDomain", - "discriminant": 0, - "type": "NewDomain" - }, - { - "tag": "NewAccount", - "discriminant": 1, - "type": "NewAccount" - }, - { - "tag": "NewAssetDefinition", - "discriminant": 2, - "type": "NewAssetDefinition" - }, - { - "tag": "NewRole", - "discriminant": 3, - "type": "Role" - }, - { - "tag": "Peer", - "discriminant": 4, - "type": "Peer" - }, - { - "tag": "Domain", - "discriminant": 5, - "type": "Domain" - }, - { - "tag": "Account", - "discriminant": 6, - "type": "Account" - }, - { - "tag": "AssetDefinition", - "discriminant": 7, - "type": "AssetDefinition" - }, - { - "tag": "Asset", - "discriminant": 8, - "type": "Asset" - }, - { - "tag": "Trigger", - "discriminant": 9, - "type": "Trigger" - }, - { - "tag": "Role", - "discriminant": 10, - "type": "Role" - }, - { - "tag": "CustomParameter", - "discriminant": 11, - "type": "CustomParameter" - } - ] - }, "InstructionBox": { "Enum": [ { @@ -2228,7 +2674,33 @@ "IpfsPath": "String", "Ipv4Addr": "Array", "Ipv6Addr": "Array", - "JsonString": "String", + "Json": "String", + "JsonPredicateAtom": { + "Enum": [ + { + "tag": "Equals", + "discriminant": 0, + "type": "Json" + } + ] + }, + "JsonProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0, + "type": "JsonPredicateAtom" + } + ] + }, + "JsonProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0 + } + ] + }, "Level": { "Enum": [ { @@ -2301,7 +2773,7 @@ "MerkleTree": { "Vec": "HashOf" }, - "Metadata": "SortedMap", + "Metadata": "SortedMap", "MetadataChanged": { "Struct": [ { @@ -2314,7 +2786,7 @@ }, { "name": "value", - "type": "JsonString" + "type": "Json" } ] }, @@ -2330,7 +2802,7 @@ }, { "name": "value", - "type": "JsonString" + "type": "Json" } ] }, @@ -2346,7 +2818,7 @@ }, { "name": "value", - "type": "JsonString" + "type": "Json" } ] }, @@ -2362,7 +2834,7 @@ }, { "name": "value", - "type": "JsonString" + "type": "Json" } ] }, @@ -2378,7 +2850,61 @@ }, { "name": "value", - "type": "JsonString" + "type": "Json" + } + ] + }, + "MetadataKeyProjection": { + "Struct": [ + { + "name": "key", + "type": "Name" + }, + { + "name": "projection", + "type": "JsonProjection" + } + ] + }, + "MetadataKeyProjection": { + "Struct": [ + { + "name": "key", + "type": "Name" + }, + { + "name": "projection", + "type": "JsonProjection" + } + ] + }, + "MetadataPredicateAtom": { + "Enum": [] + }, + "MetadataProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0, + "type": "MetadataPredicateAtom" + }, + { + "tag": "Key", + "discriminant": 1, + "type": "MetadataKeyProjection" + } + ] + }, + "MetadataProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0 + }, + { + "tag": "Key", + "discriminant": 1, + "type": "MetadataKeyProjection" } ] }, @@ -2460,7 +2986,123 @@ } ] }, + "MultisigApprove": { + "Struct": [ + { + "name": "account", + "type": "AccountId" + }, + { + "name": "instructions_hash", + "type": "HashOf>" + } + ] + }, + "MultisigInstructionBox": { + "Enum": [ + { + "tag": "Register", + "discriminant": 0, + "type": "MultisigRegister" + }, + { + "tag": "Propose", + "discriminant": 1, + "type": "MultisigPropose" + }, + { + "tag": "Approve", + "discriminant": 2, + "type": "MultisigApprove" + } + ] + }, + "MultisigProposalValue": { + "Struct": [ + { + "name": "instructions", + "type": "Vec" + }, + { + "name": "proposed_at_ms", + "type": "NonZero" + }, + { + "name": "expires_at_ms", + "type": "NonZero" + }, + { + "name": "approvals", + "type": "SortedVec" + }, + { + "name": "is_relayed", + "type": "Option" + } + ] + }, + "MultisigPropose": { + "Struct": [ + { + "name": "account", + "type": "AccountId" + }, + { + "name": "instructions", + "type": "Vec" + }, + { + "name": "transaction_ttl_ms", + "type": "Option>" + } + ] + }, + "MultisigRegister": { + "Struct": [ + { + "name": "account", + "type": "AccountId" + }, + { + "name": "spec", + "type": "MultisigSpec" + } + ] + }, + "MultisigSpec": { + "Struct": [ + { + "name": "signatories", + "type": "SortedMap" + }, + { + "name": "quorum", + "type": "NonZero" + }, + { + "name": "transaction_ttl_ms", + "type": "NonZero" + } + ] + }, "Name": "String", + "NameProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0, + "type": "StringPredicateAtom" + } + ] + }, + "NameProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0 + } + ] + }, "NewAccount": { "Struct": [ { @@ -2513,7 +3155,19 @@ } ] }, - "NonTrivial>": "Vec>", + "NewRole": { + "Struct": [ + { + "name": "inner", + "type": "Role" + }, + { + "name": "grant_to", + "type": "AccountId" + } + ] + }, + "NonZero": "u16", "NonZero": "u32", "NonZero": "u64", "Numeric": { @@ -2528,6 +3182,26 @@ } ] }, + "NumericPredicateAtom": { + "Enum": [] + }, + "NumericProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0, + "type": "NumericPredicateAtom" + } + ] + }, + "NumericProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0 + } + ] + }, "NumericSpec": { "Struct": [ { @@ -2551,6 +3225,9 @@ "Option": { "Option": "DomainId" }, + "Option": { + "Option": "ForwardCursor" + }, "Option>": { "Option": "HashOf" }, @@ -2560,9 +3237,6 @@ "Option": { "Option": "IpfsPath" }, - "Option": { - "Option": "JsonString" - }, "Option": { "Option": "Name" }, @@ -2575,18 +3249,15 @@ "Option>>": { "Option": "Option>" }, + "Option": { + "Option": "Parameters" + }, "Option": { "Option": "PeerId" }, "Option": { "Option": "RoleId" }, - "Option": { - "Option": "String" - }, - "Option": { - "Option": "TimeInterval" - }, "Option": { "Option": "TransactionRejectionReason" }, @@ -2599,6 +3270,9 @@ "Option": { "Option": "TriggerId" }, + "Option": { + "Option": "bool" + }, "Option": { "Option": "u32" }, @@ -2609,11 +3283,11 @@ "Struct": [ { "name": "limit", - "type": "Option>" + "type": "Option>" }, { - "name": "start", - "type": "Option>" + "name": "offset", + "type": "u64" } ] }, @@ -2693,6 +3367,10 @@ }, "Peer": { "Struct": [ + { + "name": "address", + "type": "SocketAddr" + }, { "name": "id", "type": "PeerId" @@ -2742,16 +3420,42 @@ }, "PeerId": { "Struct": [ - { - "name": "address", - "type": "SocketAddr" - }, { "name": "public_key", "type": "PublicKey" } ] }, + "PeerIdPredicateAtom": { + "Enum": [] + }, + "PeerIdProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0, + "type": "PeerIdPredicateAtom" + }, + { + "tag": "PublicKey", + "discriminant": 1, + "type": "PublicKeyProjection" + } + ] + }, + "PeerIdProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0 + }, + { + "tag": "PublicKey", + "discriminant": 1, + "type": "PublicKeyProjection" + } + ] + }, "Permission": { "Struct": [ { @@ -2760,7 +3464,27 @@ }, { "name": "payload", - "type": "JsonString" + "type": "Json" + } + ] + }, + "PermissionPredicateAtom": { + "Enum": [] + }, + "PermissionProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0, + "type": "PermissionPredicateAtom" + } + ] + }, + "PermissionProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0 } ] }, @@ -2804,333 +3528,641 @@ } ] }, + "PublicKeyPredicateAtom": { + "Enum": [ + { + "tag": "Equals", + "discriminant": 0, + "type": "PublicKey" + } + ] + }, + "PublicKeyProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0, + "type": "PublicKeyPredicateAtom" + } + ] + }, + "PublicKeyProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0 + } + ] + }, "QueryBox": { "Enum": [ { - "tag": "FindAllAccounts", + "tag": "FindDomains", "discriminant": 0, - "type": "FindAllAccounts" + "type": "QueryWithFilter" }, { - "tag": "FindAccountById", + "tag": "FindAccounts", "discriminant": 1, - "type": "FindAccountById" + "type": "QueryWithFilter" }, { - "tag": "FindAccountKeyValueByIdAndKey", + "tag": "FindAssets", "discriminant": 2, - "type": "FindAccountKeyValueByIdAndKey" + "type": "QueryWithFilter" }, { - "tag": "FindAccountsByDomainId", + "tag": "FindAssetsDefinitions", "discriminant": 3, - "type": "FindAccountsByDomainId" + "type": "QueryWithFilter" + }, + { + "tag": "FindRoles", + "discriminant": 4, + "type": "QueryWithFilter" + }, + { + "tag": "FindRoleIds", + "discriminant": 5, + "type": "QueryWithFilter" + }, + { + "tag": "FindPermissionsByAccountId", + "discriminant": 6, + "type": "QueryWithFilter" + }, + { + "tag": "FindRolesByAccountId", + "discriminant": 7, + "type": "QueryWithFilter" }, { "tag": "FindAccountsWithAsset", + "discriminant": 8, + "type": "QueryWithFilter" + }, + { + "tag": "FindPeers", + "discriminant": 9, + "type": "QueryWithFilter" + }, + { + "tag": "FindActiveTriggerIds", + "discriminant": 10, + "type": "QueryWithFilter" + }, + { + "tag": "FindTriggers", + "discriminant": 11, + "type": "QueryWithFilter" + }, + { + "tag": "FindTransactions", + "discriminant": 12, + "type": "QueryWithFilter" + }, + { + "tag": "FindBlocks", + "discriminant": 13, + "type": "QueryWithFilter" + }, + { + "tag": "FindBlockHeaders", + "discriminant": 14, + "type": "QueryWithFilter" + } + ] + }, + "QueryExecutionFail": { + "Enum": [ + { + "tag": "Find", + "discriminant": 0, + "type": "FindError" + }, + { + "tag": "Conversion", + "discriminant": 1, + "type": "String" + }, + { + "tag": "NotFound", + "discriminant": 2 + }, + { + "tag": "CursorMismatch", + "discriminant": 3 + }, + { + "tag": "CursorDone", + "discriminant": 4 + }, + { + "tag": "FetchSizeTooBig", + "discriminant": 5 + }, + { + "tag": "InvalidSingularParameters", + "discriminant": 6 + }, + { + "tag": "CapacityLimit", + "discriminant": 7 + } + ] + }, + "QueryOutput": { + "Struct": [ + { + "name": "batch", + "type": "QueryOutputBatchBoxTuple" + }, + { + "name": "remaining_items", + "type": "u64" + }, + { + "name": "continue_cursor", + "type": "Option" + } + ] + }, + "QueryOutputBatchBox": { + "Enum": [ + { + "tag": "PublicKey", + "discriminant": 0, + "type": "Vec" + }, + { + "tag": "String", + "discriminant": 1, + "type": "Vec" + }, + { + "tag": "Metadata", + "discriminant": 2, + "type": "Vec" + }, + { + "tag": "Json", + "discriminant": 3, + "type": "Vec" + }, + { + "tag": "Numeric", "discriminant": 4, - "type": "FindAccountsWithAsset" + "type": "Vec" }, { - "tag": "FindAllAssets", + "tag": "Name", "discriminant": 5, - "type": "FindAllAssets" + "type": "Vec" }, { - "tag": "FindAllAssetsDefinitions", + "tag": "DomainId", "discriminant": 6, - "type": "FindAllAssetsDefinitions" + "type": "Vec" }, { - "tag": "FindAssetById", + "tag": "Domain", "discriminant": 7, - "type": "FindAssetById" + "type": "Vec" }, { - "tag": "FindAssetDefinitionById", + "tag": "AccountId", "discriminant": 8, - "type": "FindAssetDefinitionById" + "type": "Vec" }, { - "tag": "FindAssetsByName", + "tag": "Account", "discriminant": 9, - "type": "FindAssetsByName" + "type": "Vec" }, { - "tag": "FindAssetsByAccountId", + "tag": "AssetId", "discriminant": 10, - "type": "FindAssetsByAccountId" + "type": "Vec" + }, + { + "tag": "Asset", + "discriminant": 11, + "type": "Vec" + }, + { + "tag": "AssetValue", + "discriminant": 12, + "type": "Vec" + }, + { + "tag": "AssetDefinitionId", + "discriminant": 13, + "type": "Vec" + }, + { + "tag": "AssetDefinition", + "discriminant": 14, + "type": "Vec" + }, + { + "tag": "Role", + "discriminant": 15, + "type": "Vec" + }, + { + "tag": "Parameter", + "discriminant": 16, + "type": "Vec" + }, + { + "tag": "Permission", + "discriminant": 17, + "type": "Vec" + }, + { + "tag": "CommittedTransaction", + "discriminant": 18, + "type": "Vec" + }, + { + "tag": "SignedTransaction", + "discriminant": 19, + "type": "Vec" + }, + { + "tag": "TransactionHash", + "discriminant": 20, + "type": "Vec>" + }, + { + "tag": "TransactionRejectionReason", + "discriminant": 21, + "type": "Vec>" + }, + { + "tag": "Peer", + "discriminant": 22, + "type": "Vec" + }, + { + "tag": "RoleId", + "discriminant": 23, + "type": "Vec" + }, + { + "tag": "TriggerId", + "discriminant": 24, + "type": "Vec" + }, + { + "tag": "Trigger", + "discriminant": 25, + "type": "Vec" + }, + { + "tag": "Action", + "discriminant": 26, + "type": "Vec" + }, + { + "tag": "Block", + "discriminant": 27, + "type": "Vec" + }, + { + "tag": "BlockHeader", + "discriminant": 28, + "type": "Vec" + }, + { + "tag": "BlockHeaderHash", + "discriminant": 29, + "type": "Vec>" + } + ] + }, + "QueryOutputBatchBoxTuple": { + "Struct": [ + { + "name": "tuple", + "type": "Vec" + } + ] + }, + "QueryParams": { + "Struct": [ + { + "name": "pagination", + "type": "Pagination" }, { - "tag": "FindAssetsByAssetDefinitionId", - "discriminant": 11, - "type": "FindAssetsByAssetDefinitionId" + "name": "sorting", + "type": "Sorting" }, { - "tag": "FindAssetsByDomainId", - "discriminant": 12, - "type": "FindAssetsByDomainId" - }, + "name": "fetch_size", + "type": "FetchSize" + } + ] + }, + "QueryRequest": { + "Enum": [ { - "tag": "FindAssetsByDomainIdAndAssetDefinitionId", - "discriminant": 13, - "type": "FindAssetsByDomainIdAndAssetDefinitionId" + "tag": "Singular", + "discriminant": 0, + "type": "SingularQueryBox" }, { - "tag": "FindAssetQuantityById", - "discriminant": 14, - "type": "FindAssetQuantityById" + "tag": "Start", + "discriminant": 1, + "type": "QueryWithParams" }, { - "tag": "FindTotalAssetQuantityByAssetDefinitionId", - "discriminant": 15, - "type": "FindTotalAssetQuantityByAssetDefinitionId" - }, + "tag": "Continue", + "discriminant": 2, + "type": "ForwardCursor" + } + ] + }, + "QueryRequestWithAuthority": { + "Struct": [ { - "tag": "FindAssetKeyValueByIdAndKey", - "discriminant": 16, - "type": "FindAssetKeyValueByIdAndKey" + "name": "authority", + "type": "AccountId" }, { - "tag": "FindAssetDefinitionKeyValueByIdAndKey", - "discriminant": 17, - "type": "FindAssetDefinitionKeyValueByIdAndKey" - }, + "name": "request", + "type": "QueryRequest" + } + ] + }, + "QueryResponse": { + "Enum": [ { - "tag": "FindAllDomains", - "discriminant": 18, - "type": "FindAllDomains" + "tag": "Singular", + "discriminant": 0, + "type": "SingularQueryOutputBox" }, { - "tag": "FindDomainById", - "discriminant": 19, - "type": "FindDomainById" - }, + "tag": "Iterable", + "discriminant": 1, + "type": "QueryOutput" + } + ] + }, + "QuerySignature": "SignatureOf", + "QueryWithFilter": { + "Struct": [ { - "tag": "FindDomainKeyValueByIdAndKey", - "discriminant": 20, - "type": "FindDomainKeyValueByIdAndKey" + "name": "query", + "type": "FindAccounts" }, { - "tag": "FindAllPeers", - "discriminant": 21, - "type": "FindAllPeers" + "name": "predicate", + "type": "CompoundPredicate" }, { - "tag": "FindAllBlocks", - "discriminant": 22, - "type": "FindAllBlocks" - }, + "name": "selector", + "type": "SelectorTuple" + } + ] + }, + "QueryWithFilter": { + "Struct": [ { - "tag": "FindAllBlockHeaders", - "discriminant": 23, - "type": "FindAllBlockHeaders" + "name": "query", + "type": "FindAccountsWithAsset" }, { - "tag": "FindBlockHeaderByHash", - "discriminant": 24, - "type": "FindBlockHeaderByHash" + "name": "predicate", + "type": "CompoundPredicate" }, { - "tag": "FindAllTransactions", - "discriminant": 25, - "type": "FindAllTransactions" - }, + "name": "selector", + "type": "SelectorTuple" + } + ] + }, + "QueryWithFilter": { + "Struct": [ { - "tag": "FindTransactionsByAccountId", - "discriminant": 26, - "type": "FindTransactionsByAccountId" + "name": "query", + "type": "FindActiveTriggerIds" }, { - "tag": "FindTransactionByHash", - "discriminant": 27, - "type": "FindTransactionByHash" + "name": "predicate", + "type": "CompoundPredicate" }, { - "tag": "FindPermissionsByAccountId", - "discriminant": 28, - "type": "FindPermissionsByAccountId" - }, + "name": "selector", + "type": "SelectorTuple" + } + ] + }, + "QueryWithFilter": { + "Struct": [ { - "tag": "FindExecutorDataModel", - "discriminant": 29, - "type": "FindExecutorDataModel" + "name": "query", + "type": "FindAssets" }, { - "tag": "FindAllActiveTriggerIds", - "discriminant": 30, - "type": "FindAllActiveTriggerIds" + "name": "predicate", + "type": "CompoundPredicate" }, { - "tag": "FindTriggerById", - "discriminant": 31, - "type": "FindTriggerById" - }, + "name": "selector", + "type": "SelectorTuple" + } + ] + }, + "QueryWithFilter": { + "Struct": [ { - "tag": "FindTriggerKeyValueByIdAndKey", - "discriminant": 32, - "type": "FindTriggerKeyValueByIdAndKey" + "name": "query", + "type": "FindAssetsDefinitions" }, { - "tag": "FindTriggersByAuthorityId", - "discriminant": 33, - "type": "FindTriggersByAuthorityId" + "name": "predicate", + "type": "CompoundPredicate" }, { - "tag": "FindTriggersByAuthorityDomainId", - "discriminant": 34, - "type": "FindTriggersByAuthorityDomainId" - }, + "name": "selector", + "type": "SelectorTuple" + } + ] + }, + "QueryWithFilter": { + "Struct": [ { - "tag": "FindAllRoles", - "discriminant": 35, - "type": "FindAllRoles" + "name": "query", + "type": "FindBlockHeaders" }, { - "tag": "FindAllRoleIds", - "discriminant": 36, - "type": "FindAllRoleIds" + "name": "predicate", + "type": "CompoundPredicate" }, { - "tag": "FindRoleByRoleId", - "discriminant": 37, - "type": "FindRoleByRoleId" + "name": "selector", + "type": "SelectorTuple" + } + ] + }, + "QueryWithFilter": { + "Struct": [ + { + "name": "query", + "type": "FindBlocks" }, { - "tag": "FindRolesByAccountId", - "discriminant": 38, - "type": "FindRolesByAccountId" + "name": "predicate", + "type": "CompoundPredicate" }, { - "tag": "FindAllParameters", - "discriminant": 39, - "type": "FindAllParameters" + "name": "selector", + "type": "SelectorTuple" } ] }, - "QueryExecutionFail": { - "Enum": [ + "QueryWithFilter": { + "Struct": [ { - "tag": "Find", - "discriminant": 0, - "type": "FindError" + "name": "query", + "type": "FindDomains" }, { - "tag": "Conversion", - "discriminant": 1, - "type": "String" + "name": "predicate", + "type": "CompoundPredicate" }, { - "tag": "UnknownCursor", - "discriminant": 2 - }, + "name": "selector", + "type": "SelectorTuple" + } + ] + }, + "QueryWithFilter": { + "Struct": [ { - "tag": "FetchSizeTooBig", - "discriminant": 3 + "name": "query", + "type": "FindPeers" }, { - "tag": "InvalidSingularParameters", - "discriminant": 4 + "name": "predicate", + "type": "CompoundPredicate" }, { - "tag": "CapacityLimit", - "discriminant": 5 + "name": "selector", + "type": "SelectorTuple" } ] }, - "QueryOutputBox": { - "Enum": [ + "QueryWithFilter": { + "Struct": [ { - "tag": "Id", - "discriminant": 0, - "type": "IdBox" + "name": "query", + "type": "FindPermissionsByAccountId" }, { - "tag": "Identifiable", - "discriminant": 1, - "type": "IdentifiableBox" + "name": "predicate", + "type": "CompoundPredicate" }, { - "tag": "Transaction", - "discriminant": 2, - "type": "TransactionQueryOutput" - }, + "name": "selector", + "type": "SelectorTuple" + } + ] + }, + "QueryWithFilter": { + "Struct": [ { - "tag": "Permission", - "discriminant": 3, - "type": "Permission" + "name": "query", + "type": "FindRoleIds" }, { - "tag": "Parameters", - "discriminant": 4, - "type": "Parameters" + "name": "predicate", + "type": "CompoundPredicate" }, { - "tag": "Metadata", - "discriminant": 5, - "type": "JsonString" - }, + "name": "selector", + "type": "SelectorTuple" + } + ] + }, + "QueryWithFilter": { + "Struct": [ { - "tag": "Numeric", - "discriminant": 6, - "type": "Numeric" + "name": "query", + "type": "FindRoles" }, { - "tag": "BlockHeader", - "discriminant": 7, - "type": "BlockHeader" + "name": "predicate", + "type": "CompoundPredicate" }, { - "tag": "Block", - "discriminant": 8, - "type": "SignedBlock" + "name": "selector", + "type": "SelectorTuple" + } + ] + }, + "QueryWithFilter": { + "Struct": [ + { + "name": "query", + "type": "FindRolesByAccountId" }, { - "tag": "ExecutorDataModel", - "discriminant": 9, - "type": "ExecutorDataModel" + "name": "predicate", + "type": "CompoundPredicate" }, { - "tag": "Vec", - "discriminant": 10, - "type": "Vec" + "name": "selector", + "type": "SelectorTuple" } ] }, - "QueryOutputPredicate": { - "Enum": [ + "QueryWithFilter": { + "Struct": [ { - "tag": "Identifiable", - "discriminant": 0, - "type": "StringPredicate" + "name": "query", + "type": "FindTransactions" }, { - "tag": "Container", - "discriminant": 1, - "type": "Container" + "name": "predicate", + "type": "CompoundPredicate" }, { - "tag": "Display", - "discriminant": 2, - "type": "StringPredicate" + "name": "selector", + "type": "SelectorTuple" + } + ] + }, + "QueryWithFilter": { + "Struct": [ + { + "name": "query", + "type": "FindTriggers" }, { - "tag": "Numerical", - "discriminant": 3, - "type": "SemiRange" + "name": "predicate", + "type": "CompoundPredicate" }, { - "tag": "TimeStamp", - "discriminant": 4, - "type": "SemiInterval" + "name": "selector", + "type": "SelectorTuple" + } + ] + }, + "QueryWithParams": { + "Struct": [ + { + "name": "query", + "type": "QueryBox" }, { - "tag": "Pass", - "discriminant": 5 + "name": "params", + "type": "QueryParams" } ] }, - "QuerySignature": "SignatureOf", "RawGenesisTransaction": { "Struct": [ { @@ -3143,12 +4175,20 @@ }, { "name": "parameters", - "type": "Vec" + "type": "Option" }, { "name": "instructions", "type": "Vec" }, + { + "name": "wasm_dir", + "type": "String" + }, + { + "name": "wasm_triggers", + "type": "Vec" + }, { "name": "topology", "type": "Vec" @@ -3191,7 +4231,7 @@ "Struct": [ { "name": "object", - "type": "Peer" + "type": "PeerId" } ] }, @@ -3199,7 +4239,7 @@ "Struct": [ { "name": "object", - "type": "Role" + "type": "NewRole" } ] }, @@ -3498,63 +4538,109 @@ } ] }, - "RolePermissionChanged": { - "Struct": [ + "RoleIdPredicateAtom": { + "Enum": [ { - "name": "role", + "tag": "Equals", + "discriminant": 0, "type": "RoleId" + } + ] + }, + "RoleIdProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0, + "type": "RoleIdPredicateAtom" }, { - "name": "permission", - "type": "Permission" + "tag": "Name", + "discriminant": 1, + "type": "NameProjection" } ] }, - "Schedule": { - "Struct": [ + "RoleIdProjection": { + "Enum": [ { - "name": "start_ms", - "type": "u64" + "tag": "Atom", + "discriminant": 0 }, { - "name": "period_ms", - "type": "Option" + "tag": "Name", + "discriminant": 1, + "type": "NameProjection" } ] }, - "SemiInterval": { + "RolePermissionChanged": { "Struct": [ { - "name": "start", - "type": "Numeric" + "name": "role", + "type": "RoleId" }, { - "name": "limit", - "type": "Numeric" + "name": "permission", + "type": "Permission" } ] }, - "SemiInterval": { - "Struct": [ + "RolePredicateAtom": { + "Enum": [] + }, + "RoleProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0, + "type": "RolePredicateAtom" + }, + { + "tag": "Id", + "discriminant": 1, + "type": "RoleIdProjection" + } + ] + }, + "RoleProjection": { + "Enum": [ { - "name": "start", - "type": "u128" + "tag": "Atom", + "discriminant": 0 }, { - "name": "limit", - "type": "u128" + "tag": "Id", + "discriminant": 1, + "type": "RoleIdProjection" } ] }, - "SemiRange": { - "Enum": [ + "Schedule": { + "Struct": [ { - "tag": "Numeric", - "discriminant": 0, - "type": "SemiInterval" + "name": "start_ms", + "type": "u64" + }, + { + "name": "period_ms", + "type": "Option" } ] }, + "SelectorTuple": "Vec>", + "SelectorTuple": "Vec>", + "SelectorTuple": "Vec>", + "SelectorTuple": "Vec>", + "SelectorTuple": "Vec>", + "SelectorTuple": "Vec>", + "SelectorTuple": "Vec>", + "SelectorTuple": "Vec>", + "SelectorTuple": "Vec>", + "SelectorTuple": "Vec>", + "SelectorTuple": "Vec>", + "SelectorTuple": "Vec>", + "SelectorTuple": "Vec>", "SetKeyValue": { "Struct": [ { @@ -3567,7 +4653,7 @@ }, { "name": "value", - "type": "JsonString" + "type": "Json" } ] }, @@ -3583,7 +4669,7 @@ }, { "name": "value", - "type": "JsonString" + "type": "Json" } ] }, @@ -3599,7 +4685,7 @@ }, { "name": "value", - "type": "JsonString" + "type": "Json" } ] }, @@ -3615,7 +4701,7 @@ }, { "name": "value", - "type": "JsonString" + "type": "Json" } ] }, @@ -3631,7 +4717,7 @@ }, { "name": "value", - "type": "JsonString" + "type": "Json" } ] }, @@ -3674,7 +4760,7 @@ ] }, "SignatureOf": "Signature", - "SignatureOf": "Signature", + "SignatureOf": "Signature", "SignatureOf": "Signature", "SignedBlock": { "Enum": [ @@ -3685,6 +4771,36 @@ } ] }, + "SignedBlockPredicateAtom": { + "Enum": [] + }, + "SignedBlockProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0, + "type": "SignedBlockPredicateAtom" + }, + { + "tag": "Header", + "discriminant": 1, + "type": "BlockHeaderProjection" + } + ] + }, + "SignedBlockProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0 + }, + { + "tag": "Header", + "discriminant": 1, + "type": "BlockHeaderProjection" + } + ] + }, "SignedBlockV1": { "Struct": [ { @@ -3694,6 +4810,10 @@ { "name": "payload", "type": "BlockPayload" + }, + { + "name": "errors", + "type": "SortedMap" } ] }, @@ -3714,7 +4834,7 @@ }, { "name": "payload", - "type": "ClientQueryPayload" + "type": "QueryRequestWithAuthority" } ] }, @@ -3727,6 +4847,46 @@ } ] }, + "SignedTransactionPredicateAtom": { + "Enum": [] + }, + "SignedTransactionProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0, + "type": "SignedTransactionPredicateAtom" + }, + { + "tag": "Hash", + "discriminant": 1, + "type": "TransactionHashProjection" + }, + { + "tag": "Authority", + "discriminant": 2, + "type": "AccountIdProjection" + } + ] + }, + "SignedTransactionProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0 + }, + { + "tag": "Hash", + "discriminant": 1, + "type": "TransactionHashProjection" + }, + { + "tag": "Authority", + "discriminant": 2, + "type": "AccountIdProjection" + } + ] + }, "SignedTransactionV1": { "Struct": [ { @@ -3739,6 +4899,34 @@ } ] }, + "SingularQueryBox": { + "Enum": [ + { + "tag": "FindExecutorDataModel", + "discriminant": 0, + "type": "FindExecutorDataModel" + }, + { + "tag": "FindParameters", + "discriminant": 1, + "type": "FindParameters" + } + ] + }, + "SingularQueryOutputBox": { + "Enum": [ + { + "tag": "ExecutorDataModel", + "discriminant": 0, + "type": "ExecutorDataModel" + }, + { + "tag": "Parameters", + "discriminant": 1, + "type": "Parameters" + } + ] + }, "SmartContractParameter": { "Enum": [ { @@ -3820,18 +5008,33 @@ } ] }, + "SortedMap": { + "Map": { + "key": "AccountId", + "value": "u8" + } + }, "SortedMap": { "Map": { "key": "CustomParameterId", "value": "CustomParameter" } }, - "SortedMap": { + "SortedMap": { "Map": { "key": "Name", - "value": "JsonString" + "value": "Json" } }, + "SortedMap": { + "Map": { + "key": "u64", + "value": "TransactionRejectionReason" + } + }, + "SortedVec": { + "Vec": "AccountId" + }, "SortedVec": { "Vec": "Permission" }, @@ -3847,25 +5050,25 @@ ] }, "String": "String", - "StringPredicate": { + "StringPredicateAtom": { "Enum": [ { - "tag": "Contains", + "tag": "Equals", "discriminant": 0, "type": "String" }, { - "tag": "StartsWith", + "tag": "Contains", "discriminant": 1, "type": "String" }, { - "tag": "EndsWith", + "tag": "StartsWith", "discriminant": 2, "type": "String" }, { - "tag": "Is", + "tag": "EndsWith", "discriminant": 3, "type": "String" } @@ -3908,10 +5111,6 @@ }, "TimeEvent": { "Struct": [ - { - "name": "prev_interval", - "type": "Option" - }, { "name": "interval", "type": "TimeInterval" @@ -3931,6 +5130,31 @@ } ] }, + "TransactionErrorPredicateAtom": { + "Enum": [ + { + "tag": "IsSome", + "discriminant": 0 + } + ] + }, + "TransactionErrorProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0, + "type": "TransactionErrorPredicateAtom" + } + ] + }, + "TransactionErrorProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0 + } + ] + }, "TransactionEvent": { "Struct": [ { @@ -3963,6 +5187,32 @@ } ] }, + "TransactionHashPredicateAtom": { + "Enum": [ + { + "tag": "Equals", + "discriminant": 0, + "type": "HashOf" + } + ] + }, + "TransactionHashProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0, + "type": "TransactionHashPredicateAtom" + } + ] + }, + "TransactionHashProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0 + } + ] + }, "TransactionLimitError": { "Struct": [ { @@ -4029,18 +5279,6 @@ } ] }, - "TransactionQueryOutput": { - "Struct": [ - { - "name": "block_hash", - "type": "HashOf" - }, - { - "name": "transaction", - "type": "CommittedTransaction" - } - ] - }, "TransactionRejectionReason": { "Enum": [ { @@ -4321,6 +5559,42 @@ } ] }, + "TriggerIdPredicateAtom": { + "Enum": [ + { + "tag": "Equals", + "discriminant": 0, + "type": "TriggerId" + } + ] + }, + "TriggerIdProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0, + "type": "TriggerIdPredicateAtom" + }, + { + "tag": "Name", + "discriminant": 1, + "type": "NameProjection" + } + ] + }, + "TriggerIdProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0 + }, + { + "tag": "Name", + "discriminant": 1, + "type": "NameProjection" + } + ] + }, "TriggerNumberOfExecutionsChanged": { "Struct": [ { @@ -4333,6 +5607,46 @@ } ] }, + "TriggerPredicateAtom": { + "Enum": [] + }, + "TriggerProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0, + "type": "TriggerPredicateAtom" + }, + { + "tag": "Id", + "discriminant": 1, + "type": "TriggerIdProjection" + }, + { + "tag": "Action", + "discriminant": 2, + "type": "ActionProjection" + } + ] + }, + "TriggerProjection": { + "Enum": [ + { + "tag": "Atom", + "discriminant": 0 + }, + { + "tag": "Id", + "discriminant": 1, + "type": "TriggerIdProjection" + }, + { + "tag": "Action", + "discriminant": 2, + "type": "ActionProjection" + } + ] + }, "TypeError": { "Enum": [ { @@ -4477,32 +5791,188 @@ } ] }, + "Vec": { + "Vec": "Account" + }, + "Vec": { + "Vec": "AccountId" + }, + "Vec>": { + "Vec": "AccountProjection" + }, + "Vec": { + "Vec": "Action" + }, + "Vec": { + "Vec": "Asset" + }, + "Vec": { + "Vec": "AssetDefinition" + }, + "Vec": { + "Vec": "AssetDefinitionId" + }, + "Vec>": { + "Vec": "AssetDefinitionProjection" + }, + "Vec": { + "Vec": "AssetId" + }, + "Vec>": { + "Vec": "AssetProjection" + }, + "Vec": { + "Vec": "AssetValue" + }, + "Vec": { + "Vec": "BlockHeader" + }, + "Vec>": { + "Vec": "BlockHeaderProjection" + }, "Vec": { "Vec": "BlockSignature" }, "Vec": { "Vec": "CommittedTransaction" }, - "Vec": { - "Vec": "EventBox" + "Vec>": { + "Vec": "CommittedTransactionProjection" + }, + "Vec>": { + "Vec": "CompoundPredicate" + }, + "Vec>": { + "Vec": "CompoundPredicate" + }, + "Vec>": { + "Vec": "CompoundPredicate" + }, + "Vec>": { + "Vec": "CompoundPredicate" + }, + "Vec>": { + "Vec": "CompoundPredicate" + }, + "Vec>": { + "Vec": "CompoundPredicate" + }, + "Vec>": { + "Vec": "CompoundPredicate" + }, + "Vec>": { + "Vec": "CompoundPredicate" + }, + "Vec>": { + "Vec": "CompoundPredicate" + }, + "Vec>": { + "Vec": "CompoundPredicate" + }, + "Vec>": { + "Vec": "CompoundPredicate" + }, + "Vec>": { + "Vec": "CompoundPredicate" + }, + "Vec>": { + "Vec": "CompoundPredicate" + }, + "Vec": { + "Vec": "Domain" + }, + "Vec": { + "Vec": "DomainId" + }, + "Vec>": { + "Vec": "DomainProjection" }, "Vec": { "Vec": "EventFilterBox" }, - "Vec>": { - "Vec": "GenericPredicateBox" + "Vec": { + "Vec": "GenesisWasmTrigger" + }, + "Vec>": { + "Vec": "HashOf" + }, + "Vec>": { + "Vec": "HashOf" }, "Vec": { "Vec": "InstructionBox" }, + "Vec": { + "Vec": "Json" + }, + "Vec": { + "Vec": "Metadata" + }, + "Vec": { + "Vec": "Name" + }, + "Vec": { + "Vec": "Numeric" + }, + "Vec>": { + "Vec": "Option" + }, "Vec": { "Vec": "Parameter" }, "Vec": { "Vec": "PeerId" }, - "Vec": { - "Vec": "QueryOutputBox" + "Vec>": { + "Vec": "PeerIdProjection" + }, + "Vec": { + "Vec": "Permission" + }, + "Vec>": { + "Vec": "PermissionProjection" + }, + "Vec": { + "Vec": "PublicKey" + }, + "Vec": { + "Vec": "QueryOutputBatchBox" + }, + "Vec": { + "Vec": "Role" + }, + "Vec": { + "Vec": "RoleId" + }, + "Vec>": { + "Vec": "RoleIdProjection" + }, + "Vec>": { + "Vec": "RoleProjection" + }, + "Vec": { + "Vec": "SignedBlock" + }, + "Vec>": { + "Vec": "SignedBlockProjection" + }, + "Vec": { + "Vec": "SignedTransaction" + }, + "Vec": { + "Vec": "String" + }, + "Vec": { + "Vec": "Trigger" + }, + "Vec": { + "Vec": "TriggerId" + }, + "Vec>": { + "Vec": "TriggerIdProjection" + }, + "Vec>": { + "Vec": "TriggerProjection" }, "Vec": { "Vec": "u8" @@ -4516,9 +5986,7 @@ ] }, "WasmSmartContract": "Vec", - "u128": { - "Int": "FixedWidth" - }, + "bool": "bool", "u16": { "Int": "FixedWidth" }, @@ -4531,4 +5999,4 @@ "u8": { "Int": "FixedWidth" } -} \ No newline at end of file +} diff --git a/modules/model/build.gradle b/modules/model/build.gradle index e8eba0fc6..0c859ef9c 100644 --- a/modules/model/build.gradle +++ b/modules/model/build.gradle @@ -1,3 +1,12 @@ +dependencies { + implementation "com.fasterxml.jackson.module:jackson-module-kotlin:$jacksonKotlinVer" + + // crypto + implementation "com.github.multiformats:java-multihash:$multihashVersion" + implementation "org.bouncycastle:bcprov-jdk15on:$bouncyCastleVer" + api "net.i2p.crypto:eddsa:$i2pCryptoEddsa" +} + jacocoTestReport { mustRunAfter(":admin-client:jacocoTestReport") mustRunAfter(":block:jacocoTestReport") diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/Comparators.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/Comparators.kt index ca4855f18..9323de29c 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/Comparators.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/Comparators.kt @@ -27,29 +27,32 @@ fun Name.Companion.comparator() = compareBy { it.string } * Compare account IDs */ @JvmName("AccountIdComparator") -fun AccountId.Companion.comparator() = compareBy { it.domain.name.string }.thenComparator { o1, o2 -> - PublicKey.comparator().compare(o1.signatory, o2.signatory) -} +fun AccountId.Companion.comparator() = + compareBy { it.domain.name.string }.thenComparator { o1, o2 -> + PublicKey.comparator().compare(o1.signatory, o2.signatory) + } /** * Compare asset definition IDs */ @JvmName("AssetDefinitionIdComparator") -fun AssetDefinitionId.Companion.comparator() = compareBy { it.name.string } - .thenBy { it.domain.name.string } +fun AssetDefinitionId.Companion.comparator() = + compareBy { it.name.string } + .thenBy { it.domain.name.string } /** * Compare asset IDs */ @JvmName("AssetIdComparator") -fun AssetId.Companion.comparator() = Comparator { o1, o2 -> - AssetDefinitionId.comparator().compare( - o1.definition, - o2.definition, - ) -}.thenComparator { o1, o2 -> - AccountId.comparator().compare(o1.account, o2.account) -} +fun AssetId.Companion.comparator() = + Comparator { o1, o2 -> + AssetDefinitionId.comparator().compare( + o1.definition, + o2.definition, + ) + }.thenComparator { o1, o2 -> + AccountId.comparator().compare(o1.account, o2.account) + } /** * Compare role IDs @@ -61,52 +64,59 @@ fun RoleId.Companion.comparator() = compareBy { it.name.string } * Compare public keys */ @JvmName("PublicKeyComparator") -fun PublicKey.Companion.comparator() = Comparator { o1, o2 -> - ByteArray::class.comparator().compare(o1.payload, o2.payload) -} +fun PublicKey.Companion.comparator() = + Comparator { o1, o2 -> + ByteArray::class.comparator().compare(o1.payload, o2.payload) + } /** * Compare signatures */ @JvmName("SignatureOfComparator") -fun SignatureOf.Companion.comparator() = Comparator> { o1, o2 -> - ByteArray::class.comparator().compare( - o1.signature.payload, - o2.signature.payload, - ) -} +fun SignatureOf.Companion.comparator() = + Comparator> { o1, o2 -> + ByteArray::class.comparator().compare( + o1.signature.payload, + o2.signature.payload, + ) + } /** * Compare permissions */ @JvmName("PermissionComparator") -fun Permission.Companion.comparator() = compareBy { - it.name -}.thenComparator { o1, o2 -> - o1.payload?.compareTo(o2.payload ?: "") ?: 0 -} +fun Permission.Companion.comparator() = + compareBy { + it.name + }.thenComparator { o1, o2 -> + o1.payload.string.compareTo(o2.payload.string) + } /** * Compare custom parameter ID */ @JvmName("CustomParameterIdComparator") -fun CustomParameterId.Companion.comparator() = compareBy { - it.name.string -} - -private fun KClass.comparator() = Comparator { o1, o2 -> - if (o1.size != o2.size) { - throw ComparisonException("Unexpected payload length") +fun CustomParameterId.Companion.comparator() = + compareBy { + it.name.string } - o1.forEachIndexed { index, b1 -> - val result = b1.compareTo(o2[index]) - if (result != 0) return@Comparator result +private fun KClass.comparator() = + Comparator { o1, o2 -> + if (o1.size != o2.size) { + throw ComparisonException("Unexpected payload length") + } + + o1.forEachIndexed { index, b1 -> + val result = b1.compareTo(o2[index]) + if (result != 0) return@Comparator result + } + return@Comparator 0 } - return@Comparator 0 -} /** * Throw if an exception occurs during comparison */ -class ComparisonException(message: String) : RuntimeException(message) +class ComparisonException( + message: String, +) : RuntimeException(message) diff --git a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/Constants.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/Constants.kt similarity index 100% rename from modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/Constants.kt rename to modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/Constants.kt diff --git a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/Crypto.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/Crypto.kt similarity index 62% rename from modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/Crypto.kt rename to modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/Crypto.kt index 00d5af4ea..c4dcf6a9a 100644 --- a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/Crypto.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/Crypto.kt @@ -17,7 +17,10 @@ import java.security.SecureRandom @JvmField val DEFAULT_SPEC: EdDSANamedCurveSpec = EdDSANamedCurveTable.getByName(EdDSANamedCurveTable.ED_25519) -enum class DigestFunction(val hashFunName: String, val index: Int) { +enum class DigestFunction( + val hashFunName: String, + val index: Int, +) { Ed25519("ed25519", 0xed), } @@ -27,8 +30,8 @@ enum class DigestFunction(val hashFunName: String, val index: Int) { * @throws CryptoException if key-pair cannot be generated */ @JvmOverloads -fun generateKeyPair(spec: EdDSAParameterSpec = DEFAULT_SPEC): KeyPair { - return try { +fun generateKeyPair(spec: EdDSAParameterSpec = DEFAULT_SPEC): KeyPair = + try { val seed = ByteArray(spec.curve.field.getb() / 8) SecureRandom().nextBytes(seed) @@ -41,12 +44,9 @@ fun generateKeyPair(spec: EdDSAParameterSpec = DEFAULT_SPEC): KeyPair { } catch (ex: Exception) { throw CryptoException("Cannot generate a key pair", ex) } -} @JvmOverloads -fun generatePublicKey( - spec: EdDSAParameterSpec = DEFAULT_SPEC, -): PublicKey = generateKeyPair(spec).public.toIrohaPublicKey() +fun generatePublicKey(spec: EdDSAParameterSpec = DEFAULT_SPEC): PublicKey = generateKeyPair(spec).public.toIrohaPublicKey() /** * Create ED25519 key-pair from given hex of the public and private key @@ -54,8 +54,11 @@ fun generatePublicKey( * @throws CryptoException if key-pair cannot be created */ @JvmOverloads -fun keyPairFromHex(publicKeyHex: String, privateKeyHex: String, spec: EdDSAParameterSpec = DEFAULT_SPEC) = - KeyPair(publicKeyFromHex(publicKeyHex, spec), privateKeyFromHex(privateKeyHex, spec)) +fun keyPairFromHex( + publicKeyHex: String, + privateKeyHex: String, + spec: EdDSAParameterSpec = DEFAULT_SPEC, +) = KeyPair(publicKeyFromHex(publicKeyHex, spec), privateKeyFromHex(privateKeyHex, spec)) /** * Create ED25519 private key from a given hex @@ -63,12 +66,14 @@ fun keyPairFromHex(publicKeyHex: String, privateKeyHex: String, spec: EdDSAParam * @throws CryptoException if key cannot be created from hex */ @JvmOverloads -fun privateKeyFromHex(privateKeyHex: String, spec: EdDSAParameterSpec = DEFAULT_SPEC) = - try { - EdDSAPrivateKey(EdDSAPrivateKeySpec(privateKeyHex.fromHex(), spec)) - } catch (ex: Exception) { - throw CryptoException("Cannot create a private key from hex `$privateKeyHex`", ex) - } +fun privateKeyFromHex( + privateKeyHex: String, + spec: EdDSAParameterSpec = DEFAULT_SPEC, +) = try { + EdDSAPrivateKey(EdDSAPrivateKeySpec(privateKeyHex.fromHex(), spec)) +} catch (ex: Exception) { + throw CryptoException("Cannot create a private key from hex `$privateKeyHex`", ex) +} /** * Create ED25519 public key from a given hex @@ -76,15 +81,17 @@ fun privateKeyFromHex(privateKeyHex: String, spec: EdDSAParameterSpec = DEFAULT_ * @throws CryptoException if key cannot be created from hex */ @JvmOverloads -fun publicKeyFromHex(publicKeyHex: String, spec: EdDSAParameterSpec = DEFAULT_SPEC) = - try { - when (publicKeyHex.startsWith("ed0120")) { - true -> EdDSAPublicKey(EdDSAPublicKeySpec(publicKeyHex.drop(6).fromHex(), spec)) - false -> EdDSAPublicKey(EdDSAPublicKeySpec(publicKeyHex.fromHex(), spec)) - } - } catch (ex: Exception) { - throw CryptoException("Cannot create a public key from hex `$publicKeyHex`", ex) +fun publicKeyFromHex( + publicKeyHex: String, + spec: EdDSAParameterSpec = DEFAULT_SPEC, +) = try { + when (publicKeyHex.startsWith("ed0120")) { + true -> EdDSAPublicKey(EdDSAPublicKeySpec(publicKeyHex.drop(6).fromHex(), spec)) + false -> EdDSAPublicKey(EdDSAPublicKeySpec(publicKeyHex.fromHex(), spec)) } +} catch (ex: Exception) { + throw CryptoException("Cannot create a public key from hex `$publicKeyHex`", ex) +} /** * Return encoded representation of the key, which may be different from `java.security.Key.getEncoded()`. @@ -97,10 +104,25 @@ fun publicKeyFromHex(publicKeyHex: String, spec: EdDSAParameterSpec = DEFAULT_SP * @see java.security.Key.getFormat * @return bytes Encoding of the key (empty if encoding is not supported) */ -fun Key.bytes(): ByteArray { - return when (this) { +fun Key.bytes(): ByteArray = + when (this) { is EdDSAPublicKey -> abyte is EdDSAPrivateKey -> seed else -> this.encoded ?: ByteArray(0) } -} + +/** + * Throw if there is an exception related to cryptography + */ +class CryptoException( + message: String? = null, + cause: Throwable? = null, +) : IrohaSdkException(message, cause) + +/** + * Throw if there is an exception during hex encoding/decoding + */ +class HexCodecException( + message: String? = null, + cause: Throwable? = null, +) : IrohaSdkException(message, cause) diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/Exceptions.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/Exceptions.kt index 36e2b2260..07e7ce453 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/Exceptions.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/Exceptions.kt @@ -3,14 +3,41 @@ package jp.co.soramitsu.iroha2 /** * Top-level error that can be thrown by the client */ -open class IrohaSdkException(message: String? = null, cause: Throwable? = null) : Exception(message, cause) +open class IrohaSdkException( + message: String? = null, + cause: Throwable? = null, +) : Exception(message, cause) /** * Throw if there is an exception during scale encoding/decoding */ -class ScaleCodecException(message: String? = null, cause: Throwable? = null) : IrohaSdkException(message, cause) +class ScaleCodecException( + message: String? = null, + cause: Throwable? = null, +) : IrohaSdkException(message, cause) /** * Throw if there is an exception during conversion from or into a fixed-point number */ -class FixedPointConversionException(message: String? = null, cause: Throwable? = null) : IrohaSdkException(message, cause) +class FixedPointConversionException( + message: String? = null, + cause: Throwable? = null, +) : IrohaSdkException(message, cause) + +/** + * Throw if there is an issue with deserialization. + * + * @param message The explanation of the issue + */ +class DeserializationException( + message: String, +) : RuntimeException(message) + +/** + * Throw if there is an issue with serialization + * + * @param message The explanation of the issue + */ +class SerializationException( + message: String, +) : RuntimeException(message) diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/Extensions.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/Extensions.kt new file mode 100644 index 000000000..c3a8a56e7 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/Extensions.kt @@ -0,0 +1,440 @@ +@file:Suppress("ktlint:standard:no-wildcard-imports") + +package jp.co.soramitsu.iroha2 + +import com.fasterxml.jackson.module.kotlin.readValue +import jp.co.soramitsu.iroha2.generated.* +import net.i2p.crypto.eddsa.EdDSAEngine +import org.bouncycastle.jcajce.provider.digest.Blake2b +import org.bouncycastle.util.encoders.Hex +import java.math.BigDecimal +import java.math.BigInteger +import java.security.MessageDigest +import java.security.PrivateKey +import java.security.PublicKey +import kotlin.experimental.or +import jp.co.soramitsu.iroha2.generated.PublicKey as IrohaPublicKey + +fun BlockSubscriptionRequest.Companion.of(from: Long) = BlockSubscriptionRequest(NonZeroOfu64(BigInteger.valueOf(from))) + +fun Signature.asSignatureOf() = SignatureOf(this) + +fun String.asAccountId() = + this + .split(ACCOUNT_ID_DELIMITER) + .takeIf { + it.size == 2 + }?.let { parts -> + AccountId(parts[1].asDomainId(), publicKeyFromHex(parts[0]).toIrohaPublicKey()) + } ?: throw IllegalArgumentException("Incorrect account ID: $this") + +fun String.asAssetDefinitionId() = + this + .split(ASSET_ID_DELIMITER) + .takeIf { + it.size == 2 + }?.let { parts -> + AssetDefinitionId(parts[1].asDomainId(), parts[0].asName()) + } ?: throw IllegalArgumentException("Incorrect asset definition ID: $this") + +fun String.asAssetId() = + this + .split(ASSET_ID_DELIMITER) + .takeIf { + it.size == 3 + }?.let { parts -> + parts[2].asAccountId().let { accountId -> + val domainId = parts[1].takeIf { it.isNotBlank() }?.asDomainId() + + AssetId( + accountId, + AssetDefinitionId( + domainId ?: accountId.domain, + parts[0].asName(), + ), + ) + } + } ?: throw IllegalArgumentException("Incorrect asset ID: $this") + +fun String.asDomainId() = DomainId(Name(this)) + +fun String.asRoleId() = RoleId(Name(this)) + +fun String.asName() = Name(this) + +fun ByteArray.toHex(withPrefix: Boolean = false): String = + try { + val prefix = + when (withPrefix) { + true -> "ed0120" + false -> "" + } + "${prefix}${Hex.toHexString(this)}" + } catch (ex: Exception) { + throw HexCodecException("Cannot encode to hex string", ex) + } + +fun String.fromHex(): ByteArray = + try { + Hex.decode(this) + } catch (ex: Exception) { + throw HexCodecException("Cannot decode from hex string `$this`", ex) + } + +/** + * Convert a public key to an Iroha public key + */ +fun PublicKey.toIrohaPublicKey(): IrohaPublicKey = IrohaPublicKey(Algorithm.Ed25519(), this.bytes()) + +/** + * Sign the [message] using the given private key + * + * Note: the message must not be prehashed + */ +fun PrivateKey.signAs(message: ByteArray): ByteArray = + try { + val sgr = EdDSAEngine(MessageDigest.getInstance(DEFAULT_SPEC.hashAlgorithm)) + sgr.initSign(this) + sgr.update(message.hash()) + sgr.sign() + } catch (ex: Exception) { + throw CryptoException("Cannot sign message", ex) + } + +/** + * Verify the [signature] against the [message] and the given public key + * + * Note: the message must not be prehashed + */ +fun PublicKey.verify( + signature: ByteArray, + message: ByteArray, +): Boolean = + try { + val sgr = EdDSAEngine(MessageDigest.getInstance(DEFAULT_SPEC.hashAlgorithm)) + sgr.initVerify(this) + sgr.update(message.hash()) + sgr.verify(signature) + } catch (ex: Exception) { + throw CryptoException("Cannot verify message", ex) + } + +fun ByteArray.toIrohaHash(): Hash { + if (this.size != 32) throw IrohaSdkException("Hash byte array size must be 32") + + this[31] = this[31] or 1 + return Hash(this) +} + +fun ByteArray.asHashOf() = HashOf(this.toIrohaHash()) + +fun ByteArray.hash(): ByteArray { + val bytes = Blake2b.Blake2b256().digest(this) + bytes[bytes.size - 1] = bytes[bytes.size - 1] or 1 + return bytes +} + +/** + * Hash the given versioned transaction. Maintains only `VersionedTransaction.V1` + */ +fun SignedTransaction.hash() = SignedTransaction.encode(this).hash() + +/** + * Cast to another type + */ +inline fun Any.cast(): B = + this as? B + ?: throw ClassCastException("Could not cast `${this::class.qualifiedName}` to `${B::class.qualifiedName}`") + +fun AssetId.asString(withPrefix: Boolean = true) = this.definition.asString() + ASSET_ID_DELIMITER + this.account.asString(withPrefix) + +fun AssetDefinitionId.asString() = this.name.string + ASSET_ID_DELIMITER + this.domain.name.string + +fun AccountId.asString(withPrefix: Boolean = true) = + this.signatory.payload.toHex(withPrefix) + + ACCOUNT_ID_DELIMITER + this.domain.name.string + +inline fun Json.readValue(): T = JSON_SERDE.readValue(this.string) + +fun Json.Companion.writeValue(value: V): Json { + val value = JSON_SERDE.writeValueAsString(value) + + if (value == "{ }") { + return Json("null") + } + + return Json(value) +} + +fun DomainId.asString() = this.name.string + +fun RoleId.asString() = this.name.string + +fun SocketAddr.asString() = + when (this) { + is SocketAddr.Host -> this.socketAddrHost.let { "${it.host}:${it.port}" } + is SocketAddr.Ipv4 -> this.socketAddrV4.let { "${it.ip}:${it.port}" } + is SocketAddr.Ipv6 -> this.socketAddrV6.let { "${it.ip}:${it.port}" } + } + +fun TriggerId.asString() = this.name.string + +fun Metadata.merge(extra: Metadata) = + Metadata( + this.sortedMapOfName.toMutableMap().also { it.putAll(extra.sortedMapOfName) }, + ) + +fun Iterable.extractRegisterBoxes() = + this + .asSequence() + .filterIsInstance() + .map { it.registerBox } + +fun IdBox.extractId(): Any = + when (this) { + is IdBox.RoleId -> this.roleId + is IdBox.AccountId -> this.accountId + is IdBox.AssetId -> this.assetId + is IdBox.AssetDefinitionId -> this.assetDefinitionId + is IdBox.DomainId -> this.domainId + is IdBox.TriggerId -> this.triggerId + is IdBox.PeerId -> this.peerId + is IdBox.CustomParameterId -> this.customParameterId + is IdBox.Permission -> this.permission + } + +fun InstructionBox.extractAccount() = + this + .cast() + .registerBox + .cast() + .registerOfAccount.`object` + +fun InstructionBox.Register.extractAccount() = + this + .registerBox + .cast() + .registerOfAccount.`object` + +fun InstructionBox.Register.extractDomain() = + this + .cast() + .registerBox + .cast() + .registerOfDomain.`object` + +fun InstructionBox.Register.extractAssetDefinition() = + this + .cast() + .registerBox + .cast() + .registerOfAssetDefinition.`object` + +inline fun SignedTransaction.extractInstruction(): I = + this + .cast() + .extractInstruction() + +inline fun SignedTransaction.V1.extractInstruction() = + this + .extractInstructionVec() + .first() + .cast() + +inline fun SignedTransaction.V1.extractInstructions() = + this + .extractInstructionVec() + .cast>() + +inline fun SignedTransaction.V1.extractInstructionVec() = + this + .signedTransactionV1.payload.instructions + .cast() + .vec + .filterIsInstance() + +fun InstructionBox.SetKeyValue.extractDomainId() = + this + .cast() + .setKeyValueBox + .cast() + .setKeyValueOfDomain + .`object` + +fun InstructionBox.Grant.extractValuePermissionToken() = + this + .cast() + .grantBox + .cast() + .grantOfPermissionAndAccount + .`object` + +fun EventFilterBox.extractSchedule() = + this + .cast() + .timeEventFilter.executionTime + .cast() + .schedule + +fun BlockMessage.extractBlock() = + this.signedBlock + .cast() + .signedBlockV1.payload + +fun BlockPayload.height() = this.header.height + +fun Asset.metadata() = + this.value + .cast() + .metadata.sortedMapOfName + +fun String.toSocketAddr() = + this.split(":").let { parts -> + if (parts.size != 2) throw IrohaSdkException("Incorrect address") + + SocketAddr.Host(SocketAddrHost(parts.first(), parts.last().toInt())) + } + +fun FindError.extract() = + when (this) { + is FindError.Account -> this.accountId.asString() + is FindError.Asset -> this.assetId.asString() + is FindError.AssetDefinition -> this.assetDefinitionId.asString() + is FindError.Domain -> this.domainId.asString() + is FindError.Role -> this.roleId.asString() + is FindError.Block -> + this.hashOf.hash.arrayOfU8 + .toHex() + is FindError.MetadataKey -> this.name.string + is FindError.Peer -> this.peerId.toString() + is FindError.Permission -> this.permission.name + is FindError.PublicKey -> this.publicKey.payload.toString() + is FindError.Trigger -> this.triggerId.asString() + is FindError.Transaction -> + this.hashOf.hash.arrayOfU8 + .toHex() + } + +fun Number.asNumeric() = + when (this) { + is Int -> this.asNumeric() + is Long -> this.asNumeric() + is BigInteger -> this.asNumeric() + is Double -> this.asNumeric() + is BigDecimal -> this.asNumeric() + else -> throw IrohaSdkException("Unexpected type to extract numeric ${this::class}") + } + +fun String.asNumeric() = Numeric(mantissa = this.toBigInteger(), scale = 0) + +fun Int.asNumeric() = Numeric(mantissa = this.toBigInteger(), scale = 0) + +fun Long.asNumeric() = Numeric(mantissa = this.toBigInteger(), scale = 0) + +fun BigInteger.asNumeric() = Numeric(mantissa = this, scale = 0) + +fun Double.asNumeric() = this.toBigDecimal().asNumeric() + +fun BigDecimal.asNumeric() = Numeric(mantissa = this.unscaledValue(), scale = this.scale().toLong()) + +fun Numeric.asInt() = this.mantissa.toInt() + +fun Numeric.asLong() = this.mantissa.toLong() + +fun Numeric.asBigInteger() = this.mantissa + +fun Numeric.asBigDecimal() = BigDecimal.valueOf(this.mantissa.toLong(), this.scale.toInt()) + +fun Numeric.asNumber() = + when (this.scale) { + 0L -> this.mantissa + else -> this.asBigDecimal() + } + +fun Numeric.asString() = this.asNumber().toString() + +fun AssetType.Companion.numeric(scale: Long? = null) = AssetType.Numeric(NumericSpec(scale)) + +fun RegisterOfPeer.asInstructionBoxExt() = InstructionBox.Register(RegisterBox.Peer(this)) + +fun RegisterOfDomain.asInstructionBoxExt() = InstructionBox.Register(RegisterBox.Domain(this)) + +fun RegisterOfAssetDefinition.asInstructionBoxExt() = InstructionBox.Register(RegisterBox.AssetDefinition(this)) + +fun RegisterOfAccount.asInstructionBoxExt() = InstructionBox.Register(RegisterBox.Account(this)) + +fun RegisterOfAsset.asInstructionBoxExt() = InstructionBox.Register(RegisterBox.Asset(this)) + +fun RegisterOfRole.asInstructionBoxExt() = InstructionBox.Register(RegisterBox.Role(this)) + +fun RegisterOfTrigger.asInstructionBoxExt() = InstructionBox.Register(RegisterBox.Trigger(this)) + +fun UnregisterOfPeer.asInstructionBoxExt() = InstructionBox.Unregister(UnregisterBox.Peer(this)) + +fun UnregisterOfDomain.asInstructionBoxExt() = InstructionBox.Unregister(UnregisterBox.Domain(this)) + +fun UnregisterOfAssetDefinition.asInstructionBoxExt() = InstructionBox.Unregister(UnregisterBox.AssetDefinition(this)) + +fun UnregisterOfAccount.asInstructionBoxExt() = InstructionBox.Unregister(UnregisterBox.Account(this)) + +fun UnregisterOfAsset.asInstructionBoxExt() = InstructionBox.Unregister(UnregisterBox.Asset(this)) + +fun UnregisterOfRole.asInstructionBoxExt() = InstructionBox.Unregister(UnregisterBox.Role(this)) + +fun UnregisterOfTrigger.asInstructionBoxExt() = InstructionBox.Unregister(UnregisterBox.Trigger(this)) + +fun SetKeyValueOfDomain.asInstructionBoxExt() = InstructionBox.SetKeyValue(SetKeyValueBox.Domain(this)) + +fun SetKeyValueOfAssetDefinition.asInstructionBoxExt() = InstructionBox.SetKeyValue(SetKeyValueBox.AssetDefinition(this)) + +fun SetKeyValueOfAccount.asInstructionBoxExt() = InstructionBox.SetKeyValue(SetKeyValueBox.Account(this)) + +fun SetKeyValueOfAsset.asInstructionBoxExt() = InstructionBox.SetKeyValue(SetKeyValueBox.Asset(this)) + +fun SetKeyValueOfTrigger.asInstructionBoxExt() = InstructionBox.SetKeyValue(SetKeyValueBox.Trigger(this)) + +fun RemoveKeyValueOfDomain.asInstructionBoxExt() = InstructionBox.RemoveKeyValue(RemoveKeyValueBox.Domain(this)) + +fun RemoveKeyValueOfAssetDefinition.asInstructionBoxExt() = InstructionBox.RemoveKeyValue(RemoveKeyValueBox.AssetDefinition(this)) + +fun RemoveKeyValueOfAccount.asInstructionBoxExt() = InstructionBox.RemoveKeyValue(RemoveKeyValueBox.Account(this)) + +fun RemoveKeyValueOfAsset.asInstructionBoxExt() = InstructionBox.RemoveKeyValue(RemoveKeyValueBox.Asset(this)) + +fun RemoveKeyValueOfTrigger.asInstructionBoxExt() = InstructionBox.RemoveKeyValue(RemoveKeyValueBox.Trigger(this)) + +fun MintOfNumericAndAsset.asInstructionBoxExt() = InstructionBox.Mint(MintBox.Asset(this)) + +fun MintOfu32AndTrigger.asInstructionBoxExt() = InstructionBox.Mint(MintBox.TriggerRepetitions(this)) + +fun BurnOfNumericAndAsset.asInstructionBoxExt() = InstructionBox.Burn(BurnBox.Asset(this)) + +fun BurnOfu32AndTrigger.asInstructionBoxExt() = InstructionBox.Burn(BurnBox.TriggerRepetitions(this)) + +fun TransferOfAccountAndDomainIdAndAccount.asInstructionBoxExt() = InstructionBox.Transfer(TransferBox.Domain(this)) + +fun TransferOfAccountAndAssetDefinitionIdAndAccount.asInstructionBoxExt() = InstructionBox.Transfer(TransferBox.AssetDefinition(this)) + +fun TransferOfAssetAndNumericAndAccount.asInstructionBoxExt() = InstructionBox.Transfer(TransferBox.Asset(AssetTransferBox.Numeric(this))) + +fun TransferOfAssetAndMetadataAndAccount.asInstructionBoxExt() = InstructionBox.Transfer(TransferBox.Asset(AssetTransferBox.Store(this))) + +fun GrantOfPermissionAndAccount.asInstructionBoxExt() = InstructionBox.Grant(GrantBox.Permission(this)) + +fun GrantOfRoleIdAndAccount.asInstructionBoxExt() = InstructionBox.Grant(GrantBox.Role(this)) + +fun GrantOfPermissionAndRole.asInstructionBoxExt() = InstructionBox.Grant(GrantBox.RolePermission(this)) + +fun RevokeOfPermissionAndAccount.asInstructionBoxExt() = InstructionBox.Revoke(RevokeBox.Permission(this)) + +fun RevokeOfRoleIdAndAccount.asInstructionBoxExt() = InstructionBox.Revoke(RevokeBox.Role(this)) + +fun RevokeOfPermissionAndRole.asInstructionBoxExt() = InstructionBox.Revoke(RevokeBox.RolePermission(this)) + +fun ExecuteTrigger.asInstructionBoxExt() = InstructionBox.ExecuteTrigger(this) + +fun Upgrade.asInstructionBoxExt() = InstructionBox.Upgrade(this) + +fun SetParameter.asInstructionBoxExt() = InstructionBox.SetParameter(this) + +fun I.asInstructionBoxExt() = InstructionBox.Custom(CustomInstruction(Json.writeValue(this))) diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/Fixnum.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/Fixnum.kt index 8dc54d63f..4e8bc30d5 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/Fixnum.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/Fixnum.kt @@ -43,33 +43,35 @@ val POWERS_OF_10: Array by lazy { * * @see https://github.com/loyd/fixnum/blob/77860b04eb53a2e001b3b97fe3601833e18b01b9/src/lib.rs#L581 */ -fun BigInteger.fromFixedPoint(scale: Int = DEFAULT_SCALE): BigDecimal = try { - BigDecimal(this) - .divide(BigDecimal(POWERS_OF_10[scale])) - .stripTrailingZeros() -} catch (ex: Exception) { - throw FixedPointConversionException("Could not convert from fixed point", ex) -} +fun BigInteger.fromFixedPoint(scale: Int = DEFAULT_SCALE): BigDecimal = + try { + BigDecimal(this) + .divide(BigDecimal(POWERS_OF_10[scale])) + .stripTrailingZeros() + } catch (ex: Exception) { + throw FixedPointConversionException("Could not convert from fixed point", ex) + } /** * Convert [BigDecimal] to a fixed-point number * * @see https://github.com/loyd/fixnum/blob/77860b04eb53a2e001b3b97fe3601833e18b01b9/src/lib.rs#L688 */ -fun BigDecimal.toFixedPoint(scale: Int = DEFAULT_SCALE): BigInteger = try { - val thisZeroStripped = this.stripTrailingZeros() - if (thisZeroStripped.scale() > scale) { - throw FixedPointConversionException( - "Scale of the original floating point number is ${thisZeroStripped.scale()}" + - " and it is greater than fixed point number scale: $scale. Need to decrease scale of the original floating point", - ) +fun BigDecimal.toFixedPoint(scale: Int = DEFAULT_SCALE): BigInteger = + try { + val thisZeroStripped = this.stripTrailingZeros() + if (thisZeroStripped.scale() > scale) { + throw FixedPointConversionException( + "Scale of the original floating point number is ${thisZeroStripped.scale()}" + + " and it is greater than fixed point number scale: $scale. Need to decrease scale of the original floating point", + ) + } + thisZeroStripped + .multiply(BigDecimal.valueOf(POWERS_OF_10[scale])) + .toBigIntegerExact() + } catch (ex: Exception) { + when (ex) { + is FixedPointConversionException -> throw ex + else -> throw FixedPointConversionException("Could not convert to fixed point number", ex) + } } - thisZeroStripped - .multiply(BigDecimal.valueOf(POWERS_OF_10[scale])) - .toBigIntegerExact() -} catch (ex: Exception) { - when (ex) { - is FixedPointConversionException -> throw ex - else -> throw FixedPointConversionException("Could not convert to fixed point number", ex) - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/ModelCustomInstruction.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/ModelCustomInstruction.kt new file mode 100644 index 000000000..ac66a86a5 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/ModelCustomInstruction.kt @@ -0,0 +1,3 @@ +package jp.co.soramitsu.iroha2 + +interface ModelCustomInstruction diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/ModelParameter.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/ModelParameter.kt new file mode 100644 index 000000000..48d559496 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/ModelParameter.kt @@ -0,0 +1,3 @@ +package jp.co.soramitsu.iroha2 + +interface ModelParameter diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/ModelPermission.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/ModelPermission.kt new file mode 100644 index 000000000..9976c4384 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/ModelPermission.kt @@ -0,0 +1,11 @@ +package jp.co.soramitsu.iroha2 + +import jp.co.soramitsu.iroha2.generated.Json +import jp.co.soramitsu.iroha2.generated.Permission + +/** + * Permission + */ +interface ModelPermission { + fun asRaw(): Permission = Permission(this.javaClass.simpleName, Json.writeValue(this)) +} diff --git a/modules/block/src/main/kotlin/jp/co/soramitsu/iroha2/Serde.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/Serde.kt similarity index 67% rename from modules/block/src/main/kotlin/jp/co/soramitsu/iroha2/Serde.kt rename to modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/Serde.kt index 6e2487cd2..9f9061aff 100644 --- a/modules/block/src/main/kotlin/jp/co/soramitsu/iroha2/Serde.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/Serde.kt @@ -2,6 +2,7 @@ package jp.co.soramitsu.iroha2 import com.fasterxml.jackson.core.JsonGenerator import com.fasterxml.jackson.core.JsonParser +import com.fasterxml.jackson.core.type.TypeReference import com.fasterxml.jackson.databind.DeserializationContext import com.fasterxml.jackson.databind.JsonDeserializer import com.fasterxml.jackson.databind.JsonNode @@ -15,7 +16,6 @@ import com.fasterxml.jackson.databind.module.SimpleModule import com.fasterxml.jackson.databind.node.LongNode import com.fasterxml.jackson.databind.node.ObjectNode import com.fasterxml.jackson.databind.node.TextNode -import com.fasterxml.jackson.module.kotlin.KotlinFeature import com.fasterxml.jackson.module.kotlin.KotlinModule import io.ipfs.multihash.Multihash import jp.co.soramitsu.iroha2.DigestFunction.Ed25519 @@ -28,18 +28,16 @@ import jp.co.soramitsu.iroha2.generated.AssetId import jp.co.soramitsu.iroha2.generated.AssetTransferBox import jp.co.soramitsu.iroha2.generated.AssetType import jp.co.soramitsu.iroha2.generated.AssetValue -import jp.co.soramitsu.iroha2.generated.BlockHeader import jp.co.soramitsu.iroha2.generated.BlockParameter import jp.co.soramitsu.iroha2.generated.BurnBox import jp.co.soramitsu.iroha2.generated.BurnOfNumericAndAsset import jp.co.soramitsu.iroha2.generated.BurnOfu32AndTrigger import jp.co.soramitsu.iroha2.generated.ChainId -import jp.co.soramitsu.iroha2.generated.CustomInstruction import jp.co.soramitsu.iroha2.generated.CustomParameter +import jp.co.soramitsu.iroha2.generated.CustomParameterId import jp.co.soramitsu.iroha2.generated.DomainId import jp.co.soramitsu.iroha2.generated.EventFilterBox import jp.co.soramitsu.iroha2.generated.Executable -import jp.co.soramitsu.iroha2.generated.ExecuteTrigger import jp.co.soramitsu.iroha2.generated.ExecuteTriggerEventFilter import jp.co.soramitsu.iroha2.generated.ExecutionTime import jp.co.soramitsu.iroha2.generated.Executor @@ -47,14 +45,10 @@ import jp.co.soramitsu.iroha2.generated.GrantBox import jp.co.soramitsu.iroha2.generated.GrantOfPermissionAndAccount import jp.co.soramitsu.iroha2.generated.GrantOfPermissionAndRole import jp.co.soramitsu.iroha2.generated.GrantOfRoleIdAndAccount -import jp.co.soramitsu.iroha2.generated.Hash import jp.co.soramitsu.iroha2.generated.IdBox -import jp.co.soramitsu.iroha2.generated.IdentifiableBox import jp.co.soramitsu.iroha2.generated.InstructionBox import jp.co.soramitsu.iroha2.generated.IpfsPath -import jp.co.soramitsu.iroha2.generated.Ipv4Addr -import jp.co.soramitsu.iroha2.generated.Ipv6Addr -import jp.co.soramitsu.iroha2.generated.Log +import jp.co.soramitsu.iroha2.generated.Json import jp.co.soramitsu.iroha2.generated.Metadata import jp.co.soramitsu.iroha2.generated.MintBox import jp.co.soramitsu.iroha2.generated.MintOfNumericAndAsset @@ -64,6 +58,7 @@ import jp.co.soramitsu.iroha2.generated.Name import jp.co.soramitsu.iroha2.generated.NewAccount import jp.co.soramitsu.iroha2.generated.NewAssetDefinition import jp.co.soramitsu.iroha2.generated.NewDomain +import jp.co.soramitsu.iroha2.generated.NewRole import jp.co.soramitsu.iroha2.generated.NonZeroOfu64 import jp.co.soramitsu.iroha2.generated.Numeric import jp.co.soramitsu.iroha2.generated.NumericSpec @@ -71,7 +66,6 @@ import jp.co.soramitsu.iroha2.generated.Parameter import jp.co.soramitsu.iroha2.generated.Peer import jp.co.soramitsu.iroha2.generated.Permission import jp.co.soramitsu.iroha2.generated.PublicKey -import jp.co.soramitsu.iroha2.generated.RawGenesisTransaction import jp.co.soramitsu.iroha2.generated.RegisterBox import jp.co.soramitsu.iroha2.generated.RegisterOfAccount import jp.co.soramitsu.iroha2.generated.RegisterOfAsset @@ -80,9 +74,7 @@ import jp.co.soramitsu.iroha2.generated.RegisterOfDomain import jp.co.soramitsu.iroha2.generated.RegisterOfPeer import jp.co.soramitsu.iroha2.generated.RegisterOfRole import jp.co.soramitsu.iroha2.generated.RegisterOfTrigger -import jp.co.soramitsu.iroha2.generated.RemoveKeyValueBox import jp.co.soramitsu.iroha2.generated.Repeats -import jp.co.soramitsu.iroha2.generated.RevokeBox import jp.co.soramitsu.iroha2.generated.Role import jp.co.soramitsu.iroha2.generated.RoleId import jp.co.soramitsu.iroha2.generated.Schedule @@ -92,25 +84,19 @@ import jp.co.soramitsu.iroha2.generated.SetKeyValueOfAsset import jp.co.soramitsu.iroha2.generated.SetKeyValueOfAssetDefinition import jp.co.soramitsu.iroha2.generated.SetKeyValueOfDomain import jp.co.soramitsu.iroha2.generated.SetKeyValueOfTrigger -import jp.co.soramitsu.iroha2.generated.SetParameter -import jp.co.soramitsu.iroha2.generated.SignedBlock import jp.co.soramitsu.iroha2.generated.SmartContractParameter import jp.co.soramitsu.iroha2.generated.SocketAddr import jp.co.soramitsu.iroha2.generated.SumeragiParameter import jp.co.soramitsu.iroha2.generated.TimeEventFilter import jp.co.soramitsu.iroha2.generated.TransactionParameter -import jp.co.soramitsu.iroha2.generated.TransactionQueryOutput import jp.co.soramitsu.iroha2.generated.TransferBox import jp.co.soramitsu.iroha2.generated.TransferOfAccountAndAssetDefinitionIdAndAccount import jp.co.soramitsu.iroha2.generated.TransferOfAccountAndDomainIdAndAccount import jp.co.soramitsu.iroha2.generated.Trigger import jp.co.soramitsu.iroha2.generated.TriggerId -import jp.co.soramitsu.iroha2.generated.UnregisterBox -import jp.co.soramitsu.iroha2.generated.Upgrade import jp.co.soramitsu.iroha2.generated.WasmSmartContract import java.io.ByteArrayOutputStream import java.math.BigInteger -import kotlin.reflect.KClass import kotlin.reflect.full.memberProperties import kotlin.reflect.full.primaryConstructor @@ -124,7 +110,6 @@ public val JSON_SERDE by lazy { // deserializers module.addDeserializer(AssetValue::class.java, AssetValueDeserializer) module.addDeserializer(PublicKey::class.java, PublicKeyDeserializer) - module.addDeserializer(IdBox::class.java, IdBoxDeserializer) module.addDeserializer(Name::class.java, NameDeserializer) module.addDeserializer(Mintable::class.java, MintableDeserializer) module.addDeserializer(DomainId::class.java, DomainIdDeserializer) @@ -135,8 +120,8 @@ public val JSON_SERDE by lazy { module.addDeserializer(RegisterBox::class.java, RegisterBoxDeserializer) module.addDeserializer(MintBox::class.java, MintBoxDeserializer) module.addDeserializer(Metadata::class.java, MetadataDeserializer) - module.addDeserializer(TriggerId::class.java, TriggerIdDeserializer) module.addDeserializer(InstructionBox::class.java, InstructionDeserializer) + module.addDeserializer(TriggerId::class.java, TriggerIdDeserializer) module.addDeserializer(GrantBox::class.java, GrantBoxDeserializer) module.addDeserializer(EventFilterBox::class.java, EventFilterBoxDeserializer) module.addDeserializer(SetKeyValueBox::class.java, SetKeyValueBoxDeserializer) @@ -149,6 +134,7 @@ public val JSON_SERDE by lazy { module.addDeserializer(ExecuteTriggerEventFilter::class.java, ExecuteTriggerEventFilterDeserializer) module.addDeserializer(Action::class.java, ActionDeserializer) module.addDeserializer(Executable::class.java, ExecutableDeserializer) + module.addDeserializer(Json::class.java, IrohaJsonDeserializer) module.addDeserializer(IpfsPath::class.java, IpfsPathDeserializer) module.addDeserializer(Repeats::class.java, RepeatsDeserializer) module.addDeserializer(Parameter::class.java, ParameterDeserializer) @@ -163,15 +149,18 @@ public val JSON_SERDE by lazy { module.addDeserializer(Numeric::class.java, NumericDeserializer) module.addDeserializer(Permission::class.java, PermissionDeserializer) module.addDeserializer(BurnBox::class.java, BurnBoxDeserializer) + module.addDeserializer(NonZeroOfu64::class.java, NonZeroOfu64Deserializer) + module.addDeserializer(NewRole::class.java, NewRoleDeserializer) module.addKeyDeserializer(AssetDefinitionId::class.java, AssetDefinitionIdKeyDeserializer) module.addKeyDeserializer(AccountId::class.java, AccountIdKeyDeserializer) module.addKeyDeserializer(AssetId::class.java, AssetIdKeyDeserializer) module.addKeyDeserializer(DomainId::class.java, DomainIdKeyDeserializer) + module.addKeyDeserializer(CustomParameterId::class.java, CustomParameterIdKeyDeserializer) // serializers - module.addKeySerializer(Name::class.java, NameAsKeySerializer) - module.addSerializer(RawGenesisTransaction::class.java, RawGenesisTransactionSerializer) + module.addSerializer(Metadata::class.java, MetadataSerializer) + module.addSerializer(ChainId::class.java, ChainIdSerializer) module.addSerializer(DomainId::class.java, DomainIdSerializer) module.addSerializer(AssetDefinitionId::class.java, AssetDefinitionIdSerializer) module.addSerializer(AccountId::class.java, AccountIdSerializer) @@ -183,13 +172,10 @@ public val JSON_SERDE by lazy { module.addSerializer(UInt::class.java, UIntSerializer) module.addSerializer(PublicKey::class.java, PublicKeySerializer) module.addSerializer(ModelEnum::class.java, EnumerationSerializer) - module.addSerializer(Metadata::class.java, MetadataSerializer) - module.addSerializer(IdentifiableBox.NewRole::class.java, IdentifiableBoxNewRoleSerializer) module.addSerializer(Parameter::class.java, ParameterSerializer) module.addSerializer(TimeEventFilter::class.java, TimeEventFilterSerializer) module.addSerializer(Schedule::class.java, ScheduleSerializer) module.addSerializer(Executor::class.java, ExecutorSerializer) - module.addSerializer(InstructionBox::class.java, InstructionBoxSerializer) module.addSerializer(RegisterOfDomain::class.java, RegisterOfDomainSerializer) module.addSerializer(RegisterOfTrigger::class.java, RegisterOfTriggerSerializer) module.addSerializer(RegisterOfRole::class.java, RegisterOfRoleSerializer) @@ -197,6 +183,7 @@ public val JSON_SERDE by lazy { module.addSerializer(RegisterOfAssetDefinition::class.java, RegisterOfAssetDefinitionSerializer) module.addSerializer(RegisterOfPeer::class.java, RegisterOfPeerSerializer) module.addSerializer(RegisterOfAccount::class.java, RegisterOfAccountSerializer) + module.addSerializer(NewRole::class.java, NewRoleSerializer) module.addSerializer(AssetTransferBox::class.java, AssetTransferBoxSerializer) module.addSerializer(NonZeroOfu64::class.java, NonZeroOfu64Serializer) module.addSerializer(Executable.Instructions::class.java, ExecutableInstructionsSerializer) @@ -204,14 +191,10 @@ public val JSON_SERDE by lazy { module.addSerializer(AssetType::class.java, AssetTypeSerializer) module.addSerializer(Numeric::class.java, NumericSerializer) module.addSerializer(Permission::class.java, PermissionSerializer) + module.addSerializer(Json::class.java, IrohaJsonSerializer) mapper.registerModule(module) - mapper.registerModule( - KotlinModule.Builder() - .configure(KotlinFeature.NullToEmptyCollection, true) - .configure(KotlinFeature.NullToEmptyMap, true) - .build(), - ) + mapper.registerModule(KotlinModule.Builder().build()) mapper.propertyNamingStrategy = PropertyNamingStrategies.SNAKE_CASE mapper.enable(SerializationFeature.INDENT_OUTPUT) } @@ -221,21 +204,30 @@ public val JSON_SERDE by lazy { * Deserializer for [Iroha Special Instructions][InstructionBox] */ object InstructionDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): InstructionBox { - return deserializeInstruction(p.readValueAsTree(), JSON_SERDE) - } - - private fun deserializeInstruction(jsonNode: JsonNode, mapper: ObjectMapper): InstructionBox { + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): InstructionBox = deserializeInstruction(p.readValueAsTree(), JSON_SERDE) + + private fun deserializeInstruction( + jsonNode: JsonNode, + mapper: ObjectMapper, + ): InstructionBox { val node = jsonNode.fields().next() val param = node.key - val subtype = InstructionBox::class.nestedClasses.find { clazz -> - !clazz.isCompanion && clazz.simpleName == param - } ?: throw DeserializationException("Class with constructor($param) not found") + val subtype = + InstructionBox::class.nestedClasses.find { clazz -> + !clazz.isCompanion && clazz.simpleName == param + } ?: throw DeserializationException("Class with constructor($param) not found") - val argTypeName = subtype.primaryConstructor?.parameters - ?.firstOrNull()?.type?.toString() - ?: throw DeserializationException("Subtype parameter not found by $param") + val argTypeName = + subtype.primaryConstructor + ?.parameters + ?.firstOrNull() + ?.type + ?.toString() + ?: throw DeserializationException("Subtype parameter not found by $param") val toConvert: JsonNode = node.value @@ -245,34 +237,43 @@ object InstructionDeserializer : JsonDeserializer() { } object GrantBoxDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): GrantBox { + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): GrantBox { val node = p.readValueAsTree() - val paramClass = node.fields().next().key.toArg() + val paramClass = + node + .fields() + .next() + .key + .toArg() return get(JSON_SERDE.convertValue(node.fields().next().value, paramClass)) } - private fun String.toArg(): Class<*> { - return when (this) { + private fun String.toArg(): Class<*> = + when (this) { "Permission" -> GrantOfPermissionAndAccount::class.java "Role" -> GrantOfRoleIdAndAccount::class.java "RolePermission" -> GrantOfPermissionAndRole::class.java else -> throw DeserializationException("Unknown type: $this") } - } - private fun get(arg: Any): GrantBox { - return when (arg) { + private fun get(arg: Any): GrantBox = + when (arg) { is GrantOfPermissionAndAccount -> GrantBox.Permission(arg) is GrantOfRoleIdAndAccount -> GrantBox.Role(arg) is GrantOfPermissionAndRole -> GrantBox.RolePermission(arg) else -> throw DeserializationException("Grant box `$arg` not found") } - } } object AssetValueDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): AssetValue { + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): AssetValue { val node = p.readValueAsTree().fields().next() return when (node.key) { "Store" -> AssetValue.Store(Metadata(mapOf())) @@ -285,13 +286,17 @@ object AssetValueDeserializer : JsonDeserializer() { * Deserializer for [IdBox] */ object IdBoxDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): IdBox { - return sealedDeserializeIdBox(p, JSON_SERDE) - } + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): IdBox = sealedDeserializeIdBox(p, JSON_SERDE) } object RegisterBoxDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): RegisterBox { + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): RegisterBox { val node = p.readValueAsTree().fields().next() val paramClass = node.key.toArg() @@ -300,153 +305,181 @@ object RegisterBoxDeserializer : JsonDeserializer() { return getRegisterBox(value) } - private fun String.toArg(): Class<*> { - return when (this) { + private fun String.toArg(): Class<*> = + when (this) { "Domain" -> NewDomain::class.java "Peer" -> Peer::class.java "Account" -> NewAccount::class.java "AssetDefinition" -> NewAssetDefinition::class.java "Asset" -> Asset::class.java "Trigger" -> Trigger::class.java - "Role" -> Role::class.java + "Role" -> NewRole::class.java else -> throw DeserializationException("Unknown string type: $this") } - } - private fun getRegisterBox(arg: Any): RegisterBox { - return when (arg) { + private fun getRegisterBox(arg: Any): RegisterBox = + when (arg) { is NewDomain -> RegisterBox.Domain(RegisterOfDomain(arg)) is NewAccount -> RegisterBox.Account(RegisterOfAccount(arg)) - is Peer -> RegisterBox.Peer(RegisterOfPeer(arg)) + is Peer -> RegisterBox.Peer(RegisterOfPeer(arg.id)) is NewAssetDefinition -> RegisterBox.AssetDefinition(RegisterOfAssetDefinition(arg)) is Asset -> RegisterBox.Asset(RegisterOfAsset(arg)) is Trigger -> RegisterBox.Trigger(RegisterOfTrigger(arg)) - is Role -> RegisterBox.Role(RegisterOfRole(arg)) + is NewRole -> RegisterBox.Role(RegisterOfRole(arg)) else -> throw DeserializationException("Register box `$arg` not found") } - } } /** * Deserializer for [BurnBox] */ object BurnBoxDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): BurnBox { + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): BurnBox { val node = p.readValueAsTree() - val paramClass = node.fields().next().key.toArg() + val paramClass = + node + .fields() + .next() + .key + .toArg() return get(JSON_SERDE.convertValue(node.fields().next().value, paramClass)) } - private fun String.toArg(): Class<*> { - return when (this) { + private fun String.toArg(): Class<*> = + when (this) { "Asset" -> BurnOfNumericAndAsset::class.java "TriggerRepetitions" -> BurnOfu32AndTrigger::class.java else -> throw DeserializationException("Unknown type: $this") } - } - private fun get(arg: Any): BurnBox { - return when (arg) { + private fun get(arg: Any): BurnBox = + when (arg) { is BurnOfNumericAndAsset -> BurnBox.Asset(arg) is BurnOfu32AndTrigger -> BurnBox.TriggerRepetitions(arg) else -> throw DeserializationException("Burn box `$arg` not found") } - } } object MintBoxDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): MintBox { + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): MintBox { val node = p.readValueAsTree() - val paramClass = node.fields().next().key.toArg() + val paramClass = + node + .fields() + .next() + .key + .toArg() return get(JSON_SERDE.convertValue(node.fields().next().value, paramClass)) } - private fun String.toArg(): Class<*> { - return when (this) { + private fun String.toArg(): Class<*> = + when (this) { "Asset" -> MintOfNumericAndAsset::class.java "TriggerRepetitions" -> MintOfu32AndTrigger::class.java else -> throw DeserializationException("Unknown type: $this") } - } - private fun get(arg: Any): MintBox { - return when (arg) { + private fun get(arg: Any): MintBox = + when (arg) { is MintOfNumericAndAsset -> MintBox.Asset(arg) is MintOfu32AndTrigger -> MintBox.TriggerRepetitions(arg) else -> throw DeserializationException("Mint box `$arg` not found") } - } } object EventFilterBoxDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): EventFilterBox { + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): EventFilterBox { val node = p.readValueAsTree().fields().next() return getBox(JSON_SERDE.convertValue(node.value, node.key.toArg())) } - private fun String.toArg(): Class<*> { - return when (this) { + private fun String.toArg(): Class<*> = + when (this) { "ExecuteTrigger" -> ExecuteTriggerEventFilter::class.java "Time" -> TimeEventFilter::class.java else -> throw DeserializationException("Unknown type `$this`") } - } - private fun getBox(arg: Any): EventFilterBox { - return when (arg) { + private fun getBox(arg: Any): EventFilterBox = + when (arg) { is ExecuteTriggerEventFilter -> EventFilterBox.ExecuteTrigger(arg) is TimeEventFilter -> EventFilterBox.Time(arg) else -> throw DeserializationException("Unknown type `$this`") } - } } object TriggerIdDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): TriggerId { + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): TriggerId { val triggerName = p.readValueAsTree().asText() return getTriggerId(triggerName) } } object TransferBoxDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): TransferBox { + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): TransferBox { val node = p.readValueAsTree() - val paramClass = node.fields().next().key.toArg() + val paramClass = + node + .fields() + .next() + .key + .toArg() return get(JSON_SERDE.convertValue(node.fields().next().value, paramClass)) } - private fun String.toArg(): Class<*> { - return when (this) { + private fun String.toArg(): Class<*> = + when (this) { "Domain" -> TransferOfAccountAndDomainIdAndAccount::class.java "Asset" -> AssetTransferBox::class.java "AssetDefinition" -> TransferOfAccountAndAssetDefinitionIdAndAccount::class.java else -> throw DeserializationException("Unknown type: $this") } - } - private fun get(arg: Any): TransferBox { - return when (arg) { + private fun get(arg: Any): TransferBox = + when (arg) { is TransferOfAccountAndDomainIdAndAccount -> TransferBox.Domain(arg) is AssetTransferBox -> TransferBox.Asset(arg) is TransferOfAccountAndAssetDefinitionIdAndAccount -> TransferBox.AssetDefinition(arg) - else -> throw DeserializationException("SetKeyValue box `$arg` not found") + else -> throw DeserializationException("Transfer box `$arg` not found") } - } } object SetKeyValueBoxDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): SetKeyValueBox { + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): SetKeyValueBox { val node = p.readValueAsTree() - val paramClass = node.fields().next().key.toArg() + val paramClass = + node + .fields() + .next() + .key + .toArg() return get(JSON_SERDE.convertValue(node.fields().next().value, paramClass)) } - private fun String.toArg(): Class<*> { - return when (this) { + private fun String.toArg(): Class<*> = + when (this) { "Domain" -> SetKeyValueOfDomain::class.java "Account" -> SetKeyValueOfAccount::class.java "Asset" -> SetKeyValueOfAsset::class.java @@ -454,10 +487,9 @@ object SetKeyValueBoxDeserializer : JsonDeserializer() { "Trigger" -> SetKeyValueOfTrigger::class.java else -> throw DeserializationException("Unknown type: $this") } - } - private fun get(arg: Any): SetKeyValueBox { - return when (arg) { + private fun get(arg: Any): SetKeyValueBox = + when (arg) { is SetKeyValueOfDomain -> SetKeyValueBox.Domain(arg) is SetKeyValueOfAccount -> SetKeyValueBox.Account(arg) is SetKeyValueOfAsset -> SetKeyValueBox.Asset(arg) @@ -465,26 +497,29 @@ object SetKeyValueBoxDeserializer : JsonDeserializer() { is SetKeyValueOfTrigger -> SetKeyValueBox.Trigger(arg) else -> throw DeserializationException("SetKeyValue box `$arg` not found") } - } } /** * Deserializer for [Metadata] */ object MetadataDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): Metadata { - return deserializeMetadata(p, JSON_SERDE) - } - - private fun deserializeMetadata(p: JsonParser, mapper: ObjectMapper): Metadata { + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): Metadata = deserializeMetadata(p, JSON_SERDE) + + private fun deserializeMetadata( + p: JsonParser, + mapper: ObjectMapper, + ): Metadata { val nodeMetadata = p.readValueAsTree().fields() if (!nodeMetadata.hasNext()) { return Metadata(mapOf()) } val node = nodeMetadata.next() val key = node.key.asName() - val value = node.value.asStringOrNull() ?: "" - return Metadata(mapOf(Pair(key, value))) + val value = node.value.toString() + return Metadata(mapOf(Pair(key, Json(value)))) } } @@ -492,45 +527,73 @@ object MetadataDeserializer : JsonDeserializer() { * Deserializer for [AssetType] */ object AssetTypeDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): AssetType { - return when (p.readValueAsTree().textValue()) { + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): AssetType = + when (p.readValueAsTree().textValue()) { AssetType.Numeric::class.simpleName -> AssetType.Numeric(NumericSpec()) AssetType.Store::class.simpleName -> AssetType.Store() else -> throw DeserializationException("Unknown type: $this") } - } } /** * Deserializer for [NumericSpec] */ object NumericSpecDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): NumericSpec { - return NumericSpec(p.readValueAsTree().longValue()) - } + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): NumericSpec = NumericSpec(p.readValueAsTree().longValue()) } /** * Deserializer for [Numeric] */ object NumericDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): Numeric { - return p.readValueAs(String::class.java).asNumeric() - } + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): Numeric = p.readValueAs(String::class.java).asNumeric() } /** * Deserializer for [Permission] */ object PermissionDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): Permission { + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): Permission { val node = p.readValueAsTree() - var payloadValue = node.get("payload").asStringOrNull() + var payloadValue = node.get("payload").toString() when (payloadValue.isNullOrEmpty()) { true -> payloadValue = "null" else -> {} } - return Permission(node.get("name").asText(), payloadValue) + return Permission(node.get("name").asText(), Json(payloadValue)) + } +} + +/** + * Deserializer for [NewRole] + */ +object NewRoleDeserializer : JsonDeserializer() { + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): NewRole { + val node = p.readValueAsTree() + val roleId = JSON_SERDE.convertValue(node["id"], RoleId::class.java) + val permissions = + JSON_SERDE.convertValue( + node["permissions"], + object : TypeReference>() {}, + ) + val grantTo = JSON_SERDE.convertValue(node["grant_to"], AccountId::class.java) + + return NewRole(Role(roleId, permissions), grantTo) } } @@ -538,16 +601,20 @@ object PermissionDeserializer : JsonDeserializer() { * Deserializer for [ChainId] */ object ChainIdDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): ChainId { - return ChainId(p.readValueAs(String::class.java)) - } + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): ChainId = ChainId(p.readValueAs(String::class.java)) } /** * Deserializer for [NewAssetDefinition] */ object NewAssetDefinitionDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): NewAssetDefinition { + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): NewAssetDefinition { val node = p.readValueAsTree() val domainId = node["id"].asText().asAssetDefinitionId() val mintable = JSON_SERDE.convertValue(node["mintable"], Mintable::class.java) @@ -563,7 +630,10 @@ object NewAssetDefinitionDeserializer : JsonDeserializer() { * Deserializer for [NewDomain] */ object NewDomainDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): NewDomain { + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): NewDomain { val node = p.readValueAsTree() val domainId = node["id"].asText().asDomainId() val logo = JSON_SERDE.convertValue(node["logo"], IpfsPath::class.java) @@ -577,7 +647,10 @@ object NewDomainDeserializer : JsonDeserializer() { * Deserializer for [Trigger] */ object TriggerDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): Trigger { + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): Trigger { val node = p.readValueAsTree() val triggerId = TriggerId(node["id"].asText().asName()) val action = JSON_SERDE.convertValue(node["action"], Action::class.java) @@ -590,7 +663,10 @@ object TriggerDeserializer : JsonDeserializer() { * Deserializer for [ExecuteTriggerEventFilter] */ object ExecuteTriggerEventFilterDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): ExecuteTriggerEventFilter { + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): ExecuteTriggerEventFilter { val node = p.readValueAsTree() val triggerId = TriggerId(node["trigger"].asText().asName()) val authority = JSON_SERDE.convertValue(node["authority"], AccountId::class.java) @@ -603,7 +679,10 @@ object ExecuteTriggerEventFilterDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): Action { + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): Action { val node = p.readValueAsTree() val executable = JSON_SERDE.convertValue(node["executable"], Executable::class.java) val repeats = JSON_SERDE.convertValue(node["repeats"], Repeats::class.java) @@ -619,7 +698,10 @@ object ActionDeserializer : JsonDeserializer() { * Deserializer for [Executable] */ object ExecutableDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): Executable { + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): Executable { val node = p.readValueAsTree().fields().next() val paramClass = node.key.toArg() @@ -628,38 +710,40 @@ object ExecutableDeserializer : JsonDeserializer() { return getExecutable(value) } - private fun String.toArg(): Class<*> { - return when (this) { + private fun String.toArg(): Class<*> = + when (this) { "Wasm" -> WasmSmartContract::class.java "Instructions" -> List::class.java else -> throw DeserializationException("Unknown type: $this") } - } - private fun getExecutable(arg: Any): Executable { - return when (arg) { + private fun getExecutable(arg: Any): Executable = + when (arg) { is WasmSmartContract -> Executable.Wasm(arg) is List<*> -> Executable.Instructions(arg as List) else -> throw DeserializationException("Executable `$arg` not found") } - } } /** * Deserializer for [IpfsPath] */ object IpfsPathDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): IpfsPath { - return IpfsPath(p.readValueAs(String::class.java)) - } + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): IpfsPath = IpfsPath(p.readValueAs(String::class.java)) } /** * Deserializer for [Repeats] */ object RepeatsDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): Repeats { - return when (val node = p.readValueAsTree()) { + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): Repeats = + when (val node = p.readValueAsTree()) { is TextNode -> Repeats.Indefinitely() is ObjectNode -> { val field = node.fields().next() @@ -668,20 +752,22 @@ object RepeatsDeserializer : JsonDeserializer() { else -> throw DeserializationException("Unknown type: $this") } - } } /** * Deserializer for [Parameter] */ object ParameterDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): Parameter { + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): Parameter { val node = p.readValueAsTree().fields().next() return get(JSON_SERDE.convertValue(node.value, node.key.toArg()), node.key) } - private fun String.toArg(): Class<*> { - return when (this) { + private fun String.toArg(): Class<*> = + when (this) { "Sumeragi" -> SumeragiParameter::class.java "Block" -> BlockParameter::class.java "Transaction" -> TransactionParameter::class.java @@ -690,10 +776,12 @@ object ParameterDeserializer : JsonDeserializer() { "Custom" -> CustomParameter::class.java else -> throw DeserializationException("Unknown type: $this") } - } - private fun get(arg: Any, type: String): Parameter { - return when (type) { + private fun get( + arg: Any, + type: String, + ): Parameter = + when (type) { "Sumeragi" -> Parameter.Sumeragi(arg as SumeragiParameter) "Block" -> Parameter.Block(arg as BlockParameter) "Transaction" -> Parameter.Transaction(arg as TransactionParameter) @@ -702,33 +790,40 @@ object ParameterDeserializer : JsonDeserializer() { "CustomParameter" -> Parameter.Custom(arg as CustomParameter) else -> throw DeserializationException("Unknown type: $this") } - } } /** * Deserializer for [SumeragiParameter] */ object SumeragiParameterDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): SumeragiParameter { + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): SumeragiParameter { val node = p.readValueAsTree().fields().next() val arg = JSON_SERDE.convertValue(node.value, BigInteger::class.java) return get(arg, node.key) } - private fun get(arg: BigInteger, type: String): SumeragiParameter { - return when (type) { + private fun get( + arg: BigInteger, + type: String, + ): SumeragiParameter = + when (type) { "BlockTimeMs" -> SumeragiParameter.BlockTimeMs(arg) "CommitTimeMs" -> SumeragiParameter.CommitTimeMs(arg) else -> throw DeserializationException("Unknown type: $this") } - } } /** * Deserializer for [BlockParameter] */ object BlockParameterDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): BlockParameter { + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): BlockParameter { val node = p.readValueAsTree().fields().next() val arg = JSON_SERDE.convertValue(node.value, BigInteger::class.java) return BlockParameter.MaxTransactions(NonZeroOfu64(arg)) @@ -739,45 +834,58 @@ object BlockParameterDeserializer : JsonDeserializer() { * Deserializer for [TransactionParameter] */ object TransactionParameterDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): TransactionParameter { + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): TransactionParameter { val node = p.readValueAsTree().fields().next() val arg = JSON_SERDE.convertValue(node.value, BigInteger::class.java) return get(arg, node.key) } - private fun get(arg: BigInteger, type: String): TransactionParameter { - return when (type) { + private fun get( + arg: BigInteger, + type: String, + ): TransactionParameter = + when (type) { "MaxInstructions" -> TransactionParameter.MaxInstructions(NonZeroOfu64(arg)) "SmartContractSize" -> TransactionParameter.SmartContractSize(NonZeroOfu64(arg)) else -> throw DeserializationException("Unknown type: $this") } - } } /** * Deserializer for [SmartContractParameter] */ object SmartContractParameterDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): SmartContractParameter { + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): SmartContractParameter { val node = p.readValueAsTree().fields().next() val arg = JSON_SERDE.convertValue(node.value, BigInteger::class.java) return get(arg, node.key) } - private fun get(arg: BigInteger, type: String): SmartContractParameter { - return when (type) { + private fun get( + arg: BigInteger, + type: String, + ): SmartContractParameter = + when (type) { "Fuel" -> SmartContractParameter.Fuel(NonZeroOfu64(arg)) "Memory" -> SmartContractParameter.Memory(NonZeroOfu64(arg)) else -> throw DeserializationException("Unknown type: $this") } - } } /** * Deserializer for [Schedule] */ object ScheduleDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): Schedule { + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): Schedule { val node = p.readValueAsTree() return Schedule( startMs = JSON_SERDE.convertValue(node["start_ms"], BigInteger::class.java), @@ -790,20 +898,25 @@ object ScheduleDeserializer : JsonDeserializer() { * Deserializer for [ExecutionTime] */ object ExecutionTimeDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): ExecutionTime { - return when (val node = p.readValueAsTree()) { + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): ExecutionTime = + when (val node = p.readValueAsTree()) { is TextNode -> ExecutionTime.PreCommit() is ObjectNode -> ExecutionTime.Schedule(JSON_SERDE.convertValue(node, Schedule::class.java)) else -> throw DeserializationException("Unknown type: $this") } - } } /** * Deserializer for [TimeEventFilter] */ object TimeEventFilterDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): TimeEventFilter { + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): TimeEventFilter { val node = p.readValueAsTree().fields().next() return TimeEventFilter(JSON_SERDE.convertValue(node.value, ExecutionTime::class.java)) } @@ -813,7 +926,10 @@ object TimeEventFilterDeserializer : JsonDeserializer() { * Deserializer for [PublicKey] */ object PublicKeyDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): PublicKey { + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): PublicKey { val key = p.readValueAs(String::class.java) return PublicKey(Algorithm.Ed25519(), key.substring(6, key.length).fromHex()) } @@ -823,123 +939,136 @@ object PublicKeyDeserializer : JsonDeserializer() { * Deserializer for [Name] */ object NameDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): Name { - return Name(p.readValueAs(String::class.java)) - } + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): Name = Name(p.readValueAs(String::class.java)) } /** * Deserializer for [Mintable] */ object MintableDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): Mintable { - return when (val value = p.readValueAs(String::class.java)) { + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): Mintable = + when (val value = p.readValueAs(String::class.java)) { Mintable.Once::class.simpleName -> Mintable.Once() Mintable.Not::class.simpleName -> Mintable.Not() Mintable.Infinitely::class.simpleName -> Mintable.Infinitely() else -> throw DeserializationException("Unknown Mintable type: $value") } - } } /** * Deserializer for [asset ID][AssetId] */ object AssetIdDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): AssetId { - return p.readValueAs(String::class.java).asAssetId() - } + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): AssetId = p.readValueAs(String::class.java).asAssetId() } /** * Deserializer for [asset definition ID][AssetDefinitionId] */ object AssetDefinitionIdDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): AssetDefinitionId { - return p.readValueAs(String::class.java).asAssetDefinitionId() - } + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): AssetDefinitionId = p.readValueAs(String::class.java).asAssetDefinitionId() } /** * Deserializer for [account ID][AccountId] */ object AccountIdDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): AccountId { - return p.readValueAs(String::class.java).asAccountId() - } + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): AccountId = p.readValueAs(String::class.java).asAccountId() } /** * Deserializer for [role ID][RoleId] */ object RoleIdDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): RoleId { - return p.readValueAs(String::class.java).asRoleId() - } + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): RoleId = p.readValueAs(String::class.java).asRoleId() } /** * Deserializer for [domain ID][DomainId] */ object DomainIdDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): DomainId { - return p.readValueAs(String::class.java).asDomainId() - } + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): DomainId = p.readValueAs(String::class.java).asDomainId() } /** * Deserializer for [asset definition ID][AssetDefinitionId] */ object AssetDefinitionIdKeyDeserializer : KeyDeserializer() { - override fun deserializeKey(key: String?, ctxt: DeserializationContext?): AssetDefinitionId? { - return JSON_SERDE.readValue(key, AssetDefinitionId::class.java) - } + override fun deserializeKey( + key: String?, + ctxt: DeserializationContext?, + ): AssetDefinitionId? = JSON_SERDE.readValue(key, AssetDefinitionId::class.java) } /** * Deserializer for [account ID][AccountId] */ object AccountIdKeyDeserializer : KeyDeserializer() { - override fun deserializeKey(key: String?, ctxt: DeserializationContext?): AccountId? { - return JSON_SERDE.readValue(key, AccountId::class.java) - } + override fun deserializeKey( + key: String?, + ctxt: DeserializationContext?, + ): AccountId? = JSON_SERDE.readValue(key, AccountId::class.java) } /** * Deserializer for [asset ID][AssetId] */ object AssetIdKeyDeserializer : KeyDeserializer() { - override fun deserializeKey(key: String, ctxt: DeserializationContext?): AssetId? { - return JSON_SERDE.readValue(key, AssetId::class.java) - } + override fun deserializeKey( + key: String, + ctxt: DeserializationContext?, + ): AssetId? = JSON_SERDE.readValue(key, AssetId::class.java) } /** * Deserializer for [domain ID][DomainId] */ object DomainIdKeyDeserializer : KeyDeserializer() { - override fun deserializeKey(key: String, ctxt: DeserializationContext?): DomainId? { - return JSON_SERDE.readValue(key, DomainId::class.java) - } + override fun deserializeKey( + key: String, + ctxt: DeserializationContext?, + ): DomainId? = JSON_SERDE.readValue(key, DomainId::class.java) } +object CustomParameterIdKeyDeserializer : KeyDeserializer() { + override fun deserializeKey( + key: String, + ctxt: DeserializationContext?, + ): CustomParameterId? = JSON_SERDE.readValue(key, CustomParameterId::class.java) +} // ================================================== /** - * Serializer for [RawGenesisTransaction] + * Serializer for [ChainId] */ -object RawGenesisTransactionSerializer : JsonSerializer() { - override fun serialize(tx: RawGenesisTransaction, gen: JsonGenerator, serializers: SerializerProvider) { - gen.writeStartObject() - gen.writeObjectField("chain", tx.chain.string) - gen.writeObjectField("executor", tx.executor) - gen.writeObjectField("parameters", tx.parameters) - when (tx.instructions.isEmpty()) { - true -> gen.writeObjectField("instructions", listOf()) - false -> gen.writeObjectField("instructions", tx.instructions) - } - gen.writeObjectField("topology", tx.topology) - gen.writeEndObject() +object ChainIdSerializer : JsonSerializer() { + override fun serialize( + chainId: ChainId, + gen: JsonGenerator, + serializers: SerializerProvider, + ) { + gen.writeString(chainId.string) } } @@ -947,7 +1076,11 @@ object RawGenesisTransactionSerializer : JsonSerializer() * Serializer for [AssetDefinitionId] */ object AssetDefinitionIdSerializer : JsonSerializer() { - override fun serialize(value: AssetDefinitionId, gen: JsonGenerator, serializers: SerializerProvider) { + override fun serialize( + value: AssetDefinitionId, + gen: JsonGenerator, + serializers: SerializerProvider, + ) { gen.writeString(value.asString()) } } @@ -956,7 +1089,11 @@ object AssetDefinitionIdSerializer : JsonSerializer() { * Serializer for [AssetId] */ object AssetIdSerializer : JsonSerializer() { - override fun serialize(value: AssetId, gen: JsonGenerator, serializers: SerializerProvider) { + override fun serialize( + value: AssetId, + gen: JsonGenerator, + serializers: SerializerProvider, + ) { gen.writeString(value.asString(true)) } } @@ -965,7 +1102,11 @@ object AssetIdSerializer : JsonSerializer() { * Serializer for [AccountId] */ object AccountIdSerializer : JsonSerializer() { - override fun serialize(value: AccountId, gen: JsonGenerator, serializers: SerializerProvider) { + override fun serialize( + value: AccountId, + gen: JsonGenerator, + serializers: SerializerProvider, + ) { gen.writeString(value.asString(true)) } } @@ -974,7 +1115,11 @@ object AccountIdSerializer : JsonSerializer() { * Serializer for [DomainId] */ object DomainIdSerializer : JsonSerializer() { - override fun serialize(value: DomainId, gen: JsonGenerator, serializers: SerializerProvider) { + override fun serialize( + value: DomainId, + gen: JsonGenerator, + serializers: SerializerProvider, + ) { gen.writeString(value.asString()) } } @@ -983,13 +1128,21 @@ object DomainIdSerializer : JsonSerializer() { * Serializer for [RoleId] */ object RoleIdSerializer : JsonSerializer() { - override fun serialize(value: RoleId, gen: JsonGenerator, serializers: SerializerProvider) { + override fun serialize( + value: RoleId, + gen: JsonGenerator, + serializers: SerializerProvider, + ) { gen.writeString(value.asString()) } } object SocketAddrSerializer : JsonSerializer() { - override fun serialize(value: SocketAddr, gen: JsonGenerator, serializers: SerializerProvider) { + override fun serialize( + value: SocketAddr, + gen: JsonGenerator, + serializers: SerializerProvider, + ) { gen.writeString(value.asString()) } } @@ -998,7 +1151,11 @@ object SocketAddrSerializer : JsonSerializer() { * Serializer for [TriggerId] */ object TriggerIdSerializer : JsonSerializer() { - override fun serialize(value: TriggerId, gen: JsonGenerator, serializers: SerializerProvider) { + override fun serialize( + value: TriggerId, + gen: JsonGenerator, + serializers: SerializerProvider, + ) { gen.writeString(value.asString()) } } @@ -1007,7 +1164,11 @@ object TriggerIdSerializer : JsonSerializer() { * Serializer for [TimeEventFilter] */ object TimeEventFilterSerializer : JsonSerializer() { - override fun serialize(value: TimeEventFilter, gen: JsonGenerator, serializers: SerializerProvider) { + override fun serialize( + value: TimeEventFilter, + gen: JsonGenerator, + serializers: SerializerProvider, + ) { value.serializeEnum(gen) } } @@ -1016,26 +1177,25 @@ object TimeEventFilterSerializer : JsonSerializer() { * Serializer for [Schedule] */ object ScheduleSerializer : JsonSerializer() { - override fun serialize(value: Schedule, gen: JsonGenerator, serializers: SerializerProvider) { + override fun serialize( + value: Schedule, + gen: JsonGenerator, + serializers: SerializerProvider, + ) { val schedule = mapOf(Pair("start_ms", value.startMs), Pair("period_ms", value.periodMs)) gen.writeObject(schedule) } } -/** - * Serializer for [Name] as key - */ -object NameAsKeySerializer : JsonSerializer() { - override fun serialize(value: Name, gen: JsonGenerator, serializers: SerializerProvider) { - gen.writeFieldName(value.string) - } -} - /** * Serializer for [Name] */ object NameSerializer : JsonSerializer() { - override fun serialize(value: Name, gen: JsonGenerator, serializers: SerializerProvider) { + override fun serialize( + value: Name, + gen: JsonGenerator, + serializers: SerializerProvider, + ) { gen.writeString(value.string) } } @@ -1044,7 +1204,11 @@ object NameSerializer : JsonSerializer() { * Serializer for [Executor] */ object ExecutorSerializer : JsonSerializer() { - override fun serialize(value: Executor, gen: JsonGenerator, serializers: SerializerProvider) { + override fun serialize( + value: Executor, + gen: JsonGenerator, + serializers: SerializerProvider, + ) { when (value) { // is Executor -> gen.writeString(value.wasm) else -> throw IrohaSdkException("Unsupported type ${this::class}") @@ -1052,28 +1216,15 @@ object ExecutorSerializer : JsonSerializer() { } } -/** - * Serializer for [InstructionBox] - */ -object InstructionBoxSerializer : JsonSerializer() { - override fun serialize(value: InstructionBox, gen: JsonGenerator, serializers: SerializerProvider) { - when (value) { - is InstructionBox.Register -> value.serializeBox(gen) - is InstructionBox.SetKeyValue -> value.serializeBox(gen) - is InstructionBox.Mint -> value.serializeBox(gen) - is InstructionBox.Burn -> value.serializeBox(gen) - is InstructionBox.Transfer -> value.serializeBox(gen) - is InstructionBox.Grant -> value.serializeBox(gen) - else -> throw IrohaSdkException("Unsupported type ${this::class}") - } - } -} - /** * Serializer for [RegisterOfDomain] */ object RegisterOfDomainSerializer : JsonSerializer() { - override fun serialize(value: RegisterOfDomain, gen: JsonGenerator, serializers: SerializerProvider) { + override fun serialize( + value: RegisterOfDomain, + gen: JsonGenerator, + serializers: SerializerProvider, + ) { gen.writeObject(value.`object`) } } @@ -1082,7 +1233,11 @@ object RegisterOfDomainSerializer : JsonSerializer() { * Serializer for [RegisterOfTrigger] */ object RegisterOfTriggerSerializer : JsonSerializer() { - override fun serialize(value: RegisterOfTrigger, gen: JsonGenerator, serializers: SerializerProvider) { + override fun serialize( + value: RegisterOfTrigger, + gen: JsonGenerator, + serializers: SerializerProvider, + ) { gen.writeObject(value.`object`) } } @@ -1091,7 +1246,11 @@ object RegisterOfTriggerSerializer : JsonSerializer() { * Serializer for [RegisterOfRole] */ object RegisterOfRoleSerializer : JsonSerializer() { - override fun serialize(value: RegisterOfRole, gen: JsonGenerator, serializers: SerializerProvider) { + override fun serialize( + value: RegisterOfRole, + gen: JsonGenerator, + serializers: SerializerProvider, + ) { gen.writeObject(value.`object`) } } @@ -1100,7 +1259,11 @@ object RegisterOfRoleSerializer : JsonSerializer() { * Serializer for [RegisterOfAsset] */ object RegisterOfAssetSerializer : JsonSerializer() { - override fun serialize(value: RegisterOfAsset, gen: JsonGenerator, serializers: SerializerProvider) { + override fun serialize( + value: RegisterOfAsset, + gen: JsonGenerator, + serializers: SerializerProvider, + ) { gen.writeObject(value.`object`) } } @@ -1109,7 +1272,11 @@ object RegisterOfAssetSerializer : JsonSerializer() { * Serializer for [RegisterOfAssetDefinition] */ object RegisterOfAssetDefinitionSerializer : JsonSerializer() { - override fun serialize(value: RegisterOfAssetDefinition, gen: JsonGenerator, serializers: SerializerProvider) { + override fun serialize( + value: RegisterOfAssetDefinition, + gen: JsonGenerator, + serializers: SerializerProvider, + ) { gen.writeObject(value.`object`) } } @@ -1118,7 +1285,11 @@ object RegisterOfAssetDefinitionSerializer : JsonSerializer() { - override fun serialize(value: RegisterOfPeer, gen: JsonGenerator, serializers: SerializerProvider) { + override fun serialize( + value: RegisterOfPeer, + gen: JsonGenerator, + serializers: SerializerProvider, + ) { gen.writeObject(value.`object`) } } @@ -1127,29 +1298,80 @@ object RegisterOfPeerSerializer : JsonSerializer() { * Serializer for [RegisterOfAccount] */ object RegisterOfAccountSerializer : JsonSerializer() { - override fun serialize(value: RegisterOfAccount, gen: JsonGenerator, serializers: SerializerProvider) { + override fun serialize( + value: RegisterOfAccount, + gen: JsonGenerator, + serializers: SerializerProvider, + ) { gen.writeObject(value.`object`) } } +/** + * Serializer for [NewRole] + */ +object NewRoleSerializer : JsonSerializer() { + override fun serialize( + value: NewRole, + gen: JsonGenerator, + serializers: SerializerProvider, + ) { + gen.writeStartObject() + gen.writeObjectField("id", value.inner.id) + gen.writeObjectField("permissions", value.inner.permissions) + gen.writeObjectField("grant_to", value.grantTo) + gen.writeEndObject() + } +} + /** * Serializer for [AssetTransferBox] */ object AssetTransferBoxSerializer : JsonSerializer() { - override fun serialize(value: AssetTransferBox, gen: JsonGenerator, serializers: SerializerProvider) { + override fun serialize( + value: AssetTransferBox, + gen: JsonGenerator, + serializers: SerializerProvider, + ) { when (value) { is AssetTransferBox.Numeric -> gen.writeObject(value.transferOfAssetAndNumericAndAccount) is AssetTransferBox.Store -> gen.writeObject(value.transferOfAssetAndMetadataAndAccount) - else -> throw IrohaSdkException("Unexpected type ${value::class}") } } } +/** + * Deserializer for [NonZeroOfu64] + */ +object IrohaJsonDeserializer : JsonDeserializer() { + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): Json { + val node = p.readValueAsTree() + return Json(node.toString()) + } +} + +/** + * Deserializer for [NonZeroOfu64] + */ +object NonZeroOfu64Deserializer : JsonDeserializer() { + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): NonZeroOfu64 = NonZeroOfu64(p.readValueAs(BigInteger::class.java)) +} + /** * Serializer for [NonZeroOfu64] */ object NonZeroOfu64Serializer : JsonSerializer() { - override fun serialize(value: NonZeroOfu64, gen: JsonGenerator, serializers: SerializerProvider) { + override fun serialize( + value: NonZeroOfu64, + gen: JsonGenerator, + serializers: SerializerProvider, + ) { gen.writeObject(value.u64) } } @@ -1158,7 +1380,11 @@ object NonZeroOfu64Serializer : JsonSerializer() { * Serializer for [Executable.Instructions] */ object ExecutableInstructionsSerializer : JsonSerializer() { - override fun serialize(value: Executable.Instructions, gen: JsonGenerator, serializers: SerializerProvider) { + override fun serialize( + value: Executable.Instructions, + gen: JsonGenerator, + serializers: SerializerProvider, + ) { gen.writeStartObject() gen.writeObjectField(Executable.Instructions::class.simpleName, value.vec) gen.writeEndObject() @@ -1169,7 +1395,11 @@ object ExecutableInstructionsSerializer : JsonSerializer() { - override fun serialize(value: ExecuteTriggerEventFilter, gen: JsonGenerator, serializers: SerializerProvider) { + override fun serialize( + value: ExecuteTriggerEventFilter, + gen: JsonGenerator, + serializers: SerializerProvider, + ) { gen.writeStartObject() gen.writeObjectField("trigger", value.triggerId) gen.writeObjectField("authority", value.authority) @@ -1181,7 +1411,11 @@ object ExecuteTriggerEventFilterSerializer : JsonSerializer() { - override fun serialize(value: AssetType, gen: JsonGenerator, serializers: SerializerProvider) { + override fun serialize( + value: AssetType, + gen: JsonGenerator, + serializers: SerializerProvider, + ) { gen.writeObject(value::class.simpleName) } } @@ -1190,7 +1424,11 @@ object AssetTypeSerializer : JsonSerializer() { * Serializer for [Numeric] */ object NumericSerializer : JsonSerializer() { - override fun serialize(value: Numeric, gen: JsonGenerator, serializers: SerializerProvider) { + override fun serialize( + value: Numeric, + gen: JsonGenerator, + serializers: SerializerProvider, + ) { gen.writeObject(value.asString()) } } @@ -1199,8 +1437,12 @@ object NumericSerializer : JsonSerializer() { * Serializer for [Permission] */ object PermissionSerializer : JsonSerializer() { - override fun serialize(value: Permission, gen: JsonGenerator, serializers: SerializerProvider) { - val payload = JSON_SERDE.readTree(value.payload) + override fun serialize( + value: Permission, + gen: JsonGenerator, + serializers: SerializerProvider, + ) { + val payload = JSON_SERDE.readTree(value.payload.string) gen.writeStartObject() gen.writeObjectField(Permission::name.name, value.name) gen.writeObjectField(Permission::payload.name, payload) @@ -1212,7 +1454,11 @@ object PermissionSerializer : JsonSerializer() { * Custom serializer for [UInt] */ object UIntSerializer : JsonSerializer() { - override fun serialize(value: UInt, gen: JsonGenerator, serializers: SerializerProvider) { + override fun serialize( + value: UInt, + gen: JsonGenerator, + serializers: SerializerProvider, + ) { gen.writeNumber(value.toLong()) } } @@ -1221,7 +1467,11 @@ object UIntSerializer : JsonSerializer() { * Custom serializer for [PublicKey] */ object PublicKeySerializer : JsonSerializer() { - override fun serialize(value: PublicKey, gen: JsonGenerator, serializers: SerializerProvider) { + override fun serialize( + value: PublicKey, + gen: JsonGenerator, + serializers: SerializerProvider, + ) { val res = ByteArrayOutputStream() Multihash.putUvarint(res, Ed25519.index.toLong()) Multihash.putUvarint(res, value.payload.size.toLong()) @@ -1230,46 +1480,58 @@ object PublicKeySerializer : JsonSerializer() { } } +/** + * Custom serializer for [Json] + */ +object IrohaJsonSerializer : JsonSerializer() { + override fun serialize( + value: Json, + gen: JsonGenerator, + serializers: SerializerProvider, + ) { + gen.writeRawValue(value.string) + } +} + /** * Custom serializer for [Metadata] */ object MetadataSerializer : JsonSerializer() { - override fun serialize(value: Metadata, gen: JsonGenerator, serializers: SerializerProvider) { + override fun serialize( + value: Metadata, + gen: JsonGenerator, + serializers: SerializerProvider, + ) { gen.writeStartObject() value.sortedMapOfName.forEach { (k, v) -> - gen.writeStringField(k.string, v) + serializers.defaultSerializeField(k.string, v, gen) } gen.writeEndObject() } } -/** - * Custom serializer for [IdentifiableBox.NewRole] - */ -object IdentifiableBoxNewRoleSerializer : JsonSerializer() { - override fun serialize(value: IdentifiableBox.NewRole, gen: JsonGenerator, serializers: SerializerProvider) { - serializeSingleMember(gen, value.role) - } -} - /** * Custom serializer for [Parameter] */ object ParameterSerializer : JsonSerializer() { - override fun serialize(value: Parameter, gen: JsonGenerator, serializers: SerializerProvider) { + override fun serialize( + value: Parameter, + gen: JsonGenerator, + serializers: SerializerProvider, + ) { gen.writeStartObject() when (value) { is Parameter.Block -> gen.writeObjectField(Parameter.Block::class.simpleName, value.blockParameter) is Parameter.Custom -> gen.writeObjectField(Parameter.Custom::class.simpleName, value.customParameter) is Parameter.Executor -> gen.writeObjectField(Parameter.Executor::class.simpleName, value.smartContractParameter) - is Parameter.SmartContract -> gen.writeObjectField( - Parameter.SmartContract::class.simpleName, - value.smartContractParameter, - ) + is Parameter.SmartContract -> + gen.writeObjectField( + Parameter.SmartContract::class.simpleName, + value.smartContractParameter, + ) is Parameter.Sumeragi -> gen.writeObjectField(Parameter.Sumeragi::class.simpleName, value.sumeragiParameter) is Parameter.Transaction -> gen.writeObjectField(Parameter.Transaction::class.simpleName, value.transactionParameter) - else -> throw IrohaSdkException("Unexpected type ${value::class}") } gen.writeEndObject() } @@ -1279,7 +1541,11 @@ object ParameterSerializer : JsonSerializer() { * Custom serializer for Iroha2 enumeration types */ object EnumerationSerializer : JsonSerializer() { - override fun serialize(value: ModelEnum, gen: JsonGenerator, serializers: SerializerProvider) { + override fun serialize( + value: ModelEnum, + gen: JsonGenerator, + serializers: SerializerProvider, + ) { when (value) { is InstructionBox.Grant -> value.serialize(gen) is InstructionBox.Burn -> value.serialize(gen) @@ -1312,7 +1578,11 @@ private inline fun InstructionBox.serializeBox(gen: JsonGenerator) { 1 -> { gen.writeStartObject() gen.writeObjectFieldStart(clazz.simpleName) - memberProperties.first().call(this)?.cast()?.serializeBox(gen) + memberProperties + .first() + .call(this) + ?.cast() + ?.serializeBox(gen) gen.writeEndObject() gen.writeEndObject() } @@ -1321,17 +1591,16 @@ private inline fun InstructionBox.serializeBox(gen: JsonGenerator) { } } -private inline fun B.serializeBox( - gen: JsonGenerator, -) = when (B::class) { - BurnBox::class -> this?.cast()?.serializeBox(gen) - MintBox::class -> this?.cast()?.serializeBox(gen) - GrantBox::class -> this?.cast()?.serializeBox(gen) - TransferBox::class -> this?.cast()?.serializeBox(gen) - SetKeyValueBox::class -> this?.cast()?.serializeBox(gen) - RegisterBox::class -> this?.cast()?.serializeBox(gen) - else -> throw IrohaSdkException("Unexpected type ${B::class}") -} +private inline fun B.serializeBox(gen: JsonGenerator) = + when (B::class) { + BurnBox::class -> this?.cast()?.serializeBox(gen) + MintBox::class -> this?.cast()?.serializeBox(gen) + GrantBox::class -> this?.cast()?.serializeBox(gen) + TransferBox::class -> this?.cast()?.serializeBox(gen) + SetKeyValueBox::class -> this?.cast()?.serializeBox(gen) + RegisterBox::class -> this?.cast()?.serializeBox(gen) + else -> throw IrohaSdkException("Unexpected type ${B::class}") + } private fun BurnBox.serializeBox(gen: JsonGenerator) = serializeBox(this, gen) @@ -1345,7 +1614,10 @@ private fun RegisterBox.serializeBox(gen: JsonGenerator) = serializeBox(this, ge private fun SetKeyValueBox.serializeBox(gen: JsonGenerator) = serializeBox(this, gen) -private fun serializeBox(obj: Any, gen: JsonGenerator) { +private fun serializeBox( + obj: Any, + gen: JsonGenerator, +) { val memberProperties = obj::class.memberProperties when (memberProperties.size) { 0 -> gen.writeString(obj::class.simpleName) @@ -1358,7 +1630,10 @@ private fun serializeBox(obj: Any, gen: JsonGenerator) { /** * Serialise a single member object or nothing at all */ -private fun serializeSingleMember(gen: JsonGenerator, value: Any) { +private fun serializeSingleMember( + gen: JsonGenerator, + value: Any, +) { val clazz = value::class val memberProperties = clazz.memberProperties when (memberProperties.size) { @@ -1386,79 +1661,43 @@ private inline fun T.serializeEnum(gen: JsonGenerator) { } } -private fun String.asClass() = runCatching { - Class.forName(this) -}.getOrNull() ?: run { - when (this) { - "kotlin.Long" -> Long::class.java - "kotlin.Int" -> Int::class.java - else -> null - } -} ?: throw DeserializationException("Class $this not found") - -private fun getClazzByParam(param: String): KClass { - return when (param) { - "SetKeyValue" -> SetKeyValueBox::class - "Bool" -> Boolean::class - "String" -> String::class - "Name" -> Name::class - "LimitedMetadata" -> Metadata::class - "Id" -> IdBox::class - "Identifiable" -> IdentifiableBox::class - "PublicKey" -> PublicKey::class - "TransactionQueryOutput" -> TransactionQueryOutput::class - "Hash" -> Hash::class - "Block" -> SignedBlock::class - "BlockHeader" -> BlockHeader::class - "Ipv4Addr" -> Ipv4Addr::class - "Ipv6Addr" -> Ipv6Addr::class - "U32" -> Numeric::class - "U64" -> Numeric::class - "U128" -> Numeric::class - "Fixed" -> Numeric::class - else -> throw DeserializationException("Value key $param not found") - } -} - -private fun sealedDeserializeIdBox(p: JsonParser, mapper: ObjectMapper): IdBox { +private fun String.asClass() = + runCatching { + Class.forName(this) + }.getOrNull() ?: run { + when (this) { + "kotlin.Long" -> Long::class.java + "kotlin.Int" -> Int::class.java + else -> null + } + } ?: throw DeserializationException("Class $this not found") + +private fun sealedDeserializeIdBox( + p: JsonParser, + mapper: ObjectMapper, +): IdBox { val node = p.readValueAsTree().fields().next() val param = node.key - val subtype = IdBox::class.nestedClasses.find { clazz -> - !clazz.isCompanion && clazz.simpleName == param - } ?: throw DeserializationException("Class with constructor($param) not found") + val subtype = + IdBox::class.nestedClasses.find { clazz -> + !clazz.isCompanion && clazz.simpleName == param + } ?: throw DeserializationException("Class with constructor($param) not found") - val argTypeName = subtype.primaryConstructor?.parameters - ?.firstOrNull()?.type?.toString() - ?: throw DeserializationException("Subtype parameter not found by $param") + val argTypeName = + subtype.primaryConstructor + ?.parameters + ?.firstOrNull() + ?.type + ?.toString() + ?: throw DeserializationException("Subtype parameter not found by $param") val arg = mapper.convertValue(node.value, argTypeName.asClass()) return subtype.primaryConstructor?.call(arg) as IdBox } -private fun getTriggerId(triggerName: String): TriggerId { - return when (triggerName.contains("$")) { +private fun getTriggerId(triggerName: String): TriggerId = + when (triggerName.contains("$")) { true -> TriggerId(name = triggerName.split("$")[0].asName()) false -> TriggerId(name = triggerName.asName()) } -} - -private fun Any.toInstructionBox(): InstructionBox { - return when (this) { - is GrantBox -> InstructionBox.Grant(this) - is RevokeBox -> InstructionBox.Revoke(this) - is ExecuteTrigger -> InstructionBox.ExecuteTrigger(this) - is SetParameter -> InstructionBox.SetParameter(this) - is Upgrade -> InstructionBox.Upgrade(this) - is Log -> InstructionBox.Log(this) - is CustomInstruction -> InstructionBox.Custom(this) - is SetKeyValueBox -> InstructionBox.SetKeyValue(this) - is RemoveKeyValueBox -> InstructionBox.RemoveKeyValue(this) - is TransferBox -> InstructionBox.Transfer(this) - is BurnBox -> InstructionBox.Burn(this) - is MintBox -> InstructionBox.Mint(this) - is RegisterBox -> InstructionBox.Register(this) - is UnregisterBox -> InstructionBox.Unregister(this) - else -> throw DeserializationException("Unknown type: $this") - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/TriggerArgs.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/TriggerArgs.kt new file mode 100644 index 000000000..896fd96f9 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/TriggerArgs.kt @@ -0,0 +1,3 @@ +package jp.co.soramitsu.iroha2 + +interface TriggerArgs diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/Util.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/Util.kt index 0ea87e192..e5079cd97 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/Util.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/Util.kt @@ -13,9 +13,8 @@ const val U32_MAX_VALUE = (1L shl 32) - 1 /** * Wrap an [exception][ex] in `ScaleCodecException` */ -fun wrapException(ex: Exception): Exception { - return when (ex) { +fun wrapException(ex: Exception): Exception = + when (ex) { is ScaleCodecException -> ex else -> ScaleCodecException(cause = ex) } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/CompactMode.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/CompactMode.kt index e7608a4f9..d733ff83b 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/CompactMode.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/CompactMode.kt @@ -5,25 +5,28 @@ import java.math.BigInteger /** * Compact mode for SCALE codec writers and readers */ -enum class CompactMode(val value: Byte) { - SINGLE(0.toByte()), TWO(1.toByte()), FOUR(2.toByte()), BIGINT(3.toByte()); +enum class CompactMode( + val value: Byte, +) { + SINGLE(0.toByte()), + TWO(1.toByte()), + FOUR(2.toByte()), + BIGINT(3.toByte()), + ; companion object { private val MAX = BigInteger.valueOf(2).pow(536).subtract(BigInteger.ONE) @JvmStatic - fun byValue(value: Byte): CompactMode { - return when (value) { + fun byValue(value: Byte): CompactMode = + when (value) { SINGLE.value -> SINGLE TWO.value -> TWO FOUR.value -> FOUR else -> BIGINT } - } - fun forNumber(number: Int): CompactMode { - return forNumber(number.toLong()) - } + fun forNumber(number: Int): CompactMode = forNumber(number.toLong()) fun forNumber(number: Long): CompactMode { require(number >= 0) { "Negative numbers are not supported" } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/IntMax.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/IntMax.kt index 62ec14514..645cc678f 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/IntMax.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/IntMax.kt @@ -5,7 +5,9 @@ import java.math.BigInteger /** * The largest values for Integer types */ -enum class IntMax(val max: BigInteger) { +enum class IntMax( + val max: BigInteger, +) { U64(BigInteger.valueOf(2).pow(64) - BigInteger.ONE), U128(BigInteger.valueOf(2).pow(128) - BigInteger.ONE), U256(BigInteger.valueOf(2).pow(256) - BigInteger.ONE), @@ -14,40 +16,39 @@ enum class IntMax(val max: BigInteger) { ; companion object { - fun uintMaxValue(bit: Int): BigInteger { - return when (bit) { + fun uintMaxValue(bit: Int): BigInteger = + when (bit) { 64 -> U64 128 -> U128 256 -> U256 else -> throw IllegalArgumentException("Unsupported type $bit") }.max - } - fun intMaxValue(bit: Int): BigInteger { - return when (bit) { + fun intMaxValue(bit: Int): BigInteger = + when (bit) { 128 -> I128 256 -> I256 else -> throw IllegalArgumentException("Unsupported type $bit") }.max - } } } /** * The smallest values for signed Integer types */ -enum class IntMin(val min: BigInteger) { +enum class IntMin( + val min: BigInteger, +) { I128(-BigInteger.valueOf(2).pow(127)), I256(-BigInteger.valueOf(2).pow(255)), ; companion object { - fun intMinValue(bit: Int): BigInteger { - return when (bit) { + fun intMinValue(bit: Int): BigInteger = + when (bit) { 128 -> I128 256 -> I256 else -> throw IllegalArgumentException("Unsupported type $bit") }.min - } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/ScaleCodecReader.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/ScaleCodecReader.kt index 8f5ef34df..a5c91a857 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/ScaleCodecReader.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/ScaleCodecReader.kt @@ -19,15 +19,15 @@ import kotlin.math.abs /** * SCALE codec reader */ -class ScaleCodecReader(private val source: ByteArray) { +class ScaleCodecReader( + private val source: ByteArray, +) { private var pos = 0 /** * @return true if there are still elements to read */ - operator fun hasNext(): Boolean { - return pos < source.size - } + operator fun hasNext(): Boolean = pos < source.size /** * Move the reader's position forward (or backward for negative value) @@ -78,111 +78,95 @@ class ScaleCodecReader(private val source: ByteArray) { } } - inline fun readNullable(): T? { - return when (T::class) { - BigInteger::class -> when (readBoolean()) { - true -> readUint64() - else -> null - } as T? - Long::class -> when (readBoolean()) { - true -> readUint32() - else -> null - } as T? - Int::class -> when (readBoolean()) { - true -> readUint16() - else -> null - } as T? - String::class -> when (readBoolean()) { - true -> readString() - else -> null - } as T? + inline fun readNullable(): T? = + when (T::class) { + BigInteger::class -> + when (readBoolean()) { + true -> readUint64() + else -> null + } as T? + Boolean::class -> + when (readBoolean()) { + true -> readBoolean() + else -> null + } as T? + Long::class -> + when (readBoolean()) { + true -> readUint32() + else -> null + } as T? + Int::class -> + when (readBoolean()) { + true -> readUint16() + else -> null + } as T? + String::class -> + when (readBoolean()) { + true -> readString() + else -> null + } as T? else -> throw IllegalArgumentException("Unsupported value type `${T::class.qualifiedName}`") } - } /** * Read Java Integer encoded as unsigned byte SCALE value */ - fun readUByte(): Int { - return UBYTE.read(this) - } + fun readUByte(): Int = UBYTE.read(this) /** * Read Java Integer encoded as unsigned 16-bit integer SCALE value */ - fun readUint16(): Int { - return UINT16.read(this) - } + fun readUint16(): Int = UINT16.read(this) /** * Read Java Long Integer encoded as unsigned 32-bit integer SCALE value */ - fun readUint32(): Long { - return UINT32.read(this) - } + fun readUint32(): Long = UINT32.read(this) /** * Read Java Big Integer encoded as unsigned 64-bit integer SCALE value */ - fun readUint64(): BigInteger { - return UINT64.read(this) - } + fun readUint64(): BigInteger = UINT64.read(this) /** * Read Java Big Integer encoded as unsigned 128-bit integer SCALE value */ - fun readUint128(): BigInteger { - return UINT128.read(this) - } + fun readUint128(): BigInteger = UINT128.read(this) /** * Read Java Big Integer encoded as unsigned 256-bit integer SCALE value */ - fun readUint256(): BigInteger { - return UINT256.read(this) - } + fun readUint256(): BigInteger = UINT256.read(this) /** * Read Java Integer encoded as 32-bit integer SCALE value */ - fun readInt32(): Int { - return INT32.read(this) - } + fun readInt32(): Int = INT32.read(this) /** * Read a Java Long Integer encoded as 64-bit integer SCALE value */ - fun readInt64(): Long { - return INT64.read(this) - } + fun readInt64(): Long = INT64.read(this) /** * Read a Java Big Integer encoded as 128-bit integer SCALE value */ - fun readInt128(): BigInteger { - return INT128.read(this) - } + fun readInt128(): BigInteger = INT128.read(this) /** * Read a Java Big Integer encoded as 256-bit integer SCALE value */ - fun readInt256(): BigInteger { - return INT256.read(this) - } + fun readInt256(): BigInteger = INT256.read(this) /** * Read an unsigned integer */ - fun readCompactInt(): Int { - return COMPACT_UINT.read(this) - } + fun readCompactInt(): Int = COMPACT_UINT.read(this) /** * Read a Boolean value */ - fun readBoolean(): Boolean { - return BOOL.read(this) - } + fun readBoolean(): Boolean = BOOL.read(this) /** * Read a byte array @@ -205,7 +189,10 @@ class ScaleCodecReader(private val source: ByteArray) { /** * Read a set */ - fun readSet(size: Int, supplier: () -> T): MutableSet { + fun readSet( + size: Int, + supplier: () -> T, + ): MutableSet { val set = HashSet(capacity(size)) for (index in 0 until size) { set.add(supplier()) @@ -216,7 +203,11 @@ class ScaleCodecReader(private val source: ByteArray) { /** * Read a map */ - fun readMap(size: Int, key: () -> K, value: () -> V): MutableMap { + fun readMap( + size: Int, + key: () -> K, + value: () -> V, + ): MutableMap { val map = HashMap(capacity(size)) for (index in 0 until size) { map[key()] = value() @@ -227,34 +218,33 @@ class ScaleCodecReader(private val source: ByteArray) { /** * Read an array of a specified [size] */ - inline fun readArray(size: Int, supplier: () -> T): Array { - return Array(size) { supplier() } - } + inline fun readArray( + size: Int, + supplier: () -> T, + ): Array = Array(size) { supplier() } /** * Read a vector of a specified [size] */ - fun readVec(size: Int, supplier: () -> T): List { - return List(size) { supplier() } - } + fun readVec( + size: Int, + supplier: () -> T, + ): List = List(size) { supplier() } /** * Read a string encoded as UTF-8 bytes * * @return String value */ - fun readString(): String { - return String(readByteArray()) - } + fun readString(): String = String(readByteArray()) - private fun capacity(expectedSize: Int): Int { - return when { + private fun capacity(expectedSize: Int): Int = + when { expectedSize < 0 -> throw IllegalArgumentException("Expected size cannot be negative but was: $expectedSize") expectedSize < 3 -> expectedSize + 1 expectedSize < MAX_POWER_OF_TWO -> (expectedSize.toFloat() / 0.75f + 1.0f).toInt() else -> Int.MAX_VALUE } - } companion object { val UBYTE = UByteReader() diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/ScaleCodecWriter.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/ScaleCodecWriter.kt index c0d00be31..4f13e4173 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/ScaleCodecWriter.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/ScaleCodecWriter.kt @@ -20,8 +20,9 @@ import java.math.BigInteger /** * SCALE codec writer */ -class ScaleCodecWriter(private val out: OutputStream) : Closeable { - +class ScaleCodecWriter( + private val out: OutputStream, +) : Closeable { fun writeByteArray(value: ByteArray) { out.write(value, 0, value.size) } @@ -58,7 +59,11 @@ class ScaleCodecWriter(private val out: OutputStream) : Closeable { * Write the bytes into output stream as-is directly with the given [offset]. * The input is supposed to be already encoded. */ - fun directWrite(bytes: ByteArray, offset: Int, length: Int) { + fun directWrite( + bytes: ByteArray, + offset: Int, + length: Int, + ) { out.write(bytes, offset, length) } @@ -70,7 +75,10 @@ class ScaleCodecWriter(private val out: OutputStream) : Closeable { out.close() } - fun write(writer: ScaleWriter, value: T) { + fun write( + writer: ScaleWriter, + value: T, + ) { writer.write(this, value) } @@ -84,16 +92,20 @@ class ScaleCodecWriter(private val out: OutputStream) : Closeable { } } - fun writeNullable(writer: ScaleWriter, value: T?) { + fun writeNullable( + writer: ScaleWriter, + value: T?, + ) { when (writer) { is BoolWriter, is BoolNullableWriter -> BOOL_NULLABLE.write(this, value as Boolean?) - else -> when (value) { - null -> BOOL.write(this, false) - else -> { - BOOL.write(this, true) - writer.write(this, value) + else -> + when (value) { + null -> BOOL.write(this, false) + else -> { + BOOL.write(this, true) + writer.write(this, value) + } } - } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/ScaleWriter.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/ScaleWriter.kt index 65dafbf8b..99dd3b585 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/ScaleWriter.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/ScaleWriter.kt @@ -8,14 +8,16 @@ import java.io.ByteArrayOutputStream * @param type */ interface ScaleWriter { - /** * Write SCALE value to the specified writer. * * @param writer writer with the data * @param instance the data to write */ - fun write(writer: ScaleCodecWriter, instance: T) + fun write( + writer: ScaleCodecWriter, + instance: T, + ) /** * Encode provided data as a SCALE value diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/UnionValue.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/UnionValue.kt index 03cc8b119..0a261a720 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/UnionValue.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/UnionValue.kt @@ -5,9 +5,13 @@ import java.util.Objects /** * `UnionValue` type is [enumeration][index] with assigned [value] */ -class UnionValue(index: Int, value: T) { +class UnionValue( + index: Int, + value: T, +) { val index: Int val value: T + override fun equals(o: Any?): Boolean { if (this === o) return true if (o !is UnionValue<*>) return false @@ -17,20 +21,15 @@ class UnionValue(index: Int, value: T) { value == that.value } - fun canEquals(o: Any?): Boolean { - return o is UnionValue<*> - } + fun canEquals(o: Any?): Boolean = o is UnionValue<*> - override fun hashCode(): Int { - return Objects.hash(index, value) - } + override fun hashCode(): Int = Objects.hash(index, value) - override fun toString(): String { - return "UnionValue{" + + override fun toString(): String = + "UnionValue{" + "index=" + index + ", value=" + value + '}' - } init { require(index >= 0) { "Index cannot be negative number: $index" } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/reader/BoolReader.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/reader/BoolReader.kt index ecbec56c4..cd738db5c 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/reader/BoolReader.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/reader/BoolReader.kt @@ -7,25 +7,23 @@ import jp.co.soramitsu.iroha2.codec.ScaleReader * SCALE codec reader for Boolean values encoded as SCALE values */ class BoolReader : ScaleReader { - override fun read(reader: ScaleCodecReader): Boolean { - return when (val b = reader.readByte().toInt()) { + override fun read(reader: ScaleCodecReader): Boolean = + when (val b = reader.readByte().toInt()) { 0 -> false 1 -> true else -> throw IllegalStateException("Not a boolean option: $b") } - } } /** * SCALE codec reader for Nullable Boolean values encoded as SCALE values */ class BoolNullableReader : ScaleReader { - override fun read(reader: ScaleCodecReader): Boolean? { - return when (val b = reader.readByte().toInt()) { + override fun read(reader: ScaleCodecReader): Boolean? = + when (val b = reader.readByte().toInt()) { 0 -> null 1 -> false 2 -> true else -> throw IllegalStateException("Not a boolean option: $b") } - } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/reader/EnumReader.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/reader/EnumReader.kt index 9c519bdc6..bd8441a6d 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/reader/EnumReader.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/reader/EnumReader.kt @@ -13,8 +13,11 @@ import jp.co.soramitsu.iroha2.codec.ScaleReader * @param type of Enum * @see UnionReader */ -class EnumReader?>(values: Array) : ScaleReader { +class EnumReader?>( + values: Array, +) : ScaleReader { private val values: Array + override fun read(reader: ScaleCodecReader): T { val id = reader.readUByte() for (t in values) { diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/reader/IntReader.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/reader/IntReader.kt index 72e433f23..9fadf6365 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/reader/IntReader.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/reader/IntReader.kt @@ -39,7 +39,9 @@ class Int64Reader : ScaleReader { /** * SCALE codec reader for Java Big Integers encoded as integer SCALE values. */ -class IntReader(private val bit: Int) : ScaleReader { +class IntReader( + private val bit: Int, +) : ScaleReader { override fun read(reader: ScaleCodecReader): BigInteger { val capacity = bit / 8 val buf = ByteBuffer.allocate(capacity).order(ByteOrder.LITTLE_ENDIAN) @@ -48,7 +50,11 @@ class IntReader(private val bit: Int) : ScaleReader { } } -private fun putBytes(buf: ByteBuffer, capacity: Int, rdr: ScaleCodecReader) { +private fun putBytes( + buf: ByteBuffer, + capacity: Int, + rdr: ScaleCodecReader, +) { for (i in 1..capacity) { buf.put(rdr.readByte()) } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/reader/ListReader.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/reader/ListReader.kt index 87e8f9274..b079f4a6c 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/reader/ListReader.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/reader/ListReader.kt @@ -6,7 +6,9 @@ import jp.co.soramitsu.iroha2.codec.ScaleReader /** * SCALE codec reader for a list of values encoded as type */ -class ListReader(private val scaleReader: ScaleReader) : ScaleReader> { +class ListReader( + private val scaleReader: ScaleReader, +) : ScaleReader> { override fun read(reader: ScaleCodecReader): List { val size = reader.readCompactInt() val result: MutableList = ArrayList(size) diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/reader/StringReader.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/reader/StringReader.kt index 31d473fca..71cfeb092 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/reader/StringReader.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/reader/StringReader.kt @@ -7,7 +7,5 @@ import jp.co.soramitsu.iroha2.codec.ScaleReader * Read string, encoded as UTF-8 bytes */ class StringReader : ScaleReader { - override fun read(reader: ScaleCodecReader): String { - return reader.readString() - } + override fun read(reader: ScaleCodecReader): String = reader.readString() } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/reader/UIntReader.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/reader/UIntReader.kt index 32952a578..a688557f0 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/reader/UIntReader.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/reader/UIntReader.kt @@ -8,7 +8,9 @@ import java.math.BigInteger /** * SCALE codec reader for Java Big Integers encoded as unsigned SCALE values. */ -class UIntReader(private val bit: Int) : ScaleReader { +class UIntReader( + private val bit: Int, +) : ScaleReader { override fun read(reader: ScaleCodecReader): BigInteger { var result = BigInteger.ZERO result = result.add(BigInteger.valueOf(reader.readUByte().toLong())) diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/reader/UnionReader.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/reader/UnionReader.kt index a422591e4..42a863c2b 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/reader/UnionReader.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/reader/UnionReader.kt @@ -7,8 +7,9 @@ import jp.co.soramitsu.iroha2.codec.UnionValue /** * SCALE reader for [UnionValue] */ -class UnionReader(private val mapping: List>) : ScaleReader> { - +class UnionReader( + private val mapping: List>, +) : ScaleReader> { constructor(vararg mapping: ScaleReader) : this(listOf>(*mapping)) override fun read(reader: ScaleCodecReader): UnionValue { diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/reader/UnsupportedReader.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/reader/UnsupportedReader.kt index 98c24239a..0373db2e4 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/reader/UnsupportedReader.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/reader/UnsupportedReader.kt @@ -8,9 +8,10 @@ import jp.co.soramitsu.iroha2.codec.ScaleReader * * @throws IllegalStateException */ -class UnsupportedReader @JvmOverloads constructor(private val message: String = "Reading an unsupported value") : - ScaleReader { - override fun read(reader: ScaleCodecReader): T { - throw IllegalStateException(message) +class UnsupportedReader + @JvmOverloads + constructor( + private val message: String = "Reading an unsupported value", + ) : ScaleReader { + override fun read(reader: ScaleCodecReader): T = throw IllegalStateException(message) } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/writer/BoolWriter.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/writer/BoolWriter.kt index 4c3909f2e..58964d96c 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/writer/BoolWriter.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/writer/BoolWriter.kt @@ -7,7 +7,10 @@ import jp.co.soramitsu.iroha2.codec.ScaleWriter * SCALE codec writer for Boolean values */ class BoolWriter : ScaleWriter { - override fun write(wrt: ScaleCodecWriter, value: Boolean) { + override fun write( + wrt: ScaleCodecWriter, + value: Boolean, + ) { when (value) { false -> wrt.directWrite(0) true -> wrt.directWrite(1) @@ -19,7 +22,10 @@ class BoolWriter : ScaleWriter { * SCALE codec writer for Nullable Boolean values */ class BoolNullableWriter : ScaleWriter { - override fun write(writer: ScaleCodecWriter, instance: Boolean?) { + override fun write( + writer: ScaleCodecWriter, + instance: Boolean?, + ) { when (instance) { null -> writer.directWrite(0) false -> writer.directWrite(1) diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/writer/CompactBigIntWriter.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/writer/CompactBigIntWriter.kt index ce4ea7740..348bc9950 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/writer/CompactBigIntWriter.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/writer/CompactBigIntWriter.kt @@ -10,7 +10,10 @@ import java.math.BigInteger * [Compact mode][CompactMode] SCALE writer for Big Integers */ class CompactBigIntWriter : ScaleWriter { - override fun write(writer: ScaleCodecWriter, instance: BigInteger) { + override fun write( + writer: ScaleCodecWriter, + instance: BigInteger, + ) { val mode = forNumber(instance) val data = instance.toByteArray() var length = data.size diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/writer/CompactUIntWriter.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/writer/CompactUIntWriter.kt index e9f0f6240..cb5914ea7 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/writer/CompactUIntWriter.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/writer/CompactUIntWriter.kt @@ -9,7 +9,10 @@ import jp.co.soramitsu.iroha2.codec.ScaleWriter * [Compact mode][CompactMode] SCALE writer for unsigned Integers */ class CompactUIntWriter : ScaleWriter { - override fun write(writer: ScaleCodecWriter, instance: Int) { + override fun write( + writer: ScaleCodecWriter, + instance: Int, + ) { val mode = forNumber(instance) var compact: Int var bytes: Int @@ -19,11 +22,12 @@ class CompactUIntWriter : ScaleWriter { bytes = 4 } else { compact = (instance shl 2) + mode.value - bytes = when (mode) { - CompactMode.SINGLE -> 1 - CompactMode.TWO -> 2 - else -> 4 - } + bytes = + when (mode) { + CompactMode.SINGLE -> 1 + CompactMode.TWO -> 2 + else -> 4 + } } while (bytes > 0) { writer.directWrite(compact and 0xff) diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/writer/CompactULongWriter.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/writer/CompactULongWriter.kt index 404f21bc6..f2f04447b 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/writer/CompactULongWriter.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/writer/CompactULongWriter.kt @@ -10,7 +10,10 @@ import java.math.BigInteger * [Compact mode][CompactMode] SCALE writer for unsigned Long Integers */ class CompactULongWriter : ScaleWriter { - override fun write(wrt: ScaleCodecWriter, value: Long) { + override fun write( + wrt: ScaleCodecWriter, + value: Long, + ) { val mode = forNumber(value) var compact: Long var bytes: Int @@ -19,11 +22,12 @@ class CompactULongWriter : ScaleWriter { return } else { compact = (value shl 2) + mode.value - bytes = when (mode) { - CompactMode.SINGLE -> 1 - CompactMode.TWO -> 2 - else -> 4 - } + bytes = + when (mode) { + CompactMode.SINGLE -> 1 + CompactMode.TWO -> 2 + else -> 4 + } } while (bytes > 0) { wrt.directWrite(compact.toInt() and 0xff) diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/writer/IntWriter.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/writer/IntWriter.kt index f05132539..cbb01a711 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/writer/IntWriter.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/writer/IntWriter.kt @@ -10,7 +10,10 @@ import java.math.BigInteger * SCALE codec writer for Java Integers to encode them as 32-bit integer SCALE value. */ class Int32Writer : ScaleWriter { - override fun write(writer: ScaleCodecWriter, instance: Int) { + override fun write( + writer: ScaleCodecWriter, + instance: Int, + ) { require(Int.MIN_VALUE <= instance) { "Value is too small for I32: $instance" } require(instance <= Int.MAX_VALUE) { "Value is too big for I32: $instance" } @@ -25,7 +28,10 @@ class Int32Writer : ScaleWriter { * SCALE codec writer for Java Long Integers to encode them as 64-bit integer SCALE value. */ class Int64Writer : ScaleWriter { - override fun write(writer: ScaleCodecWriter, instance: Long) { + override fun write( + writer: ScaleCodecWriter, + instance: Long, + ) { require(Long.MIN_VALUE <= instance) { "Value is too small for I64: $instance" } require(instance <= Long.MAX_VALUE) { "Value is too big for I64: $instance" } @@ -43,8 +49,13 @@ class Int64Writer : ScaleWriter { /** * SCALE codec writer for Java Big Integers to encode them as integer SCALE value. */ -class IntWriter(private val bit: Int) : ScaleWriter { - override fun write(writer: ScaleCodecWriter, instance: BigInteger) { +class IntWriter( + private val bit: Int, +) : ScaleWriter { + override fun write( + writer: ScaleCodecWriter, + instance: BigInteger, + ) { require(IntMin.intMinValue(bit) <= instance) { "Value is too small for I$bit: $instance" } require(instance <= IntMax.intMaxValue(bit)) { "Value is too big for I$bit: $instance" } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/writer/ListWriter.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/writer/ListWriter.kt index adb1bd0cb..fce062c0b 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/writer/ListWriter.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/writer/ListWriter.kt @@ -6,8 +6,13 @@ import jp.co.soramitsu.iroha2.codec.ScaleWriter /** * SCALE codec writer for a list of values to be encoded as type */ -class ListWriter(private val scaleWriter: ScaleWriter) : ScaleWriter> { - override fun write(writer: ScaleCodecWriter, instance: List) { +class ListWriter( + private val scaleWriter: ScaleWriter, +) : ScaleWriter> { + override fun write( + writer: ScaleCodecWriter, + instance: List, + ) { writer.writeCompact(instance.size) for (item in instance) { scaleWriter.write(writer, item) diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/writer/UByteWriter.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/writer/UByteWriter.kt index 642905478..872d31043 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/writer/UByteWriter.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/writer/UByteWriter.kt @@ -7,7 +7,10 @@ import jp.co.soramitsu.iroha2.codec.ScaleWriter * SCALE codec writer for Java Short Integers to encode them as unsigned byte SCALE values */ class UByteWriter : ScaleWriter { - override fun write(writer: ScaleCodecWriter, instance: Short) { + override fun write( + writer: ScaleCodecWriter, + instance: Short, + ) { require(!(instance < 0 || instance > 0xff)) { "Only values in range 0..255 are supported: $instance" } writer.directWrite(instance) } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/writer/UIntWriter.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/writer/UIntWriter.kt index 412300506..7a643878a 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/writer/UIntWriter.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/writer/UIntWriter.kt @@ -8,8 +8,13 @@ import java.math.BigInteger /** * SCALE codec writer for Java Big Integers to encode them as unsigned integer SCALE values */ -open class UIntWriter(private val bit: Int) : ScaleWriter { - override fun write(writer: ScaleCodecWriter, instance: BigInteger) { +open class UIntWriter( + private val bit: Int, +) : ScaleWriter { + override fun write( + writer: ScaleCodecWriter, + instance: BigInteger, + ) { require(instance >= BigInteger.ZERO) { "Negative values are not supported: $instance" } require(instance <= IntMax.uintMaxValue(bit)) { "Value is too big for U$bit: $instance" } @@ -24,7 +29,10 @@ open class UIntWriter(private val bit: Int) : ScaleWriter { * SCALE codec writer for Java Integers to encode them as unsigned 16-bit integer SCALE values */ class UInt16Writer : ScaleWriter { - override fun write(wrt: ScaleCodecWriter, value: Int) { + override fun write( + wrt: ScaleCodecWriter, + value: Int, + ) { require(value >= 0) { "Negative values are not supported: $value" } wrt.directWrite(value and 0xff) wrt.directWrite(value shr 8 and 0xff) @@ -35,7 +43,10 @@ class UInt16Writer : ScaleWriter { * SCALE codec writer for Kotlin Int to encode them as unsigned 32-bit integer SCALE values */ class UInt32Writer : ScaleWriter { - override fun write(wrt: ScaleCodecWriter, value: Int) { + override fun write( + wrt: ScaleCodecWriter, + value: Int, + ) { require(value >= 0) { "Negative values are not supported: $value" } wrt.directWrite(value and 0xff) wrt.directWrite(value shr 8 and 0xff) @@ -48,7 +59,10 @@ class UInt32Writer : ScaleWriter { * SCALE codec writer for Kotlin Long to encode them as unsigned 32-bit integer SCALE values */ class ULong32Writer : ScaleWriter { - override fun write(wrt: ScaleCodecWriter, value: Long) { + override fun write( + wrt: ScaleCodecWriter, + value: Long, + ) { require(value >= 0) { "Negative values are not supported: $value" } require(value <= 0xffffffffL) { "Value is too big for U32: $value" } wrt.directWrite(value and 0xff) diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/writer/UnionWriter.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/writer/UnionWriter.kt index f33f9af50..75f21c010 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/writer/UnionWriter.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/codec/writer/UnionWriter.kt @@ -7,13 +7,17 @@ import jp.co.soramitsu.iroha2.codec.UnionValue /** * SCALE codec writer for [UnionValue] */ -class UnionWriter(mapping: List>) : ScaleWriter> { - +class UnionWriter( + mapping: List>, +) : ScaleWriter> { private val mapping: MutableList> constructor(vararg mapping: ScaleWriter) : this(listOf>(*mapping)) - override fun write(writer: ScaleCodecWriter, instance: UnionValue) { + override fun write( + writer: ScaleCodecWriter, + instance: UnionValue, + ) { writer.directWrite(instance.index) val actual = instance.value mapping[instance.index].write(writer, actual) diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Account.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Account.kt index ed68718cc..f81d2a440 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Account.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Account.kt @@ -20,20 +20,25 @@ public data class Account( public val metadata: Metadata, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): Account = try { - Account( - AccountId.read(reader), - Metadata.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): Account = + try { + Account( + AccountId.read(reader), + Metadata.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: Account): Unit = try { - AccountId.write(writer, instance.id) - Metadata.write(writer, instance.metadata) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: Account, + ): Unit = + try { + AccountId.write(writer, instance.id) + Metadata.write(writer, instance.metadata) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountEvent.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountEvent.kt index cc6e3b0e0..326296321 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountEvent.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountEvent.kt @@ -36,22 +36,24 @@ public sealed class AccountEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AccountEvent.Created = try { - Created( - Account.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AccountEvent.Created = + try { + Created( + Account.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.AccountEvent.Created, - ): Unit = try { - Account.write(writer, instance.account) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + Account.write(writer, instance.account) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -68,22 +70,24 @@ public sealed class AccountEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AccountEvent.Deleted = try { - Deleted( - AccountId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AccountEvent.Deleted = + try { + Deleted( + AccountId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.AccountEvent.Deleted, - ): Unit = try { - AccountId.write(writer, instance.accountId) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + AccountId.write(writer, instance.accountId) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -100,22 +104,24 @@ public sealed class AccountEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 2 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AccountEvent.Asset = try { - Asset( - AssetEvent.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AccountEvent.Asset = + try { + Asset( + AssetEvent.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.AccountEvent.Asset, - ): Unit = try { - AssetEvent.write(writer, instance.assetEvent) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + AssetEvent.write(writer, instance.assetEvent) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -132,22 +138,24 @@ public sealed class AccountEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 3 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AccountEvent.PermissionAdded = try { - PermissionAdded( - AccountPermissionChanged.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AccountEvent.PermissionAdded = + try { + PermissionAdded( + AccountPermissionChanged.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.AccountEvent.PermissionAdded, - ): Unit = try { - AccountPermissionChanged.write(writer, instance.accountPermissionChanged) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + AccountPermissionChanged.write(writer, instance.accountPermissionChanged) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -164,22 +172,24 @@ public sealed class AccountEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 4 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AccountEvent.PermissionRemoved = try { - PermissionRemoved( - AccountPermissionChanged.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AccountEvent.PermissionRemoved = + try { + PermissionRemoved( + AccountPermissionChanged.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.AccountEvent.PermissionRemoved, - ): Unit = try { - AccountPermissionChanged.write(writer, instance.accountPermissionChanged) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + AccountPermissionChanged.write(writer, instance.accountPermissionChanged) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -196,22 +206,24 @@ public sealed class AccountEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 5 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AccountEvent.RoleGranted = try { - RoleGranted( - AccountRoleChanged.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AccountEvent.RoleGranted = + try { + RoleGranted( + AccountRoleChanged.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.AccountEvent.RoleGranted, - ): Unit = try { - AccountRoleChanged.write(writer, instance.accountRoleChanged) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + AccountRoleChanged.write(writer, instance.accountRoleChanged) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -228,22 +240,24 @@ public sealed class AccountEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 6 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AccountEvent.RoleRevoked = try { - RoleRevoked( - AccountRoleChanged.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AccountEvent.RoleRevoked = + try { + RoleRevoked( + AccountRoleChanged.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.AccountEvent.RoleRevoked, - ): Unit = try { - AccountRoleChanged.write(writer, instance.accountRoleChanged) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + AccountRoleChanged.write(writer, instance.accountRoleChanged) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -260,22 +274,24 @@ public sealed class AccountEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 7 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AccountEvent.MetadataInserted = try { - MetadataInserted( - MetadataChangedOfAccountId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AccountEvent.MetadataInserted = + try { + MetadataInserted( + MetadataChangedOfAccountId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.AccountEvent.MetadataInserted, - ): Unit = try { - MetadataChangedOfAccountId.write(writer, instance.metadataChangedOfAccountId) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + MetadataChangedOfAccountId.write(writer, instance.metadataChangedOfAccountId) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -292,42 +308,46 @@ public sealed class AccountEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 8 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AccountEvent.MetadataRemoved = try { - MetadataRemoved( - MetadataChangedOfAccountId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AccountEvent.MetadataRemoved = + try { + MetadataRemoved( + MetadataChangedOfAccountId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.AccountEvent.MetadataRemoved, - ): Unit = try { - MetadataChangedOfAccountId.write(writer, instance.metadataChangedOfAccountId) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + MetadataChangedOfAccountId.write(writer, instance.metadataChangedOfAccountId) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): AccountEvent = when ( - val discriminant = - reader.readUByte() + override fun read(reader: ScaleCodecReader): AccountEvent = + when (val discriminant = reader.readUByte()) { + 0 -> Created.read(reader) + 1 -> Deleted.read(reader) + 2 -> Asset.read(reader) + 3 -> PermissionAdded.read(reader) + 4 -> PermissionRemoved.read(reader) + 5 -> RoleGranted.read(reader) + 6 -> RoleRevoked.read(reader) + 7 -> MetadataInserted.read(reader) + 8 -> MetadataRemoved.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: AccountEvent, ) { - 0 -> Created.read(reader) - 1 -> Deleted.read(reader) - 2 -> Asset.read(reader) - 3 -> PermissionAdded.read(reader) - 4 -> PermissionRemoved.read(reader) - 5 -> RoleGranted.read(reader) - 6 -> RoleRevoked.read(reader) - 7 -> MetadataInserted.read(reader) - 8 -> MetadataRemoved.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: AccountEvent) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Created.write(writer, instance as Created) @@ -339,7 +359,8 @@ public sealed class AccountEvent : ModelEnum { 6 -> RoleRevoked.write(writer, instance as RoleRevoked) 7 -> MetadataInserted.write(writer, instance as MetadataInserted) 8 -> MetadataRemoved.write(writer, instance as MetadataRemoved) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountEventFilter.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountEventFilter.kt index a5355bfe3..f877c2ad2 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountEventFilter.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountEventFilter.kt @@ -21,20 +21,25 @@ public data class AccountEventFilter( public val eventSet: Long, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): AccountEventFilter = try { - AccountEventFilter( - reader.readNullable(AccountId) as AccountId?, - reader.readUint32(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): AccountEventFilter = + try { + AccountEventFilter( + reader.readNullable(AccountId) as AccountId?, + reader.readUint32(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: AccountEventFilter): Unit = try { - writer.writeNullable(AccountId, instance.idMatcher) - writer.writeUint32(instance.eventSet) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: AccountEventFilter, + ): Unit = + try { + writer.writeNullable(AccountId, instance.idMatcher) + writer.writeUint32(instance.eventSet) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountId.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountId.kt index 3dbdc2f0d..ad1fbe289 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountId.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountId.kt @@ -20,20 +20,25 @@ public data class AccountId( public val signatory: PublicKey, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): AccountId = try { - AccountId( - DomainId.read(reader), - PublicKey.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): AccountId = + try { + AccountId( + DomainId.read(reader), + PublicKey.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: AccountId): Unit = try { - DomainId.write(writer, instance.domain) - PublicKey.write(writer, instance.signatory) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: AccountId, + ): Unit = + try { + DomainId.write(writer, instance.domain) + PublicKey.write(writer, instance.signatory) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountIdPredicateAtom.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountIdPredicateAtom.kt new file mode 100644 index 000000000..ae232e7e5 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountIdPredicateAtom.kt @@ -0,0 +1,80 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit + +/** + * AccountIdPredicateAtom + * + * Generated from 'AccountIdPredicateAtom' enum + */ +public sealed class AccountIdPredicateAtom : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Equals' variant + */ + public data class Equals( + public val accountId: AccountId, + ) : AccountIdPredicateAtom() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AccountIdPredicateAtom.Equals = + try { + Equals( + AccountId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AccountIdPredicateAtom.Equals, + ): Unit = + try { + AccountId.write(writer, instance.accountId) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): AccountIdPredicateAtom = + when (val discriminant = reader.readUByte()) { + 0 -> Equals.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: AccountIdPredicateAtom, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Equals.write(writer, instance as Equals) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountIdPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountIdPredicateBox.kt deleted file mode 100644 index 8c67a2eb7..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountIdPredicateBox.kt +++ /dev/null @@ -1,141 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.ModelEnum -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Int -import kotlin.Unit - -/** - * AccountIdPredicateBox - * - * Generated from 'AccountIdPredicateBox' enum - */ -public sealed class AccountIdPredicateBox : ModelEnum { - /** - * @return Discriminator of variant in enum - */ - public abstract fun discriminant(): Int - - /** - * 'Equals' variant - */ - public data class Equals( - public val accountId: AccountId, - ) : AccountIdPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 0 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AccountIdPredicateBox.Equals = try { - Equals( - AccountId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.AccountIdPredicateBox.Equals, - ): Unit = try { - AccountId.write(writer, instance.accountId) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'DomainId' variant - */ - public data class DomainId( - public val domainIdPredicateBox: DomainIdPredicateBox, - ) : AccountIdPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 1 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AccountIdPredicateBox.DomainId = try { - DomainId( - DomainIdPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.AccountIdPredicateBox.DomainId, - ): Unit = try { - DomainIdPredicateBox.write(writer, instance.domainIdPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Signatory' variant - */ - public data class Signatory( - public val publicKeyPredicateBox: PublicKeyPredicateBox, - ) : AccountIdPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 2 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AccountIdPredicateBox.Signatory = try { - Signatory( - PublicKeyPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.AccountIdPredicateBox.Signatory, - ): Unit = try { - PublicKeyPredicateBox.write(writer, instance.publicKeyPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): AccountIdPredicateBox = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Equals.read(reader) - 1 -> DomainId.read(reader) - 2 -> Signatory.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: AccountIdPredicateBox) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 0 -> Equals.write(writer, instance as Equals) - 1 -> DomainId.write(writer, instance as DomainId) - 2 -> Signatory.write(writer, instance as Signatory) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountIdProjectionOfPredicateMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountIdProjectionOfPredicateMarker.kt new file mode 100644 index 000000000..6063f8c91 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountIdProjectionOfPredicateMarker.kt @@ -0,0 +1,152 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit + +/** + * AccountIdProjectionOfPredicateMarker + * + * Generated from 'AccountIdProjectionOfPredicateMarker' enum + */ +public sealed class AccountIdProjectionOfPredicateMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val accountIdPredicateAtom: AccountIdPredicateAtom, + ) : AccountIdProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AccountIdProjectionOfPredicateMarker.Atom = + try { + Atom( + AccountIdPredicateAtom.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AccountIdProjectionOfPredicateMarker.Atom, + ): Unit = + try { + AccountIdPredicateAtom.write(writer, instance.accountIdPredicateAtom) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Domain' variant + */ + public data class Domain( + public val domainIdProjectionOfPredicateMarker: DomainIdProjectionOfPredicateMarker, + ) : AccountIdProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AccountIdProjectionOfPredicateMarker.Domain = + try { + Domain( + DomainIdProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AccountIdProjectionOfPredicateMarker.Domain, + ): Unit = + try { + DomainIdProjectionOfPredicateMarker.write(writer, instance.domainIdProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Signatory' variant + */ + public data class Signatory( + public val publicKeyProjectionOfPredicateMarker: PublicKeyProjectionOfPredicateMarker, + ) : AccountIdProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 2 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AccountIdProjectionOfPredicateMarker.Signatory = + try { + Signatory( + PublicKeyProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AccountIdProjectionOfPredicateMarker.Signatory, + ): Unit = + try { + PublicKeyProjectionOfPredicateMarker.write(writer, instance.publicKeyProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): AccountIdProjectionOfPredicateMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Domain.read(reader) + 2 -> Signatory.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: AccountIdProjectionOfPredicateMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Domain.write(writer, instance as Domain) + 2 -> Signatory.write(writer, instance as Signatory) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountIdProjectionOfSelectorMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountIdProjectionOfSelectorMarker.kt new file mode 100644 index 000000000..c4aba456e --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountIdProjectionOfSelectorMarker.kt @@ -0,0 +1,172 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Any +import kotlin.Boolean +import kotlin.Int +import kotlin.Unit + +/** + * AccountIdProjectionOfSelectorMarker + * + * Generated from 'AccountIdProjectionOfSelectorMarker' enum + */ +public sealed class AccountIdProjectionOfSelectorMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + override fun equals(other: Any?): Boolean = + when (this) { + is Atom -> Atom.equals(this, other) + else -> super.equals(other) + } + + override fun hashCode(): Int = + when (this) { + is Atom -> Atom.hashCode() + else -> super.hashCode() + } + + /** + * 'Atom' variant + */ + public class Atom : AccountIdProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AccountIdProjectionOfSelectorMarker.Atom = + try { + Atom() + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AccountIdProjectionOfSelectorMarker.Atom, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.AccountIdProjectionOfSelectorMarker.Atom, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".AccountIdProjectionOfSelectorMarker.Atom".hashCode() + } + } + + /** + * 'Domain' variant + */ + public data class Domain( + public val domainIdProjectionOfSelectorMarker: DomainIdProjectionOfSelectorMarker, + ) : AccountIdProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AccountIdProjectionOfSelectorMarker.Domain = + try { + Domain( + DomainIdProjectionOfSelectorMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AccountIdProjectionOfSelectorMarker.Domain, + ): Unit = + try { + DomainIdProjectionOfSelectorMarker.write(writer, instance.domainIdProjectionOfSelectorMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Signatory' variant + */ + public data class Signatory( + public val publicKeyProjectionOfSelectorMarker: PublicKeyProjectionOfSelectorMarker, + ) : AccountIdProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 2 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AccountIdProjectionOfSelectorMarker.Signatory = + try { + Signatory( + PublicKeyProjectionOfSelectorMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AccountIdProjectionOfSelectorMarker.Signatory, + ): Unit = + try { + PublicKeyProjectionOfSelectorMarker.write(writer, instance.publicKeyProjectionOfSelectorMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): AccountIdProjectionOfSelectorMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Domain.read(reader) + 2 -> Signatory.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: AccountIdProjectionOfSelectorMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Domain.write(writer, instance as Domain) + 2 -> Signatory.write(writer, instance as Signatory) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountPermissionChanged.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountPermissionChanged.kt index 9957dc0d9..72c5bfe71 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountPermissionChanged.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountPermissionChanged.kt @@ -22,20 +22,25 @@ public data class AccountPermissionChanged( public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): AccountPermissionChanged = try { - AccountPermissionChanged( - AccountId.read(reader), - Permission.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): AccountPermissionChanged = + try { + AccountPermissionChanged( + AccountId.read(reader), + Permission.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: AccountPermissionChanged): Unit = try { - AccountId.write(writer, instance.account) - Permission.write(writer, instance.permission) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: AccountPermissionChanged, + ): Unit = + try { + AccountId.write(writer, instance.account) + Permission.write(writer, instance.permission) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountPredicateAtom.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountPredicateAtom.kt new file mode 100644 index 000000000..b2bfb038d --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountPredicateAtom.kt @@ -0,0 +1,40 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import kotlin.Int + +/** + * AccountPredicateAtom + * + * Generated from 'AccountPredicateAtom' enum + */ +public sealed class AccountPredicateAtom : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): AccountPredicateAtom = + when (val discriminant = reader.readUByte()) { + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: AccountPredicateAtom, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountPredicateBox.kt deleted file mode 100644 index 1636d2ec0..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountPredicateBox.kt +++ /dev/null @@ -1,107 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.ModelEnum -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Int -import kotlin.Unit - -/** - * AccountPredicateBox - * - * Generated from 'AccountPredicateBox' enum - */ -public sealed class AccountPredicateBox : ModelEnum { - /** - * @return Discriminator of variant in enum - */ - public abstract fun discriminant(): Int - - /** - * 'Id' variant - */ - public data class Id( - public val accountIdPredicateBox: AccountIdPredicateBox, - ) : AccountPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 0 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AccountPredicateBox.Id = try { - Id( - AccountIdPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.AccountPredicateBox.Id, - ): Unit = try { - AccountIdPredicateBox.write(writer, instance.accountIdPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Metadata' variant - */ - public data class Metadata( - public val metadataPredicateBox: MetadataPredicateBox, - ) : AccountPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 1 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AccountPredicateBox.Metadata = try { - Metadata( - MetadataPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.AccountPredicateBox.Metadata, - ): Unit = try { - MetadataPredicateBox.write(writer, instance.metadataPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): AccountPredicateBox = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Id.read(reader) - 1 -> Metadata.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: AccountPredicateBox) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 0 -> Id.write(writer, instance as Id) - 1 -> Metadata.write(writer, instance as Metadata) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountProjectionOfPredicateMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountProjectionOfPredicateMarker.kt new file mode 100644 index 000000000..a999e7152 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountProjectionOfPredicateMarker.kt @@ -0,0 +1,152 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit + +/** + * AccountProjectionOfPredicateMarker + * + * Generated from 'AccountProjectionOfPredicateMarker' enum + */ +public sealed class AccountProjectionOfPredicateMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val accountPredicateAtom: AccountPredicateAtom, + ) : AccountProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AccountProjectionOfPredicateMarker.Atom = + try { + Atom( + AccountPredicateAtom.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AccountProjectionOfPredicateMarker.Atom, + ): Unit = + try { + AccountPredicateAtom.write(writer, instance.accountPredicateAtom) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Id' variant + */ + public data class Id( + public val accountIdProjectionOfPredicateMarker: AccountIdProjectionOfPredicateMarker, + ) : AccountProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AccountProjectionOfPredicateMarker.Id = + try { + Id( + AccountIdProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AccountProjectionOfPredicateMarker.Id, + ): Unit = + try { + AccountIdProjectionOfPredicateMarker.write(writer, instance.accountIdProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Metadata' variant + */ + public data class Metadata( + public val metadataProjectionOfPredicateMarker: MetadataProjectionOfPredicateMarker, + ) : AccountProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 2 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AccountProjectionOfPredicateMarker.Metadata = + try { + Metadata( + MetadataProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AccountProjectionOfPredicateMarker.Metadata, + ): Unit = + try { + MetadataProjectionOfPredicateMarker.write(writer, instance.metadataProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): AccountProjectionOfPredicateMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Id.read(reader) + 2 -> Metadata.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: AccountProjectionOfPredicateMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Id.write(writer, instance as Id) + 2 -> Metadata.write(writer, instance as Metadata) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountProjectionOfSelectorMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountProjectionOfSelectorMarker.kt new file mode 100644 index 000000000..aa23f41ca --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountProjectionOfSelectorMarker.kt @@ -0,0 +1,172 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Any +import kotlin.Boolean +import kotlin.Int +import kotlin.Unit + +/** + * AccountProjectionOfSelectorMarker + * + * Generated from 'AccountProjectionOfSelectorMarker' enum + */ +public sealed class AccountProjectionOfSelectorMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + override fun equals(other: Any?): Boolean = + when (this) { + is Atom -> Atom.equals(this, other) + else -> super.equals(other) + } + + override fun hashCode(): Int = + when (this) { + is Atom -> Atom.hashCode() + else -> super.hashCode() + } + + /** + * 'Atom' variant + */ + public class Atom : AccountProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AccountProjectionOfSelectorMarker.Atom = + try { + Atom() + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AccountProjectionOfSelectorMarker.Atom, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.AccountProjectionOfSelectorMarker.Atom, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".AccountProjectionOfSelectorMarker.Atom".hashCode() + } + } + + /** + * 'Id' variant + */ + public data class Id( + public val accountIdProjectionOfSelectorMarker: AccountIdProjectionOfSelectorMarker, + ) : AccountProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AccountProjectionOfSelectorMarker.Id = + try { + Id( + AccountIdProjectionOfSelectorMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AccountProjectionOfSelectorMarker.Id, + ): Unit = + try { + AccountIdProjectionOfSelectorMarker.write(writer, instance.accountIdProjectionOfSelectorMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Metadata' variant + */ + public data class Metadata( + public val metadataProjectionOfSelectorMarker: MetadataProjectionOfSelectorMarker, + ) : AccountProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 2 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AccountProjectionOfSelectorMarker.Metadata = + try { + Metadata( + MetadataProjectionOfSelectorMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AccountProjectionOfSelectorMarker.Metadata, + ): Unit = + try { + MetadataProjectionOfSelectorMarker.write(writer, instance.metadataProjectionOfSelectorMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): AccountProjectionOfSelectorMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Id.read(reader) + 2 -> Metadata.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: AccountProjectionOfSelectorMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Id.write(writer, instance as Id) + 2 -> Metadata.write(writer, instance as Metadata) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountRoleChanged.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountRoleChanged.kt index f3d9abe99..3e30f1c04 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountRoleChanged.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AccountRoleChanged.kt @@ -20,20 +20,25 @@ public data class AccountRoleChanged( public val role: RoleId, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): AccountRoleChanged = try { - AccountRoleChanged( - AccountId.read(reader), - RoleId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): AccountRoleChanged = + try { + AccountRoleChanged( + AccountId.read(reader), + RoleId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: AccountRoleChanged): Unit = try { - AccountId.write(writer, instance.account) - RoleId.write(writer, instance.role) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: AccountRoleChanged, + ): Unit = + try { + AccountId.write(writer, instance.account) + RoleId.write(writer, instance.role) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Action.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Action.kt index e6422e1ee..bacae3339 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Action.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Action.kt @@ -23,26 +23,31 @@ public data class Action( public val metadata: Metadata, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): Action = try { - Action( - Executable.read(reader), - Repeats.read(reader), - AccountId.read(reader), - EventFilterBox.read(reader), - Metadata.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): Action = + try { + Action( + Executable.read(reader), + Repeats.read(reader), + AccountId.read(reader), + EventFilterBox.read(reader), + Metadata.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: Action): Unit = try { - Executable.write(writer, instance.executable) - Repeats.write(writer, instance.repeats) - AccountId.write(writer, instance.authority) - EventFilterBox.write(writer, instance.filter) - Metadata.write(writer, instance.metadata) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: Action, + ): Unit = + try { + Executable.write(writer, instance.executable) + Repeats.write(writer, instance.repeats) + AccountId.write(writer, instance.authority) + EventFilterBox.write(writer, instance.filter) + Metadata.write(writer, instance.metadata) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ActionPredicateAtom.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ActionPredicateAtom.kt new file mode 100644 index 000000000..07d8c9b7b --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ActionPredicateAtom.kt @@ -0,0 +1,40 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import kotlin.Int + +/** + * ActionPredicateAtom + * + * Generated from 'ActionPredicateAtom' enum + */ +public sealed class ActionPredicateAtom : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): ActionPredicateAtom = + when (val discriminant = reader.readUByte()) { + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: ActionPredicateAtom, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ActionProjectionOfPredicateMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ActionProjectionOfPredicateMarker.kt new file mode 100644 index 000000000..b8af8adc6 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ActionProjectionOfPredicateMarker.kt @@ -0,0 +1,116 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit + +/** + * ActionProjectionOfPredicateMarker + * + * Generated from 'ActionProjectionOfPredicateMarker' enum + */ +public sealed class ActionProjectionOfPredicateMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val actionPredicateAtom: ActionPredicateAtom, + ) : ActionProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.ActionProjectionOfPredicateMarker.Atom = + try { + Atom( + ActionPredicateAtom.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.ActionProjectionOfPredicateMarker.Atom, + ): Unit = + try { + ActionPredicateAtom.write(writer, instance.actionPredicateAtom) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Metadata' variant + */ + public data class Metadata( + public val metadataProjectionOfPredicateMarker: MetadataProjectionOfPredicateMarker, + ) : ActionProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.ActionProjectionOfPredicateMarker.Metadata = + try { + Metadata( + MetadataProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.ActionProjectionOfPredicateMarker.Metadata, + ): Unit = + try { + MetadataProjectionOfPredicateMarker.write(writer, instance.metadataProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): ActionProjectionOfPredicateMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Metadata.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: ActionProjectionOfPredicateMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Metadata.write(writer, instance as Metadata) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ActionProjectionOfSelectorMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ActionProjectionOfSelectorMarker.kt new file mode 100644 index 000000000..3fcfb4ae4 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ActionProjectionOfSelectorMarker.kt @@ -0,0 +1,136 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Any +import kotlin.Boolean +import kotlin.Int +import kotlin.Unit + +/** + * ActionProjectionOfSelectorMarker + * + * Generated from 'ActionProjectionOfSelectorMarker' enum + */ +public sealed class ActionProjectionOfSelectorMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + override fun equals(other: Any?): Boolean = + when (this) { + is Atom -> Atom.equals(this, other) + else -> super.equals(other) + } + + override fun hashCode(): Int = + when (this) { + is Atom -> Atom.hashCode() + else -> super.hashCode() + } + + /** + * 'Atom' variant + */ + public class Atom : ActionProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.ActionProjectionOfSelectorMarker.Atom = + try { + Atom() + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.ActionProjectionOfSelectorMarker.Atom, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.ActionProjectionOfSelectorMarker.Atom, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".ActionProjectionOfSelectorMarker.Atom".hashCode() + } + } + + /** + * 'Metadata' variant + */ + public data class Metadata( + public val metadataProjectionOfSelectorMarker: MetadataProjectionOfSelectorMarker, + ) : ActionProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.ActionProjectionOfSelectorMarker.Metadata = + try { + Metadata( + MetadataProjectionOfSelectorMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.ActionProjectionOfSelectorMarker.Metadata, + ): Unit = + try { + MetadataProjectionOfSelectorMarker.write(writer, instance.metadataProjectionOfSelectorMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): ActionProjectionOfSelectorMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Metadata.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: ActionProjectionOfSelectorMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Metadata.write(writer, instance as Metadata) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Algorithm.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Algorithm.kt index b11eb10b5..226f4678d 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Algorithm.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Algorithm.kt @@ -25,19 +25,23 @@ public sealed class Algorithm : ModelEnum { */ public abstract fun discriminant(): Int - override fun equals(other: Any?): Boolean = when (this) { - is Ed25519 -> Ed25519.equals(this, other) - is Secp256k1 -> Secp256k1.equals(this, other) - is BlsNormal -> BlsNormal.equals(this, other) - is BlsSmall -> BlsSmall.equals(this, other) - else -> super.equals(other) } - - override fun hashCode(): Int = when (this) { - is Ed25519 -> Ed25519.hashCode() - is Secp256k1 -> Secp256k1.hashCode() - is BlsNormal -> BlsNormal.hashCode() - is BlsSmall -> BlsSmall.hashCode() - else -> super.hashCode() } + override fun equals(other: Any?): Boolean = + when (this) { + is Ed25519 -> Ed25519.equals(this, other) + is Secp256k1 -> Secp256k1.equals(this, other) + is BlsNormal -> BlsNormal.equals(this, other) + is BlsSmall -> BlsSmall.equals(this, other) + else -> super.equals(other) + } + + override fun hashCode(): Int = + when (this) { + is Ed25519 -> Ed25519.hashCode() + is Secp256k1 -> Secp256k1.hashCode() + is BlsNormal -> BlsNormal.hashCode() + is BlsSmall -> BlsSmall.hashCode() + else -> super.hashCode() + } /** * 'Ed25519' variant @@ -50,21 +54,26 @@ public sealed class Algorithm : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.Algorithm.Ed25519 = try { - Ed25519() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.Algorithm.Ed25519 = + try { + Ed25519() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.Algorithm.Ed25519, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: jp.co.soramitsu.iroha2.generated.Algorithm.Ed25519, o2: Any?): Boolean = + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.Algorithm.Ed25519, + o2: Any?, + ): Boolean = when (o2) { null -> false else -> o2::class == o1::class @@ -85,24 +94,30 @@ public sealed class Algorithm : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.Algorithm.Secp256k1 = try { - Secp256k1() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.Algorithm.Secp256k1 = + try { + Secp256k1() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.Algorithm.Secp256k1, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: jp.co.soramitsu.iroha2.generated.Algorithm.Secp256k1, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.Algorithm.Secp256k1, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".Algorithm.Secp256k1".hashCode() } @@ -119,24 +134,30 @@ public sealed class Algorithm : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 2 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.Algorithm.BlsNormal = try { - BlsNormal() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.Algorithm.BlsNormal = + try { + BlsNormal() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.Algorithm.BlsNormal, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: jp.co.soramitsu.iroha2.generated.Algorithm.BlsNormal, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.Algorithm.BlsNormal, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".Algorithm.BlsNormal".hashCode() } @@ -153,48 +174,57 @@ public sealed class Algorithm : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 3 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.Algorithm.BlsSmall = try { - BlsSmall() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.Algorithm.BlsSmall = + try { + BlsSmall() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.Algorithm.BlsSmall, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: jp.co.soramitsu.iroha2.generated.Algorithm.BlsSmall, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.Algorithm.BlsSmall, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".Algorithm.BlsSmall".hashCode() } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): Algorithm = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Ed25519.read(reader) - 1 -> Secp256k1.read(reader) - 2 -> BlsNormal.read(reader) - 3 -> BlsSmall.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + override fun read(reader: ScaleCodecReader): Algorithm = + when (val discriminant = reader.readUByte()) { + 0 -> Ed25519.read(reader) + 1 -> Secp256k1.read(reader) + 2 -> BlsNormal.read(reader) + 3 -> BlsSmall.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: Algorithm) { + override fun write( + writer: ScaleCodecWriter, + instance: Algorithm, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Ed25519.write(writer, instance as Ed25519) 1 -> Secp256k1.write(writer, instance as Secp256k1) 2 -> BlsNormal.write(writer, instance as BlsNormal) 3 -> BlsSmall.write(writer, instance as BlsSmall) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Asset.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Asset.kt index 2769ea857..4eab31370 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Asset.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Asset.kt @@ -20,20 +20,25 @@ public data class Asset( public val `value`: AssetValue, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): Asset = try { - Asset( - AssetId.read(reader), - AssetValue.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): Asset = + try { + Asset( + AssetId.read(reader), + AssetValue.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: Asset): Unit = try { - AssetId.write(writer, instance.id) - AssetValue.write(writer, instance.`value`) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: Asset, + ): Unit = + try { + AssetId.write(writer, instance.id) + AssetValue.write(writer, instance.`value`) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetChanged.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetChanged.kt index 0c74cd6e7..8bf30fea1 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetChanged.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetChanged.kt @@ -20,20 +20,25 @@ public data class AssetChanged( public val amount: AssetValue, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): AssetChanged = try { - AssetChanged( - AssetId.read(reader), - AssetValue.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): AssetChanged = + try { + AssetChanged( + AssetId.read(reader), + AssetValue.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: AssetChanged): Unit = try { - AssetId.write(writer, instance.asset) - AssetValue.write(writer, instance.amount) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: AssetChanged, + ): Unit = + try { + AssetId.write(writer, instance.asset) + AssetValue.write(writer, instance.amount) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinition.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinition.kt index 87f4be6e8..e8db5aa60 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinition.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinition.kt @@ -22,30 +22,38 @@ public data class AssetDefinition( public val logo: IpfsPath? = null, public val metadata: Metadata, public val ownedBy: AccountId, + public val totalQuantity: Numeric, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): AssetDefinition = try { - AssetDefinition( - AssetDefinitionId.read(reader), - AssetType.read(reader), - Mintable.read(reader), - reader.readNullable(IpfsPath) as IpfsPath?, - Metadata.read(reader), - AccountId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): AssetDefinition = + try { + AssetDefinition( + AssetDefinitionId.read(reader), + AssetType.read(reader), + Mintable.read(reader), + reader.readNullable(IpfsPath) as IpfsPath?, + Metadata.read(reader), + AccountId.read(reader), + Numeric.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: AssetDefinition): Unit = try { - AssetDefinitionId.write(writer, instance.id) - AssetType.write(writer, instance.type) - Mintable.write(writer, instance.mintable) - writer.writeNullable(IpfsPath, instance.logo) - Metadata.write(writer, instance.metadata) - AccountId.write(writer, instance.ownedBy) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: AssetDefinition, + ): Unit = + try { + AssetDefinitionId.write(writer, instance.id) + AssetType.write(writer, instance.type) + Mintable.write(writer, instance.mintable) + writer.writeNullable(IpfsPath, instance.logo) + Metadata.write(writer, instance.metadata) + AccountId.write(writer, instance.ownedBy) + Numeric.write(writer, instance.totalQuantity) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionEvent.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionEvent.kt index bb6ca7be5..7c1cf2c57 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionEvent.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionEvent.kt @@ -36,22 +36,24 @@ public sealed class AssetDefinitionEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetDefinitionEvent.Created = try { - Created( - AssetDefinition.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetDefinitionEvent.Created = + try { + Created( + AssetDefinition.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.AssetDefinitionEvent.Created, - ): Unit = try { - AssetDefinition.write(writer, instance.assetDefinition) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + AssetDefinition.write(writer, instance.assetDefinition) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -68,22 +70,24 @@ public sealed class AssetDefinitionEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetDefinitionEvent.Deleted = try { - Deleted( - AssetDefinitionId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetDefinitionEvent.Deleted = + try { + Deleted( + AssetDefinitionId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.AssetDefinitionEvent.Deleted, - ): Unit = try { - AssetDefinitionId.write(writer, instance.assetDefinitionId) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + AssetDefinitionId.write(writer, instance.assetDefinitionId) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -100,23 +104,21 @@ public sealed class AssetDefinitionEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 2 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetDefinitionEvent.MetadataInserted = try { - MetadataInserted( - MetadataChangedOfAssetDefinitionId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetDefinitionEvent.MetadataInserted = + try { + MetadataInserted( + MetadataChangedOfAssetDefinitionId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.AssetDefinitionEvent.MetadataInserted, ): Unit = try { - MetadataChangedOfAssetDefinitionId.write( - writer, - instance.metadataChangedOfAssetDefinitionId, - ) + MetadataChangedOfAssetDefinitionId.write(writer, instance.metadataChangedOfAssetDefinitionId) } catch (ex: Exception) { throw wrapException(ex) } @@ -136,23 +138,21 @@ public sealed class AssetDefinitionEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 3 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetDefinitionEvent.MetadataRemoved = try { - MetadataRemoved( - MetadataChangedOfAssetDefinitionId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetDefinitionEvent.MetadataRemoved = + try { + MetadataRemoved( + MetadataChangedOfAssetDefinitionId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.AssetDefinitionEvent.MetadataRemoved, ): Unit = try { - MetadataChangedOfAssetDefinitionId.write( - writer, - instance.metadataChangedOfAssetDefinitionId, - ) + MetadataChangedOfAssetDefinitionId.write(writer, instance.metadataChangedOfAssetDefinitionId) } catch (ex: Exception) { throw wrapException(ex) } @@ -172,22 +172,24 @@ public sealed class AssetDefinitionEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 4 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetDefinitionEvent.MintabilityChanged = try { - MintabilityChanged( - AssetDefinitionId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetDefinitionEvent.MintabilityChanged = + try { + MintabilityChanged( + AssetDefinitionId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.AssetDefinitionEvent.MintabilityChanged, - ): Unit = try { - AssetDefinitionId.write(writer, instance.assetDefinitionId) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + AssetDefinitionId.write(writer, instance.assetDefinitionId) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -204,25 +206,24 @@ public sealed class AssetDefinitionEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 5 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetDefinitionEvent.TotalQuantityChanged = try { - TotalQuantityChanged( - AssetDefinitionTotalQuantityChanged.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetDefinitionEvent.TotalQuantityChanged = + try { + TotalQuantityChanged( + AssetDefinitionTotalQuantityChanged.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.AssetDefinitionEvent.TotalQuantityChanged, - ): Unit = try { - AssetDefinitionTotalQuantityChanged.write( - writer, - instance.assetDefinitionTotalQuantityChanged, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + AssetDefinitionTotalQuantityChanged.write(writer, instance.assetDefinitionTotalQuantityChanged) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -239,40 +240,44 @@ public sealed class AssetDefinitionEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 6 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetDefinitionEvent.OwnerChanged = try { - OwnerChanged( - AssetDefinitionOwnerChanged.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetDefinitionEvent.OwnerChanged = + try { + OwnerChanged( + AssetDefinitionOwnerChanged.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.AssetDefinitionEvent.OwnerChanged, - ): Unit = try { - AssetDefinitionOwnerChanged.write(writer, instance.assetDefinitionOwnerChanged) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + AssetDefinitionOwnerChanged.write(writer, instance.assetDefinitionOwnerChanged) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): AssetDefinitionEvent = when ( - val discriminant = - reader.readUByte() + override fun read(reader: ScaleCodecReader): AssetDefinitionEvent = + when (val discriminant = reader.readUByte()) { + 0 -> Created.read(reader) + 1 -> Deleted.read(reader) + 2 -> MetadataInserted.read(reader) + 3 -> MetadataRemoved.read(reader) + 4 -> MintabilityChanged.read(reader) + 5 -> TotalQuantityChanged.read(reader) + 6 -> OwnerChanged.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: AssetDefinitionEvent, ) { - 0 -> Created.read(reader) - 1 -> Deleted.read(reader) - 2 -> MetadataInserted.read(reader) - 3 -> MetadataRemoved.read(reader) - 4 -> MintabilityChanged.read(reader) - 5 -> TotalQuantityChanged.read(reader) - 6 -> OwnerChanged.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: AssetDefinitionEvent) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Created.write(writer, instance as Created) @@ -282,7 +287,8 @@ public sealed class AssetDefinitionEvent : ModelEnum { 4 -> MintabilityChanged.write(writer, instance as MintabilityChanged) 5 -> TotalQuantityChanged.write(writer, instance as TotalQuantityChanged) 6 -> OwnerChanged.write(writer, instance as OwnerChanged) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionEventFilter.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionEventFilter.kt index c92a5b292..5599791fb 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionEventFilter.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionEventFilter.kt @@ -23,20 +23,25 @@ public data class AssetDefinitionEventFilter( public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): AssetDefinitionEventFilter = try { - AssetDefinitionEventFilter( - reader.readNullable(AssetDefinitionId) as AssetDefinitionId?, - reader.readUint32(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): AssetDefinitionEventFilter = + try { + AssetDefinitionEventFilter( + reader.readNullable(AssetDefinitionId) as AssetDefinitionId?, + reader.readUint32(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: AssetDefinitionEventFilter): Unit = try { - writer.writeNullable(AssetDefinitionId, instance.idMatcher) - writer.writeUint32(instance.eventSet) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: AssetDefinitionEventFilter, + ): Unit = + try { + writer.writeNullable(AssetDefinitionId, instance.idMatcher) + writer.writeUint32(instance.eventSet) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionId.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionId.kt index 137949bc7..f09e184f4 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionId.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionId.kt @@ -20,20 +20,25 @@ public data class AssetDefinitionId( public val name: Name, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): AssetDefinitionId = try { - AssetDefinitionId( - DomainId.read(reader), - Name.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): AssetDefinitionId = + try { + AssetDefinitionId( + DomainId.read(reader), + Name.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: AssetDefinitionId): Unit = try { - DomainId.write(writer, instance.domain) - Name.write(writer, instance.name) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: AssetDefinitionId, + ): Unit = + try { + DomainId.write(writer, instance.domain) + Name.write(writer, instance.name) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionIdPredicateAtom.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionIdPredicateAtom.kt new file mode 100644 index 000000000..98a3401fd --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionIdPredicateAtom.kt @@ -0,0 +1,80 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit + +/** + * AssetDefinitionIdPredicateAtom + * + * Generated from 'AssetDefinitionIdPredicateAtom' enum + */ +public sealed class AssetDefinitionIdPredicateAtom : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Equals' variant + */ + public data class Equals( + public val assetDefinitionId: AssetDefinitionId, + ) : AssetDefinitionIdPredicateAtom() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetDefinitionIdPredicateAtom.Equals = + try { + Equals( + AssetDefinitionId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AssetDefinitionIdPredicateAtom.Equals, + ): Unit = + try { + AssetDefinitionId.write(writer, instance.assetDefinitionId) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): AssetDefinitionIdPredicateAtom = + when (val discriminant = reader.readUByte()) { + 0 -> Equals.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: AssetDefinitionIdPredicateAtom, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Equals.write(writer, instance as Equals) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionIdPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionIdPredicateBox.kt deleted file mode 100644 index b0bccd122..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionIdPredicateBox.kt +++ /dev/null @@ -1,145 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.ModelEnum -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Int -import kotlin.Unit - -/** - * AssetDefinitionIdPredicateBox - * - * Generated from 'AssetDefinitionIdPredicateBox' enum - */ -public sealed class AssetDefinitionIdPredicateBox : ModelEnum { - /** - * @return Discriminator of variant in enum - */ - public abstract fun discriminant(): Int - - /** - * 'Equals' variant - */ - public data class Equals( - public val assetDefinitionId: AssetDefinitionId, - ) : AssetDefinitionIdPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 0 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetDefinitionIdPredicateBox.Equals = try { - Equals( - AssetDefinitionId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.AssetDefinitionIdPredicateBox.Equals, - ): Unit = - try { - AssetDefinitionId.write(writer, instance.assetDefinitionId) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'DomainId' variant - */ - public data class DomainId( - public val domainIdPredicateBox: DomainIdPredicateBox, - ) : AssetDefinitionIdPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 1 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetDefinitionIdPredicateBox.DomainId = try { - DomainId( - DomainIdPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.AssetDefinitionIdPredicateBox.DomainId, - ): Unit = - try { - DomainIdPredicateBox.write(writer, instance.domainIdPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Name' variant - */ - public data class Name( - public val stringPredicateBox: StringPredicateBox, - ) : AssetDefinitionIdPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 2 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetDefinitionIdPredicateBox.Name = try { - Name( - StringPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.AssetDefinitionIdPredicateBox.Name, - ): Unit = try { - StringPredicateBox.write(writer, instance.stringPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): AssetDefinitionIdPredicateBox = when ( - val - discriminant = reader.readUByte() - ) { - 0 -> Equals.read(reader) - 1 -> DomainId.read(reader) - 2 -> Name.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: AssetDefinitionIdPredicateBox) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 0 -> Equals.write(writer, instance as Equals) - 1 -> DomainId.write(writer, instance as DomainId) - 2 -> Name.write(writer, instance as Name) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionIdProjectionOfPredicateMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionIdProjectionOfPredicateMarker.kt new file mode 100644 index 000000000..19b63f744 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionIdProjectionOfPredicateMarker.kt @@ -0,0 +1,158 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit + +/** + * AssetDefinitionIdProjectionOfPredicateMarker + * + * Generated from 'AssetDefinitionIdProjectionOfPredicateMarker' enum + */ +public sealed class AssetDefinitionIdProjectionOfPredicateMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val assetDefinitionIdPredicateAtom: AssetDefinitionIdPredicateAtom, + ) : AssetDefinitionIdProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read( + reader: ScaleCodecReader, + ): jp.co.soramitsu.iroha2.generated.AssetDefinitionIdProjectionOfPredicateMarker.Atom = + try { + Atom( + AssetDefinitionIdPredicateAtom.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AssetDefinitionIdProjectionOfPredicateMarker.Atom, + ): Unit = + try { + AssetDefinitionIdPredicateAtom.write(writer, instance.assetDefinitionIdPredicateAtom) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Domain' variant + */ + public data class Domain( + public val domainIdProjectionOfPredicateMarker: DomainIdProjectionOfPredicateMarker, + ) : AssetDefinitionIdProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read( + reader: ScaleCodecReader, + ): jp.co.soramitsu.iroha2.generated.AssetDefinitionIdProjectionOfPredicateMarker.Domain = + try { + Domain( + DomainIdProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AssetDefinitionIdProjectionOfPredicateMarker.Domain, + ): Unit = + try { + DomainIdProjectionOfPredicateMarker.write(writer, instance.domainIdProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Name' variant + */ + public data class Name( + public val nameProjectionOfPredicateMarker: NameProjectionOfPredicateMarker, + ) : AssetDefinitionIdProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 2 + + override fun read( + reader: ScaleCodecReader, + ): jp.co.soramitsu.iroha2.generated.AssetDefinitionIdProjectionOfPredicateMarker.Name = + try { + Name( + NameProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AssetDefinitionIdProjectionOfPredicateMarker.Name, + ): Unit = + try { + NameProjectionOfPredicateMarker.write(writer, instance.nameProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): AssetDefinitionIdProjectionOfPredicateMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Domain.read(reader) + 2 -> Name.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: AssetDefinitionIdProjectionOfPredicateMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Domain.write(writer, instance as Domain) + 2 -> Name.write(writer, instance as Name) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionIdProjectionOfSelectorMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionIdProjectionOfSelectorMarker.kt new file mode 100644 index 000000000..6413c9203 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionIdProjectionOfSelectorMarker.kt @@ -0,0 +1,174 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Any +import kotlin.Boolean +import kotlin.Int +import kotlin.Unit + +/** + * AssetDefinitionIdProjectionOfSelectorMarker + * + * Generated from 'AssetDefinitionIdProjectionOfSelectorMarker' enum + */ +public sealed class AssetDefinitionIdProjectionOfSelectorMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + override fun equals(other: Any?): Boolean = + when (this) { + is Atom -> Atom.equals(this, other) + else -> super.equals(other) + } + + override fun hashCode(): Int = + when (this) { + is Atom -> Atom.hashCode() + else -> super.hashCode() + } + + /** + * 'Atom' variant + */ + public class Atom : AssetDefinitionIdProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetDefinitionIdProjectionOfSelectorMarker.Atom = + try { + Atom() + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AssetDefinitionIdProjectionOfSelectorMarker.Atom, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.AssetDefinitionIdProjectionOfSelectorMarker.Atom, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".AssetDefinitionIdProjectionOfSelectorMarker.Atom".hashCode() + } + } + + /** + * 'Domain' variant + */ + public data class Domain( + public val domainIdProjectionOfSelectorMarker: DomainIdProjectionOfSelectorMarker, + ) : AssetDefinitionIdProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read( + reader: ScaleCodecReader, + ): jp.co.soramitsu.iroha2.generated.AssetDefinitionIdProjectionOfSelectorMarker.Domain = + try { + Domain( + DomainIdProjectionOfSelectorMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AssetDefinitionIdProjectionOfSelectorMarker.Domain, + ): Unit = + try { + DomainIdProjectionOfSelectorMarker.write(writer, instance.domainIdProjectionOfSelectorMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Name' variant + */ + public data class Name( + public val nameProjectionOfSelectorMarker: NameProjectionOfSelectorMarker, + ) : AssetDefinitionIdProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 2 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetDefinitionIdProjectionOfSelectorMarker.Name = + try { + Name( + NameProjectionOfSelectorMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AssetDefinitionIdProjectionOfSelectorMarker.Name, + ): Unit = + try { + NameProjectionOfSelectorMarker.write(writer, instance.nameProjectionOfSelectorMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): AssetDefinitionIdProjectionOfSelectorMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Domain.read(reader) + 2 -> Name.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: AssetDefinitionIdProjectionOfSelectorMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Domain.write(writer, instance as Domain) + 2 -> Name.write(writer, instance as Name) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionOwnerChanged.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionOwnerChanged.kt index 31a7926c6..8fb0e7a74 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionOwnerChanged.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionOwnerChanged.kt @@ -22,20 +22,25 @@ public data class AssetDefinitionOwnerChanged( public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): AssetDefinitionOwnerChanged = try { - AssetDefinitionOwnerChanged( - AssetDefinitionId.read(reader), - AccountId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): AssetDefinitionOwnerChanged = + try { + AssetDefinitionOwnerChanged( + AssetDefinitionId.read(reader), + AccountId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: AssetDefinitionOwnerChanged): Unit = try { - AssetDefinitionId.write(writer, instance.assetDefinition) - AccountId.write(writer, instance.newOwner) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: AssetDefinitionOwnerChanged, + ): Unit = + try { + AssetDefinitionId.write(writer, instance.assetDefinition) + AccountId.write(writer, instance.newOwner) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionPredicateAtom.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionPredicateAtom.kt new file mode 100644 index 000000000..fa45ba581 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionPredicateAtom.kt @@ -0,0 +1,42 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import kotlin.Int + +/** + * AssetDefinitionPredicateAtom + * + * Generated from 'AssetDefinitionPredicateAtom' enum + */ +public sealed class AssetDefinitionPredicateAtom : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): AssetDefinitionPredicateAtom = + when (val discriminant = reader.readUByte()) { + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: AssetDefinitionPredicateAtom, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionPredicateBox.kt deleted file mode 100644 index b020e0d45..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionPredicateBox.kt +++ /dev/null @@ -1,145 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.ModelEnum -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Int -import kotlin.Unit - -/** - * AssetDefinitionPredicateBox - * - * Generated from 'AssetDefinitionPredicateBox' enum - */ -public sealed class AssetDefinitionPredicateBox : ModelEnum { - /** - * @return Discriminator of variant in enum - */ - public abstract fun discriminant(): Int - - /** - * 'Id' variant - */ - public data class Id( - public val assetDefinitionIdPredicateBox: AssetDefinitionIdPredicateBox, - ) : AssetDefinitionPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 0 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetDefinitionPredicateBox.Id = try { - Id( - AssetDefinitionIdPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.AssetDefinitionPredicateBox.Id, - ): Unit = try { - AssetDefinitionIdPredicateBox.write(writer, instance.assetDefinitionIdPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Metadata' variant - */ - public data class Metadata( - public val metadataPredicateBox: MetadataPredicateBox, - ) : AssetDefinitionPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 1 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetDefinitionPredicateBox.Metadata = try { - Metadata( - MetadataPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.AssetDefinitionPredicateBox.Metadata, - ): Unit = - try { - MetadataPredicateBox.write(writer, instance.metadataPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'OwnedBy' variant - */ - public data class OwnedBy( - public val accountIdPredicateBox: AccountIdPredicateBox, - ) : AssetDefinitionPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 2 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetDefinitionPredicateBox.OwnedBy = try { - OwnedBy( - AccountIdPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.AssetDefinitionPredicateBox.OwnedBy, - ): Unit = - try { - AccountIdPredicateBox.write(writer, instance.accountIdPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): AssetDefinitionPredicateBox = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Id.read(reader) - 1 -> Metadata.read(reader) - 2 -> OwnedBy.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: AssetDefinitionPredicateBox) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 0 -> Id.write(writer, instance as Id) - 1 -> Metadata.write(writer, instance as Metadata) - 2 -> OwnedBy.write(writer, instance as OwnedBy) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionProjectionOfPredicateMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionProjectionOfPredicateMarker.kt new file mode 100644 index 000000000..456c4119c --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionProjectionOfPredicateMarker.kt @@ -0,0 +1,154 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit + +/** + * AssetDefinitionProjectionOfPredicateMarker + * + * Generated from 'AssetDefinitionProjectionOfPredicateMarker' enum + */ +public sealed class AssetDefinitionProjectionOfPredicateMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val assetDefinitionPredicateAtom: AssetDefinitionPredicateAtom, + ) : AssetDefinitionProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetDefinitionProjectionOfPredicateMarker.Atom = + try { + Atom( + AssetDefinitionPredicateAtom.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AssetDefinitionProjectionOfPredicateMarker.Atom, + ): Unit = + try { + AssetDefinitionPredicateAtom.write(writer, instance.assetDefinitionPredicateAtom) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Id' variant + */ + public data class Id( + public val assetDefinitionIdProjectionOfPredicateMarker: AssetDefinitionIdProjectionOfPredicateMarker, + ) : AssetDefinitionProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetDefinitionProjectionOfPredicateMarker.Id = + try { + Id( + AssetDefinitionIdProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AssetDefinitionProjectionOfPredicateMarker.Id, + ): Unit = + try { + AssetDefinitionIdProjectionOfPredicateMarker.write(writer, instance.assetDefinitionIdProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Metadata' variant + */ + public data class Metadata( + public val metadataProjectionOfPredicateMarker: MetadataProjectionOfPredicateMarker, + ) : AssetDefinitionProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 2 + + override fun read( + reader: ScaleCodecReader, + ): jp.co.soramitsu.iroha2.generated.AssetDefinitionProjectionOfPredicateMarker.Metadata = + try { + Metadata( + MetadataProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AssetDefinitionProjectionOfPredicateMarker.Metadata, + ): Unit = + try { + MetadataProjectionOfPredicateMarker.write(writer, instance.metadataProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): AssetDefinitionProjectionOfPredicateMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Id.read(reader) + 2 -> Metadata.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: AssetDefinitionProjectionOfPredicateMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Id.write(writer, instance as Id) + 2 -> Metadata.write(writer, instance as Metadata) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionProjectionOfSelectorMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionProjectionOfSelectorMarker.kt new file mode 100644 index 000000000..3707ec447 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionProjectionOfSelectorMarker.kt @@ -0,0 +1,174 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Any +import kotlin.Boolean +import kotlin.Int +import kotlin.Unit + +/** + * AssetDefinitionProjectionOfSelectorMarker + * + * Generated from 'AssetDefinitionProjectionOfSelectorMarker' enum + */ +public sealed class AssetDefinitionProjectionOfSelectorMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + override fun equals(other: Any?): Boolean = + when (this) { + is Atom -> Atom.equals(this, other) + else -> super.equals(other) + } + + override fun hashCode(): Int = + when (this) { + is Atom -> Atom.hashCode() + else -> super.hashCode() + } + + /** + * 'Atom' variant + */ + public class Atom : AssetDefinitionProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetDefinitionProjectionOfSelectorMarker.Atom = + try { + Atom() + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AssetDefinitionProjectionOfSelectorMarker.Atom, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.AssetDefinitionProjectionOfSelectorMarker.Atom, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".AssetDefinitionProjectionOfSelectorMarker.Atom".hashCode() + } + } + + /** + * 'Id' variant + */ + public data class Id( + public val assetDefinitionIdProjectionOfSelectorMarker: AssetDefinitionIdProjectionOfSelectorMarker, + ) : AssetDefinitionProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetDefinitionProjectionOfSelectorMarker.Id = + try { + Id( + AssetDefinitionIdProjectionOfSelectorMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AssetDefinitionProjectionOfSelectorMarker.Id, + ): Unit = + try { + AssetDefinitionIdProjectionOfSelectorMarker.write(writer, instance.assetDefinitionIdProjectionOfSelectorMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Metadata' variant + */ + public data class Metadata( + public val metadataProjectionOfSelectorMarker: MetadataProjectionOfSelectorMarker, + ) : AssetDefinitionProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 2 + + override fun read( + reader: ScaleCodecReader, + ): jp.co.soramitsu.iroha2.generated.AssetDefinitionProjectionOfSelectorMarker.Metadata = + try { + Metadata( + MetadataProjectionOfSelectorMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AssetDefinitionProjectionOfSelectorMarker.Metadata, + ): Unit = + try { + MetadataProjectionOfSelectorMarker.write(writer, instance.metadataProjectionOfSelectorMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): AssetDefinitionProjectionOfSelectorMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Id.read(reader) + 2 -> Metadata.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: AssetDefinitionProjectionOfSelectorMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Id.write(writer, instance as Id) + 2 -> Metadata.write(writer, instance as Metadata) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionTotalQuantityChanged.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionTotalQuantityChanged.kt index cff71594e..dc9e0f8ae 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionTotalQuantityChanged.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetDefinitionTotalQuantityChanged.kt @@ -22,20 +22,25 @@ public data class AssetDefinitionTotalQuantityChanged( public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): AssetDefinitionTotalQuantityChanged = try { - AssetDefinitionTotalQuantityChanged( - AssetDefinitionId.read(reader), - Numeric.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): AssetDefinitionTotalQuantityChanged = + try { + AssetDefinitionTotalQuantityChanged( + AssetDefinitionId.read(reader), + Numeric.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: AssetDefinitionTotalQuantityChanged): Unit = try { - AssetDefinitionId.write(writer, instance.assetDefinition) - Numeric.write(writer, instance.totalAmount) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: AssetDefinitionTotalQuantityChanged, + ): Unit = + try { + AssetDefinitionId.write(writer, instance.assetDefinition) + Numeric.write(writer, instance.totalAmount) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetEvent.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetEvent.kt index bbfc5887f..f7b268aa6 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetEvent.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetEvent.kt @@ -36,22 +36,24 @@ public sealed class AssetEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetEvent.Created = try { - Created( - Asset.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetEvent.Created = + try { + Created( + Asset.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.AssetEvent.Created, - ): Unit = try { - Asset.write(writer, instance.asset) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + Asset.write(writer, instance.asset) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -68,22 +70,24 @@ public sealed class AssetEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetEvent.Deleted = try { - Deleted( - AssetId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetEvent.Deleted = + try { + Deleted( + AssetId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.AssetEvent.Deleted, - ): Unit = try { - AssetId.write(writer, instance.assetId) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + AssetId.write(writer, instance.assetId) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -100,22 +104,24 @@ public sealed class AssetEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 2 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetEvent.Added = try { - Added( - AssetChanged.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetEvent.Added = + try { + Added( + AssetChanged.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.AssetEvent.Added, - ): Unit = try { - AssetChanged.write(writer, instance.assetChanged) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + AssetChanged.write(writer, instance.assetChanged) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -132,22 +138,24 @@ public sealed class AssetEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 3 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetEvent.Removed = try { - Removed( - AssetChanged.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetEvent.Removed = + try { + Removed( + AssetChanged.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.AssetEvent.Removed, - ): Unit = try { - AssetChanged.write(writer, instance.assetChanged) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + AssetChanged.write(writer, instance.assetChanged) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -164,22 +172,24 @@ public sealed class AssetEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 4 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetEvent.MetadataInserted = try { - MetadataInserted( - MetadataChangedOfAssetId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetEvent.MetadataInserted = + try { + MetadataInserted( + MetadataChangedOfAssetId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.AssetEvent.MetadataInserted, - ): Unit = try { - MetadataChangedOfAssetId.write(writer, instance.metadataChangedOfAssetId) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + MetadataChangedOfAssetId.write(writer, instance.metadataChangedOfAssetId) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -196,39 +206,43 @@ public sealed class AssetEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 5 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetEvent.MetadataRemoved = try { - MetadataRemoved( - MetadataChangedOfAssetId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetEvent.MetadataRemoved = + try { + MetadataRemoved( + MetadataChangedOfAssetId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.AssetEvent.MetadataRemoved, - ): Unit = try { - MetadataChangedOfAssetId.write(writer, instance.metadataChangedOfAssetId) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + MetadataChangedOfAssetId.write(writer, instance.metadataChangedOfAssetId) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): AssetEvent = when ( - val discriminant = - reader.readUByte() + override fun read(reader: ScaleCodecReader): AssetEvent = + when (val discriminant = reader.readUByte()) { + 0 -> Created.read(reader) + 1 -> Deleted.read(reader) + 2 -> Added.read(reader) + 3 -> Removed.read(reader) + 4 -> MetadataInserted.read(reader) + 5 -> MetadataRemoved.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: AssetEvent, ) { - 0 -> Created.read(reader) - 1 -> Deleted.read(reader) - 2 -> Added.read(reader) - 3 -> Removed.read(reader) - 4 -> MetadataInserted.read(reader) - 5 -> MetadataRemoved.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: AssetEvent) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Created.write(writer, instance as Created) @@ -237,7 +251,8 @@ public sealed class AssetEvent : ModelEnum { 3 -> Removed.write(writer, instance as Removed) 4 -> MetadataInserted.write(writer, instance as MetadataInserted) 5 -> MetadataRemoved.write(writer, instance as MetadataRemoved) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetEventFilter.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetEventFilter.kt index 19d220c19..a08e21437 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetEventFilter.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetEventFilter.kt @@ -21,20 +21,25 @@ public data class AssetEventFilter( public val eventSet: Long, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): AssetEventFilter = try { - AssetEventFilter( - reader.readNullable(AssetId) as AssetId?, - reader.readUint32(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): AssetEventFilter = + try { + AssetEventFilter( + reader.readNullable(AssetId) as AssetId?, + reader.readUint32(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: AssetEventFilter): Unit = try { - writer.writeNullable(AssetId, instance.idMatcher) - writer.writeUint32(instance.eventSet) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: AssetEventFilter, + ): Unit = + try { + writer.writeNullable(AssetId, instance.idMatcher) + writer.writeUint32(instance.eventSet) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetId.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetId.kt index 1c7b14900..81ea2f78a 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetId.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetId.kt @@ -20,20 +20,25 @@ public data class AssetId( public val definition: AssetDefinitionId, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): AssetId = try { - AssetId( - AccountId.read(reader), - AssetDefinitionId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): AssetId = + try { + AssetId( + AccountId.read(reader), + AssetDefinitionId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: AssetId): Unit = try { - AccountId.write(writer, instance.account) - AssetDefinitionId.write(writer, instance.definition) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: AssetId, + ): Unit = + try { + AccountId.write(writer, instance.account) + AssetDefinitionId.write(writer, instance.definition) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetIdPredicateAtom.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetIdPredicateAtom.kt new file mode 100644 index 000000000..641add126 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetIdPredicateAtom.kt @@ -0,0 +1,78 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit + +/** + * AssetIdPredicateAtom + * + * Generated from 'AssetIdPredicateAtom' enum + */ +public sealed class AssetIdPredicateAtom : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Equals' variant + */ + public data class Equals( + public val assetId: AssetId, + ) : AssetIdPredicateAtom() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetIdPredicateAtom.Equals = + try { + Equals( + AssetId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AssetIdPredicateAtom.Equals, + ): Unit = + try { + AssetId.write(writer, instance.assetId) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): AssetIdPredicateAtom = + when (val discriminant = reader.readUByte()) { + 0 -> Equals.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: AssetIdPredicateAtom, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Equals.write(writer, instance as Equals) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetIdPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetIdPredicateBox.kt deleted file mode 100644 index 0150bef74..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetIdPredicateBox.kt +++ /dev/null @@ -1,141 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.ModelEnum -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Int -import kotlin.Unit - -/** - * AssetIdPredicateBox - * - * Generated from 'AssetIdPredicateBox' enum - */ -public sealed class AssetIdPredicateBox : ModelEnum { - /** - * @return Discriminator of variant in enum - */ - public abstract fun discriminant(): Int - - /** - * 'Equals' variant - */ - public data class Equals( - public val assetId: AssetId, - ) : AssetIdPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 0 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetIdPredicateBox.Equals = try { - Equals( - AssetId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.AssetIdPredicateBox.Equals, - ): Unit = try { - AssetId.write(writer, instance.assetId) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'DefinitionId' variant - */ - public data class DefinitionId( - public val assetDefinitionIdPredicateBox: AssetDefinitionIdPredicateBox, - ) : AssetIdPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 1 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetIdPredicateBox.DefinitionId = try { - DefinitionId( - AssetDefinitionIdPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.AssetIdPredicateBox.DefinitionId, - ): Unit = try { - AssetDefinitionIdPredicateBox.write(writer, instance.assetDefinitionIdPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'AccountId' variant - */ - public data class AccountId( - public val accountIdPredicateBox: AccountIdPredicateBox, - ) : AssetIdPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 2 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetIdPredicateBox.AccountId = try { - AccountId( - AccountIdPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.AssetIdPredicateBox.AccountId, - ): Unit = try { - AccountIdPredicateBox.write(writer, instance.accountIdPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): AssetIdPredicateBox = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Equals.read(reader) - 1 -> DefinitionId.read(reader) - 2 -> AccountId.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: AssetIdPredicateBox) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 0 -> Equals.write(writer, instance as Equals) - 1 -> DefinitionId.write(writer, instance as DefinitionId) - 2 -> AccountId.write(writer, instance as AccountId) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetIdProjectionOfPredicateMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetIdProjectionOfPredicateMarker.kt new file mode 100644 index 000000000..129acffcc --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetIdProjectionOfPredicateMarker.kt @@ -0,0 +1,152 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit + +/** + * AssetIdProjectionOfPredicateMarker + * + * Generated from 'AssetIdProjectionOfPredicateMarker' enum + */ +public sealed class AssetIdProjectionOfPredicateMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val assetIdPredicateAtom: AssetIdPredicateAtom, + ) : AssetIdProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetIdProjectionOfPredicateMarker.Atom = + try { + Atom( + AssetIdPredicateAtom.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AssetIdProjectionOfPredicateMarker.Atom, + ): Unit = + try { + AssetIdPredicateAtom.write(writer, instance.assetIdPredicateAtom) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Account' variant + */ + public data class Account( + public val accountIdProjectionOfPredicateMarker: AccountIdProjectionOfPredicateMarker, + ) : AssetIdProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetIdProjectionOfPredicateMarker.Account = + try { + Account( + AccountIdProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AssetIdProjectionOfPredicateMarker.Account, + ): Unit = + try { + AccountIdProjectionOfPredicateMarker.write(writer, instance.accountIdProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Definition' variant + */ + public data class Definition( + public val assetDefinitionIdProjectionOfPredicateMarker: AssetDefinitionIdProjectionOfPredicateMarker, + ) : AssetIdProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 2 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetIdProjectionOfPredicateMarker.Definition = + try { + Definition( + AssetDefinitionIdProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AssetIdProjectionOfPredicateMarker.Definition, + ): Unit = + try { + AssetDefinitionIdProjectionOfPredicateMarker.write(writer, instance.assetDefinitionIdProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): AssetIdProjectionOfPredicateMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Account.read(reader) + 2 -> Definition.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: AssetIdProjectionOfPredicateMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Account.write(writer, instance as Account) + 2 -> Definition.write(writer, instance as Definition) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetIdProjectionOfSelectorMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetIdProjectionOfSelectorMarker.kt new file mode 100644 index 000000000..58ac01bc7 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetIdProjectionOfSelectorMarker.kt @@ -0,0 +1,172 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Any +import kotlin.Boolean +import kotlin.Int +import kotlin.Unit + +/** + * AssetIdProjectionOfSelectorMarker + * + * Generated from 'AssetIdProjectionOfSelectorMarker' enum + */ +public sealed class AssetIdProjectionOfSelectorMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + override fun equals(other: Any?): Boolean = + when (this) { + is Atom -> Atom.equals(this, other) + else -> super.equals(other) + } + + override fun hashCode(): Int = + when (this) { + is Atom -> Atom.hashCode() + else -> super.hashCode() + } + + /** + * 'Atom' variant + */ + public class Atom : AssetIdProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetIdProjectionOfSelectorMarker.Atom = + try { + Atom() + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AssetIdProjectionOfSelectorMarker.Atom, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.AssetIdProjectionOfSelectorMarker.Atom, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".AssetIdProjectionOfSelectorMarker.Atom".hashCode() + } + } + + /** + * 'Account' variant + */ + public data class Account( + public val accountIdProjectionOfSelectorMarker: AccountIdProjectionOfSelectorMarker, + ) : AssetIdProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetIdProjectionOfSelectorMarker.Account = + try { + Account( + AccountIdProjectionOfSelectorMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AssetIdProjectionOfSelectorMarker.Account, + ): Unit = + try { + AccountIdProjectionOfSelectorMarker.write(writer, instance.accountIdProjectionOfSelectorMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Definition' variant + */ + public data class Definition( + public val assetDefinitionIdProjectionOfSelectorMarker: AssetDefinitionIdProjectionOfSelectorMarker, + ) : AssetIdProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 2 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetIdProjectionOfSelectorMarker.Definition = + try { + Definition( + AssetDefinitionIdProjectionOfSelectorMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AssetIdProjectionOfSelectorMarker.Definition, + ): Unit = + try { + AssetDefinitionIdProjectionOfSelectorMarker.write(writer, instance.assetDefinitionIdProjectionOfSelectorMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): AssetIdProjectionOfSelectorMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Account.read(reader) + 2 -> Definition.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: AssetIdProjectionOfSelectorMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Account.write(writer, instance as Account) + 2 -> Definition.write(writer, instance as Definition) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PeerPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetPredicateAtom.kt similarity index 51% rename from modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PeerPredicateBox.kt rename to modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetPredicateAtom.kt index e3e35d08d..6a8d23489 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PeerPredicateBox.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetPredicateAtom.kt @@ -11,27 +11,30 @@ import jp.co.soramitsu.iroha2.codec.ScaleWriter import kotlin.Int /** - * PeerPredicateBox + * AssetPredicateAtom * - * Generated from 'PeerPredicateBox' enum + * Generated from 'AssetPredicateAtom' enum */ -public sealed class PeerPredicateBox : ModelEnum { +public sealed class AssetPredicateAtom : ModelEnum { /** * @return Discriminator of variant in enum */ public abstract fun discriminant(): Int - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): PeerPredicateBox = when ( - val discriminant = - reader.readUByte() - ) { - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): AssetPredicateAtom = + when (val discriminant = reader.readUByte()) { + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: PeerPredicateBox) { + override fun write( + writer: ScaleCodecWriter, + instance: AssetPredicateAtom, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetPredicateBox.kt deleted file mode 100644 index 470905e05..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetPredicateBox.kt +++ /dev/null @@ -1,107 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.ModelEnum -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Int -import kotlin.Unit - -/** - * AssetPredicateBox - * - * Generated from 'AssetPredicateBox' enum - */ -public sealed class AssetPredicateBox : ModelEnum { - /** - * @return Discriminator of variant in enum - */ - public abstract fun discriminant(): Int - - /** - * 'Id' variant - */ - public data class Id( - public val assetIdPredicateBox: AssetIdPredicateBox, - ) : AssetPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 0 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetPredicateBox.Id = try { - Id( - AssetIdPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.AssetPredicateBox.Id, - ): Unit = try { - AssetIdPredicateBox.write(writer, instance.assetIdPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Value' variant - */ - public data class Value( - public val assetValuePredicateBox: AssetValuePredicateBox, - ) : AssetPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 1 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetPredicateBox.Value = try { - Value( - AssetValuePredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.AssetPredicateBox.Value, - ): Unit = try { - AssetValuePredicateBox.write(writer, instance.assetValuePredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): AssetPredicateBox = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Id.read(reader) - 1 -> Value.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: AssetPredicateBox) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 0 -> Id.write(writer, instance as Id) - 1 -> Value.write(writer, instance as Value) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetProjectionOfPredicateMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetProjectionOfPredicateMarker.kt new file mode 100644 index 000000000..977aab395 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetProjectionOfPredicateMarker.kt @@ -0,0 +1,152 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit + +/** + * AssetProjectionOfPredicateMarker + * + * Generated from 'AssetProjectionOfPredicateMarker' enum + */ +public sealed class AssetProjectionOfPredicateMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val assetPredicateAtom: AssetPredicateAtom, + ) : AssetProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetProjectionOfPredicateMarker.Atom = + try { + Atom( + AssetPredicateAtom.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AssetProjectionOfPredicateMarker.Atom, + ): Unit = + try { + AssetPredicateAtom.write(writer, instance.assetPredicateAtom) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Id' variant + */ + public data class Id( + public val assetIdProjectionOfPredicateMarker: AssetIdProjectionOfPredicateMarker, + ) : AssetProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetProjectionOfPredicateMarker.Id = + try { + Id( + AssetIdProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AssetProjectionOfPredicateMarker.Id, + ): Unit = + try { + AssetIdProjectionOfPredicateMarker.write(writer, instance.assetIdProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Value' variant + */ + public data class Value( + public val assetValueProjectionOfPredicateMarker: AssetValueProjectionOfPredicateMarker, + ) : AssetProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 2 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetProjectionOfPredicateMarker.Value = + try { + Value( + AssetValueProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AssetProjectionOfPredicateMarker.Value, + ): Unit = + try { + AssetValueProjectionOfPredicateMarker.write(writer, instance.assetValueProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): AssetProjectionOfPredicateMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Id.read(reader) + 2 -> Value.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: AssetProjectionOfPredicateMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Id.write(writer, instance as Id) + 2 -> Value.write(writer, instance as Value) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetProjectionOfSelectorMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetProjectionOfSelectorMarker.kt new file mode 100644 index 000000000..98a5f26ef --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetProjectionOfSelectorMarker.kt @@ -0,0 +1,172 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Any +import kotlin.Boolean +import kotlin.Int +import kotlin.Unit + +/** + * AssetProjectionOfSelectorMarker + * + * Generated from 'AssetProjectionOfSelectorMarker' enum + */ +public sealed class AssetProjectionOfSelectorMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + override fun equals(other: Any?): Boolean = + when (this) { + is Atom -> Atom.equals(this, other) + else -> super.equals(other) + } + + override fun hashCode(): Int = + when (this) { + is Atom -> Atom.hashCode() + else -> super.hashCode() + } + + /** + * 'Atom' variant + */ + public class Atom : AssetProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetProjectionOfSelectorMarker.Atom = + try { + Atom() + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AssetProjectionOfSelectorMarker.Atom, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.AssetProjectionOfSelectorMarker.Atom, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".AssetProjectionOfSelectorMarker.Atom".hashCode() + } + } + + /** + * 'Id' variant + */ + public data class Id( + public val assetIdProjectionOfSelectorMarker: AssetIdProjectionOfSelectorMarker, + ) : AssetProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetProjectionOfSelectorMarker.Id = + try { + Id( + AssetIdProjectionOfSelectorMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AssetProjectionOfSelectorMarker.Id, + ): Unit = + try { + AssetIdProjectionOfSelectorMarker.write(writer, instance.assetIdProjectionOfSelectorMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Value' variant + */ + public data class Value( + public val assetValueProjectionOfSelectorMarker: AssetValueProjectionOfSelectorMarker, + ) : AssetProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 2 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetProjectionOfSelectorMarker.Value = + try { + Value( + AssetValueProjectionOfSelectorMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AssetProjectionOfSelectorMarker.Value, + ): Unit = + try { + AssetValueProjectionOfSelectorMarker.write(writer, instance.assetValueProjectionOfSelectorMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): AssetProjectionOfSelectorMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Id.read(reader) + 2 -> Value.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: AssetProjectionOfSelectorMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Id.write(writer, instance as Id) + 2 -> Value.write(writer, instance as Value) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetTransferBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetTransferBox.kt index b3c7c1fba..2d84b0423 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetTransferBox.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetTransferBox.kt @@ -36,25 +36,24 @@ public sealed class AssetTransferBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetTransferBox.Numeric = try { - Numeric( - TransferOfAssetAndNumericAndAccount.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetTransferBox.Numeric = + try { + Numeric( + TransferOfAssetAndNumericAndAccount.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.AssetTransferBox.Numeric, - ): Unit = try { - TransferOfAssetAndNumericAndAccount.write( - writer, - instance.transferOfAssetAndNumericAndAccount, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + TransferOfAssetAndNumericAndAccount.write(writer, instance.transferOfAssetAndNumericAndAccount) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -71,43 +70,45 @@ public sealed class AssetTransferBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetTransferBox.Store = try { - Store( - TransferOfAssetAndMetadataAndAccount.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetTransferBox.Store = + try { + Store( + TransferOfAssetAndMetadataAndAccount.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.AssetTransferBox.Store, - ): Unit = try { - TransferOfAssetAndMetadataAndAccount.write( - writer, - instance.transferOfAssetAndMetadataAndAccount, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + TransferOfAssetAndMetadataAndAccount.write(writer, instance.transferOfAssetAndMetadataAndAccount) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): AssetTransferBox = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Numeric.read(reader) - 1 -> Store.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + override fun read(reader: ScaleCodecReader): AssetTransferBox = + when (val discriminant = reader.readUByte()) { + 0 -> Numeric.read(reader) + 1 -> Store.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: AssetTransferBox) { + override fun write( + writer: ScaleCodecWriter, + instance: AssetTransferBox, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Numeric.write(writer, instance as Numeric) 1 -> Store.write(writer, instance as Store) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetType.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetType.kt index e44697b25..0b4fe0a3d 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetType.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetType.kt @@ -25,13 +25,17 @@ public sealed class AssetType : ModelEnum { */ public abstract fun discriminant(): Int - override fun equals(other: Any?): Boolean = when (this) { - is Store -> Store.equals(this, other) - else -> super.equals(other) } + override fun equals(other: Any?): Boolean = + when (this) { + is Store -> Store.equals(this, other) + else -> super.equals(other) + } - override fun hashCode(): Int = when (this) { - is Store -> Store.hashCode() - else -> super.hashCode() } + override fun hashCode(): Int = + when (this) { + is Store -> Store.hashCode() + else -> super.hashCode() + } /** * 'Numeric' variant @@ -46,22 +50,24 @@ public sealed class AssetType : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetType.Numeric = try { - Numeric( - NumericSpec.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetType.Numeric = + try { + Numeric( + NumericSpec.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.AssetType.Numeric, - ): Unit = try { - NumericSpec.write(writer, instance.numericSpec) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + NumericSpec.write(writer, instance.numericSpec) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -76,21 +82,26 @@ public sealed class AssetType : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetType.Store = try { - Store() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetType.Store = + try { + Store() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.AssetType.Store, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: jp.co.soramitsu.iroha2.generated.AssetType.Store, o2: Any?): Boolean = + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.AssetType.Store, + o2: Any?, + ): Boolean = when (o2) { null -> false else -> o2::class == o1::class @@ -101,20 +112,23 @@ public sealed class AssetType : ModelEnum { } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): AssetType = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Numeric.read(reader) - 1 -> Store.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + override fun read(reader: ScaleCodecReader): AssetType = + when (val discriminant = reader.readUByte()) { + 0 -> Numeric.read(reader) + 1 -> Store.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: AssetType) { + override fun write( + writer: ScaleCodecWriter, + instance: AssetType, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Numeric.write(writer, instance as Numeric) 1 -> Store.write(writer, instance as Store) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetValue.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetValue.kt index c0a991359..5f9717245 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetValue.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetValue.kt @@ -36,22 +36,26 @@ public sealed class AssetValue : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetValue.Numeric = try { - Numeric( - jp.co.soramitsu.iroha2.generated.Numeric.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetValue.Numeric = + try { + Numeric( + jp.co.soramitsu.iroha2.generated.Numeric + .read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.AssetValue.Numeric, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.Numeric.write(writer, instance.numeric) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + jp.co.soramitsu.iroha2.generated.Numeric + .write(writer, instance.numeric) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -68,40 +72,45 @@ public sealed class AssetValue : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetValue.Store = try { - Store( - Metadata.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetValue.Store = + try { + Store( + Metadata.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.AssetValue.Store, - ): Unit = try { - Metadata.write(writer, instance.metadata) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + Metadata.write(writer, instance.metadata) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): AssetValue = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Numeric.read(reader) - 1 -> Store.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + override fun read(reader: ScaleCodecReader): AssetValue = + when (val discriminant = reader.readUByte()) { + 0 -> Numeric.read(reader) + 1 -> Store.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: AssetValue) { + override fun write( + writer: ScaleCodecWriter, + instance: AssetValue, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Numeric.write(writer, instance as Numeric) 1 -> Store.write(writer, instance as Store) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetValuePredicateAtom.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetValuePredicateAtom.kt new file mode 100644 index 000000000..61572d9b2 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetValuePredicateAtom.kt @@ -0,0 +1,144 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Any +import kotlin.Boolean +import kotlin.Int +import kotlin.Unit + +/** + * AssetValuePredicateAtom + * + * Generated from 'AssetValuePredicateAtom' enum + */ +public sealed class AssetValuePredicateAtom : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + override fun equals(other: Any?): Boolean = + when (this) { + is IsNumeric -> IsNumeric.equals(this, other) + is IsStore -> IsStore.equals(this, other) + else -> super.equals(other) + } + + override fun hashCode(): Int = + when (this) { + is IsNumeric -> IsNumeric.hashCode() + is IsStore -> IsStore.hashCode() + else -> super.hashCode() + } + + /** + * 'IsNumeric' variant + */ + public class IsNumeric : AssetValuePredicateAtom() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetValuePredicateAtom.IsNumeric = + try { + IsNumeric() + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AssetValuePredicateAtom.IsNumeric, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.AssetValuePredicateAtom.IsNumeric, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".AssetValuePredicateAtom.IsNumeric".hashCode() + } + } + + /** + * 'IsStore' variant + */ + public class IsStore : AssetValuePredicateAtom() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetValuePredicateAtom.IsStore = + try { + IsStore() + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AssetValuePredicateAtom.IsStore, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.AssetValuePredicateAtom.IsStore, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".AssetValuePredicateAtom.IsStore".hashCode() + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): AssetValuePredicateAtom = + when (val discriminant = reader.readUByte()) { + 0 -> IsNumeric.read(reader) + 1 -> IsStore.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: AssetValuePredicateAtom, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> IsNumeric.write(writer, instance as IsNumeric) + 1 -> IsStore.write(writer, instance as IsStore) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetValueProjectionOfPredicateMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetValueProjectionOfPredicateMarker.kt new file mode 100644 index 000000000..4b5da63b6 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetValueProjectionOfPredicateMarker.kt @@ -0,0 +1,152 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit + +/** + * AssetValueProjectionOfPredicateMarker + * + * Generated from 'AssetValueProjectionOfPredicateMarker' enum + */ +public sealed class AssetValueProjectionOfPredicateMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val assetValuePredicateAtom: AssetValuePredicateAtom, + ) : AssetValueProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetValueProjectionOfPredicateMarker.Atom = + try { + Atom( + AssetValuePredicateAtom.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AssetValueProjectionOfPredicateMarker.Atom, + ): Unit = + try { + AssetValuePredicateAtom.write(writer, instance.assetValuePredicateAtom) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Numeric' variant + */ + public data class Numeric( + public val numericProjectionOfPredicateMarker: NumericProjectionOfPredicateMarker, + ) : AssetValueProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetValueProjectionOfPredicateMarker.Numeric = + try { + Numeric( + NumericProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AssetValueProjectionOfPredicateMarker.Numeric, + ): Unit = + try { + NumericProjectionOfPredicateMarker.write(writer, instance.numericProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Store' variant + */ + public data class Store( + public val metadataProjectionOfPredicateMarker: MetadataProjectionOfPredicateMarker, + ) : AssetValueProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 2 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetValueProjectionOfPredicateMarker.Store = + try { + Store( + MetadataProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AssetValueProjectionOfPredicateMarker.Store, + ): Unit = + try { + MetadataProjectionOfPredicateMarker.write(writer, instance.metadataProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): AssetValueProjectionOfPredicateMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Numeric.read(reader) + 2 -> Store.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: AssetValueProjectionOfPredicateMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Numeric.write(writer, instance as Numeric) + 2 -> Store.write(writer, instance as Store) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetValueProjectionOfSelectorMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetValueProjectionOfSelectorMarker.kt new file mode 100644 index 000000000..f6c888dce --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetValueProjectionOfSelectorMarker.kt @@ -0,0 +1,172 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Any +import kotlin.Boolean +import kotlin.Int +import kotlin.Unit + +/** + * AssetValueProjectionOfSelectorMarker + * + * Generated from 'AssetValueProjectionOfSelectorMarker' enum + */ +public sealed class AssetValueProjectionOfSelectorMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + override fun equals(other: Any?): Boolean = + when (this) { + is Atom -> Atom.equals(this, other) + else -> super.equals(other) + } + + override fun hashCode(): Int = + when (this) { + is Atom -> Atom.hashCode() + else -> super.hashCode() + } + + /** + * 'Atom' variant + */ + public class Atom : AssetValueProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetValueProjectionOfSelectorMarker.Atom = + try { + Atom() + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AssetValueProjectionOfSelectorMarker.Atom, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.AssetValueProjectionOfSelectorMarker.Atom, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".AssetValueProjectionOfSelectorMarker.Atom".hashCode() + } + } + + /** + * 'Numeric' variant + */ + public data class Numeric( + public val numericProjectionOfSelectorMarker: NumericProjectionOfSelectorMarker, + ) : AssetValueProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetValueProjectionOfSelectorMarker.Numeric = + try { + Numeric( + NumericProjectionOfSelectorMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AssetValueProjectionOfSelectorMarker.Numeric, + ): Unit = + try { + NumericProjectionOfSelectorMarker.write(writer, instance.numericProjectionOfSelectorMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Store' variant + */ + public data class Store( + public val metadataProjectionOfSelectorMarker: MetadataProjectionOfSelectorMarker, + ) : AssetValueProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 2 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.AssetValueProjectionOfSelectorMarker.Store = + try { + Store( + MetadataProjectionOfSelectorMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.AssetValueProjectionOfSelectorMarker.Store, + ): Unit = + try { + MetadataProjectionOfSelectorMarker.write(writer, instance.metadataProjectionOfSelectorMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): AssetValueProjectionOfSelectorMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Numeric.read(reader) + 2 -> Store.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: AssetValueProjectionOfSelectorMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Numeric.write(writer, instance as Numeric) + 2 -> Store.write(writer, instance as Store) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AtIndex.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AtIndex.kt deleted file mode 100644 index 3a375d74b..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AtIndex.kt +++ /dev/null @@ -1,40 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Long -import kotlin.Unit - -/** - * AtIndex - * - * Generated from 'AtIndex' regular structure - */ -public data class AtIndex( - public val index: Long, - public val predicate: QueryOutputPredicate, -) { - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): AtIndex = try { - AtIndex( - reader.readUint32(), - QueryOutputPredicate.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: AtIndex): Unit = try { - writer.writeUint32(instance.index) - QueryOutputPredicate.write(writer, instance.predicate) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BatchedResponse.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BatchedResponse.kt deleted file mode 100644 index 31d4a8873..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BatchedResponse.kt +++ /dev/null @@ -1,76 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.ModelEnum -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Any -import kotlin.Int -import kotlin.Unit - -/** - * BatchedResponse - * - * Generated from 'BatchedResponse' enum - */ -public sealed class BatchedResponse : ModelEnum { - /** - * @return Discriminator of variant in enum - */ - public abstract fun discriminant(): Int - - /** - * 'V1' variant - */ - public data class V1( - public val batchedResponseV1: BatchedResponseV1, - ) : BatchedResponse() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 1 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.BatchedResponse.V1 = try { - V1( - BatchedResponseV1.read(reader) as BatchedResponseV1, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.BatchedResponse.V1, - ): Unit = try { - BatchedResponseV1.write(writer, instance.batchedResponseV1) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : - ScaleReader>, - ScaleWriter> { - override fun read(reader: ScaleCodecReader): BatchedResponse = when ( - val discriminant = - reader.readUByte() - ) { - 1 -> V1.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: BatchedResponse) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 1 -> V1.write(writer, instance as V1) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BatchedResponseV1.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BatchedResponseV1.kt deleted file mode 100644 index d613c9b68..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BatchedResponseV1.kt +++ /dev/null @@ -1,42 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Any -import kotlin.Unit - -/** - * BatchedResponseV1 - * - * Generated from 'BatchedResponseV1' regular structure - */ -public data class BatchedResponseV1( - public val batch: QueryOutputBox, - public val cursor: ForwardCursor, -) { - public companion object : - ScaleReader>, - ScaleWriter> { - override fun read(reader: ScaleCodecReader): BatchedResponseV1 = try { - BatchedResponseV1( - QueryOutputBox.read(reader), - ForwardCursor.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: BatchedResponseV1): Unit = try { - QueryOutputBox.write(writer, instance.batch) - ForwardCursor.write(writer, instance.cursor) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockEvent.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockEvent.kt index a8bf43229..5201595b4 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockEvent.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockEvent.kt @@ -20,20 +20,25 @@ public data class BlockEvent( public val status: BlockStatus, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): BlockEvent = try { - BlockEvent( - BlockHeader.read(reader), - BlockStatus.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): BlockEvent = + try { + BlockEvent( + BlockHeader.read(reader), + BlockStatus.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: BlockEvent): Unit = try { - BlockHeader.write(writer, instance.`header`) - BlockStatus.write(writer, instance.status) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: BlockEvent, + ): Unit = + try { + BlockHeader.write(writer, instance.`header`) + BlockStatus.write(writer, instance.status) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockEventFilter.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockEventFilter.kt index c67b86812..fee42f945 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockEventFilter.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockEventFilter.kt @@ -20,20 +20,25 @@ public data class BlockEventFilter( public val status: BlockStatus? = null, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): BlockEventFilter = try { - BlockEventFilter( - reader.readNullable(NonZeroOfu64) as NonZeroOfu64?, - reader.readNullable(BlockStatus) as BlockStatus?, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): BlockEventFilter = + try { + BlockEventFilter( + reader.readNullable(NonZeroOfu64) as NonZeroOfu64?, + reader.readNullable(BlockStatus) as BlockStatus?, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: BlockEventFilter): Unit = try { - writer.writeNullable(NonZeroOfu64, instance.height) - writer.writeNullable(BlockStatus, instance.status) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: BlockEventFilter, + ): Unit = + try { + writer.writeNullable(NonZeroOfu64, instance.height) + writer.writeNullable(BlockStatus, instance.status) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockHashPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockHashPredicateBox.kt deleted file mode 100644 index a40986bcb..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockHashPredicateBox.kt +++ /dev/null @@ -1,73 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.ModelEnum -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Int -import kotlin.Unit - -/** - * BlockHashPredicateBox - * - * Generated from 'BlockHashPredicateBox' enum - */ -public sealed class BlockHashPredicateBox : ModelEnum { - /** - * @return Discriminator of variant in enum - */ - public abstract fun discriminant(): Int - - /** - * 'Equals' variant - */ - public data class Equals( - public val hashOf: HashOf, - ) : BlockHashPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 0 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.BlockHashPredicateBox.Equals = try { - Equals( - HashOf.read(reader) as HashOf, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.BlockHashPredicateBox.Equals, - ): Unit = try { - HashOf.write(writer, instance.hashOf) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): BlockHashPredicateBox = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Equals.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: BlockHashPredicateBox) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 0 -> Equals.write(writer, instance as Equals) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockHeader.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockHeader.kt index 7393cf9c7..06af001eb 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockHeader.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockHeader.kt @@ -24,31 +24,33 @@ public data class BlockHeader( public val transactionsHash: HashOf>, public val creationTimeMs: BigInteger, public val viewChangeIndex: Long, - public val consensusEstimationMs: BigInteger, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): BlockHeader = try { - BlockHeader( - NonZeroOfu64.read(reader), - reader.readNullable(HashOf) as HashOf?, - HashOf.read(reader) as HashOf>, - reader.readUint64(), - reader.readUint32(), - reader.readUint64(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): BlockHeader = + try { + BlockHeader( + NonZeroOfu64.read(reader), + reader.readNullable(HashOf) as HashOf?, + HashOf.read(reader) as HashOf>, + reader.readUint64(), + reader.readUint32(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: BlockHeader): Unit = try { - NonZeroOfu64.write(writer, instance.height) - writer.writeNullable(HashOf, instance.prevBlockHash) - HashOf.write(writer, instance.transactionsHash) - writer.writeUint64(instance.creationTimeMs) - writer.writeUint32(instance.viewChangeIndex) - writer.writeUint64(instance.consensusEstimationMs) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: BlockHeader, + ): Unit = + try { + NonZeroOfu64.write(writer, instance.height) + writer.writeNullable(HashOf, instance.prevBlockHash) + HashOf.write(writer, instance.transactionsHash) + writer.writeUint64(instance.creationTimeMs) + writer.writeUint32(instance.viewChangeIndex) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockHeaderHashPredicateAtom.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockHeaderHashPredicateAtom.kt new file mode 100644 index 000000000..37b1b49de --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockHeaderHashPredicateAtom.kt @@ -0,0 +1,80 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit + +/** + * BlockHeaderHashPredicateAtom + * + * Generated from 'BlockHeaderHashPredicateAtom' enum + */ +public sealed class BlockHeaderHashPredicateAtom : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Equals' variant + */ + public data class Equals( + public val hashOf: HashOf, + ) : BlockHeaderHashPredicateAtom() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.BlockHeaderHashPredicateAtom.Equals = + try { + Equals( + HashOf.read(reader) as HashOf, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.BlockHeaderHashPredicateAtom.Equals, + ): Unit = + try { + HashOf.write(writer, instance.hashOf) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): BlockHeaderHashPredicateAtom = + when (val discriminant = reader.readUByte()) { + 0 -> Equals.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: BlockHeaderHashPredicateAtom, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Equals.write(writer, instance as Equals) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockHeaderHashProjectionOfPredicateMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockHeaderHashProjectionOfPredicateMarker.kt new file mode 100644 index 000000000..a17bef4d3 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockHeaderHashProjectionOfPredicateMarker.kt @@ -0,0 +1,80 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit + +/** + * BlockHeaderHashProjectionOfPredicateMarker + * + * Generated from 'BlockHeaderHashProjectionOfPredicateMarker' enum + */ +public sealed class BlockHeaderHashProjectionOfPredicateMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val blockHeaderHashPredicateAtom: BlockHeaderHashPredicateAtom, + ) : BlockHeaderHashProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.BlockHeaderHashProjectionOfPredicateMarker.Atom = + try { + Atom( + BlockHeaderHashPredicateAtom.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.BlockHeaderHashProjectionOfPredicateMarker.Atom, + ): Unit = + try { + BlockHeaderHashPredicateAtom.write(writer, instance.blockHeaderHashPredicateAtom) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): BlockHeaderHashProjectionOfPredicateMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: BlockHeaderHashProjectionOfPredicateMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockHeaderHashProjectionOfSelectorMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockHeaderHashProjectionOfSelectorMarker.kt new file mode 100644 index 000000000..46b43742a --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockHeaderHashProjectionOfSelectorMarker.kt @@ -0,0 +1,100 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Any +import kotlin.Boolean +import kotlin.Int +import kotlin.Unit + +/** + * BlockHeaderHashProjectionOfSelectorMarker + * + * Generated from 'BlockHeaderHashProjectionOfSelectorMarker' enum + */ +public sealed class BlockHeaderHashProjectionOfSelectorMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + override fun equals(other: Any?): Boolean = + when (this) { + is Atom -> Atom.equals(this, other) + else -> super.equals(other) + } + + override fun hashCode(): Int = + when (this) { + is Atom -> Atom.hashCode() + else -> super.hashCode() + } + + /** + * 'Atom' variant + */ + public class Atom : BlockHeaderHashProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.BlockHeaderHashProjectionOfSelectorMarker.Atom = + try { + Atom() + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.BlockHeaderHashProjectionOfSelectorMarker.Atom, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.BlockHeaderHashProjectionOfSelectorMarker.Atom, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".BlockHeaderHashProjectionOfSelectorMarker.Atom".hashCode() + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): BlockHeaderHashProjectionOfSelectorMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: BlockHeaderHashProjectionOfSelectorMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockHeaderPredicateAtom.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockHeaderPredicateAtom.kt new file mode 100644 index 000000000..ed5419112 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockHeaderPredicateAtom.kt @@ -0,0 +1,42 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import kotlin.Int + +/** + * BlockHeaderPredicateAtom + * + * Generated from 'BlockHeaderPredicateAtom' enum + */ +public sealed class BlockHeaderPredicateAtom : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): BlockHeaderPredicateAtom = + when (val discriminant = reader.readUByte()) { + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: BlockHeaderPredicateAtom, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockHeaderPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockHeaderPredicateBox.kt deleted file mode 100644 index 62559f878..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockHeaderPredicateBox.kt +++ /dev/null @@ -1,75 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.ModelEnum -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Int -import kotlin.Unit - -/** - * BlockHeaderPredicateBox - * - * Generated from 'BlockHeaderPredicateBox' enum - */ -public sealed class BlockHeaderPredicateBox : ModelEnum { - /** - * @return Discriminator of variant in enum - */ - public abstract fun discriminant(): Int - - /** - * 'Hash' variant - */ - public data class Hash( - public val blockHashPredicateBox: BlockHashPredicateBox, - ) : BlockHeaderPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 0 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.BlockHeaderPredicateBox.Hash = try { - Hash( - BlockHashPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.BlockHeaderPredicateBox.Hash, - ): Unit = try { - BlockHashPredicateBox.write(writer, instance.blockHashPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): BlockHeaderPredicateBox = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Hash.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: BlockHeaderPredicateBox) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 0 -> Hash.write(writer, instance as Hash) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockHeaderProjectionOfPredicateMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockHeaderProjectionOfPredicateMarker.kt new file mode 100644 index 000000000..5394cfa26 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockHeaderProjectionOfPredicateMarker.kt @@ -0,0 +1,116 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit + +/** + * BlockHeaderProjectionOfPredicateMarker + * + * Generated from 'BlockHeaderProjectionOfPredicateMarker' enum + */ +public sealed class BlockHeaderProjectionOfPredicateMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val blockHeaderPredicateAtom: BlockHeaderPredicateAtom, + ) : BlockHeaderProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.BlockHeaderProjectionOfPredicateMarker.Atom = + try { + Atom( + BlockHeaderPredicateAtom.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.BlockHeaderProjectionOfPredicateMarker.Atom, + ): Unit = + try { + BlockHeaderPredicateAtom.write(writer, instance.blockHeaderPredicateAtom) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Hash' variant + */ + public data class Hash( + public val blockHeaderHashProjectionOfPredicateMarker: BlockHeaderHashProjectionOfPredicateMarker, + ) : BlockHeaderProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.BlockHeaderProjectionOfPredicateMarker.Hash = + try { + Hash( + BlockHeaderHashProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.BlockHeaderProjectionOfPredicateMarker.Hash, + ): Unit = + try { + BlockHeaderHashProjectionOfPredicateMarker.write(writer, instance.blockHeaderHashProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): BlockHeaderProjectionOfPredicateMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Hash.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: BlockHeaderProjectionOfPredicateMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Hash.write(writer, instance as Hash) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockHeaderProjectionOfSelectorMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockHeaderProjectionOfSelectorMarker.kt new file mode 100644 index 000000000..05d12dbca --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockHeaderProjectionOfSelectorMarker.kt @@ -0,0 +1,136 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Any +import kotlin.Boolean +import kotlin.Int +import kotlin.Unit + +/** + * BlockHeaderProjectionOfSelectorMarker + * + * Generated from 'BlockHeaderProjectionOfSelectorMarker' enum + */ +public sealed class BlockHeaderProjectionOfSelectorMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + override fun equals(other: Any?): Boolean = + when (this) { + is Atom -> Atom.equals(this, other) + else -> super.equals(other) + } + + override fun hashCode(): Int = + when (this) { + is Atom -> Atom.hashCode() + else -> super.hashCode() + } + + /** + * 'Atom' variant + */ + public class Atom : BlockHeaderProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.BlockHeaderProjectionOfSelectorMarker.Atom = + try { + Atom() + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.BlockHeaderProjectionOfSelectorMarker.Atom, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.BlockHeaderProjectionOfSelectorMarker.Atom, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".BlockHeaderProjectionOfSelectorMarker.Atom".hashCode() + } + } + + /** + * 'Hash' variant + */ + public data class Hash( + public val blockHeaderHashProjectionOfSelectorMarker: BlockHeaderHashProjectionOfSelectorMarker, + ) : BlockHeaderProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.BlockHeaderProjectionOfSelectorMarker.Hash = + try { + Hash( + BlockHeaderHashProjectionOfSelectorMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.BlockHeaderProjectionOfSelectorMarker.Hash, + ): Unit = + try { + BlockHeaderHashProjectionOfSelectorMarker.write(writer, instance.blockHeaderHashProjectionOfSelectorMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): BlockHeaderProjectionOfSelectorMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Hash.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: BlockHeaderProjectionOfSelectorMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Hash.write(writer, instance as Hash) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockMessage.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockMessage.kt index 5c968e2fa..545b15607 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockMessage.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockMessage.kt @@ -19,18 +19,23 @@ public data class BlockMessage( public val signedBlock: SignedBlock, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): BlockMessage = try { - BlockMessage( - SignedBlock.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): BlockMessage = + try { + BlockMessage( + SignedBlock.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: BlockMessage): Unit = try { - SignedBlock.write(writer, instance.signedBlock) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: BlockMessage, + ): Unit = + try { + SignedBlock.write(writer, instance.signedBlock) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockParameter.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockParameter.kt index 718476f2b..0805faf3a 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockParameter.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockParameter.kt @@ -36,38 +36,43 @@ public sealed class BlockParameter : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.BlockParameter.MaxTransactions = try { - MaxTransactions( - NonZeroOfu64.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.BlockParameter.MaxTransactions = + try { + MaxTransactions( + NonZeroOfu64.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.BlockParameter.MaxTransactions, - ): Unit = try { - NonZeroOfu64.write(writer, instance.nonZeroOfu64) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + NonZeroOfu64.write(writer, instance.nonZeroOfu64) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): BlockParameter = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> MaxTransactions.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + override fun read(reader: ScaleCodecReader): BlockParameter = + when (val discriminant = reader.readUByte()) { + 0 -> MaxTransactions.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: BlockParameter) { + override fun write( + writer: ScaleCodecWriter, + instance: BlockParameter, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> MaxTransactions.write(writer, instance as MaxTransactions) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockParameters.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockParameters.kt index a6f725dc9..f5236d649 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockParameters.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockParameters.kt @@ -19,18 +19,23 @@ public data class BlockParameters( public val maxTransactions: NonZeroOfu64, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): BlockParameters = try { - BlockParameters( - NonZeroOfu64.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): BlockParameters = + try { + BlockParameters( + NonZeroOfu64.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: BlockParameters): Unit = try { - NonZeroOfu64.write(writer, instance.maxTransactions) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: BlockParameters, + ): Unit = + try { + NonZeroOfu64.write(writer, instance.maxTransactions) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockPayload.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockPayload.kt index 4c64170cb..4f5f72761 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockPayload.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockPayload.kt @@ -18,32 +18,31 @@ import kotlin.collections.List */ public data class BlockPayload( public val `header`: BlockHeader, - public val transactions: List, - public val eventRecommendations: List, + public val transactions: List, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): BlockPayload = try { - BlockPayload( - BlockHeader.read(reader), - reader.readVec(reader.readCompactInt()) { CommittedTransaction.read(reader) }, - reader.readVec(reader.readCompactInt()) { EventBox.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: BlockPayload): Unit = try { - BlockHeader.write(writer, instance.`header`) - writer.writeCompact(instance.transactions.size) - instance.transactions.forEach { value -> - CommittedTransaction.write(writer, value) + override fun read(reader: ScaleCodecReader): BlockPayload = + try { + BlockPayload( + BlockHeader.read(reader), + reader.readVec(reader.readCompactInt()) { SignedTransaction.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) } - writer.writeCompact(instance.eventRecommendations.size) - instance.eventRecommendations.forEach { value -> - EventBox.write(writer, value) + + override fun write( + writer: ScaleCodecWriter, + instance: BlockPayload, + ): Unit = + try { + BlockHeader.write(writer, instance.`header`) + writer.writeCompact(instance.transactions.size) + instance.transactions.forEach { value -> + SignedTransaction.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) } - } catch (ex: Exception) { - throw wrapException(ex) - } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockRejectionReason.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockRejectionReason.kt index 30acd9ad9..dc06373bc 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockRejectionReason.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockRejectionReason.kt @@ -25,13 +25,17 @@ public sealed class BlockRejectionReason : ModelEnum { */ public abstract fun discriminant(): Int - override fun equals(other: Any?): Boolean = when (this) { - is ConsensusBlockRejection -> ConsensusBlockRejection.equals(this, other) - else -> super.equals(other) } + override fun equals(other: Any?): Boolean = + when (this) { + is ConsensusBlockRejection -> ConsensusBlockRejection.equals(this, other) + else -> super.equals(other) + } - override fun hashCode(): Int = when (this) { - is ConsensusBlockRejection -> ConsensusBlockRejection.hashCode() - else -> super.hashCode() } + override fun hashCode(): Int = + when (this) { + is ConsensusBlockRejection -> ConsensusBlockRejection.hashCode() + else -> super.hashCode() + } /** * 'ConsensusBlockRejection' variant @@ -44,45 +48,51 @@ public sealed class BlockRejectionReason : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.BlockRejectionReason.ConsensusBlockRejection = try { - ConsensusBlockRejection() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.BlockRejectionReason.ConsensusBlockRejection = + try { + ConsensusBlockRejection() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.BlockRejectionReason.ConsensusBlockRejection, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } public fun equals( o1: jp.co.soramitsu.iroha2.generated.BlockRejectionReason.ConsensusBlockRejection, o2: Any?, - ): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".BlockRejectionReason.ConsensusBlockRejection".hashCode() } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): BlockRejectionReason = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> ConsensusBlockRejection.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + override fun read(reader: ScaleCodecReader): BlockRejectionReason = + when (val discriminant = reader.readUByte()) { + 0 -> ConsensusBlockRejection.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: BlockRejectionReason) { + override fun write( + writer: ScaleCodecWriter, + instance: BlockRejectionReason, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> ConsensusBlockRejection.write(writer, instance as ConsensusBlockRejection) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockSignature.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockSignature.kt index 85ee7d1d2..ea084ae89 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockSignature.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockSignature.kt @@ -21,20 +21,25 @@ public data class BlockSignature( public val signatureOf: SignatureOf, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): BlockSignature = try { - BlockSignature( - reader.readUint64(), - SignatureOf.read(reader) as SignatureOf, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): BlockSignature = + try { + BlockSignature( + reader.readUint64(), + SignatureOf.read(reader) as SignatureOf, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: BlockSignature): Unit = try { - writer.writeUint64(instance.u64) - SignatureOf.write(writer, instance.signatureOf) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: BlockSignature, + ): Unit = + try { + writer.writeUint64(instance.u64) + SignatureOf.write(writer, instance.signatureOf) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockStatus.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockStatus.kt index df507d132..1094867b2 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockStatus.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockStatus.kt @@ -25,17 +25,63 @@ public sealed class BlockStatus : ModelEnum { */ public abstract fun discriminant(): Int - override fun equals(other: Any?): Boolean = when (this) { - is Approved -> Approved.equals(this, other) - is Committed -> Committed.equals(this, other) - is Applied -> Applied.equals(this, other) - else -> super.equals(other) } - - override fun hashCode(): Int = when (this) { - is Approved -> Approved.hashCode() - is Committed -> Committed.hashCode() - is Applied -> Applied.hashCode() - else -> super.hashCode() } + override fun equals(other: Any?): Boolean = + when (this) { + is Created -> Created.equals(this, other) + is Approved -> Approved.equals(this, other) + is Committed -> Committed.equals(this, other) + is Applied -> Applied.equals(this, other) + else -> super.equals(other) + } + + override fun hashCode(): Int = + when (this) { + is Created -> Created.hashCode() + is Approved -> Approved.hashCode() + is Committed -> Committed.hashCode() + is Applied -> Applied.hashCode() + else -> super.hashCode() + } + + /** + * 'Created' variant + */ + public class Created : BlockStatus() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.BlockStatus.Created = + try { + Created() + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.BlockStatus.Created, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.BlockStatus.Created, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".BlockStatus.Created".hashCode() + } + } /** * 'Approved' variant @@ -46,26 +92,32 @@ public sealed class BlockStatus : ModelEnum { public companion object : ScaleReader, ScaleWriter { - public const val DISCRIMINANT: Int = 0 + public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.BlockStatus.Approved = try { - Approved() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.BlockStatus.Approved = + try { + Approved() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.BlockStatus.Approved, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: jp.co.soramitsu.iroha2.generated.BlockStatus.Approved, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.BlockStatus.Approved, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".BlockStatus.Approved".hashCode() } @@ -82,24 +134,26 @@ public sealed class BlockStatus : ModelEnum { public companion object : ScaleReader, ScaleWriter { - public const val DISCRIMINANT: Int = 1 + public const val DISCRIMINANT: Int = 2 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.BlockStatus.Rejected = try { - Rejected( - BlockRejectionReason.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.BlockStatus.Rejected = + try { + Rejected( + BlockRejectionReason.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.BlockStatus.Rejected, - ): Unit = try { - BlockRejectionReason.write(writer, instance.blockRejectionReason) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + BlockRejectionReason.write(writer, instance.blockRejectionReason) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -112,26 +166,32 @@ public sealed class BlockStatus : ModelEnum { public companion object : ScaleReader, ScaleWriter { - public const val DISCRIMINANT: Int = 2 + public const val DISCRIMINANT: Int = 3 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.BlockStatus.Committed = try { - Committed() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.BlockStatus.Committed = + try { + Committed() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.BlockStatus.Committed, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: jp.co.soramitsu.iroha2.generated.BlockStatus.Committed, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.BlockStatus.Committed, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".BlockStatus.Committed".hashCode() } @@ -146,50 +206,61 @@ public sealed class BlockStatus : ModelEnum { public companion object : ScaleReader, ScaleWriter { - public const val DISCRIMINANT: Int = 3 + public const val DISCRIMINANT: Int = 4 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.BlockStatus.Applied = try { - Applied() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.BlockStatus.Applied = + try { + Applied() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.BlockStatus.Applied, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: jp.co.soramitsu.iroha2.generated.BlockStatus.Applied, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.BlockStatus.Applied, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".BlockStatus.Applied".hashCode() } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): BlockStatus = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Approved.read(reader) - 1 -> Rejected.read(reader) - 2 -> Committed.read(reader) - 3 -> Applied.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + override fun read(reader: ScaleCodecReader): BlockStatus = + when (val discriminant = reader.readUByte()) { + 0 -> Created.read(reader) + 1 -> Approved.read(reader) + 2 -> Rejected.read(reader) + 3 -> Committed.read(reader) + 4 -> Applied.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: BlockStatus) { + override fun write( + writer: ScaleCodecWriter, + instance: BlockStatus, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { - 0 -> Approved.write(writer, instance as Approved) - 1 -> Rejected.write(writer, instance as Rejected) - 2 -> Committed.write(writer, instance as Committed) - 3 -> Applied.write(writer, instance as Applied) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + 0 -> Created.write(writer, instance as Created) + 1 -> Approved.write(writer, instance as Approved) + 2 -> Rejected.write(writer, instance as Rejected) + 3 -> Committed.write(writer, instance as Committed) + 4 -> Applied.write(writer, instance as Applied) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockSubscriptionRequest.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockSubscriptionRequest.kt index 34fd0f84a..2e5f5a5da 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockSubscriptionRequest.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BlockSubscriptionRequest.kt @@ -21,18 +21,23 @@ public data class BlockSubscriptionRequest( public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): BlockSubscriptionRequest = try { - BlockSubscriptionRequest( - NonZeroOfu64.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): BlockSubscriptionRequest = + try { + BlockSubscriptionRequest( + NonZeroOfu64.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: BlockSubscriptionRequest): Unit = try { - NonZeroOfu64.write(writer, instance.nonZeroOfu64) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: BlockSubscriptionRequest, + ): Unit = + try { + NonZeroOfu64.write(writer, instance.nonZeroOfu64) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BurnBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BurnBox.kt index a7e7b29ec..14e0f8fa8 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BurnBox.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BurnBox.kt @@ -48,11 +48,12 @@ public sealed class BurnBox : ModelEnum { override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.BurnBox.Asset, - ): Unit = try { - BurnOfNumericAndAsset.write(writer, instance.burnOfNumericAndAsset) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + BurnOfNumericAndAsset.write(writer, instance.burnOfNumericAndAsset) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -69,40 +70,45 @@ public sealed class BurnBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.BurnBox.TriggerRepetitions = try { - TriggerRepetitions( - BurnOfu32AndTrigger.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.BurnBox.TriggerRepetitions = + try { + TriggerRepetitions( + BurnOfu32AndTrigger.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.BurnBox.TriggerRepetitions, - ): Unit = try { - BurnOfu32AndTrigger.write(writer, instance.burnOfu32AndTrigger) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + BurnOfu32AndTrigger.write(writer, instance.burnOfu32AndTrigger) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): BurnBox = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Asset.read(reader) - 1 -> TriggerRepetitions.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + override fun read(reader: ScaleCodecReader): BurnBox = + when (val discriminant = reader.readUByte()) { + 0 -> Asset.read(reader) + 1 -> TriggerRepetitions.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: BurnBox) { + override fun write( + writer: ScaleCodecWriter, + instance: BurnBox, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Asset.write(writer, instance as Asset) 1 -> TriggerRepetitions.write(writer, instance as TriggerRepetitions) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BurnOfNumericAndAsset.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BurnOfNumericAndAsset.kt index 5e4b85de6..ec236d4fc 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BurnOfNumericAndAsset.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BurnOfNumericAndAsset.kt @@ -3,10 +3,13 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException import kotlin.Unit @@ -18,22 +21,29 @@ import kotlin.Unit public data class BurnOfNumericAndAsset( public val `object`: Numeric, public val destination: AssetId, -) { +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): BurnOfNumericAndAsset = try { - BurnOfNumericAndAsset( - Numeric.read(reader), - AssetId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): BurnOfNumericAndAsset = + try { + BurnOfNumericAndAsset( + Numeric.read(reader), + AssetId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: BurnOfNumericAndAsset): Unit = try { - Numeric.write(writer, instance.`object`) - AssetId.write(writer, instance.destination) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: BurnOfNumericAndAsset, + ): Unit = + try { + Numeric.write(writer, instance.`object`) + AssetId.write(writer, instance.destination) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BurnOfu32AndTrigger.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BurnOfu32AndTrigger.kt index f8681d7fe..014609a64 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BurnOfu32AndTrigger.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/BurnOfu32AndTrigger.kt @@ -3,10 +3,13 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException import kotlin.Long import kotlin.Unit @@ -19,22 +22,29 @@ import kotlin.Unit public data class BurnOfu32AndTrigger( public val `object`: Long, public val destination: TriggerId, -) { +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): BurnOfu32AndTrigger = try { - BurnOfu32AndTrigger( - reader.readUint32(), - TriggerId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): BurnOfu32AndTrigger = + try { + BurnOfu32AndTrigger( + reader.readUint32(), + TriggerId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: BurnOfu32AndTrigger): Unit = try { - writer.writeUint32(instance.`object`) - TriggerId.write(writer, instance.destination) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: BurnOfu32AndTrigger, + ): Unit = + try { + writer.writeUint32(instance.`object`) + TriggerId.write(writer, instance.destination) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanBurnAsset.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanBurnAsset.kt new file mode 100644 index 000000000..8081aa0c4 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanBurnAsset.kt @@ -0,0 +1,42 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelPermission +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit + +/** + * CanBurnAsset + * + * Generated from 'CanBurnAsset' regular structure + */ +public data class CanBurnAsset( + public val asset: AssetId, +) : ModelPermission { + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): CanBurnAsset = + try { + CanBurnAsset( + AssetId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: CanBurnAsset, + ): Unit = + try { + AssetId.write(writer, instance.asset) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanBurnAssetWithDefinition.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanBurnAssetWithDefinition.kt index 265ec6a71..d1e41c2bf 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanBurnAssetWithDefinition.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanBurnAssetWithDefinition.kt @@ -3,6 +3,7 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.ModelPermission import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader @@ -17,22 +18,27 @@ import kotlin.Unit */ public data class CanBurnAssetWithDefinition( public val assetDefinition: AssetDefinitionId, -) { +) : ModelPermission { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): CanBurnAssetWithDefinition = try { - CanBurnAssetWithDefinition( - AssetDefinitionId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): CanBurnAssetWithDefinition = + try { + CanBurnAssetWithDefinition( + AssetDefinitionId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: CanBurnAssetWithDefinition): Unit = try { - AssetDefinitionId.write(writer, instance.assetDefinition) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: CanBurnAssetWithDefinition, + ): Unit = + try { + AssetDefinitionId.write(writer, instance.assetDefinition) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanBurnUserAsset.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanBurnUserAsset.kt deleted file mode 100644 index c33542aea..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanBurnUserAsset.kt +++ /dev/null @@ -1,36 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * CanBurnUserAsset - * - * Generated from 'CanBurnUserAsset' regular structure - */ -public data class CanBurnUserAsset( - public val asset: AssetId, -) { - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): CanBurnUserAsset = try { - CanBurnUserAsset( - AssetId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: CanBurnUserAsset): Unit = try { - AssetId.write(writer, instance.asset) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanBurnUserTrigger.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanBurnUserTrigger.kt deleted file mode 100644 index 09d8e0339..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanBurnUserTrigger.kt +++ /dev/null @@ -1,36 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * CanBurnUserTrigger - * - * Generated from 'CanBurnUserTrigger' regular structure - */ -public data class CanBurnUserTrigger( - public val trigger: TriggerId, -) { - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): CanBurnUserTrigger = try { - CanBurnUserTrigger( - TriggerId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: CanBurnUserTrigger): Unit = try { - TriggerId.write(writer, instance.trigger) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanExecuteTrigger.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanExecuteTrigger.kt new file mode 100644 index 000000000..2de73c2c1 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanExecuteTrigger.kt @@ -0,0 +1,42 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelPermission +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit + +/** + * CanExecuteTrigger + * + * Generated from 'CanExecuteTrigger' regular structure + */ +public data class CanExecuteTrigger( + public val trigger: TriggerId, +) : ModelPermission { + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): CanExecuteTrigger = + try { + CanExecuteTrigger( + TriggerId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: CanExecuteTrigger, + ): Unit = + try { + TriggerId.write(writer, instance.trigger) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanExecuteUserTrigger.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanExecuteUserTrigger.kt deleted file mode 100644 index a5b5900ce..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanExecuteUserTrigger.kt +++ /dev/null @@ -1,36 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * CanExecuteUserTrigger - * - * Generated from 'CanExecuteUserTrigger' regular structure - */ -public data class CanExecuteUserTrigger( - public val trigger: TriggerId, -) { - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): CanExecuteUserTrigger = try { - CanExecuteUserTrigger( - TriggerId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: CanExecuteUserTrigger): Unit = try { - TriggerId.write(writer, instance.trigger) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanManagePeers.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanManagePeers.kt new file mode 100644 index 000000000..0d74c89ee --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanManagePeers.kt @@ -0,0 +1,51 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelPermission +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Any +import kotlin.Boolean +import kotlin.Int +import kotlin.Unit + +/** + * CanManagePeers + * + * Generated from 'CanManagePeers' tuple structure + */ +public class CanManagePeers : ModelPermission { + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): CanManagePeers = + try { + CanManagePeers() + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: CanManagePeers, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: CanManagePeers, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".CanManagePeers".hashCode() + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanManageRoles.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanManageRoles.kt new file mode 100644 index 000000000..bde3e37c9 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanManageRoles.kt @@ -0,0 +1,51 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelPermission +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Any +import kotlin.Boolean +import kotlin.Int +import kotlin.Unit + +/** + * CanManageRoles + * + * Generated from 'CanManageRoles' tuple structure + */ +public class CanManageRoles : ModelPermission { + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): CanManageRoles = + try { + CanManageRoles() + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: CanManageRoles, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: CanManageRoles, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".CanManageRoles".hashCode() + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanMintAsset.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanMintAsset.kt new file mode 100644 index 000000000..d7831ef44 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanMintAsset.kt @@ -0,0 +1,42 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelPermission +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit + +/** + * CanMintAsset + * + * Generated from 'CanMintAsset' regular structure + */ +public data class CanMintAsset( + public val asset: AssetId, +) : ModelPermission { + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): CanMintAsset = + try { + CanMintAsset( + AssetId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: CanMintAsset, + ): Unit = + try { + AssetId.write(writer, instance.asset) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanMintAssetWithDefinition.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanMintAssetWithDefinition.kt index 1b4ce4ae3..972ae7bbb 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanMintAssetWithDefinition.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanMintAssetWithDefinition.kt @@ -3,6 +3,7 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.ModelPermission import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader @@ -17,22 +18,27 @@ import kotlin.Unit */ public data class CanMintAssetWithDefinition( public val assetDefinition: AssetDefinitionId, -) { +) : ModelPermission { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): CanMintAssetWithDefinition = try { - CanMintAssetWithDefinition( - AssetDefinitionId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): CanMintAssetWithDefinition = + try { + CanMintAssetWithDefinition( + AssetDefinitionId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: CanMintAssetWithDefinition): Unit = try { - AssetDefinitionId.write(writer, instance.assetDefinition) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: CanMintAssetWithDefinition, + ): Unit = + try { + AssetDefinitionId.write(writer, instance.assetDefinition) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanMintUserAsset.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanMintUserAsset.kt deleted file mode 100644 index 1f237f34c..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanMintUserAsset.kt +++ /dev/null @@ -1,36 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * CanMintUserAsset - * - * Generated from 'CanMintUserAsset' regular structure - */ -public data class CanMintUserAsset( - public val asset: AssetId, -) { - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): CanMintUserAsset = try { - CanMintUserAsset( - AssetId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: CanMintUserAsset): Unit = try { - AssetId.write(writer, instance.asset) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanMintUserTrigger.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanMintUserTrigger.kt deleted file mode 100644 index 4f2f09288..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanMintUserTrigger.kt +++ /dev/null @@ -1,36 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * CanMintUserTrigger - * - * Generated from 'CanMintUserTrigger' regular structure - */ -public data class CanMintUserTrigger( - public val trigger: TriggerId, -) { - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): CanMintUserTrigger = try { - CanMintUserTrigger( - TriggerId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: CanMintUserTrigger): Unit = try { - TriggerId.write(writer, instance.trigger) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanModifyAccountMetadata.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanModifyAccountMetadata.kt new file mode 100644 index 000000000..a799a5bdd --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanModifyAccountMetadata.kt @@ -0,0 +1,44 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelPermission +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit + +/** + * CanModifyAccountMetadata + * + * Generated from 'CanModifyAccountMetadata' regular structure + */ +public data class CanModifyAccountMetadata( + public val account: AccountId, +) : ModelPermission { + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): CanModifyAccountMetadata = + try { + CanModifyAccountMetadata( + AccountId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: CanModifyAccountMetadata, + ): Unit = + try { + AccountId.write(writer, instance.account) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanModifyAssetDefinitionMetadata.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanModifyAssetDefinitionMetadata.kt new file mode 100644 index 000000000..675fb029a --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanModifyAssetDefinitionMetadata.kt @@ -0,0 +1,44 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelPermission +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit + +/** + * CanModifyAssetDefinitionMetadata + * + * Generated from 'CanModifyAssetDefinitionMetadata' regular structure + */ +public data class CanModifyAssetDefinitionMetadata( + public val assetDefinition: AssetDefinitionId, +) : ModelPermission { + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): CanModifyAssetDefinitionMetadata = + try { + CanModifyAssetDefinitionMetadata( + AssetDefinitionId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: CanModifyAssetDefinitionMetadata, + ): Unit = + try { + AssetDefinitionId.write(writer, instance.assetDefinition) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanModifyAssetMetadata.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanModifyAssetMetadata.kt new file mode 100644 index 000000000..a86c4fead --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanModifyAssetMetadata.kt @@ -0,0 +1,44 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelPermission +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit + +/** + * CanModifyAssetMetadata + * + * Generated from 'CanModifyAssetMetadata' regular structure + */ +public data class CanModifyAssetMetadata( + public val asset: AssetId, +) : ModelPermission { + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): CanModifyAssetMetadata = + try { + CanModifyAssetMetadata( + AssetId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: CanModifyAssetMetadata, + ): Unit = + try { + AssetId.write(writer, instance.asset) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanModifyDomainMetadata.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanModifyDomainMetadata.kt new file mode 100644 index 000000000..a6135639c --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanModifyDomainMetadata.kt @@ -0,0 +1,44 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelPermission +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit + +/** + * CanModifyDomainMetadata + * + * Generated from 'CanModifyDomainMetadata' regular structure + */ +public data class CanModifyDomainMetadata( + public val domain: DomainId, +) : ModelPermission { + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): CanModifyDomainMetadata = + try { + CanModifyDomainMetadata( + DomainId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: CanModifyDomainMetadata, + ): Unit = + try { + DomainId.write(writer, instance.domain) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanModifyTrigger.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanModifyTrigger.kt new file mode 100644 index 000000000..577cdc786 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanModifyTrigger.kt @@ -0,0 +1,42 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelPermission +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit + +/** + * CanModifyTrigger + * + * Generated from 'CanModifyTrigger' regular structure + */ +public data class CanModifyTrigger( + public val trigger: TriggerId, +) : ModelPermission { + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): CanModifyTrigger = + try { + CanModifyTrigger( + TriggerId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: CanModifyTrigger, + ): Unit = + try { + TriggerId.write(writer, instance.trigger) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanModifyTriggerMetadata.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanModifyTriggerMetadata.kt new file mode 100644 index 000000000..5ef2d2fc5 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanModifyTriggerMetadata.kt @@ -0,0 +1,44 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelPermission +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit + +/** + * CanModifyTriggerMetadata + * + * Generated from 'CanModifyTriggerMetadata' regular structure + */ +public data class CanModifyTriggerMetadata( + public val trigger: TriggerId, +) : ModelPermission { + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): CanModifyTriggerMetadata = + try { + CanModifyTriggerMetadata( + TriggerId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: CanModifyTriggerMetadata, + ): Unit = + try { + TriggerId.write(writer, instance.trigger) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRegisterAccount.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRegisterAccount.kt new file mode 100644 index 000000000..28f1c0888 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRegisterAccount.kt @@ -0,0 +1,42 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelPermission +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit + +/** + * CanRegisterAccount + * + * Generated from 'CanRegisterAccount' regular structure + */ +public data class CanRegisterAccount( + public val domain: DomainId, +) : ModelPermission { + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): CanRegisterAccount = + try { + CanRegisterAccount( + DomainId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: CanRegisterAccount, + ): Unit = + try { + DomainId.write(writer, instance.domain) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRegisterAccountInDomain.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRegisterAccountInDomain.kt deleted file mode 100644 index dea60174e..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRegisterAccountInDomain.kt +++ /dev/null @@ -1,38 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * CanRegisterAccountInDomain - * - * Generated from 'CanRegisterAccountInDomain' regular structure - */ -public data class CanRegisterAccountInDomain( - public val domain: DomainId, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): CanRegisterAccountInDomain = try { - CanRegisterAccountInDomain( - DomainId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: CanRegisterAccountInDomain): Unit = try { - DomainId.write(writer, instance.domain) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRegisterAsset.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRegisterAsset.kt new file mode 100644 index 000000000..efba287bc --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRegisterAsset.kt @@ -0,0 +1,42 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelPermission +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit + +/** + * CanRegisterAsset + * + * Generated from 'CanRegisterAsset' regular structure + */ +public data class CanRegisterAsset( + public val owner: AccountId, +) : ModelPermission { + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): CanRegisterAsset = + try { + CanRegisterAsset( + AccountId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: CanRegisterAsset, + ): Unit = + try { + AccountId.write(writer, instance.owner) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRegisterAssetDefinition.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRegisterAssetDefinition.kt new file mode 100644 index 000000000..faa4422de --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRegisterAssetDefinition.kt @@ -0,0 +1,44 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelPermission +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit + +/** + * CanRegisterAssetDefinition + * + * Generated from 'CanRegisterAssetDefinition' regular structure + */ +public data class CanRegisterAssetDefinition( + public val domain: DomainId, +) : ModelPermission { + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): CanRegisterAssetDefinition = + try { + CanRegisterAssetDefinition( + DomainId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: CanRegisterAssetDefinition, + ): Unit = + try { + DomainId.write(writer, instance.domain) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRegisterAssetDefinitionInDomain.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRegisterAssetDefinitionInDomain.kt deleted file mode 100644 index 858dc873a..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRegisterAssetDefinitionInDomain.kt +++ /dev/null @@ -1,38 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * CanRegisterAssetDefinitionInDomain - * - * Generated from 'CanRegisterAssetDefinitionInDomain' regular structure - */ -public data class CanRegisterAssetDefinitionInDomain( - public val domain: DomainId, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): CanRegisterAssetDefinitionInDomain = try { - CanRegisterAssetDefinitionInDomain( - DomainId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: CanRegisterAssetDefinitionInDomain): Unit = try { - DomainId.write(writer, instance.domain) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRegisterAssetWithDefinition.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRegisterAssetWithDefinition.kt index 0ba87046b..16128d1a0 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRegisterAssetWithDefinition.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRegisterAssetWithDefinition.kt @@ -3,6 +3,7 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.ModelPermission import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader @@ -17,19 +18,23 @@ import kotlin.Unit */ public data class CanRegisterAssetWithDefinition( public val assetDefinition: AssetDefinitionId, -) { +) : ModelPermission { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): CanRegisterAssetWithDefinition = try { - CanRegisterAssetWithDefinition( - AssetDefinitionId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): CanRegisterAssetWithDefinition = + try { + CanRegisterAssetWithDefinition( + AssetDefinitionId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: CanRegisterAssetWithDefinition): Unit = + override fun write( + writer: ScaleCodecWriter, + instance: CanRegisterAssetWithDefinition, + ): Unit = try { AssetDefinitionId.write(writer, instance.assetDefinition) } catch (ex: Exception) { diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRegisterDomain.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRegisterDomain.kt new file mode 100644 index 000000000..a6d339bc2 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRegisterDomain.kt @@ -0,0 +1,51 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelPermission +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Any +import kotlin.Boolean +import kotlin.Int +import kotlin.Unit + +/** + * CanRegisterDomain + * + * Generated from 'CanRegisterDomain' tuple structure + */ +public class CanRegisterDomain : ModelPermission { + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): CanRegisterDomain = + try { + CanRegisterDomain() + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: CanRegisterDomain, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: CanRegisterDomain, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".CanRegisterDomain".hashCode() + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRegisterTrigger.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRegisterTrigger.kt new file mode 100644 index 000000000..d06b14e3b --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRegisterTrigger.kt @@ -0,0 +1,42 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelPermission +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit + +/** + * CanRegisterTrigger + * + * Generated from 'CanRegisterTrigger' regular structure + */ +public data class CanRegisterTrigger( + public val authority: AccountId, +) : ModelPermission { + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): CanRegisterTrigger = + try { + CanRegisterTrigger( + AccountId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: CanRegisterTrigger, + ): Unit = + try { + AccountId.write(writer, instance.authority) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRegisterUserTrigger.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRegisterUserTrigger.kt deleted file mode 100644 index 415c2f987..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRegisterUserTrigger.kt +++ /dev/null @@ -1,36 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * CanRegisterUserTrigger - * - * Generated from 'CanRegisterUserTrigger' regular structure - */ -public data class CanRegisterUserTrigger( - public val account: AccountId, -) { - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): CanRegisterUserTrigger = try { - CanRegisterUserTrigger( - AccountId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: CanRegisterUserTrigger): Unit = try { - AccountId.write(writer, instance.account) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRemoveKeyValueInAccount.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRemoveKeyValueInAccount.kt deleted file mode 100644 index b75459474..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRemoveKeyValueInAccount.kt +++ /dev/null @@ -1,38 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * CanRemoveKeyValueInAccount - * - * Generated from 'CanRemoveKeyValueInAccount' regular structure - */ -public data class CanRemoveKeyValueInAccount( - public val account: AccountId, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): CanRemoveKeyValueInAccount = try { - CanRemoveKeyValueInAccount( - AccountId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: CanRemoveKeyValueInAccount): Unit = try { - AccountId.write(writer, instance.account) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRemoveKeyValueInAssetDefinition.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRemoveKeyValueInAssetDefinition.kt deleted file mode 100644 index da5718ba5..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRemoveKeyValueInAssetDefinition.kt +++ /dev/null @@ -1,38 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * CanRemoveKeyValueInAssetDefinition - * - * Generated from 'CanRemoveKeyValueInAssetDefinition' regular structure - */ -public data class CanRemoveKeyValueInAssetDefinition( - public val assetDefinition: AssetDefinitionId, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): CanRemoveKeyValueInAssetDefinition = try { - CanRemoveKeyValueInAssetDefinition( - AssetDefinitionId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: CanRemoveKeyValueInAssetDefinition): Unit = try { - AssetDefinitionId.write(writer, instance.assetDefinition) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRemoveKeyValueInDomain.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRemoveKeyValueInDomain.kt deleted file mode 100644 index ed241bfea..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRemoveKeyValueInDomain.kt +++ /dev/null @@ -1,38 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * CanRemoveKeyValueInDomain - * - * Generated from 'CanRemoveKeyValueInDomain' regular structure - */ -public data class CanRemoveKeyValueInDomain( - public val domain: DomainId, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): CanRemoveKeyValueInDomain = try { - CanRemoveKeyValueInDomain( - DomainId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: CanRemoveKeyValueInDomain): Unit = try { - DomainId.write(writer, instance.domain) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRemoveKeyValueInTrigger.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRemoveKeyValueInTrigger.kt deleted file mode 100644 index a03af883c..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRemoveKeyValueInTrigger.kt +++ /dev/null @@ -1,38 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * CanRemoveKeyValueInTrigger - * - * Generated from 'CanRemoveKeyValueInTrigger' regular structure - */ -public data class CanRemoveKeyValueInTrigger( - public val trigger: TriggerId, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): CanRemoveKeyValueInTrigger = try { - CanRemoveKeyValueInTrigger( - TriggerId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: CanRemoveKeyValueInTrigger): Unit = try { - TriggerId.write(writer, instance.trigger) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRemoveKeyValueInUserAsset.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRemoveKeyValueInUserAsset.kt deleted file mode 100644 index 2a955e704..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanRemoveKeyValueInUserAsset.kt +++ /dev/null @@ -1,38 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * CanRemoveKeyValueInUserAsset - * - * Generated from 'CanRemoveKeyValueInUserAsset' regular structure - */ -public data class CanRemoveKeyValueInUserAsset( - public val asset: AssetId, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): CanRemoveKeyValueInUserAsset = try { - CanRemoveKeyValueInUserAsset( - AssetId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: CanRemoveKeyValueInUserAsset): Unit = try { - AssetId.write(writer, instance.asset) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanSetKeyValueInAccount.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanSetKeyValueInAccount.kt deleted file mode 100644 index 024ef5a7b..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanSetKeyValueInAccount.kt +++ /dev/null @@ -1,38 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * CanSetKeyValueInAccount - * - * Generated from 'CanSetKeyValueInAccount' regular structure - */ -public data class CanSetKeyValueInAccount( - public val account: AccountId, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): CanSetKeyValueInAccount = try { - CanSetKeyValueInAccount( - AccountId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: CanSetKeyValueInAccount): Unit = try { - AccountId.write(writer, instance.account) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanSetKeyValueInAssetDefinition.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanSetKeyValueInAssetDefinition.kt deleted file mode 100644 index c22ec37e5..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanSetKeyValueInAssetDefinition.kt +++ /dev/null @@ -1,39 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * CanSetKeyValueInAssetDefinition - * - * Generated from 'CanSetKeyValueInAssetDefinition' regular structure - */ -public data class CanSetKeyValueInAssetDefinition( - public val assetDefinition: AssetDefinitionId, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): CanSetKeyValueInAssetDefinition = try { - CanSetKeyValueInAssetDefinition( - AssetDefinitionId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: CanSetKeyValueInAssetDefinition): Unit = - try { - AssetDefinitionId.write(writer, instance.assetDefinition) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanSetKeyValueInDomain.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanSetKeyValueInDomain.kt deleted file mode 100644 index f0dd9ed2c..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanSetKeyValueInDomain.kt +++ /dev/null @@ -1,36 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * CanSetKeyValueInDomain - * - * Generated from 'CanSetKeyValueInDomain' regular structure - */ -public data class CanSetKeyValueInDomain( - public val domain: DomainId, -) { - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): CanSetKeyValueInDomain = try { - CanSetKeyValueInDomain( - DomainId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: CanSetKeyValueInDomain): Unit = try { - DomainId.write(writer, instance.domain) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanSetKeyValueInTrigger.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanSetKeyValueInTrigger.kt deleted file mode 100644 index 844a06c7f..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanSetKeyValueInTrigger.kt +++ /dev/null @@ -1,38 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * CanSetKeyValueInTrigger - * - * Generated from 'CanSetKeyValueInTrigger' regular structure - */ -public data class CanSetKeyValueInTrigger( - public val trigger: TriggerId, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): CanSetKeyValueInTrigger = try { - CanSetKeyValueInTrigger( - TriggerId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: CanSetKeyValueInTrigger): Unit = try { - TriggerId.write(writer, instance.trigger) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanSetKeyValueInUserAsset.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanSetKeyValueInUserAsset.kt deleted file mode 100644 index 6070ca368..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanSetKeyValueInUserAsset.kt +++ /dev/null @@ -1,38 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * CanSetKeyValueInUserAsset - * - * Generated from 'CanSetKeyValueInUserAsset' regular structure - */ -public data class CanSetKeyValueInUserAsset( - public val asset: AssetId, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): CanSetKeyValueInUserAsset = try { - CanSetKeyValueInUserAsset( - AssetId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: CanSetKeyValueInUserAsset): Unit = try { - AssetId.write(writer, instance.asset) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanSetParameters.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanSetParameters.kt new file mode 100644 index 000000000..41088c63d --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanSetParameters.kt @@ -0,0 +1,51 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelPermission +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Any +import kotlin.Boolean +import kotlin.Int +import kotlin.Unit + +/** + * CanSetParameters + * + * Generated from 'CanSetParameters' tuple structure + */ +public class CanSetParameters : ModelPermission { + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): CanSetParameters = + try { + CanSetParameters() + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: CanSetParameters, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: CanSetParameters, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".CanSetParameters".hashCode() + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanTransferAsset.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanTransferAsset.kt new file mode 100644 index 000000000..c4265e2e5 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanTransferAsset.kt @@ -0,0 +1,42 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelPermission +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit + +/** + * CanTransferAsset + * + * Generated from 'CanTransferAsset' regular structure + */ +public data class CanTransferAsset( + public val asset: AssetId, +) : ModelPermission { + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): CanTransferAsset = + try { + CanTransferAsset( + AssetId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: CanTransferAsset, + ): Unit = + try { + AssetId.write(writer, instance.asset) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanTransferAssetWithDefinition.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanTransferAssetWithDefinition.kt index d8df1d595..bacb394ad 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanTransferAssetWithDefinition.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanTransferAssetWithDefinition.kt @@ -3,6 +3,7 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.ModelPermission import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader @@ -17,19 +18,23 @@ import kotlin.Unit */ public data class CanTransferAssetWithDefinition( public val assetDefinition: AssetDefinitionId, -) { +) : ModelPermission { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): CanTransferAssetWithDefinition = try { - CanTransferAssetWithDefinition( - AssetDefinitionId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): CanTransferAssetWithDefinition = + try { + CanTransferAssetWithDefinition( + AssetDefinitionId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: CanTransferAssetWithDefinition): Unit = + override fun write( + writer: ScaleCodecWriter, + instance: CanTransferAssetWithDefinition, + ): Unit = try { AssetDefinitionId.write(writer, instance.assetDefinition) } catch (ex: Exception) { diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanTransferUserAsset.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanTransferUserAsset.kt deleted file mode 100644 index 2c4322986..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanTransferUserAsset.kt +++ /dev/null @@ -1,36 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * CanTransferUserAsset - * - * Generated from 'CanTransferUserAsset' regular structure - */ -public data class CanTransferUserAsset( - public val asset: AssetId, -) { - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): CanTransferUserAsset = try { - CanTransferUserAsset( - AssetId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: CanTransferUserAsset): Unit = try { - AssetId.write(writer, instance.asset) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanUnregisterAccount.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanUnregisterAccount.kt index dae14c76d..4a88da43a 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanUnregisterAccount.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanUnregisterAccount.kt @@ -3,6 +3,7 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.ModelPermission import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader @@ -17,20 +18,25 @@ import kotlin.Unit */ public data class CanUnregisterAccount( public val account: AccountId, -) { +) : ModelPermission { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): CanUnregisterAccount = try { - CanUnregisterAccount( - AccountId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): CanUnregisterAccount = + try { + CanUnregisterAccount( + AccountId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: CanUnregisterAccount): Unit = try { - AccountId.write(writer, instance.account) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: CanUnregisterAccount, + ): Unit = + try { + AccountId.write(writer, instance.account) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanUnregisterAsset.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanUnregisterAsset.kt new file mode 100644 index 000000000..64d01e146 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanUnregisterAsset.kt @@ -0,0 +1,42 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelPermission +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit + +/** + * CanUnregisterAsset + * + * Generated from 'CanUnregisterAsset' regular structure + */ +public data class CanUnregisterAsset( + public val asset: AssetId, +) : ModelPermission { + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): CanUnregisterAsset = + try { + CanUnregisterAsset( + AssetId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: CanUnregisterAsset, + ): Unit = + try { + AssetId.write(writer, instance.asset) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanUnregisterAssetDefinition.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanUnregisterAssetDefinition.kt index e9bb10982..6007cb185 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanUnregisterAssetDefinition.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanUnregisterAssetDefinition.kt @@ -3,6 +3,7 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.ModelPermission import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader @@ -17,22 +18,27 @@ import kotlin.Unit */ public data class CanUnregisterAssetDefinition( public val assetDefinition: AssetDefinitionId, -) { +) : ModelPermission { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): CanUnregisterAssetDefinition = try { - CanUnregisterAssetDefinition( - AssetDefinitionId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): CanUnregisterAssetDefinition = + try { + CanUnregisterAssetDefinition( + AssetDefinitionId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: CanUnregisterAssetDefinition): Unit = try { - AssetDefinitionId.write(writer, instance.assetDefinition) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: CanUnregisterAssetDefinition, + ): Unit = + try { + AssetDefinitionId.write(writer, instance.assetDefinition) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanUnregisterAssetWithDefinition.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanUnregisterAssetWithDefinition.kt index 026066d46..777a8bbde 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanUnregisterAssetWithDefinition.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanUnregisterAssetWithDefinition.kt @@ -3,6 +3,7 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.ModelPermission import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader @@ -17,19 +18,23 @@ import kotlin.Unit */ public data class CanUnregisterAssetWithDefinition( public val assetDefinition: AssetDefinitionId, -) { +) : ModelPermission { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): CanUnregisterAssetWithDefinition = try { - CanUnregisterAssetWithDefinition( - AssetDefinitionId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): CanUnregisterAssetWithDefinition = + try { + CanUnregisterAssetWithDefinition( + AssetDefinitionId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: CanUnregisterAssetWithDefinition): Unit = + override fun write( + writer: ScaleCodecWriter, + instance: CanUnregisterAssetWithDefinition, + ): Unit = try { AssetDefinitionId.write(writer, instance.assetDefinition) } catch (ex: Exception) { diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanUnregisterDomain.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanUnregisterDomain.kt index 5100adc0a..0b3cc10a7 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanUnregisterDomain.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanUnregisterDomain.kt @@ -3,6 +3,7 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.ModelPermission import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader @@ -17,20 +18,25 @@ import kotlin.Unit */ public data class CanUnregisterDomain( public val domain: DomainId, -) { +) : ModelPermission { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): CanUnregisterDomain = try { - CanUnregisterDomain( - DomainId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): CanUnregisterDomain = + try { + CanUnregisterDomain( + DomainId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: CanUnregisterDomain): Unit = try { - DomainId.write(writer, instance.domain) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: CanUnregisterDomain, + ): Unit = + try { + DomainId.write(writer, instance.domain) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanUnregisterTrigger.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanUnregisterTrigger.kt new file mode 100644 index 000000000..20c80575b --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanUnregisterTrigger.kt @@ -0,0 +1,42 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelPermission +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit + +/** + * CanUnregisterTrigger + * + * Generated from 'CanUnregisterTrigger' regular structure + */ +public data class CanUnregisterTrigger( + public val trigger: TriggerId, +) : ModelPermission { + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): CanUnregisterTrigger = + try { + CanUnregisterTrigger( + TriggerId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: CanUnregisterTrigger, + ): Unit = + try { + TriggerId.write(writer, instance.trigger) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanUnregisterUserAsset.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanUnregisterUserAsset.kt deleted file mode 100644 index c29a1a1c8..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanUnregisterUserAsset.kt +++ /dev/null @@ -1,36 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * CanUnregisterUserAsset - * - * Generated from 'CanUnregisterUserAsset' regular structure - */ -public data class CanUnregisterUserAsset( - public val asset: AssetId, -) { - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): CanUnregisterUserAsset = try { - CanUnregisterUserAsset( - AssetId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: CanUnregisterUserAsset): Unit = try { - AssetId.write(writer, instance.asset) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanUnregisterUserTrigger.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanUnregisterUserTrigger.kt deleted file mode 100644 index 80340de0b..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanUnregisterUserTrigger.kt +++ /dev/null @@ -1,38 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * CanUnregisterUserTrigger - * - * Generated from 'CanUnregisterUserTrigger' regular structure - */ -public data class CanUnregisterUserTrigger( - public val account: AccountId, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): CanUnregisterUserTrigger = try { - CanUnregisterUserTrigger( - AccountId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: CanUnregisterUserTrigger): Unit = try { - AccountId.write(writer, instance.account) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanUpgradeExecutor.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanUpgradeExecutor.kt new file mode 100644 index 000000000..c2558e4a1 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CanUpgradeExecutor.kt @@ -0,0 +1,51 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelPermission +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Any +import kotlin.Boolean +import kotlin.Int +import kotlin.Unit + +/** + * CanUpgradeExecutor + * + * Generated from 'CanUpgradeExecutor' tuple structure + */ +public class CanUpgradeExecutor : ModelPermission { + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): CanUpgradeExecutor = + try { + CanUpgradeExecutor() + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: CanUpgradeExecutor, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: CanUpgradeExecutor, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".CanUpgradeExecutor".hashCode() + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ChainId.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ChainId.kt index 9e3302da7..e4d2d8ae7 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ChainId.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ChainId.kt @@ -20,18 +20,23 @@ public data class ChainId( public val string: String, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): ChainId = try { - ChainId( - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): ChainId = + try { + ChainId( + reader.readString(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: ChainId): Unit = try { - writer.writeAsList(instance.string.toByteArray(Charsets.UTF_8)) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: ChainId, + ): Unit = + try { + writer.writeAsList(instance.string.toByteArray(Charsets.UTF_8)) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ClientQueryPayload.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ClientQueryPayload.kt deleted file mode 100644 index ece309fff..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ClientQueryPayload.kt +++ /dev/null @@ -1,51 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * ClientQueryPayload - * - * Generated from 'ClientQueryPayload' regular structure - */ -public data class ClientQueryPayload( - public val authority: AccountId, - public val query: QueryBox, - public val filter: GenericPredicateBox, - public val sorting: Sorting, - public val pagination: Pagination, - public val fetchSize: FetchSize, -) { - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): ClientQueryPayload = try { - ClientQueryPayload( - AccountId.read(reader), - QueryBox.read(reader), - GenericPredicateBox.read(reader) as GenericPredicateBox, - Sorting.read(reader), - Pagination.read(reader), - FetchSize.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: ClientQueryPayload): Unit = try { - AccountId.write(writer, instance.authority) - QueryBox.write(writer, instance.query) - GenericPredicateBox.write(writer, instance.filter) - Sorting.write(writer, instance.sorting) - Pagination.write(writer, instance.pagination) - FetchSize.write(writer, instance.fetchSize) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CommittedTransaction.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CommittedTransaction.kt index 8359fa420..0424b2cd6 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CommittedTransaction.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CommittedTransaction.kt @@ -16,24 +16,32 @@ import kotlin.Unit * Generated from 'CommittedTransaction' regular structure */ public data class CommittedTransaction( + public val blockHash: HashOf, public val `value`: SignedTransaction, public val error: TransactionRejectionReason? = null, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): CommittedTransaction = try { - CommittedTransaction( - SignedTransaction.read(reader), - reader.readNullable(TransactionRejectionReason) as TransactionRejectionReason?, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): CommittedTransaction = + try { + CommittedTransaction( + HashOf.read(reader) as HashOf, + SignedTransaction.read(reader), + reader.readNullable(TransactionRejectionReason) as TransactionRejectionReason?, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: CommittedTransaction): Unit = try { - SignedTransaction.write(writer, instance.`value`) - writer.writeNullable(TransactionRejectionReason, instance.error) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: CommittedTransaction, + ): Unit = + try { + HashOf.write(writer, instance.blockHash) + SignedTransaction.write(writer, instance.`value`) + writer.writeNullable(TransactionRejectionReason, instance.error) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CommittedTransactionPredicateAtom.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CommittedTransactionPredicateAtom.kt new file mode 100644 index 000000000..54e14c642 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CommittedTransactionPredicateAtom.kt @@ -0,0 +1,42 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import kotlin.Int + +/** + * CommittedTransactionPredicateAtom + * + * Generated from 'CommittedTransactionPredicateAtom' enum + */ +public sealed class CommittedTransactionPredicateAtom : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): CommittedTransactionPredicateAtom = + when (val discriminant = reader.readUByte()) { + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: CommittedTransactionPredicateAtom, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CommittedTransactionPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CommittedTransactionPredicateBox.kt deleted file mode 100644 index 0f41cf40a..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CommittedTransactionPredicateBox.kt +++ /dev/null @@ -1,111 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.ModelEnum -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Int -import kotlin.Unit - -/** - * CommittedTransactionPredicateBox - * - * Generated from 'CommittedTransactionPredicateBox' enum - */ -public sealed class CommittedTransactionPredicateBox : ModelEnum { - /** - * @return Discriminator of variant in enum - */ - public abstract fun discriminant(): Int - - /** - * 'Value' variant - */ - public data class Value( - public val signedTransactionPredicateBox: SignedTransactionPredicateBox, - ) : CommittedTransactionPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 0 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CommittedTransactionPredicateBox.Value = try { - Value( - SignedTransactionPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CommittedTransactionPredicateBox.Value, - ): Unit = - try { - SignedTransactionPredicateBox.write(writer, instance.signedTransactionPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Error' variant - */ - public data class Error( - public val transactionErrorPredicateBox: TransactionErrorPredicateBox, - ) : CommittedTransactionPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 1 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CommittedTransactionPredicateBox.Error = try { - Error( - TransactionErrorPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CommittedTransactionPredicateBox.Error, - ): Unit = - try { - TransactionErrorPredicateBox.write(writer, instance.transactionErrorPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): CommittedTransactionPredicateBox = when ( - val - discriminant = reader.readUByte() - ) { - 0 -> Value.read(reader) - 1 -> Error.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: CommittedTransactionPredicateBox) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 0 -> Value.write(writer, instance as Value) - 1 -> Error.write(writer, instance as Error) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CommittedTransactionProjectionOfPredicateMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CommittedTransactionProjectionOfPredicateMarker.kt new file mode 100644 index 000000000..f359884f9 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CommittedTransactionProjectionOfPredicateMarker.kt @@ -0,0 +1,196 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit + +/** + * CommittedTransactionProjectionOfPredicateMarker + * + * Generated from 'CommittedTransactionProjectionOfPredicateMarker' enum + */ +public sealed class CommittedTransactionProjectionOfPredicateMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val committedTransactionPredicateAtom: CommittedTransactionPredicateAtom, + ) : CommittedTransactionProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read( + reader: ScaleCodecReader, + ): jp.co.soramitsu.iroha2.generated.CommittedTransactionProjectionOfPredicateMarker.Atom = + try { + Atom( + CommittedTransactionPredicateAtom.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CommittedTransactionProjectionOfPredicateMarker.Atom, + ): Unit = + try { + CommittedTransactionPredicateAtom.write(writer, instance.committedTransactionPredicateAtom) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'BlockHash' variant + */ + public data class BlockHash( + public val blockHeaderHashProjectionOfPredicateMarker: BlockHeaderHashProjectionOfPredicateMarker, + ) : CommittedTransactionProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read( + reader: ScaleCodecReader, + ): jp.co.soramitsu.iroha2.generated.CommittedTransactionProjectionOfPredicateMarker.BlockHash = + try { + BlockHash( + BlockHeaderHashProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CommittedTransactionProjectionOfPredicateMarker.BlockHash, + ): Unit = + try { + BlockHeaderHashProjectionOfPredicateMarker.write(writer, instance.blockHeaderHashProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Value' variant + */ + public data class Value( + public val signedTransactionProjectionOfPredicateMarker: SignedTransactionProjectionOfPredicateMarker, + ) : CommittedTransactionProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 2 + + override fun read( + reader: ScaleCodecReader, + ): jp.co.soramitsu.iroha2.generated.CommittedTransactionProjectionOfPredicateMarker.Value = + try { + Value( + SignedTransactionProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CommittedTransactionProjectionOfPredicateMarker.Value, + ): Unit = + try { + SignedTransactionProjectionOfPredicateMarker.write(writer, instance.signedTransactionProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Error' variant + */ + public data class Error( + public val transactionErrorProjectionOfPredicateMarker: TransactionErrorProjectionOfPredicateMarker, + ) : CommittedTransactionProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 3 + + override fun read( + reader: ScaleCodecReader, + ): jp.co.soramitsu.iroha2.generated.CommittedTransactionProjectionOfPredicateMarker.Error = + try { + Error( + TransactionErrorProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CommittedTransactionProjectionOfPredicateMarker.Error, + ): Unit = + try { + TransactionErrorProjectionOfPredicateMarker.write(writer, instance.transactionErrorProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): CommittedTransactionProjectionOfPredicateMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> BlockHash.read(reader) + 2 -> Value.read(reader) + 3 -> Error.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: CommittedTransactionProjectionOfPredicateMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> BlockHash.write(writer, instance as BlockHash) + 2 -> Value.write(writer, instance as Value) + 3 -> Error.write(writer, instance as Error) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CommittedTransactionProjectionOfSelectorMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CommittedTransactionProjectionOfSelectorMarker.kt new file mode 100644 index 000000000..9b3a93bea --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CommittedTransactionProjectionOfSelectorMarker.kt @@ -0,0 +1,216 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Any +import kotlin.Boolean +import kotlin.Int +import kotlin.Unit + +/** + * CommittedTransactionProjectionOfSelectorMarker + * + * Generated from 'CommittedTransactionProjectionOfSelectorMarker' enum + */ +public sealed class CommittedTransactionProjectionOfSelectorMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + override fun equals(other: Any?): Boolean = + when (this) { + is Atom -> Atom.equals(this, other) + else -> super.equals(other) + } + + override fun hashCode(): Int = + when (this) { + is Atom -> Atom.hashCode() + else -> super.hashCode() + } + + /** + * 'Atom' variant + */ + public class Atom : CommittedTransactionProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read( + reader: ScaleCodecReader, + ): jp.co.soramitsu.iroha2.generated.CommittedTransactionProjectionOfSelectorMarker.Atom = + try { + Atom() + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CommittedTransactionProjectionOfSelectorMarker.Atom, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.CommittedTransactionProjectionOfSelectorMarker.Atom, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".CommittedTransactionProjectionOfSelectorMarker.Atom".hashCode() + } + } + + /** + * 'BlockHash' variant + */ + public data class BlockHash( + public val blockHeaderHashProjectionOfSelectorMarker: BlockHeaderHashProjectionOfSelectorMarker, + ) : CommittedTransactionProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read( + reader: ScaleCodecReader, + ): jp.co.soramitsu.iroha2.generated.CommittedTransactionProjectionOfSelectorMarker.BlockHash = + try { + BlockHash( + BlockHeaderHashProjectionOfSelectorMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CommittedTransactionProjectionOfSelectorMarker.BlockHash, + ): Unit = + try { + BlockHeaderHashProjectionOfSelectorMarker.write(writer, instance.blockHeaderHashProjectionOfSelectorMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Value' variant + */ + public data class Value( + public val signedTransactionProjectionOfSelectorMarker: SignedTransactionProjectionOfSelectorMarker, + ) : CommittedTransactionProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 2 + + override fun read( + reader: ScaleCodecReader, + ): jp.co.soramitsu.iroha2.generated.CommittedTransactionProjectionOfSelectorMarker.Value = + try { + Value( + SignedTransactionProjectionOfSelectorMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CommittedTransactionProjectionOfSelectorMarker.Value, + ): Unit = + try { + SignedTransactionProjectionOfSelectorMarker.write(writer, instance.signedTransactionProjectionOfSelectorMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Error' variant + */ + public data class Error( + public val transactionErrorProjectionOfSelectorMarker: TransactionErrorProjectionOfSelectorMarker, + ) : CommittedTransactionProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 3 + + override fun read( + reader: ScaleCodecReader, + ): jp.co.soramitsu.iroha2.generated.CommittedTransactionProjectionOfSelectorMarker.Error = + try { + Error( + TransactionErrorProjectionOfSelectorMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CommittedTransactionProjectionOfSelectorMarker.Error, + ): Unit = + try { + TransactionErrorProjectionOfSelectorMarker.write(writer, instance.transactionErrorProjectionOfSelectorMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): CommittedTransactionProjectionOfSelectorMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> BlockHash.read(reader) + 2 -> Value.read(reader) + 3 -> Error.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: CommittedTransactionProjectionOfSelectorMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> BlockHash.write(writer, instance as BlockHash) + 2 -> Value.write(writer, instance as Value) + 3 -> Error.write(writer, instance as Error) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfAccount.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfAccount.kt new file mode 100644 index 000000000..f91bc8072 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfAccount.kt @@ -0,0 +1,195 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit +import kotlin.collections.List + +/** + * CompoundPredicateOfAccount + * + * Generated from 'CompoundPredicateOfAccount' enum + */ +public sealed class CompoundPredicateOfAccount : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val accountProjectionOfPredicateMarker: AccountProjectionOfPredicateMarker, + ) : CompoundPredicateOfAccount() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAccount.Atom = + try { + Atom( + AccountProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAccount.Atom, + ): Unit = + try { + AccountProjectionOfPredicateMarker.write(writer, instance.accountProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Not' variant + */ + public data class Not( + public val compoundPredicateOfAccount: CompoundPredicateOfAccount, + ) : CompoundPredicateOfAccount() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAccount.Not = + try { + Not( + CompoundPredicateOfAccount.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAccount.Not, + ): Unit = + try { + CompoundPredicateOfAccount.write(writer, instance.compoundPredicateOfAccount) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'And' variant + */ + public data class And( + public val vec: List, + ) : CompoundPredicateOfAccount() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 2 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAccount.And = + try { + And( + reader.readVec(reader.readCompactInt()) { CompoundPredicateOfAccount.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAccount.And, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + CompoundPredicateOfAccount.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Or' variant + */ + public data class Or( + public val vec: List, + ) : CompoundPredicateOfAccount() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 3 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAccount.Or = + try { + Or( + reader.readVec(reader.readCompactInt()) { CompoundPredicateOfAccount.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAccount.Or, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + CompoundPredicateOfAccount.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): CompoundPredicateOfAccount = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Not.read(reader) + 2 -> And.read(reader) + 3 -> Or.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: CompoundPredicateOfAccount, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Not.write(writer, instance as Not) + 2 -> And.write(writer, instance as And) + 3 -> Or.write(writer, instance as Or) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfAccountPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfAccountPredicateBox.kt deleted file mode 100644 index 45b664893..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfAccountPredicateBox.kt +++ /dev/null @@ -1,187 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.ModelEnum -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Int -import kotlin.Unit -import kotlin.collections.List - -/** - * CompoundPredicateOfAccountPredicateBox - * - * Generated from 'CompoundPredicateOfAccountPredicateBox' enum - */ -public sealed class CompoundPredicateOfAccountPredicateBox : ModelEnum { - /** - * @return Discriminator of variant in enum - */ - public abstract fun discriminant(): Int - - /** - * 'Atom' variant - */ - public data class Atom( - public val accountPredicateBox: AccountPredicateBox, - ) : CompoundPredicateOfAccountPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 0 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAccountPredicateBox.Atom = try { - Atom( - AccountPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAccountPredicateBox.Atom, - ): Unit = try { - AccountPredicateBox.write(writer, instance.accountPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Not' variant - */ - public data class Not( - public val compoundPredicateOfAccountPredicateBox: CompoundPredicateOfAccountPredicateBox, - ) : CompoundPredicateOfAccountPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 1 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAccountPredicateBox.Not = try { - Not( - CompoundPredicateOfAccountPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAccountPredicateBox.Not, - ): Unit = try { - CompoundPredicateOfAccountPredicateBox.write( - writer, - instance.compoundPredicateOfAccountPredicateBox, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'And' variant - */ - public data class And( - public val vec: List, - ) : CompoundPredicateOfAccountPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 2 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAccountPredicateBox.And = try { - And( - reader.readVec(reader.readCompactInt()) { CompoundPredicateOfAccountPredicateBox.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAccountPredicateBox.And, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - CompoundPredicateOfAccountPredicateBox.write(writer, value) - } - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Or' variant - */ - public data class Or( - public val vec: List, - ) : CompoundPredicateOfAccountPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 3 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAccountPredicateBox.Or = try { - Or( - reader.readVec(reader.readCompactInt()) { CompoundPredicateOfAccountPredicateBox.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAccountPredicateBox.Or, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - CompoundPredicateOfAccountPredicateBox.write(writer, value) - } - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): CompoundPredicateOfAccountPredicateBox = when ( - val - discriminant = reader.readUByte() - ) { - 0 -> Atom.read(reader) - 1 -> Not.read(reader) - 2 -> And.read(reader) - 3 -> Or.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: CompoundPredicateOfAccountPredicateBox) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 0 -> Atom.write(writer, instance as Atom) - 1 -> Not.write(writer, instance as Not) - 2 -> And.write(writer, instance as And) - 3 -> Or.write(writer, instance as Or) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfAsset.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfAsset.kt new file mode 100644 index 000000000..bc8abba76 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfAsset.kt @@ -0,0 +1,195 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit +import kotlin.collections.List + +/** + * CompoundPredicateOfAsset + * + * Generated from 'CompoundPredicateOfAsset' enum + */ +public sealed class CompoundPredicateOfAsset : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val assetProjectionOfPredicateMarker: AssetProjectionOfPredicateMarker, + ) : CompoundPredicateOfAsset() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAsset.Atom = + try { + Atom( + AssetProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAsset.Atom, + ): Unit = + try { + AssetProjectionOfPredicateMarker.write(writer, instance.assetProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Not' variant + */ + public data class Not( + public val compoundPredicateOfAsset: CompoundPredicateOfAsset, + ) : CompoundPredicateOfAsset() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAsset.Not = + try { + Not( + CompoundPredicateOfAsset.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAsset.Not, + ): Unit = + try { + CompoundPredicateOfAsset.write(writer, instance.compoundPredicateOfAsset) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'And' variant + */ + public data class And( + public val vec: List, + ) : CompoundPredicateOfAsset() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 2 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAsset.And = + try { + And( + reader.readVec(reader.readCompactInt()) { CompoundPredicateOfAsset.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAsset.And, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + CompoundPredicateOfAsset.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Or' variant + */ + public data class Or( + public val vec: List, + ) : CompoundPredicateOfAsset() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 3 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAsset.Or = + try { + Or( + reader.readVec(reader.readCompactInt()) { CompoundPredicateOfAsset.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAsset.Or, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + CompoundPredicateOfAsset.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): CompoundPredicateOfAsset = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Not.read(reader) + 2 -> And.read(reader) + 3 -> Or.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: CompoundPredicateOfAsset, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Not.write(writer, instance as Not) + 2 -> And.write(writer, instance as And) + 3 -> Or.write(writer, instance as Or) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfAssetDefinition.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfAssetDefinition.kt new file mode 100644 index 000000000..f3aa7b757 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfAssetDefinition.kt @@ -0,0 +1,195 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit +import kotlin.collections.List + +/** + * CompoundPredicateOfAssetDefinition + * + * Generated from 'CompoundPredicateOfAssetDefinition' enum + */ +public sealed class CompoundPredicateOfAssetDefinition : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val assetDefinitionProjectionOfPredicateMarker: AssetDefinitionProjectionOfPredicateMarker, + ) : CompoundPredicateOfAssetDefinition() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAssetDefinition.Atom = + try { + Atom( + AssetDefinitionProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAssetDefinition.Atom, + ): Unit = + try { + AssetDefinitionProjectionOfPredicateMarker.write(writer, instance.assetDefinitionProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Not' variant + */ + public data class Not( + public val compoundPredicateOfAssetDefinition: CompoundPredicateOfAssetDefinition, + ) : CompoundPredicateOfAssetDefinition() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAssetDefinition.Not = + try { + Not( + CompoundPredicateOfAssetDefinition.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAssetDefinition.Not, + ): Unit = + try { + CompoundPredicateOfAssetDefinition.write(writer, instance.compoundPredicateOfAssetDefinition) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'And' variant + */ + public data class And( + public val vec: List, + ) : CompoundPredicateOfAssetDefinition() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 2 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAssetDefinition.And = + try { + And( + reader.readVec(reader.readCompactInt()) { CompoundPredicateOfAssetDefinition.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAssetDefinition.And, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + CompoundPredicateOfAssetDefinition.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Or' variant + */ + public data class Or( + public val vec: List, + ) : CompoundPredicateOfAssetDefinition() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 3 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAssetDefinition.Or = + try { + Or( + reader.readVec(reader.readCompactInt()) { CompoundPredicateOfAssetDefinition.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAssetDefinition.Or, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + CompoundPredicateOfAssetDefinition.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): CompoundPredicateOfAssetDefinition = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Not.read(reader) + 2 -> And.read(reader) + 3 -> Or.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: CompoundPredicateOfAssetDefinition, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Not.write(writer, instance as Not) + 2 -> And.write(writer, instance as And) + 3 -> Or.write(writer, instance as Or) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfAssetDefinitionPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfAssetDefinitionPredicateBox.kt deleted file mode 100644 index c1e438290..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfAssetDefinitionPredicateBox.kt +++ /dev/null @@ -1,189 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.ModelEnum -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Int -import kotlin.Unit -import kotlin.collections.List - -/** - * CompoundPredicateOfAssetDefinitionPredicateBox - * - * Generated from 'CompoundPredicateOfAssetDefinitionPredicateBox' enum - */ -public sealed class CompoundPredicateOfAssetDefinitionPredicateBox : ModelEnum { - /** - * @return Discriminator of variant in enum - */ - public abstract fun discriminant(): Int - - /** - * 'Atom' variant - */ - public data class Atom( - public val assetDefinitionPredicateBox: AssetDefinitionPredicateBox, - ) : CompoundPredicateOfAssetDefinitionPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 0 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAssetDefinitionPredicateBox.Atom = try { - Atom( - AssetDefinitionPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAssetDefinitionPredicateBox.Atom, - ): Unit = try { - AssetDefinitionPredicateBox.write(writer, instance.assetDefinitionPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Not' variant - */ - public data class Not( - public val compoundPredicateOfAssetDefinitionPredicateBox: - CompoundPredicateOfAssetDefinitionPredicateBox, - ) : CompoundPredicateOfAssetDefinitionPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 1 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAssetDefinitionPredicateBox.Not = try { - Not( - CompoundPredicateOfAssetDefinitionPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAssetDefinitionPredicateBox.Not, - ): Unit = try { - CompoundPredicateOfAssetDefinitionPredicateBox.write( - writer, - instance.compoundPredicateOfAssetDefinitionPredicateBox, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'And' variant - */ - public data class And( - public val vec: List, - ) : CompoundPredicateOfAssetDefinitionPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 2 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAssetDefinitionPredicateBox.And = try { - And( - reader.readVec(reader.readCompactInt()) { CompoundPredicateOfAssetDefinitionPredicateBox.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAssetDefinitionPredicateBox.And, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - CompoundPredicateOfAssetDefinitionPredicateBox.write(writer, value) - } - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Or' variant - */ - public data class Or( - public val vec: List, - ) : CompoundPredicateOfAssetDefinitionPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 3 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAssetDefinitionPredicateBox.Or = try { - Or( - reader.readVec(reader.readCompactInt()) { CompoundPredicateOfAssetDefinitionPredicateBox.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAssetDefinitionPredicateBox.Or, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - CompoundPredicateOfAssetDefinitionPredicateBox.write(writer, value) - } - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): CompoundPredicateOfAssetDefinitionPredicateBox = - when (val discriminant = reader.readUByte()) { - 0 -> Atom.read(reader) - 1 -> Not.read(reader) - 2 -> And.read(reader) - 3 -> Or.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write( - writer: ScaleCodecWriter, - instance: CompoundPredicateOfAssetDefinitionPredicateBox, - ) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 0 -> Atom.write(writer, instance as Atom) - 1 -> Not.write(writer, instance as Not) - 2 -> And.write(writer, instance as And) - 3 -> Or.write(writer, instance as Or) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfAssetPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfAssetPredicateBox.kt deleted file mode 100644 index 41dcffd98..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfAssetPredicateBox.kt +++ /dev/null @@ -1,187 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.ModelEnum -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Int -import kotlin.Unit -import kotlin.collections.List - -/** - * CompoundPredicateOfAssetPredicateBox - * - * Generated from 'CompoundPredicateOfAssetPredicateBox' enum - */ -public sealed class CompoundPredicateOfAssetPredicateBox : ModelEnum { - /** - * @return Discriminator of variant in enum - */ - public abstract fun discriminant(): Int - - /** - * 'Atom' variant - */ - public data class Atom( - public val assetPredicateBox: AssetPredicateBox, - ) : CompoundPredicateOfAssetPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 0 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAssetPredicateBox.Atom = try { - Atom( - AssetPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAssetPredicateBox.Atom, - ): Unit = try { - AssetPredicateBox.write(writer, instance.assetPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Not' variant - */ - public data class Not( - public val compoundPredicateOfAssetPredicateBox: CompoundPredicateOfAssetPredicateBox, - ) : CompoundPredicateOfAssetPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 1 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAssetPredicateBox.Not = try { - Not( - CompoundPredicateOfAssetPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAssetPredicateBox.Not, - ): Unit = try { - CompoundPredicateOfAssetPredicateBox.write( - writer, - instance.compoundPredicateOfAssetPredicateBox, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'And' variant - */ - public data class And( - public val vec: List, - ) : CompoundPredicateOfAssetPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 2 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAssetPredicateBox.And = try { - And( - reader.readVec(reader.readCompactInt()) { CompoundPredicateOfAssetPredicateBox.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAssetPredicateBox.And, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - CompoundPredicateOfAssetPredicateBox.write(writer, value) - } - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Or' variant - */ - public data class Or( - public val vec: List, - ) : CompoundPredicateOfAssetPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 3 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAssetPredicateBox.Or = try { - Or( - reader.readVec(reader.readCompactInt()) { CompoundPredicateOfAssetPredicateBox.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAssetPredicateBox.Or, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - CompoundPredicateOfAssetPredicateBox.write(writer, value) - } - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): CompoundPredicateOfAssetPredicateBox = when ( - val - discriminant = reader.readUByte() - ) { - 0 -> Atom.read(reader) - 1 -> Not.read(reader) - 2 -> And.read(reader) - 3 -> Or.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: CompoundPredicateOfAssetPredicateBox) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 0 -> Atom.write(writer, instance as Atom) - 1 -> Not.write(writer, instance as Not) - 2 -> And.write(writer, instance as And) - 3 -> Or.write(writer, instance as Or) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfBlockHeader.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfBlockHeader.kt new file mode 100644 index 000000000..8a57592a6 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfBlockHeader.kt @@ -0,0 +1,195 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit +import kotlin.collections.List + +/** + * CompoundPredicateOfBlockHeader + * + * Generated from 'CompoundPredicateOfBlockHeader' enum + */ +public sealed class CompoundPredicateOfBlockHeader : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val blockHeaderProjectionOfPredicateMarker: BlockHeaderProjectionOfPredicateMarker, + ) : CompoundPredicateOfBlockHeader() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfBlockHeader.Atom = + try { + Atom( + BlockHeaderProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfBlockHeader.Atom, + ): Unit = + try { + BlockHeaderProjectionOfPredicateMarker.write(writer, instance.blockHeaderProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Not' variant + */ + public data class Not( + public val compoundPredicateOfBlockHeader: CompoundPredicateOfBlockHeader, + ) : CompoundPredicateOfBlockHeader() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfBlockHeader.Not = + try { + Not( + CompoundPredicateOfBlockHeader.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfBlockHeader.Not, + ): Unit = + try { + CompoundPredicateOfBlockHeader.write(writer, instance.compoundPredicateOfBlockHeader) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'And' variant + */ + public data class And( + public val vec: List, + ) : CompoundPredicateOfBlockHeader() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 2 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfBlockHeader.And = + try { + And( + reader.readVec(reader.readCompactInt()) { CompoundPredicateOfBlockHeader.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfBlockHeader.And, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + CompoundPredicateOfBlockHeader.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Or' variant + */ + public data class Or( + public val vec: List, + ) : CompoundPredicateOfBlockHeader() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 3 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfBlockHeader.Or = + try { + Or( + reader.readVec(reader.readCompactInt()) { CompoundPredicateOfBlockHeader.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfBlockHeader.Or, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + CompoundPredicateOfBlockHeader.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): CompoundPredicateOfBlockHeader = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Not.read(reader) + 2 -> And.read(reader) + 3 -> Or.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: CompoundPredicateOfBlockHeader, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Not.write(writer, instance as Not) + 2 -> And.write(writer, instance as And) + 3 -> Or.write(writer, instance as Or) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfBlockHeaderPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfBlockHeaderPredicateBox.kt deleted file mode 100644 index 143aa7d55..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfBlockHeaderPredicateBox.kt +++ /dev/null @@ -1,189 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.ModelEnum -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Int -import kotlin.Unit -import kotlin.collections.List - -/** - * CompoundPredicateOfBlockHeaderPredicateBox - * - * Generated from 'CompoundPredicateOfBlockHeaderPredicateBox' enum - */ -public sealed class CompoundPredicateOfBlockHeaderPredicateBox : ModelEnum { - /** - * @return Discriminator of variant in enum - */ - public abstract fun discriminant(): Int - - /** - * 'Atom' variant - */ - public data class Atom( - public val blockHeaderPredicateBox: BlockHeaderPredicateBox, - ) : CompoundPredicateOfBlockHeaderPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 0 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfBlockHeaderPredicateBox.Atom = try { - Atom( - BlockHeaderPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfBlockHeaderPredicateBox.Atom, - ): Unit = try { - BlockHeaderPredicateBox.write(writer, instance.blockHeaderPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Not' variant - */ - public data class Not( - public val compoundPredicateOfBlockHeaderPredicateBox: - CompoundPredicateOfBlockHeaderPredicateBox, - ) : CompoundPredicateOfBlockHeaderPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 1 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfBlockHeaderPredicateBox.Not = try { - Not( - CompoundPredicateOfBlockHeaderPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfBlockHeaderPredicateBox.Not, - ): Unit = try { - CompoundPredicateOfBlockHeaderPredicateBox.write( - writer, - instance.compoundPredicateOfBlockHeaderPredicateBox, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'And' variant - */ - public data class And( - public val vec: List, - ) : CompoundPredicateOfBlockHeaderPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 2 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfBlockHeaderPredicateBox.And = try { - And( - reader.readVec(reader.readCompactInt()) { CompoundPredicateOfBlockHeaderPredicateBox.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfBlockHeaderPredicateBox.And, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - CompoundPredicateOfBlockHeaderPredicateBox.write(writer, value) - } - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Or' variant - */ - public data class Or( - public val vec: List, - ) : CompoundPredicateOfBlockHeaderPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 3 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfBlockHeaderPredicateBox.Or = try { - Or( - reader.readVec(reader.readCompactInt()) { CompoundPredicateOfBlockHeaderPredicateBox.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfBlockHeaderPredicateBox.Or, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - CompoundPredicateOfBlockHeaderPredicateBox.write(writer, value) - } - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): CompoundPredicateOfBlockHeaderPredicateBox = - when (val discriminant = reader.readUByte()) { - 0 -> Atom.read(reader) - 1 -> Not.read(reader) - 2 -> And.read(reader) - 3 -> Or.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write( - writer: ScaleCodecWriter, - instance: CompoundPredicateOfBlockHeaderPredicateBox, - ) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 0 -> Atom.write(writer, instance as Atom) - 1 -> Not.write(writer, instance as Not) - 2 -> And.write(writer, instance as And) - 3 -> Or.write(writer, instance as Or) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfCommittedTransaction.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfCommittedTransaction.kt new file mode 100644 index 000000000..4535b8492 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfCommittedTransaction.kt @@ -0,0 +1,195 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit +import kotlin.collections.List + +/** + * CompoundPredicateOfCommittedTransaction + * + * Generated from 'CompoundPredicateOfCommittedTransaction' enum + */ +public sealed class CompoundPredicateOfCommittedTransaction : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val committedTransactionProjectionOfPredicateMarker: CommittedTransactionProjectionOfPredicateMarker, + ) : CompoundPredicateOfCommittedTransaction() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfCommittedTransaction.Atom = + try { + Atom( + CommittedTransactionProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfCommittedTransaction.Atom, + ): Unit = + try { + CommittedTransactionProjectionOfPredicateMarker.write(writer, instance.committedTransactionProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Not' variant + */ + public data class Not( + public val compoundPredicateOfCommittedTransaction: CompoundPredicateOfCommittedTransaction, + ) : CompoundPredicateOfCommittedTransaction() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfCommittedTransaction.Not = + try { + Not( + CompoundPredicateOfCommittedTransaction.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfCommittedTransaction.Not, + ): Unit = + try { + CompoundPredicateOfCommittedTransaction.write(writer, instance.compoundPredicateOfCommittedTransaction) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'And' variant + */ + public data class And( + public val vec: List, + ) : CompoundPredicateOfCommittedTransaction() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 2 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfCommittedTransaction.And = + try { + And( + reader.readVec(reader.readCompactInt()) { CompoundPredicateOfCommittedTransaction.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfCommittedTransaction.And, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + CompoundPredicateOfCommittedTransaction.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Or' variant + */ + public data class Or( + public val vec: List, + ) : CompoundPredicateOfCommittedTransaction() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 3 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfCommittedTransaction.Or = + try { + Or( + reader.readVec(reader.readCompactInt()) { CompoundPredicateOfCommittedTransaction.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfCommittedTransaction.Or, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + CompoundPredicateOfCommittedTransaction.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): CompoundPredicateOfCommittedTransaction = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Not.read(reader) + 2 -> And.read(reader) + 3 -> Or.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: CompoundPredicateOfCommittedTransaction, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Not.write(writer, instance as Not) + 2 -> And.write(writer, instance as And) + 3 -> Or.write(writer, instance as Or) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfDomain.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfDomain.kt new file mode 100644 index 000000000..79e9455aa --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfDomain.kt @@ -0,0 +1,195 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit +import kotlin.collections.List + +/** + * CompoundPredicateOfDomain + * + * Generated from 'CompoundPredicateOfDomain' enum + */ +public sealed class CompoundPredicateOfDomain : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val domainProjectionOfPredicateMarker: DomainProjectionOfPredicateMarker, + ) : CompoundPredicateOfDomain() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfDomain.Atom = + try { + Atom( + DomainProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfDomain.Atom, + ): Unit = + try { + DomainProjectionOfPredicateMarker.write(writer, instance.domainProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Not' variant + */ + public data class Not( + public val compoundPredicateOfDomain: CompoundPredicateOfDomain, + ) : CompoundPredicateOfDomain() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfDomain.Not = + try { + Not( + CompoundPredicateOfDomain.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfDomain.Not, + ): Unit = + try { + CompoundPredicateOfDomain.write(writer, instance.compoundPredicateOfDomain) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'And' variant + */ + public data class And( + public val vec: List, + ) : CompoundPredicateOfDomain() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 2 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfDomain.And = + try { + And( + reader.readVec(reader.readCompactInt()) { CompoundPredicateOfDomain.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfDomain.And, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + CompoundPredicateOfDomain.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Or' variant + */ + public data class Or( + public val vec: List, + ) : CompoundPredicateOfDomain() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 3 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfDomain.Or = + try { + Or( + reader.readVec(reader.readCompactInt()) { CompoundPredicateOfDomain.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfDomain.Or, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + CompoundPredicateOfDomain.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): CompoundPredicateOfDomain = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Not.read(reader) + 2 -> And.read(reader) + 3 -> Or.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: CompoundPredicateOfDomain, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Not.write(writer, instance as Not) + 2 -> And.write(writer, instance as And) + 3 -> Or.write(writer, instance as Or) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfDomainPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfDomainPredicateBox.kt deleted file mode 100644 index 08a709838..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfDomainPredicateBox.kt +++ /dev/null @@ -1,187 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.ModelEnum -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Int -import kotlin.Unit -import kotlin.collections.List - -/** - * CompoundPredicateOfDomainPredicateBox - * - * Generated from 'CompoundPredicateOfDomainPredicateBox' enum - */ -public sealed class CompoundPredicateOfDomainPredicateBox : ModelEnum { - /** - * @return Discriminator of variant in enum - */ - public abstract fun discriminant(): Int - - /** - * 'Atom' variant - */ - public data class Atom( - public val domainPredicateBox: DomainPredicateBox, - ) : CompoundPredicateOfDomainPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 0 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfDomainPredicateBox.Atom = try { - Atom( - DomainPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfDomainPredicateBox.Atom, - ): Unit = try { - DomainPredicateBox.write(writer, instance.domainPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Not' variant - */ - public data class Not( - public val compoundPredicateOfDomainPredicateBox: CompoundPredicateOfDomainPredicateBox, - ) : CompoundPredicateOfDomainPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 1 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfDomainPredicateBox.Not = try { - Not( - CompoundPredicateOfDomainPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfDomainPredicateBox.Not, - ): Unit = try { - CompoundPredicateOfDomainPredicateBox.write( - writer, - instance.compoundPredicateOfDomainPredicateBox, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'And' variant - */ - public data class And( - public val vec: List, - ) : CompoundPredicateOfDomainPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 2 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfDomainPredicateBox.And = try { - And( - reader.readVec(reader.readCompactInt()) { CompoundPredicateOfDomainPredicateBox.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfDomainPredicateBox.And, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - CompoundPredicateOfDomainPredicateBox.write(writer, value) - } - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Or' variant - */ - public data class Or( - public val vec: List, - ) : CompoundPredicateOfDomainPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 3 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfDomainPredicateBox.Or = try { - Or( - reader.readVec(reader.readCompactInt()) { CompoundPredicateOfDomainPredicateBox.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfDomainPredicateBox.Or, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - CompoundPredicateOfDomainPredicateBox.write(writer, value) - } - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): CompoundPredicateOfDomainPredicateBox = when ( - val - discriminant = reader.readUByte() - ) { - 0 -> Atom.read(reader) - 1 -> Not.read(reader) - 2 -> And.read(reader) - 3 -> Or.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: CompoundPredicateOfDomainPredicateBox) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 0 -> Atom.write(writer, instance as Atom) - 1 -> Not.write(writer, instance as Not) - 2 -> And.write(writer, instance as And) - 3 -> Or.write(writer, instance as Or) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfPeerId.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfPeerId.kt new file mode 100644 index 000000000..6ce46ca9b --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfPeerId.kt @@ -0,0 +1,195 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit +import kotlin.collections.List + +/** + * CompoundPredicateOfPeerId + * + * Generated from 'CompoundPredicateOfPeerId' enum + */ +public sealed class CompoundPredicateOfPeerId : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val peerIdProjectionOfPredicateMarker: PeerIdProjectionOfPredicateMarker, + ) : CompoundPredicateOfPeerId() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfPeerId.Atom = + try { + Atom( + PeerIdProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfPeerId.Atom, + ): Unit = + try { + PeerIdProjectionOfPredicateMarker.write(writer, instance.peerIdProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Not' variant + */ + public data class Not( + public val compoundPredicateOfPeerId: CompoundPredicateOfPeerId, + ) : CompoundPredicateOfPeerId() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfPeerId.Not = + try { + Not( + CompoundPredicateOfPeerId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfPeerId.Not, + ): Unit = + try { + CompoundPredicateOfPeerId.write(writer, instance.compoundPredicateOfPeerId) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'And' variant + */ + public data class And( + public val vec: List, + ) : CompoundPredicateOfPeerId() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 2 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfPeerId.And = + try { + And( + reader.readVec(reader.readCompactInt()) { CompoundPredicateOfPeerId.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfPeerId.And, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + CompoundPredicateOfPeerId.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Or' variant + */ + public data class Or( + public val vec: List, + ) : CompoundPredicateOfPeerId() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 3 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfPeerId.Or = + try { + Or( + reader.readVec(reader.readCompactInt()) { CompoundPredicateOfPeerId.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfPeerId.Or, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + CompoundPredicateOfPeerId.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): CompoundPredicateOfPeerId = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Not.read(reader) + 2 -> And.read(reader) + 3 -> Or.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: CompoundPredicateOfPeerId, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Not.write(writer, instance as Not) + 2 -> And.write(writer, instance as And) + 3 -> Or.write(writer, instance as Or) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfPeerPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfPeerPredicateBox.kt deleted file mode 100644 index c173ec28c..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfPeerPredicateBox.kt +++ /dev/null @@ -1,188 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.ModelEnum -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Int -import kotlin.Unit -import kotlin.collections.List - -/** - * CompoundPredicateOfPeerPredicateBox - * - * Generated from 'CompoundPredicateOfPeerPredicateBox' enum - */ -public sealed class CompoundPredicateOfPeerPredicateBox : ModelEnum { - /** - * @return Discriminator of variant in enum - */ - public abstract fun discriminant(): Int - - /** - * 'Atom' variant - */ - public data class Atom( - public val peerPredicateBox: PeerPredicateBox, - ) : CompoundPredicateOfPeerPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 0 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfPeerPredicateBox.Atom = try { - Atom( - PeerPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfPeerPredicateBox.Atom, - ): Unit = try { - PeerPredicateBox.write(writer, instance.peerPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Not' variant - */ - public data class Not( - public val compoundPredicateOfPeerPredicateBox: CompoundPredicateOfPeerPredicateBox, - ) : CompoundPredicateOfPeerPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 1 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfPeerPredicateBox.Not = try { - Not( - CompoundPredicateOfPeerPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfPeerPredicateBox.Not, - ): Unit = try { - CompoundPredicateOfPeerPredicateBox.write( - writer, - instance.compoundPredicateOfPeerPredicateBox, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'And' variant - */ - public data class And( - public val vec: List, - ) : CompoundPredicateOfPeerPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 2 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfPeerPredicateBox.And = try { - And( - reader.readVec(reader.readCompactInt()) { CompoundPredicateOfPeerPredicateBox.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfPeerPredicateBox.And, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - CompoundPredicateOfPeerPredicateBox.write(writer, value) - } - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Or' variant - */ - public data class Or( - public val vec: List, - ) : CompoundPredicateOfPeerPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 3 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfPeerPredicateBox.Or = try { - Or( - reader.readVec(reader.readCompactInt()) { CompoundPredicateOfPeerPredicateBox.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfPeerPredicateBox.Or, - ): Unit = - try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - CompoundPredicateOfPeerPredicateBox.write(writer, value) - } - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): CompoundPredicateOfPeerPredicateBox = when ( - val - discriminant = reader.readUByte() - ) { - 0 -> Atom.read(reader) - 1 -> Not.read(reader) - 2 -> And.read(reader) - 3 -> Or.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: CompoundPredicateOfPeerPredicateBox) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 0 -> Atom.write(writer, instance as Atom) - 1 -> Not.write(writer, instance as Not) - 2 -> And.write(writer, instance as And) - 3 -> Or.write(writer, instance as Or) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfPermission.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfPermission.kt new file mode 100644 index 000000000..67333c062 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfPermission.kt @@ -0,0 +1,195 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit +import kotlin.collections.List + +/** + * CompoundPredicateOfPermission + * + * Generated from 'CompoundPredicateOfPermission' enum + */ +public sealed class CompoundPredicateOfPermission : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val permissionProjectionOfPredicateMarker: PermissionProjectionOfPredicateMarker, + ) : CompoundPredicateOfPermission() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfPermission.Atom = + try { + Atom( + PermissionProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfPermission.Atom, + ): Unit = + try { + PermissionProjectionOfPredicateMarker.write(writer, instance.permissionProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Not' variant + */ + public data class Not( + public val compoundPredicateOfPermission: CompoundPredicateOfPermission, + ) : CompoundPredicateOfPermission() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfPermission.Not = + try { + Not( + CompoundPredicateOfPermission.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfPermission.Not, + ): Unit = + try { + CompoundPredicateOfPermission.write(writer, instance.compoundPredicateOfPermission) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'And' variant + */ + public data class And( + public val vec: List, + ) : CompoundPredicateOfPermission() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 2 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfPermission.And = + try { + And( + reader.readVec(reader.readCompactInt()) { CompoundPredicateOfPermission.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfPermission.And, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + CompoundPredicateOfPermission.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Or' variant + */ + public data class Or( + public val vec: List, + ) : CompoundPredicateOfPermission() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 3 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfPermission.Or = + try { + Or( + reader.readVec(reader.readCompactInt()) { CompoundPredicateOfPermission.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfPermission.Or, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + CompoundPredicateOfPermission.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): CompoundPredicateOfPermission = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Not.read(reader) + 2 -> And.read(reader) + 3 -> Or.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: CompoundPredicateOfPermission, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Not.write(writer, instance as Not) + 2 -> And.write(writer, instance as And) + 3 -> Or.write(writer, instance as Or) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfPermissionPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfPermissionPredicateBox.kt deleted file mode 100644 index 90ad9bb31..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfPermissionPredicateBox.kt +++ /dev/null @@ -1,188 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.ModelEnum -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Int -import kotlin.Unit -import kotlin.collections.List - -/** - * CompoundPredicateOfPermissionPredicateBox - * - * Generated from 'CompoundPredicateOfPermissionPredicateBox' enum - */ -public sealed class CompoundPredicateOfPermissionPredicateBox : ModelEnum { - /** - * @return Discriminator of variant in enum - */ - public abstract fun discriminant(): Int - - /** - * 'Atom' variant - */ - public data class Atom( - public val permissionPredicateBox: PermissionPredicateBox, - ) : CompoundPredicateOfPermissionPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 0 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfPermissionPredicateBox.Atom = try { - Atom( - PermissionPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfPermissionPredicateBox.Atom, - ): Unit = try { - PermissionPredicateBox.write(writer, instance.permissionPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Not' variant - */ - public data class Not( - public val compoundPredicateOfPermissionPredicateBox: CompoundPredicateOfPermissionPredicateBox, - ) : CompoundPredicateOfPermissionPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 1 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfPermissionPredicateBox.Not = try { - Not( - CompoundPredicateOfPermissionPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfPermissionPredicateBox.Not, - ): Unit = try { - CompoundPredicateOfPermissionPredicateBox.write( - writer, - instance.compoundPredicateOfPermissionPredicateBox, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'And' variant - */ - public data class And( - public val vec: List, - ) : CompoundPredicateOfPermissionPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 2 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfPermissionPredicateBox.And = try { - And( - reader.readVec(reader.readCompactInt()) { CompoundPredicateOfPermissionPredicateBox.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfPermissionPredicateBox.And, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - CompoundPredicateOfPermissionPredicateBox.write(writer, value) - } - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Or' variant - */ - public data class Or( - public val vec: List, - ) : CompoundPredicateOfPermissionPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 3 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfPermissionPredicateBox.Or = try { - Or( - reader.readVec(reader.readCompactInt()) { CompoundPredicateOfPermissionPredicateBox.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfPermissionPredicateBox.Or, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - CompoundPredicateOfPermissionPredicateBox.write(writer, value) - } - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): CompoundPredicateOfPermissionPredicateBox = - when (val discriminant = reader.readUByte()) { - 0 -> Atom.read(reader) - 1 -> Not.read(reader) - 2 -> And.read(reader) - 3 -> Or.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write( - writer: ScaleCodecWriter, - instance: CompoundPredicateOfPermissionPredicateBox, - ) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 0 -> Atom.write(writer, instance as Atom) - 1 -> Not.write(writer, instance as Not) - 2 -> And.write(writer, instance as And) - 3 -> Or.write(writer, instance as Or) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfRole.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfRole.kt new file mode 100644 index 000000000..eca00a639 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfRole.kt @@ -0,0 +1,195 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit +import kotlin.collections.List + +/** + * CompoundPredicateOfRole + * + * Generated from 'CompoundPredicateOfRole' enum + */ +public sealed class CompoundPredicateOfRole : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val roleProjectionOfPredicateMarker: RoleProjectionOfPredicateMarker, + ) : CompoundPredicateOfRole() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfRole.Atom = + try { + Atom( + RoleProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfRole.Atom, + ): Unit = + try { + RoleProjectionOfPredicateMarker.write(writer, instance.roleProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Not' variant + */ + public data class Not( + public val compoundPredicateOfRole: CompoundPredicateOfRole, + ) : CompoundPredicateOfRole() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfRole.Not = + try { + Not( + CompoundPredicateOfRole.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfRole.Not, + ): Unit = + try { + CompoundPredicateOfRole.write(writer, instance.compoundPredicateOfRole) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'And' variant + */ + public data class And( + public val vec: List, + ) : CompoundPredicateOfRole() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 2 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfRole.And = + try { + And( + reader.readVec(reader.readCompactInt()) { CompoundPredicateOfRole.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfRole.And, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + CompoundPredicateOfRole.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Or' variant + */ + public data class Or( + public val vec: List, + ) : CompoundPredicateOfRole() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 3 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfRole.Or = + try { + Or( + reader.readVec(reader.readCompactInt()) { CompoundPredicateOfRole.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfRole.Or, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + CompoundPredicateOfRole.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): CompoundPredicateOfRole = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Not.read(reader) + 2 -> And.read(reader) + 3 -> Or.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: CompoundPredicateOfRole, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Not.write(writer, instance as Not) + 2 -> And.write(writer, instance as And) + 3 -> Or.write(writer, instance as Or) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfRolePredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfRoleId.kt similarity index 50% rename from modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfRolePredicateBox.kt rename to modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfRoleId.kt index 83ddb0d6f..dc7263c15 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfRolePredicateBox.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfRoleId.kt @@ -14,11 +14,11 @@ import kotlin.Unit import kotlin.collections.List /** - * CompoundPredicateOfRolePredicateBox + * CompoundPredicateOfRoleId * - * Generated from 'CompoundPredicateOfRolePredicateBox' enum + * Generated from 'CompoundPredicateOfRoleId' enum */ -public sealed class CompoundPredicateOfRolePredicateBox : ModelEnum { +public sealed class CompoundPredicateOfRoleId : ModelEnum { /** * @return Discriminator of variant in enum */ @@ -28,31 +28,33 @@ public sealed class CompoundPredicateOfRolePredicateBox : ModelEnum { * 'Atom' variant */ public data class Atom( - public val rolePredicateBox: RolePredicateBox, - ) : CompoundPredicateOfRolePredicateBox() { + public val roleIdProjectionOfPredicateMarker: RoleIdProjectionOfPredicateMarker, + ) : CompoundPredicateOfRoleId() { override fun discriminant(): Int = DISCRIMINANT public companion object : - ScaleReader, - ScaleWriter { + ScaleReader, + ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfRolePredicateBox.Atom = try { - Atom( - RolePredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfRoleId.Atom = + try { + Atom( + RoleIdProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfRolePredicateBox.Atom, - ): Unit = try { - RolePredicateBox.write(writer, instance.rolePredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfRoleId.Atom, + ): Unit = + try { + RoleIdProjectionOfPredicateMarker.write(writer, instance.roleIdProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -60,34 +62,33 @@ public sealed class CompoundPredicateOfRolePredicateBox : ModelEnum { * 'Not' variant */ public data class Not( - public val compoundPredicateOfRolePredicateBox: CompoundPredicateOfRolePredicateBox, - ) : CompoundPredicateOfRolePredicateBox() { + public val compoundPredicateOfRoleId: CompoundPredicateOfRoleId, + ) : CompoundPredicateOfRoleId() { override fun discriminant(): Int = DISCRIMINANT public companion object : - ScaleReader, - ScaleWriter { + ScaleReader, + ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfRolePredicateBox.Not = try { - Not( - CompoundPredicateOfRolePredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfRoleId.Not = + try { + Not( + CompoundPredicateOfRoleId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfRolePredicateBox.Not, - ): Unit = try { - CompoundPredicateOfRolePredicateBox.write( - writer, - instance.compoundPredicateOfRolePredicateBox, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfRoleId.Not, + ): Unit = + try { + CompoundPredicateOfRoleId.write(writer, instance.compoundPredicateOfRoleId) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -95,34 +96,36 @@ public sealed class CompoundPredicateOfRolePredicateBox : ModelEnum { * 'And' variant */ public data class And( - public val vec: List, - ) : CompoundPredicateOfRolePredicateBox() { + public val vec: List, + ) : CompoundPredicateOfRoleId() { override fun discriminant(): Int = DISCRIMINANT public companion object : - ScaleReader, - ScaleWriter { + ScaleReader, + ScaleWriter { public const val DISCRIMINANT: Int = 2 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfRolePredicateBox.And = try { - And( - reader.readVec(reader.readCompactInt()) { CompoundPredicateOfRolePredicateBox.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfRoleId.And = + try { + And( + reader.readVec(reader.readCompactInt()) { CompoundPredicateOfRoleId.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfRolePredicateBox.And, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - CompoundPredicateOfRolePredicateBox.write(writer, value) + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfRoleId.And, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + CompoundPredicateOfRoleId.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) } - } catch (ex: Exception) { - throw wrapException(ex) - } } } @@ -130,31 +133,32 @@ public sealed class CompoundPredicateOfRolePredicateBox : ModelEnum { * 'Or' variant */ public data class Or( - public val vec: List, - ) : CompoundPredicateOfRolePredicateBox() { + public val vec: List, + ) : CompoundPredicateOfRoleId() { override fun discriminant(): Int = DISCRIMINANT public companion object : - ScaleReader, - ScaleWriter { + ScaleReader, + ScaleWriter { public const val DISCRIMINANT: Int = 3 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfRolePredicateBox.Or = try { - Or( - reader.readVec(reader.readCompactInt()) { CompoundPredicateOfRolePredicateBox.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfRoleId.Or = + try { + Or( + reader.readVec(reader.readCompactInt()) { CompoundPredicateOfRoleId.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfRolePredicateBox.Or, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfRoleId.Or, ): Unit = try { writer.writeCompact(instance.vec.size) instance.vec.forEach { value -> - CompoundPredicateOfRolePredicateBox.write(writer, value) + CompoundPredicateOfRoleId.write(writer, value) } } catch (ex: Exception) { throw wrapException(ex) @@ -163,26 +167,29 @@ public sealed class CompoundPredicateOfRolePredicateBox : ModelEnum { } public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): CompoundPredicateOfRolePredicateBox = when ( - val - discriminant = reader.readUByte() - ) { - 0 -> Atom.read(reader) - 1 -> Not.read(reader) - 2 -> And.read(reader) - 3 -> Or.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): CompoundPredicateOfRoleId = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Not.read(reader) + 2 -> And.read(reader) + 3 -> Or.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: CompoundPredicateOfRolePredicateBox) { + override fun write( + writer: ScaleCodecWriter, + instance: CompoundPredicateOfRoleId, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Atom.write(writer, instance as Atom) 1 -> Not.write(writer, instance as Not) 2 -> And.write(writer, instance as And) 3 -> Or.write(writer, instance as Or) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfRoleIdPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfRoleIdPredicateBox.kt deleted file mode 100644 index 4c871c6cd..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfRoleIdPredicateBox.kt +++ /dev/null @@ -1,187 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.ModelEnum -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Int -import kotlin.Unit -import kotlin.collections.List - -/** - * CompoundPredicateOfRoleIdPredicateBox - * - * Generated from 'CompoundPredicateOfRoleIdPredicateBox' enum - */ -public sealed class CompoundPredicateOfRoleIdPredicateBox : ModelEnum { - /** - * @return Discriminator of variant in enum - */ - public abstract fun discriminant(): Int - - /** - * 'Atom' variant - */ - public data class Atom( - public val roleIdPredicateBox: RoleIdPredicateBox, - ) : CompoundPredicateOfRoleIdPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 0 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfRoleIdPredicateBox.Atom = try { - Atom( - RoleIdPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfRoleIdPredicateBox.Atom, - ): Unit = try { - RoleIdPredicateBox.write(writer, instance.roleIdPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Not' variant - */ - public data class Not( - public val compoundPredicateOfRoleIdPredicateBox: CompoundPredicateOfRoleIdPredicateBox, - ) : CompoundPredicateOfRoleIdPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 1 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfRoleIdPredicateBox.Not = try { - Not( - CompoundPredicateOfRoleIdPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfRoleIdPredicateBox.Not, - ): Unit = try { - CompoundPredicateOfRoleIdPredicateBox.write( - writer, - instance.compoundPredicateOfRoleIdPredicateBox, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'And' variant - */ - public data class And( - public val vec: List, - ) : CompoundPredicateOfRoleIdPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 2 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfRoleIdPredicateBox.And = try { - And( - reader.readVec(reader.readCompactInt()) { CompoundPredicateOfRoleIdPredicateBox.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfRoleIdPredicateBox.And, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - CompoundPredicateOfRoleIdPredicateBox.write(writer, value) - } - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Or' variant - */ - public data class Or( - public val vec: List, - ) : CompoundPredicateOfRoleIdPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 3 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfRoleIdPredicateBox.Or = try { - Or( - reader.readVec(reader.readCompactInt()) { CompoundPredicateOfRoleIdPredicateBox.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfRoleIdPredicateBox.Or, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - CompoundPredicateOfRoleIdPredicateBox.write(writer, value) - } - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): CompoundPredicateOfRoleIdPredicateBox = when ( - val - discriminant = reader.readUByte() - ) { - 0 -> Atom.read(reader) - 1 -> Not.read(reader) - 2 -> And.read(reader) - 3 -> Or.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: CompoundPredicateOfRoleIdPredicateBox) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 0 -> Atom.write(writer, instance as Atom) - 1 -> Not.write(writer, instance as Not) - 2 -> And.write(writer, instance as And) - 3 -> Or.write(writer, instance as Or) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfSignedBlock.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfSignedBlock.kt new file mode 100644 index 000000000..c8131100d --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfSignedBlock.kt @@ -0,0 +1,195 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit +import kotlin.collections.List + +/** + * CompoundPredicateOfSignedBlock + * + * Generated from 'CompoundPredicateOfSignedBlock' enum + */ +public sealed class CompoundPredicateOfSignedBlock : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val signedBlockProjectionOfPredicateMarker: SignedBlockProjectionOfPredicateMarker, + ) : CompoundPredicateOfSignedBlock() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfSignedBlock.Atom = + try { + Atom( + SignedBlockProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfSignedBlock.Atom, + ): Unit = + try { + SignedBlockProjectionOfPredicateMarker.write(writer, instance.signedBlockProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Not' variant + */ + public data class Not( + public val compoundPredicateOfSignedBlock: CompoundPredicateOfSignedBlock, + ) : CompoundPredicateOfSignedBlock() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfSignedBlock.Not = + try { + Not( + CompoundPredicateOfSignedBlock.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfSignedBlock.Not, + ): Unit = + try { + CompoundPredicateOfSignedBlock.write(writer, instance.compoundPredicateOfSignedBlock) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'And' variant + */ + public data class And( + public val vec: List, + ) : CompoundPredicateOfSignedBlock() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 2 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfSignedBlock.And = + try { + And( + reader.readVec(reader.readCompactInt()) { CompoundPredicateOfSignedBlock.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfSignedBlock.And, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + CompoundPredicateOfSignedBlock.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Or' variant + */ + public data class Or( + public val vec: List, + ) : CompoundPredicateOfSignedBlock() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 3 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfSignedBlock.Or = + try { + Or( + reader.readVec(reader.readCompactInt()) { CompoundPredicateOfSignedBlock.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfSignedBlock.Or, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + CompoundPredicateOfSignedBlock.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): CompoundPredicateOfSignedBlock = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Not.read(reader) + 2 -> And.read(reader) + 3 -> Or.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: CompoundPredicateOfSignedBlock, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Not.write(writer, instance as Not) + 2 -> And.write(writer, instance as And) + 3 -> Or.write(writer, instance as Or) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfSignedBlockPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfSignedBlockPredicateBox.kt deleted file mode 100644 index a598a6962..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfSignedBlockPredicateBox.kt +++ /dev/null @@ -1,189 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.ModelEnum -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Int -import kotlin.Unit -import kotlin.collections.List - -/** - * CompoundPredicateOfSignedBlockPredicateBox - * - * Generated from 'CompoundPredicateOfSignedBlockPredicateBox' enum - */ -public sealed class CompoundPredicateOfSignedBlockPredicateBox : ModelEnum { - /** - * @return Discriminator of variant in enum - */ - public abstract fun discriminant(): Int - - /** - * 'Atom' variant - */ - public data class Atom( - public val signedBlockPredicateBox: SignedBlockPredicateBox, - ) : CompoundPredicateOfSignedBlockPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 0 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfSignedBlockPredicateBox.Atom = try { - Atom( - SignedBlockPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfSignedBlockPredicateBox.Atom, - ): Unit = try { - SignedBlockPredicateBox.write(writer, instance.signedBlockPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Not' variant - */ - public data class Not( - public val compoundPredicateOfSignedBlockPredicateBox: - CompoundPredicateOfSignedBlockPredicateBox, - ) : CompoundPredicateOfSignedBlockPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 1 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfSignedBlockPredicateBox.Not = try { - Not( - CompoundPredicateOfSignedBlockPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfSignedBlockPredicateBox.Not, - ): Unit = try { - CompoundPredicateOfSignedBlockPredicateBox.write( - writer, - instance.compoundPredicateOfSignedBlockPredicateBox, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'And' variant - */ - public data class And( - public val vec: List, - ) : CompoundPredicateOfSignedBlockPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 2 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfSignedBlockPredicateBox.And = try { - And( - reader.readVec(reader.readCompactInt()) { CompoundPredicateOfSignedBlockPredicateBox.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfSignedBlockPredicateBox.And, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - CompoundPredicateOfSignedBlockPredicateBox.write(writer, value) - } - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Or' variant - */ - public data class Or( - public val vec: List, - ) : CompoundPredicateOfSignedBlockPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 3 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfSignedBlockPredicateBox.Or = try { - Or( - reader.readVec(reader.readCompactInt()) { CompoundPredicateOfSignedBlockPredicateBox.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfSignedBlockPredicateBox.Or, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - CompoundPredicateOfSignedBlockPredicateBox.write(writer, value) - } - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): CompoundPredicateOfSignedBlockPredicateBox = - when (val discriminant = reader.readUByte()) { - 0 -> Atom.read(reader) - 1 -> Not.read(reader) - 2 -> And.read(reader) - 3 -> Or.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write( - writer: ScaleCodecWriter, - instance: CompoundPredicateOfSignedBlockPredicateBox, - ) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 0 -> Atom.write(writer, instance as Atom) - 1 -> Not.write(writer, instance as Not) - 2 -> And.write(writer, instance as And) - 3 -> Or.write(writer, instance as Or) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfTransactionQueryOutputPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfTransactionQueryOutputPredicateBox.kt deleted file mode 100644 index 63af5b66a..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfTransactionQueryOutputPredicateBox.kt +++ /dev/null @@ -1,194 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.ModelEnum -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Int -import kotlin.Unit -import kotlin.collections.List - -/** - * CompoundPredicateOfTransactionQueryOutputPredicateBox - * - * Generated from 'CompoundPredicateOfTransactionQueryOutputPredicateBox' enum - */ -public sealed class CompoundPredicateOfTransactionQueryOutputPredicateBox : ModelEnum { - /** - * @return Discriminator of variant in enum - */ - public abstract fun discriminant(): Int - - /** - * 'Atom' variant - */ - public data class Atom( - public val transactionQueryOutputPredicateBox: TransactionQueryOutputPredicateBox, - ) : CompoundPredicateOfTransactionQueryOutputPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 0 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTransactionQueryOutputPredicateBox.Atom = try { - Atom( - TransactionQueryOutputPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTransactionQueryOutputPredicateBox.Atom, - ): Unit = try { - TransactionQueryOutputPredicateBox.write( - writer, - instance.transactionQueryOutputPredicateBox, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Not' variant - */ - public data class Not( - public val compoundPredicateOfTransactionQueryOutputPredicateBox: - CompoundPredicateOfTransactionQueryOutputPredicateBox, - ) : CompoundPredicateOfTransactionQueryOutputPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 1 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTransactionQueryOutputPredicateBox.Not = try { - Not( - CompoundPredicateOfTransactionQueryOutputPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTransactionQueryOutputPredicateBox.Not, - ): Unit = try { - CompoundPredicateOfTransactionQueryOutputPredicateBox.write( - writer, - instance.compoundPredicateOfTransactionQueryOutputPredicateBox, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'And' variant - */ - public data class And( - public val vec: List, - ) : CompoundPredicateOfTransactionQueryOutputPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 2 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTransactionQueryOutputPredicateBox.And = try { - And( - reader.readVec(reader.readCompactInt()) { CompoundPredicateOfTransactionQueryOutputPredicateBox.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTransactionQueryOutputPredicateBox.And, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - CompoundPredicateOfTransactionQueryOutputPredicateBox.write(writer, value) - } - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Or' variant - */ - public data class Or( - public val vec: List, - ) : CompoundPredicateOfTransactionQueryOutputPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 3 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTransactionQueryOutputPredicateBox.Or = try { - Or( - reader.readVec(reader.readCompactInt()) { CompoundPredicateOfTransactionQueryOutputPredicateBox.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTransactionQueryOutputPredicateBox.Or, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - CompoundPredicateOfTransactionQueryOutputPredicateBox.write(writer, value) - } - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): CompoundPredicateOfTransactionQueryOutputPredicateBox = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Atom.read(reader) - 1 -> Not.read(reader) - 2 -> And.read(reader) - 3 -> Or.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write( - writer: ScaleCodecWriter, - instance: CompoundPredicateOfTransactionQueryOutputPredicateBox, - ) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 0 -> Atom.write(writer, instance as Atom) - 1 -> Not.write(writer, instance as Not) - 2 -> And.write(writer, instance as And) - 3 -> Or.write(writer, instance as Or) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfTrigger.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfTrigger.kt new file mode 100644 index 000000000..d242cb9dd --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfTrigger.kt @@ -0,0 +1,195 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit +import kotlin.collections.List + +/** + * CompoundPredicateOfTrigger + * + * Generated from 'CompoundPredicateOfTrigger' enum + */ +public sealed class CompoundPredicateOfTrigger : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val triggerProjectionOfPredicateMarker: TriggerProjectionOfPredicateMarker, + ) : CompoundPredicateOfTrigger() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTrigger.Atom = + try { + Atom( + TriggerProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTrigger.Atom, + ): Unit = + try { + TriggerProjectionOfPredicateMarker.write(writer, instance.triggerProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Not' variant + */ + public data class Not( + public val compoundPredicateOfTrigger: CompoundPredicateOfTrigger, + ) : CompoundPredicateOfTrigger() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTrigger.Not = + try { + Not( + CompoundPredicateOfTrigger.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTrigger.Not, + ): Unit = + try { + CompoundPredicateOfTrigger.write(writer, instance.compoundPredicateOfTrigger) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'And' variant + */ + public data class And( + public val vec: List, + ) : CompoundPredicateOfTrigger() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 2 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTrigger.And = + try { + And( + reader.readVec(reader.readCompactInt()) { CompoundPredicateOfTrigger.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTrigger.And, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + CompoundPredicateOfTrigger.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Or' variant + */ + public data class Or( + public val vec: List, + ) : CompoundPredicateOfTrigger() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 3 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTrigger.Or = + try { + Or( + reader.readVec(reader.readCompactInt()) { CompoundPredicateOfTrigger.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTrigger.Or, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + CompoundPredicateOfTrigger.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): CompoundPredicateOfTrigger = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Not.read(reader) + 2 -> And.read(reader) + 3 -> Or.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: CompoundPredicateOfTrigger, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Not.write(writer, instance as Not) + 2 -> And.write(writer, instance as And) + 3 -> Or.write(writer, instance as Or) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfTriggerId.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfTriggerId.kt new file mode 100644 index 000000000..907e91641 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfTriggerId.kt @@ -0,0 +1,195 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit +import kotlin.collections.List + +/** + * CompoundPredicateOfTriggerId + * + * Generated from 'CompoundPredicateOfTriggerId' enum + */ +public sealed class CompoundPredicateOfTriggerId : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val triggerIdProjectionOfPredicateMarker: TriggerIdProjectionOfPredicateMarker, + ) : CompoundPredicateOfTriggerId() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTriggerId.Atom = + try { + Atom( + TriggerIdProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTriggerId.Atom, + ): Unit = + try { + TriggerIdProjectionOfPredicateMarker.write(writer, instance.triggerIdProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Not' variant + */ + public data class Not( + public val compoundPredicateOfTriggerId: CompoundPredicateOfTriggerId, + ) : CompoundPredicateOfTriggerId() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTriggerId.Not = + try { + Not( + CompoundPredicateOfTriggerId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTriggerId.Not, + ): Unit = + try { + CompoundPredicateOfTriggerId.write(writer, instance.compoundPredicateOfTriggerId) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'And' variant + */ + public data class And( + public val vec: List, + ) : CompoundPredicateOfTriggerId() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 2 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTriggerId.And = + try { + And( + reader.readVec(reader.readCompactInt()) { CompoundPredicateOfTriggerId.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTriggerId.And, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + CompoundPredicateOfTriggerId.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Or' variant + */ + public data class Or( + public val vec: List, + ) : CompoundPredicateOfTriggerId() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 3 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTriggerId.Or = + try { + Or( + reader.readVec(reader.readCompactInt()) { CompoundPredicateOfTriggerId.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTriggerId.Or, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + CompoundPredicateOfTriggerId.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): CompoundPredicateOfTriggerId = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Not.read(reader) + 2 -> And.read(reader) + 3 -> Or.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: CompoundPredicateOfTriggerId, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Not.write(writer, instance as Not) + 2 -> And.write(writer, instance as And) + 3 -> Or.write(writer, instance as Or) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfTriggerIdPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfTriggerIdPredicateBox.kt deleted file mode 100644 index c57886dd7..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfTriggerIdPredicateBox.kt +++ /dev/null @@ -1,190 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.ModelEnum -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Int -import kotlin.Unit -import kotlin.collections.List - -/** - * CompoundPredicateOfTriggerIdPredicateBox - * - * Generated from 'CompoundPredicateOfTriggerIdPredicateBox' enum - */ -public sealed class CompoundPredicateOfTriggerIdPredicateBox : ModelEnum { - /** - * @return Discriminator of variant in enum - */ - public abstract fun discriminant(): Int - - /** - * 'Atom' variant - */ - public data class Atom( - public val triggerIdPredicateBox: TriggerIdPredicateBox, - ) : CompoundPredicateOfTriggerIdPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 0 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTriggerIdPredicateBox.Atom = try { - Atom( - TriggerIdPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTriggerIdPredicateBox.Atom, - ): Unit = try { - TriggerIdPredicateBox.write(writer, instance.triggerIdPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Not' variant - */ - public data class Not( - public val compoundPredicateOfTriggerIdPredicateBox: CompoundPredicateOfTriggerIdPredicateBox, - ) : CompoundPredicateOfTriggerIdPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 1 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTriggerIdPredicateBox.Not = try { - Not( - CompoundPredicateOfTriggerIdPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTriggerIdPredicateBox.Not, - ): Unit = try { - CompoundPredicateOfTriggerIdPredicateBox.write( - writer, - instance.compoundPredicateOfTriggerIdPredicateBox, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'And' variant - */ - public data class And( - public val vec: List, - ) : CompoundPredicateOfTriggerIdPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 2 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTriggerIdPredicateBox.And = try { - And( - reader.readVec(reader.readCompactInt()) { CompoundPredicateOfTriggerIdPredicateBox.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTriggerIdPredicateBox.And, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - CompoundPredicateOfTriggerIdPredicateBox.write(writer, value) - } - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Or' variant - */ - public data class Or( - public val vec: List, - ) : CompoundPredicateOfTriggerIdPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 3 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTriggerIdPredicateBox.Or = try { - Or( - reader.readVec(reader.readCompactInt()) { CompoundPredicateOfTriggerIdPredicateBox.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTriggerIdPredicateBox.Or, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - CompoundPredicateOfTriggerIdPredicateBox.write(writer, value) - } - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): CompoundPredicateOfTriggerIdPredicateBox = when ( - val - discriminant = reader.readUByte() - ) { - 0 -> Atom.read(reader) - 1 -> Not.read(reader) - 2 -> And.read(reader) - 3 -> Or.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write( - writer: ScaleCodecWriter, - instance: CompoundPredicateOfTriggerIdPredicateBox, - ) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 0 -> Atom.write(writer, instance as Atom) - 1 -> Not.write(writer, instance as Not) - 2 -> And.write(writer, instance as And) - 3 -> Or.write(writer, instance as Or) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfTriggerPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfTriggerPredicateBox.kt deleted file mode 100644 index 3daba80e5..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CompoundPredicateOfTriggerPredicateBox.kt +++ /dev/null @@ -1,187 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.ModelEnum -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Int -import kotlin.Unit -import kotlin.collections.List - -/** - * CompoundPredicateOfTriggerPredicateBox - * - * Generated from 'CompoundPredicateOfTriggerPredicateBox' enum - */ -public sealed class CompoundPredicateOfTriggerPredicateBox : ModelEnum { - /** - * @return Discriminator of variant in enum - */ - public abstract fun discriminant(): Int - - /** - * 'Atom' variant - */ - public data class Atom( - public val triggerPredicateBox: TriggerPredicateBox, - ) : CompoundPredicateOfTriggerPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 0 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTriggerPredicateBox.Atom = try { - Atom( - TriggerPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTriggerPredicateBox.Atom, - ): Unit = try { - TriggerPredicateBox.write(writer, instance.triggerPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Not' variant - */ - public data class Not( - public val compoundPredicateOfTriggerPredicateBox: CompoundPredicateOfTriggerPredicateBox, - ) : CompoundPredicateOfTriggerPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 1 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTriggerPredicateBox.Not = try { - Not( - CompoundPredicateOfTriggerPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTriggerPredicateBox.Not, - ): Unit = try { - CompoundPredicateOfTriggerPredicateBox.write( - writer, - instance.compoundPredicateOfTriggerPredicateBox, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'And' variant - */ - public data class And( - public val vec: List, - ) : CompoundPredicateOfTriggerPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 2 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTriggerPredicateBox.And = try { - And( - reader.readVec(reader.readCompactInt()) { CompoundPredicateOfTriggerPredicateBox.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTriggerPredicateBox.And, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - CompoundPredicateOfTriggerPredicateBox.write(writer, value) - } - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Or' variant - */ - public data class Or( - public val vec: List, - ) : CompoundPredicateOfTriggerPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 3 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTriggerPredicateBox.Or = try { - Or( - reader.readVec(reader.readCompactInt()) { CompoundPredicateOfTriggerPredicateBox.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTriggerPredicateBox.Or, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - CompoundPredicateOfTriggerPredicateBox.write(writer, value) - } - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): CompoundPredicateOfTriggerPredicateBox = when ( - val - discriminant = reader.readUByte() - ) { - 0 -> Atom.read(reader) - 1 -> Not.read(reader) - 2 -> And.read(reader) - 3 -> Or.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: CompoundPredicateOfTriggerPredicateBox) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 0 -> Atom.write(writer, instance as Atom) - 1 -> Not.write(writer, instance as Not) - 2 -> And.write(writer, instance as And) - 3 -> Or.write(writer, instance as Or) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ConfigurationEvent.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ConfigurationEvent.kt index 1a164848c..e8772077b 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ConfigurationEvent.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ConfigurationEvent.kt @@ -36,38 +36,43 @@ public sealed class ConfigurationEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.ConfigurationEvent.Changed = try { - Changed( - ParameterChanged.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.ConfigurationEvent.Changed = + try { + Changed( + ParameterChanged.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.ConfigurationEvent.Changed, - ): Unit = try { - ParameterChanged.write(writer, instance.parameterChanged) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + ParameterChanged.write(writer, instance.parameterChanged) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): ConfigurationEvent = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Changed.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + override fun read(reader: ScaleCodecReader): ConfigurationEvent = + when (val discriminant = reader.readUByte()) { + 0 -> Changed.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: ConfigurationEvent) { + override fun write( + writer: ScaleCodecWriter, + instance: ConfigurationEvent, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Changed.write(writer, instance as Changed) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ConfigurationEventFilter.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ConfigurationEventFilter.kt index fd34ea517..293b9a297 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ConfigurationEventFilter.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ConfigurationEventFilter.kt @@ -22,18 +22,23 @@ public data class ConfigurationEventFilter( public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): ConfigurationEventFilter = try { - ConfigurationEventFilter( - reader.readUint32(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): ConfigurationEventFilter = + try { + ConfigurationEventFilter( + reader.readUint32(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: ConfigurationEventFilter): Unit = try { - writer.writeUint32(instance.eventSet) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: ConfigurationEventFilter, + ): Unit = + try { + writer.writeUint32(instance.eventSet) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Container.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Container.kt deleted file mode 100644 index 4be10b719..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Container.kt +++ /dev/null @@ -1,143 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.ModelEnum -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Int -import kotlin.Unit - -/** - * Container - * - * Generated from 'Container' enum - */ -public sealed class Container : ModelEnum { - /** - * @return Discriminator of variant in enum - */ - public abstract fun discriminant(): Int - - /** - * 'Any' variant - */ - public data class Any( - public val queryOutputPredicate: QueryOutputPredicate, - ) : Container() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 0 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.Container.Any = - try { - Any( - QueryOutputPredicate.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.Container.Any, - ): Unit = try { - QueryOutputPredicate.write(writer, instance.queryOutputPredicate) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'All' variant - */ - public data class All( - public val queryOutputPredicate: QueryOutputPredicate, - ) : Container() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 1 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.Container.All = - try { - All( - QueryOutputPredicate.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.Container.All, - ): Unit = try { - QueryOutputPredicate.write(writer, instance.queryOutputPredicate) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'AtIndex' variant - */ - public data class AtIndex( - public val atIndex: jp.co.soramitsu.iroha2.generated.AtIndex, - ) : Container() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 2 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.Container.AtIndex = try { - AtIndex( - jp.co.soramitsu.iroha2.generated.AtIndex.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.Container.AtIndex, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.AtIndex.write(writer, instance.atIndex) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): Container = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Any.read(reader) - 1 -> All.read(reader) - 2 -> AtIndex.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: Container) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 0 -> Any.write(writer, instance as Any) - 1 -> All.write(writer, instance as All) - 2 -> AtIndex.write(writer, instance as AtIndex) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CustomInstruction.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CustomInstruction.kt index c7cd7b2ce..520d82a02 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CustomInstruction.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CustomInstruction.kt @@ -8,7 +8,6 @@ import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter import jp.co.soramitsu.iroha2.wrapException -import kotlin.String import kotlin.Unit /** @@ -17,21 +16,26 @@ import kotlin.Unit * Generated from 'CustomInstruction' regular structure */ public data class CustomInstruction( - public val payload: String, + public val payload: Json, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): CustomInstruction = try { - CustomInstruction( - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): CustomInstruction = + try { + CustomInstruction( + Json.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: CustomInstruction): Unit = try { - writer.writeAsList(instance.payload.toByteArray(Charsets.UTF_8)) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: CustomInstruction, + ): Unit = + try { + Json.write(writer, instance.payload) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CustomParameter.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CustomParameter.kt index 5d1aed51c..53470a0d6 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CustomParameter.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CustomParameter.kt @@ -8,7 +8,6 @@ import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter import jp.co.soramitsu.iroha2.wrapException -import kotlin.String import kotlin.Unit /** @@ -18,23 +17,28 @@ import kotlin.Unit */ public data class CustomParameter( public val id: CustomParameterId, - public val payload: String, + public val payload: Json, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): CustomParameter = try { - CustomParameter( - CustomParameterId.read(reader), - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): CustomParameter = + try { + CustomParameter( + CustomParameterId.read(reader), + Json.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: CustomParameter): Unit = try { - CustomParameterId.write(writer, instance.id) - writer.writeAsList(instance.payload.toByteArray(Charsets.UTF_8)) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: CustomParameter, + ): Unit = + try { + CustomParameterId.write(writer, instance.id) + Json.write(writer, instance.payload) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CustomParameterId.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CustomParameterId.kt index 04e99cfda..aeec8572c 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CustomParameterId.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/CustomParameterId.kt @@ -19,18 +19,23 @@ public data class CustomParameterId( public val name: Name, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): CustomParameterId = try { - CustomParameterId( - Name.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): CustomParameterId = + try { + CustomParameterId( + Name.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: CustomParameterId): Unit = try { - Name.write(writer, instance.name) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: CustomParameterId, + ): Unit = + try { + Name.write(writer, instance.name) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DataEvent.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DataEvent.kt index 426dfe055..d156b86c9 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DataEvent.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DataEvent.kt @@ -48,11 +48,12 @@ public sealed class DataEvent : ModelEnum { override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.DataEvent.Peer, - ): Unit = try { - PeerEvent.write(writer, instance.peerEvent) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + PeerEvent.write(writer, instance.peerEvent) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -69,22 +70,24 @@ public sealed class DataEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DataEvent.Domain = try { - Domain( - DomainEvent.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DataEvent.Domain = + try { + Domain( + DomainEvent.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.DataEvent.Domain, - ): Unit = try { - DomainEvent.write(writer, instance.domainEvent) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + DomainEvent.write(writer, instance.domainEvent) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -101,22 +104,24 @@ public sealed class DataEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 2 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DataEvent.Trigger = try { - Trigger( - TriggerEvent.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DataEvent.Trigger = + try { + Trigger( + TriggerEvent.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.DataEvent.Trigger, - ): Unit = try { - TriggerEvent.write(writer, instance.triggerEvent) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + TriggerEvent.write(writer, instance.triggerEvent) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -145,11 +150,12 @@ public sealed class DataEvent : ModelEnum { override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.DataEvent.Role, - ): Unit = try { - RoleEvent.write(writer, instance.roleEvent) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + RoleEvent.write(writer, instance.roleEvent) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -166,22 +172,24 @@ public sealed class DataEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 4 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DataEvent.Configuration = try { - Configuration( - ConfigurationEvent.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DataEvent.Configuration = + try { + Configuration( + ConfigurationEvent.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.DataEvent.Configuration, - ): Unit = try { - ConfigurationEvent.write(writer, instance.configurationEvent) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + ConfigurationEvent.write(writer, instance.configurationEvent) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -198,39 +206,43 @@ public sealed class DataEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 5 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DataEvent.Executor = try { - Executor( - ExecutorEvent.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DataEvent.Executor = + try { + Executor( + ExecutorEvent.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.DataEvent.Executor, - ): Unit = try { - ExecutorEvent.write(writer, instance.executorEvent) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + ExecutorEvent.write(writer, instance.executorEvent) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): DataEvent = when ( - val discriminant = - reader.readUByte() + override fun read(reader: ScaleCodecReader): DataEvent = + when (val discriminant = reader.readUByte()) { + 0 -> Peer.read(reader) + 1 -> Domain.read(reader) + 2 -> Trigger.read(reader) + 3 -> Role.read(reader) + 4 -> Configuration.read(reader) + 5 -> Executor.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: DataEvent, ) { - 0 -> Peer.read(reader) - 1 -> Domain.read(reader) - 2 -> Trigger.read(reader) - 3 -> Role.read(reader) - 4 -> Configuration.read(reader) - 5 -> Executor.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: DataEvent) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Peer.write(writer, instance as Peer) @@ -239,7 +251,8 @@ public sealed class DataEvent : ModelEnum { 3 -> Role.write(writer, instance as Role) 4 -> Configuration.write(writer, instance as Configuration) 5 -> Executor.write(writer, instance as Executor) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DataEventFilter.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DataEventFilter.kt index 1f7f25451..bdb7ddea7 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DataEventFilter.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DataEventFilter.kt @@ -24,13 +24,17 @@ public sealed class DataEventFilter : ModelEnum { */ public abstract fun discriminant(): Int - override fun equals(other: kotlin.Any?): Boolean = when (this) { - is Any -> Any.equals(this, other) - else -> super.equals(other) } + override fun equals(other: kotlin.Any?): Boolean = + when (this) { + is Any -> Any.equals(this, other) + else -> super.equals(other) + } - override fun hashCode(): Int = when (this) { - is Any -> Any.hashCode() - else -> super.hashCode() } + override fun hashCode(): Int = + when (this) { + is Any -> Any.hashCode() + else -> super.hashCode() + } /** * 'Any' variant @@ -43,24 +47,30 @@ public sealed class DataEventFilter : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DataEventFilter.Any = try { - Any() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DataEventFilter.Any = + try { + Any() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.DataEventFilter.Any, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } - - public fun equals(o1: jp.co.soramitsu.iroha2.generated.DataEventFilter.Any, o2: kotlin.Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.DataEventFilter.Any, + o2: kotlin.Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".DataEventFilter.Any".hashCode() } @@ -79,22 +89,24 @@ public sealed class DataEventFilter : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DataEventFilter.Peer = try { - Peer( - PeerEventFilter.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DataEventFilter.Peer = + try { + Peer( + PeerEventFilter.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.DataEventFilter.Peer, - ): Unit = try { - PeerEventFilter.write(writer, instance.peerEventFilter) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + PeerEventFilter.write(writer, instance.peerEventFilter) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -111,22 +123,24 @@ public sealed class DataEventFilter : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 2 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DataEventFilter.Domain = try { - Domain( - DomainEventFilter.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DataEventFilter.Domain = + try { + Domain( + DomainEventFilter.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.DataEventFilter.Domain, - ): Unit = try { - DomainEventFilter.write(writer, instance.domainEventFilter) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + DomainEventFilter.write(writer, instance.domainEventFilter) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -143,22 +157,24 @@ public sealed class DataEventFilter : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 3 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DataEventFilter.Account = try { - Account( - AccountEventFilter.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DataEventFilter.Account = + try { + Account( + AccountEventFilter.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.DataEventFilter.Account, - ): Unit = try { - AccountEventFilter.write(writer, instance.accountEventFilter) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + AccountEventFilter.write(writer, instance.accountEventFilter) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -175,22 +191,24 @@ public sealed class DataEventFilter : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 4 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DataEventFilter.Asset = try { - Asset( - AssetEventFilter.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DataEventFilter.Asset = + try { + Asset( + AssetEventFilter.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.DataEventFilter.Asset, - ): Unit = try { - AssetEventFilter.write(writer, instance.assetEventFilter) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + AssetEventFilter.write(writer, instance.assetEventFilter) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -207,22 +225,24 @@ public sealed class DataEventFilter : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 5 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DataEventFilter.AssetDefinition = try { - AssetDefinition( - AssetDefinitionEventFilter.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DataEventFilter.AssetDefinition = + try { + AssetDefinition( + AssetDefinitionEventFilter.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.DataEventFilter.AssetDefinition, - ): Unit = try { - AssetDefinitionEventFilter.write(writer, instance.assetDefinitionEventFilter) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + AssetDefinitionEventFilter.write(writer, instance.assetDefinitionEventFilter) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -239,22 +259,24 @@ public sealed class DataEventFilter : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 6 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DataEventFilter.Trigger = try { - Trigger( - TriggerEventFilter.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DataEventFilter.Trigger = + try { + Trigger( + TriggerEventFilter.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.DataEventFilter.Trigger, - ): Unit = try { - TriggerEventFilter.write(writer, instance.triggerEventFilter) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + TriggerEventFilter.write(writer, instance.triggerEventFilter) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -271,22 +293,24 @@ public sealed class DataEventFilter : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 7 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DataEventFilter.Role = try { - Role( - RoleEventFilter.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DataEventFilter.Role = + try { + Role( + RoleEventFilter.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.DataEventFilter.Role, - ): Unit = try { - RoleEventFilter.write(writer, instance.roleEventFilter) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + RoleEventFilter.write(writer, instance.roleEventFilter) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -303,22 +327,24 @@ public sealed class DataEventFilter : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 8 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DataEventFilter.Configuration = try { - Configuration( - ConfigurationEventFilter.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DataEventFilter.Configuration = + try { + Configuration( + ConfigurationEventFilter.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.DataEventFilter.Configuration, - ): Unit = try { - ConfigurationEventFilter.write(writer, instance.configurationEventFilter) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + ConfigurationEventFilter.write(writer, instance.configurationEventFilter) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -335,43 +361,47 @@ public sealed class DataEventFilter : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 9 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DataEventFilter.Executor = try { - Executor( - ExecutorEventFilter.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DataEventFilter.Executor = + try { + Executor( + ExecutorEventFilter.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.DataEventFilter.Executor, - ): Unit = try { - ExecutorEventFilter.write(writer, instance.executorEventFilter) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + ExecutorEventFilter.write(writer, instance.executorEventFilter) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): DataEventFilter = when ( - val discriminant = - reader.readUByte() + override fun read(reader: ScaleCodecReader): DataEventFilter = + when (val discriminant = reader.readUByte()) { + 0 -> Any.read(reader) + 1 -> Peer.read(reader) + 2 -> Domain.read(reader) + 3 -> Account.read(reader) + 4 -> Asset.read(reader) + 5 -> AssetDefinition.read(reader) + 6 -> Trigger.read(reader) + 7 -> Role.read(reader) + 8 -> Configuration.read(reader) + 9 -> Executor.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: DataEventFilter, ) { - 0 -> Any.read(reader) - 1 -> Peer.read(reader) - 2 -> Domain.read(reader) - 3 -> Account.read(reader) - 4 -> Asset.read(reader) - 5 -> AssetDefinition.read(reader) - 6 -> Trigger.read(reader) - 7 -> Role.read(reader) - 8 -> Configuration.read(reader) - 9 -> Executor.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: DataEventFilter) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Any.write(writer, instance as Any) @@ -384,7 +414,8 @@ public sealed class DataEventFilter : ModelEnum { 7 -> Role.write(writer, instance as Role) 8 -> Configuration.write(writer, instance as Configuration) 9 -> Executor.write(writer, instance as Executor) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Domain.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Domain.kt index 98d99c95d..533455e46 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Domain.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Domain.kt @@ -22,24 +22,29 @@ public data class Domain( public val ownedBy: AccountId, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): Domain = try { - Domain( - DomainId.read(reader), - reader.readNullable(IpfsPath) as IpfsPath?, - Metadata.read(reader), - AccountId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): Domain = + try { + Domain( + DomainId.read(reader), + reader.readNullable(IpfsPath) as IpfsPath?, + Metadata.read(reader), + AccountId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: Domain): Unit = try { - DomainId.write(writer, instance.id) - writer.writeNullable(IpfsPath, instance.logo) - Metadata.write(writer, instance.metadata) - AccountId.write(writer, instance.ownedBy) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: Domain, + ): Unit = + try { + DomainId.write(writer, instance.id) + writer.writeNullable(IpfsPath, instance.logo) + Metadata.write(writer, instance.metadata) + AccountId.write(writer, instance.ownedBy) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainEvent.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainEvent.kt index 501d0a135..2002f55e6 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainEvent.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainEvent.kt @@ -36,22 +36,24 @@ public sealed class DomainEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DomainEvent.Created = try { - Created( - Domain.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DomainEvent.Created = + try { + Created( + Domain.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.DomainEvent.Created, - ): Unit = try { - Domain.write(writer, instance.domain) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + Domain.write(writer, instance.domain) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -68,22 +70,24 @@ public sealed class DomainEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DomainEvent.Deleted = try { - Deleted( - DomainId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DomainEvent.Deleted = + try { + Deleted( + DomainId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.DomainEvent.Deleted, - ): Unit = try { - DomainId.write(writer, instance.domainId) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + DomainId.write(writer, instance.domainId) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -100,22 +104,24 @@ public sealed class DomainEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 2 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DomainEvent.AssetDefinition = try { - AssetDefinition( - AssetDefinitionEvent.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DomainEvent.AssetDefinition = + try { + AssetDefinition( + AssetDefinitionEvent.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.DomainEvent.AssetDefinition, - ): Unit = try { - AssetDefinitionEvent.write(writer, instance.assetDefinitionEvent) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + AssetDefinitionEvent.write(writer, instance.assetDefinitionEvent) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -132,22 +138,24 @@ public sealed class DomainEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 3 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DomainEvent.Account = try { - Account( - AccountEvent.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DomainEvent.Account = + try { + Account( + AccountEvent.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.DomainEvent.Account, - ): Unit = try { - AccountEvent.write(writer, instance.accountEvent) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + AccountEvent.write(writer, instance.accountEvent) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -164,22 +172,24 @@ public sealed class DomainEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 4 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DomainEvent.MetadataInserted = try { - MetadataInserted( - MetadataChangedOfDomainId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DomainEvent.MetadataInserted = + try { + MetadataInserted( + MetadataChangedOfDomainId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.DomainEvent.MetadataInserted, - ): Unit = try { - MetadataChangedOfDomainId.write(writer, instance.metadataChangedOfDomainId) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + MetadataChangedOfDomainId.write(writer, instance.metadataChangedOfDomainId) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -196,22 +206,24 @@ public sealed class DomainEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 5 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DomainEvent.MetadataRemoved = try { - MetadataRemoved( - MetadataChangedOfDomainId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DomainEvent.MetadataRemoved = + try { + MetadataRemoved( + MetadataChangedOfDomainId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.DomainEvent.MetadataRemoved, - ): Unit = try { - MetadataChangedOfDomainId.write(writer, instance.metadataChangedOfDomainId) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + MetadataChangedOfDomainId.write(writer, instance.metadataChangedOfDomainId) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -228,40 +240,44 @@ public sealed class DomainEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 6 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DomainEvent.OwnerChanged = try { - OwnerChanged( - DomainOwnerChanged.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DomainEvent.OwnerChanged = + try { + OwnerChanged( + DomainOwnerChanged.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.DomainEvent.OwnerChanged, - ): Unit = try { - DomainOwnerChanged.write(writer, instance.domainOwnerChanged) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + DomainOwnerChanged.write(writer, instance.domainOwnerChanged) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): DomainEvent = when ( - val discriminant = - reader.readUByte() + override fun read(reader: ScaleCodecReader): DomainEvent = + when (val discriminant = reader.readUByte()) { + 0 -> Created.read(reader) + 1 -> Deleted.read(reader) + 2 -> AssetDefinition.read(reader) + 3 -> Account.read(reader) + 4 -> MetadataInserted.read(reader) + 5 -> MetadataRemoved.read(reader) + 6 -> OwnerChanged.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: DomainEvent, ) { - 0 -> Created.read(reader) - 1 -> Deleted.read(reader) - 2 -> AssetDefinition.read(reader) - 3 -> Account.read(reader) - 4 -> MetadataInserted.read(reader) - 5 -> MetadataRemoved.read(reader) - 6 -> OwnerChanged.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: DomainEvent) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Created.write(writer, instance as Created) @@ -271,7 +287,8 @@ public sealed class DomainEvent : ModelEnum { 4 -> MetadataInserted.write(writer, instance as MetadataInserted) 5 -> MetadataRemoved.write(writer, instance as MetadataRemoved) 6 -> OwnerChanged.write(writer, instance as OwnerChanged) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainEventFilter.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainEventFilter.kt index 4e3aac02d..c113755dc 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainEventFilter.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainEventFilter.kt @@ -21,20 +21,25 @@ public data class DomainEventFilter( public val eventSet: Long, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): DomainEventFilter = try { - DomainEventFilter( - reader.readNullable(DomainId) as DomainId?, - reader.readUint32(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): DomainEventFilter = + try { + DomainEventFilter( + reader.readNullable(DomainId) as DomainId?, + reader.readUint32(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: DomainEventFilter): Unit = try { - writer.writeNullable(DomainId, instance.idMatcher) - writer.writeUint32(instance.eventSet) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: DomainEventFilter, + ): Unit = + try { + writer.writeNullable(DomainId, instance.idMatcher) + writer.writeUint32(instance.eventSet) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainId.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainId.kt index 7735c2626..be7f67208 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainId.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainId.kt @@ -19,18 +19,23 @@ public data class DomainId( public val name: Name, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): DomainId = try { - DomainId( - Name.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): DomainId = + try { + DomainId( + Name.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: DomainId): Unit = try { - Name.write(writer, instance.name) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: DomainId, + ): Unit = + try { + Name.write(writer, instance.name) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainIdPredicateAtom.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainIdPredicateAtom.kt new file mode 100644 index 000000000..126332892 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainIdPredicateAtom.kt @@ -0,0 +1,78 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit + +/** + * DomainIdPredicateAtom + * + * Generated from 'DomainIdPredicateAtom' enum + */ +public sealed class DomainIdPredicateAtom : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Equals' variant + */ + public data class Equals( + public val domainId: DomainId, + ) : DomainIdPredicateAtom() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DomainIdPredicateAtom.Equals = + try { + Equals( + DomainId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.DomainIdPredicateAtom.Equals, + ): Unit = + try { + DomainId.write(writer, instance.domainId) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): DomainIdPredicateAtom = + when (val discriminant = reader.readUByte()) { + 0 -> Equals.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: DomainIdPredicateAtom, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Equals.write(writer, instance as Equals) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainIdPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainIdPredicateBox.kt deleted file mode 100644 index c0ddd21c5..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainIdPredicateBox.kt +++ /dev/null @@ -1,107 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.ModelEnum -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Int -import kotlin.Unit - -/** - * DomainIdPredicateBox - * - * Generated from 'DomainIdPredicateBox' enum - */ -public sealed class DomainIdPredicateBox : ModelEnum { - /** - * @return Discriminator of variant in enum - */ - public abstract fun discriminant(): Int - - /** - * 'Equals' variant - */ - public data class Equals( - public val domainId: DomainId, - ) : DomainIdPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 0 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DomainIdPredicateBox.Equals = try { - Equals( - DomainId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.DomainIdPredicateBox.Equals, - ): Unit = try { - DomainId.write(writer, instance.domainId) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Name' variant - */ - public data class Name( - public val stringPredicateBox: StringPredicateBox, - ) : DomainIdPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 1 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DomainIdPredicateBox.Name = try { - Name( - StringPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.DomainIdPredicateBox.Name, - ): Unit = try { - StringPredicateBox.write(writer, instance.stringPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): DomainIdPredicateBox = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Equals.read(reader) - 1 -> Name.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: DomainIdPredicateBox) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 0 -> Equals.write(writer, instance as Equals) - 1 -> Name.write(writer, instance as Name) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainIdProjectionOfPredicateMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainIdProjectionOfPredicateMarker.kt new file mode 100644 index 000000000..cc412d942 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainIdProjectionOfPredicateMarker.kt @@ -0,0 +1,116 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit + +/** + * DomainIdProjectionOfPredicateMarker + * + * Generated from 'DomainIdProjectionOfPredicateMarker' enum + */ +public sealed class DomainIdProjectionOfPredicateMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val domainIdPredicateAtom: DomainIdPredicateAtom, + ) : DomainIdProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DomainIdProjectionOfPredicateMarker.Atom = + try { + Atom( + DomainIdPredicateAtom.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.DomainIdProjectionOfPredicateMarker.Atom, + ): Unit = + try { + DomainIdPredicateAtom.write(writer, instance.domainIdPredicateAtom) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Name' variant + */ + public data class Name( + public val nameProjectionOfPredicateMarker: NameProjectionOfPredicateMarker, + ) : DomainIdProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DomainIdProjectionOfPredicateMarker.Name = + try { + Name( + NameProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.DomainIdProjectionOfPredicateMarker.Name, + ): Unit = + try { + NameProjectionOfPredicateMarker.write(writer, instance.nameProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): DomainIdProjectionOfPredicateMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Name.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: DomainIdProjectionOfPredicateMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Name.write(writer, instance as Name) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainIdProjectionOfSelectorMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainIdProjectionOfSelectorMarker.kt new file mode 100644 index 000000000..a84e1e3f2 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainIdProjectionOfSelectorMarker.kt @@ -0,0 +1,136 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Any +import kotlin.Boolean +import kotlin.Int +import kotlin.Unit + +/** + * DomainIdProjectionOfSelectorMarker + * + * Generated from 'DomainIdProjectionOfSelectorMarker' enum + */ +public sealed class DomainIdProjectionOfSelectorMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + override fun equals(other: Any?): Boolean = + when (this) { + is Atom -> Atom.equals(this, other) + else -> super.equals(other) + } + + override fun hashCode(): Int = + when (this) { + is Atom -> Atom.hashCode() + else -> super.hashCode() + } + + /** + * 'Atom' variant + */ + public class Atom : DomainIdProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DomainIdProjectionOfSelectorMarker.Atom = + try { + Atom() + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.DomainIdProjectionOfSelectorMarker.Atom, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.DomainIdProjectionOfSelectorMarker.Atom, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".DomainIdProjectionOfSelectorMarker.Atom".hashCode() + } + } + + /** + * 'Name' variant + */ + public data class Name( + public val nameProjectionOfSelectorMarker: NameProjectionOfSelectorMarker, + ) : DomainIdProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DomainIdProjectionOfSelectorMarker.Name = + try { + Name( + NameProjectionOfSelectorMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.DomainIdProjectionOfSelectorMarker.Name, + ): Unit = + try { + NameProjectionOfSelectorMarker.write(writer, instance.nameProjectionOfSelectorMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): DomainIdProjectionOfSelectorMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Name.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: DomainIdProjectionOfSelectorMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Name.write(writer, instance as Name) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainOwnerChanged.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainOwnerChanged.kt index c2d2afa71..fd12a6239 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainOwnerChanged.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainOwnerChanged.kt @@ -20,20 +20,25 @@ public data class DomainOwnerChanged( public val newOwner: AccountId, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): DomainOwnerChanged = try { - DomainOwnerChanged( - DomainId.read(reader), - AccountId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): DomainOwnerChanged = + try { + DomainOwnerChanged( + DomainId.read(reader), + AccountId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: DomainOwnerChanged): Unit = try { - DomainId.write(writer, instance.domain) - AccountId.write(writer, instance.newOwner) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: DomainOwnerChanged, + ): Unit = + try { + DomainId.write(writer, instance.domain) + AccountId.write(writer, instance.newOwner) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainPredicateAtom.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainPredicateAtom.kt new file mode 100644 index 000000000..26ce3e6c3 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainPredicateAtom.kt @@ -0,0 +1,40 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import kotlin.Int + +/** + * DomainPredicateAtom + * + * Generated from 'DomainPredicateAtom' enum + */ +public sealed class DomainPredicateAtom : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): DomainPredicateAtom = + when (val discriminant = reader.readUByte()) { + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: DomainPredicateAtom, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainPredicateBox.kt deleted file mode 100644 index 05141a1ba..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainPredicateBox.kt +++ /dev/null @@ -1,107 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.ModelEnum -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Int -import kotlin.Unit - -/** - * DomainPredicateBox - * - * Generated from 'DomainPredicateBox' enum - */ -public sealed class DomainPredicateBox : ModelEnum { - /** - * @return Discriminator of variant in enum - */ - public abstract fun discriminant(): Int - - /** - * 'Id' variant - */ - public data class Id( - public val domainIdPredicateBox: DomainIdPredicateBox, - ) : DomainPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 0 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DomainPredicateBox.Id = try { - Id( - DomainIdPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.DomainPredicateBox.Id, - ): Unit = try { - DomainIdPredicateBox.write(writer, instance.domainIdPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Metadata' variant - */ - public data class Metadata( - public val metadataPredicateBox: MetadataPredicateBox, - ) : DomainPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 1 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DomainPredicateBox.Metadata = try { - Metadata( - MetadataPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.DomainPredicateBox.Metadata, - ): Unit = try { - MetadataPredicateBox.write(writer, instance.metadataPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): DomainPredicateBox = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Id.read(reader) - 1 -> Metadata.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: DomainPredicateBox) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 0 -> Id.write(writer, instance as Id) - 1 -> Metadata.write(writer, instance as Metadata) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainProjectionOfPredicateMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainProjectionOfPredicateMarker.kt new file mode 100644 index 000000000..9f8c72adf --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainProjectionOfPredicateMarker.kt @@ -0,0 +1,152 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit + +/** + * DomainProjectionOfPredicateMarker + * + * Generated from 'DomainProjectionOfPredicateMarker' enum + */ +public sealed class DomainProjectionOfPredicateMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val domainPredicateAtom: DomainPredicateAtom, + ) : DomainProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DomainProjectionOfPredicateMarker.Atom = + try { + Atom( + DomainPredicateAtom.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.DomainProjectionOfPredicateMarker.Atom, + ): Unit = + try { + DomainPredicateAtom.write(writer, instance.domainPredicateAtom) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Id' variant + */ + public data class Id( + public val domainIdProjectionOfPredicateMarker: DomainIdProjectionOfPredicateMarker, + ) : DomainProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DomainProjectionOfPredicateMarker.Id = + try { + Id( + DomainIdProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.DomainProjectionOfPredicateMarker.Id, + ): Unit = + try { + DomainIdProjectionOfPredicateMarker.write(writer, instance.domainIdProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Metadata' variant + */ + public data class Metadata( + public val metadataProjectionOfPredicateMarker: MetadataProjectionOfPredicateMarker, + ) : DomainProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 2 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DomainProjectionOfPredicateMarker.Metadata = + try { + Metadata( + MetadataProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.DomainProjectionOfPredicateMarker.Metadata, + ): Unit = + try { + MetadataProjectionOfPredicateMarker.write(writer, instance.metadataProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): DomainProjectionOfPredicateMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Id.read(reader) + 2 -> Metadata.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: DomainProjectionOfPredicateMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Id.write(writer, instance as Id) + 2 -> Metadata.write(writer, instance as Metadata) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainProjectionOfSelectorMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainProjectionOfSelectorMarker.kt new file mode 100644 index 000000000..04b1062b3 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/DomainProjectionOfSelectorMarker.kt @@ -0,0 +1,172 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Any +import kotlin.Boolean +import kotlin.Int +import kotlin.Unit + +/** + * DomainProjectionOfSelectorMarker + * + * Generated from 'DomainProjectionOfSelectorMarker' enum + */ +public sealed class DomainProjectionOfSelectorMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + override fun equals(other: Any?): Boolean = + when (this) { + is Atom -> Atom.equals(this, other) + else -> super.equals(other) + } + + override fun hashCode(): Int = + when (this) { + is Atom -> Atom.hashCode() + else -> super.hashCode() + } + + /** + * 'Atom' variant + */ + public class Atom : DomainProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DomainProjectionOfSelectorMarker.Atom = + try { + Atom() + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.DomainProjectionOfSelectorMarker.Atom, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.DomainProjectionOfSelectorMarker.Atom, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".DomainProjectionOfSelectorMarker.Atom".hashCode() + } + } + + /** + * 'Id' variant + */ + public data class Id( + public val domainIdProjectionOfSelectorMarker: DomainIdProjectionOfSelectorMarker, + ) : DomainProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DomainProjectionOfSelectorMarker.Id = + try { + Id( + DomainIdProjectionOfSelectorMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.DomainProjectionOfSelectorMarker.Id, + ): Unit = + try { + DomainIdProjectionOfSelectorMarker.write(writer, instance.domainIdProjectionOfSelectorMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Metadata' variant + */ + public data class Metadata( + public val metadataProjectionOfSelectorMarker: MetadataProjectionOfSelectorMarker, + ) : DomainProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 2 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.DomainProjectionOfSelectorMarker.Metadata = + try { + Metadata( + MetadataProjectionOfSelectorMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.DomainProjectionOfSelectorMarker.Metadata, + ): Unit = + try { + MetadataProjectionOfSelectorMarker.write(writer, instance.metadataProjectionOfSelectorMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): DomainProjectionOfSelectorMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Id.read(reader) + 2 -> Metadata.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: DomainProjectionOfSelectorMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Id.write(writer, instance as Id) + 2 -> Metadata.write(writer, instance as Metadata) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/EventBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/EventBox.kt index 4f24e6a5f..18728162a 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/EventBox.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/EventBox.kt @@ -36,22 +36,24 @@ public sealed class EventBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.EventBox.Pipeline = try { - Pipeline( - PipelineEventBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.EventBox.Pipeline = + try { + Pipeline( + PipelineEventBox.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.EventBox.Pipeline, - ): Unit = try { - PipelineEventBox.write(writer, instance.pipelineEventBox) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + PipelineEventBox.write(writer, instance.pipelineEventBox) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -80,11 +82,12 @@ public sealed class EventBox : ModelEnum { override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.EventBox.Data, - ): Unit = try { - DataEvent.write(writer, instance.dataEvent) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + DataEvent.write(writer, instance.dataEvent) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -113,11 +116,12 @@ public sealed class EventBox : ModelEnum { override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.EventBox.Time, - ): Unit = try { - TimeEvent.write(writer, instance.timeEvent) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + TimeEvent.write(writer, instance.timeEvent) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -134,22 +138,24 @@ public sealed class EventBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 3 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.EventBox.ExecuteTrigger = try { - ExecuteTrigger( - ExecuteTriggerEvent.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.EventBox.ExecuteTrigger = + try { + ExecuteTrigger( + ExecuteTriggerEvent.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.EventBox.ExecuteTrigger, - ): Unit = try { - ExecuteTriggerEvent.write(writer, instance.executeTriggerEvent) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + ExecuteTriggerEvent.write(writer, instance.executeTriggerEvent) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -166,38 +172,42 @@ public sealed class EventBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 4 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.EventBox.TriggerCompleted = try { - TriggerCompleted( - TriggerCompletedEvent.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.EventBox.TriggerCompleted = + try { + TriggerCompleted( + TriggerCompletedEvent.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.EventBox.TriggerCompleted, - ): Unit = try { - TriggerCompletedEvent.write(writer, instance.triggerCompletedEvent) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + TriggerCompletedEvent.write(writer, instance.triggerCompletedEvent) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): EventBox = when ( - val discriminant = - reader.readUByte() + override fun read(reader: ScaleCodecReader): EventBox = + when (val discriminant = reader.readUByte()) { + 0 -> Pipeline.read(reader) + 1 -> Data.read(reader) + 2 -> Time.read(reader) + 3 -> ExecuteTrigger.read(reader) + 4 -> TriggerCompleted.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: EventBox, ) { - 0 -> Pipeline.read(reader) - 1 -> Data.read(reader) - 2 -> Time.read(reader) - 3 -> ExecuteTrigger.read(reader) - 4 -> TriggerCompleted.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: EventBox) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Pipeline.write(writer, instance as Pipeline) @@ -205,7 +215,8 @@ public sealed class EventBox : ModelEnum { 2 -> Time.write(writer, instance as Time) 3 -> ExecuteTrigger.write(writer, instance as ExecuteTrigger) 4 -> TriggerCompleted.write(writer, instance as TriggerCompleted) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/EventFilterBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/EventFilterBox.kt index 0f0eebbb7..4879e3642 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/EventFilterBox.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/EventFilterBox.kt @@ -36,22 +36,24 @@ public sealed class EventFilterBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.EventFilterBox.Pipeline = try { - Pipeline( - PipelineEventFilterBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.EventFilterBox.Pipeline = + try { + Pipeline( + PipelineEventFilterBox.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.EventFilterBox.Pipeline, - ): Unit = try { - PipelineEventFilterBox.write(writer, instance.pipelineEventFilterBox) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + PipelineEventFilterBox.write(writer, instance.pipelineEventFilterBox) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -68,22 +70,24 @@ public sealed class EventFilterBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.EventFilterBox.Data = try { - Data( - DataEventFilter.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.EventFilterBox.Data = + try { + Data( + DataEventFilter.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.EventFilterBox.Data, - ): Unit = try { - DataEventFilter.write(writer, instance.dataEventFilter) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + DataEventFilter.write(writer, instance.dataEventFilter) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -100,22 +104,24 @@ public sealed class EventFilterBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 2 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.EventFilterBox.Time = try { - Time( - TimeEventFilter.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.EventFilterBox.Time = + try { + Time( + TimeEventFilter.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.EventFilterBox.Time, - ): Unit = try { - TimeEventFilter.write(writer, instance.timeEventFilter) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + TimeEventFilter.write(writer, instance.timeEventFilter) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -132,22 +138,24 @@ public sealed class EventFilterBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 3 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.EventFilterBox.ExecuteTrigger = try { - ExecuteTrigger( - ExecuteTriggerEventFilter.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.EventFilterBox.ExecuteTrigger = + try { + ExecuteTrigger( + ExecuteTriggerEventFilter.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.EventFilterBox.ExecuteTrigger, - ): Unit = try { - ExecuteTriggerEventFilter.write(writer, instance.executeTriggerEventFilter) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + ExecuteTriggerEventFilter.write(writer, instance.executeTriggerEventFilter) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -164,38 +172,42 @@ public sealed class EventFilterBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 4 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.EventFilterBox.TriggerCompleted = try { - TriggerCompleted( - TriggerCompletedEventFilter.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.EventFilterBox.TriggerCompleted = + try { + TriggerCompleted( + TriggerCompletedEventFilter.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.EventFilterBox.TriggerCompleted, - ): Unit = try { - TriggerCompletedEventFilter.write(writer, instance.triggerCompletedEventFilter) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + TriggerCompletedEventFilter.write(writer, instance.triggerCompletedEventFilter) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): EventFilterBox = when ( - val discriminant = - reader.readUByte() + override fun read(reader: ScaleCodecReader): EventFilterBox = + when (val discriminant = reader.readUByte()) { + 0 -> Pipeline.read(reader) + 1 -> Data.read(reader) + 2 -> Time.read(reader) + 3 -> ExecuteTrigger.read(reader) + 4 -> TriggerCompleted.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: EventFilterBox, ) { - 0 -> Pipeline.read(reader) - 1 -> Data.read(reader) - 2 -> Time.read(reader) - 3 -> ExecuteTrigger.read(reader) - 4 -> TriggerCompleted.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: EventFilterBox) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Pipeline.write(writer, instance as Pipeline) @@ -203,7 +215,8 @@ public sealed class EventFilterBox : ModelEnum { 2 -> Time.write(writer, instance as Time) 3 -> ExecuteTrigger.write(writer, instance as ExecuteTrigger) 4 -> TriggerCompleted.write(writer, instance as TriggerCompleted) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/EventMessage.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/EventMessage.kt index 242f01359..aa048839e 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/EventMessage.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/EventMessage.kt @@ -19,18 +19,23 @@ public data class EventMessage( public val eventBox: EventBox, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): EventMessage = try { - EventMessage( - EventBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): EventMessage = + try { + EventMessage( + EventBox.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: EventMessage): Unit = try { - EventBox.write(writer, instance.eventBox) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: EventMessage, + ): Unit = + try { + EventBox.write(writer, instance.eventBox) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/EventSubscriptionRequest.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/EventSubscriptionRequest.kt index 2f1050cbb..71571c84d 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/EventSubscriptionRequest.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/EventSubscriptionRequest.kt @@ -22,21 +22,26 @@ public data class EventSubscriptionRequest( public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): EventSubscriptionRequest = try { - EventSubscriptionRequest( - reader.readVec(reader.readCompactInt()) { EventFilterBox.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): EventSubscriptionRequest = + try { + EventSubscriptionRequest( + reader.readVec(reader.readCompactInt()) { EventFilterBox.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: EventSubscriptionRequest): Unit = try { - writer.writeCompact(instance.vecOfEventFilterBox.size) - instance.vecOfEventFilterBox.forEach { value -> - EventFilterBox.write(writer, value) + override fun write( + writer: ScaleCodecWriter, + instance: EventSubscriptionRequest, + ): Unit = + try { + writer.writeCompact(instance.vecOfEventFilterBox.size) + instance.vecOfEventFilterBox.forEach { value -> + EventFilterBox.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) } - } catch (ex: Exception) { - throw wrapException(ex) - } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Executable.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Executable.kt index db40f7a1f..4a41e8191 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Executable.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Executable.kt @@ -37,25 +37,27 @@ public sealed class Executable : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.Executable.Instructions = try { - Instructions( - reader.readVec(reader.readCompactInt()) { InstructionBox.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.Executable.Instructions = + try { + Instructions( + reader.readVec(reader.readCompactInt()) { InstructionBox.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.Executable.Instructions, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - InstructionBox.write(writer, value) + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + InstructionBox.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) } - } catch (ex: Exception) { - throw wrapException(ex) - } } } @@ -72,40 +74,45 @@ public sealed class Executable : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.Executable.Wasm = try { - Wasm( - WasmSmartContract.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.Executable.Wasm = + try { + Wasm( + WasmSmartContract.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.Executable.Wasm, - ): Unit = try { - WasmSmartContract.write(writer, instance.wasmSmartContract) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + WasmSmartContract.write(writer, instance.wasmSmartContract) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): Executable = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Instructions.read(reader) - 1 -> Wasm.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + override fun read(reader: ScaleCodecReader): Executable = + when (val discriminant = reader.readUByte()) { + 0 -> Instructions.read(reader) + 1 -> Wasm.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: Executable) { + override fun write( + writer: ScaleCodecWriter, + instance: Executable, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Instructions.write(writer, instance as Instructions) 1 -> Wasm.write(writer, instance as Wasm) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ExecuteTrigger.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ExecuteTrigger.kt index a82b9d03d..f323826ad 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ExecuteTrigger.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ExecuteTrigger.kt @@ -3,12 +3,14 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException -import kotlin.String import kotlin.Unit /** @@ -18,23 +20,30 @@ import kotlin.Unit */ public data class ExecuteTrigger( public val trigger: TriggerId, - public val args: String? = null, -) { + public val args: Json, +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): ExecuteTrigger = try { - ExecuteTrigger( - TriggerId.read(reader), - reader.readNullable(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): ExecuteTrigger = + try { + ExecuteTrigger( + TriggerId.read(reader), + Json.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: ExecuteTrigger): Unit = try { - TriggerId.write(writer, instance.trigger) - writer.writeNullable(instance.args) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: ExecuteTrigger, + ): Unit = + try { + TriggerId.write(writer, instance.trigger) + Json.write(writer, instance.args) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ExecuteTriggerEvent.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ExecuteTriggerEvent.kt index bacfbf0ab..f30babb64 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ExecuteTriggerEvent.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ExecuteTriggerEvent.kt @@ -8,7 +8,6 @@ import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter import jp.co.soramitsu.iroha2.wrapException -import kotlin.String import kotlin.Unit /** @@ -19,25 +18,30 @@ import kotlin.Unit public data class ExecuteTriggerEvent( public val triggerId: TriggerId, public val authority: AccountId, - public val args: String? = null, + public val args: Json, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): ExecuteTriggerEvent = try { - ExecuteTriggerEvent( - TriggerId.read(reader), - AccountId.read(reader), - reader.readNullable(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): ExecuteTriggerEvent = + try { + ExecuteTriggerEvent( + TriggerId.read(reader), + AccountId.read(reader), + Json.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: ExecuteTriggerEvent): Unit = try { - TriggerId.write(writer, instance.triggerId) - AccountId.write(writer, instance.authority) - writer.writeNullable(instance.args) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: ExecuteTriggerEvent, + ): Unit = + try { + TriggerId.write(writer, instance.triggerId) + AccountId.write(writer, instance.authority) + Json.write(writer, instance.args) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ExecuteTriggerEventFilter.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ExecuteTriggerEventFilter.kt index 0f0e6881d..2c0782ae3 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ExecuteTriggerEventFilter.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ExecuteTriggerEventFilter.kt @@ -22,20 +22,25 @@ public data class ExecuteTriggerEventFilter( public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): ExecuteTriggerEventFilter = try { - ExecuteTriggerEventFilter( - reader.readNullable(TriggerId) as TriggerId?, - reader.readNullable(AccountId) as AccountId?, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): ExecuteTriggerEventFilter = + try { + ExecuteTriggerEventFilter( + reader.readNullable(TriggerId) as TriggerId?, + reader.readNullable(AccountId) as AccountId?, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: ExecuteTriggerEventFilter): Unit = try { - writer.writeNullable(TriggerId, instance.triggerId) - writer.writeNullable(AccountId, instance.authority) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: ExecuteTriggerEventFilter, + ): Unit = + try { + writer.writeNullable(TriggerId, instance.triggerId) + writer.writeNullable(AccountId, instance.authority) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ExecutionTime.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ExecutionTime.kt index d3b552867..d329dd531 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ExecutionTime.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ExecutionTime.kt @@ -25,13 +25,17 @@ public sealed class ExecutionTime : ModelEnum { */ public abstract fun discriminant(): Int - override fun equals(other: Any?): Boolean = when (this) { - is PreCommit -> PreCommit.equals(this, other) - else -> super.equals(other) } + override fun equals(other: Any?): Boolean = + when (this) { + is PreCommit -> PreCommit.equals(this, other) + else -> super.equals(other) + } - override fun hashCode(): Int = when (this) { - is PreCommit -> PreCommit.hashCode() - else -> super.hashCode() } + override fun hashCode(): Int = + when (this) { + is PreCommit -> PreCommit.hashCode() + else -> super.hashCode() + } /** * 'PreCommit' variant @@ -44,24 +48,30 @@ public sealed class ExecutionTime : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.ExecutionTime.PreCommit = try { - PreCommit() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.ExecutionTime.PreCommit = + try { + PreCommit() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.ExecutionTime.PreCommit, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } - - public fun equals(o1: jp.co.soramitsu.iroha2.generated.ExecutionTime.PreCommit, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.ExecutionTime.PreCommit, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".ExecutionTime.PreCommit".hashCode() } @@ -80,40 +90,47 @@ public sealed class ExecutionTime : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.ExecutionTime.Schedule = try { - Schedule( - jp.co.soramitsu.iroha2.generated.Schedule.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.ExecutionTime.Schedule = + try { + Schedule( + jp.co.soramitsu.iroha2.generated.Schedule + .read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.ExecutionTime.Schedule, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.Schedule.write(writer, instance.schedule) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + jp.co.soramitsu.iroha2.generated.Schedule + .write(writer, instance.schedule) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): ExecutionTime = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> PreCommit.read(reader) - 1 -> Schedule.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + override fun read(reader: ScaleCodecReader): ExecutionTime = + when (val discriminant = reader.readUByte()) { + 0 -> PreCommit.read(reader) + 1 -> Schedule.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: ExecutionTime) { + override fun write( + writer: ScaleCodecWriter, + instance: ExecutionTime, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> PreCommit.write(writer, instance as PreCommit) 1 -> Schedule.write(writer, instance as Schedule) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Executor.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Executor.kt index a436cc11b..954db47a3 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Executor.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Executor.kt @@ -19,18 +19,23 @@ public data class Executor( public val wasm: WasmSmartContract, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): Executor = try { - Executor( - WasmSmartContract.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): Executor = + try { + Executor( + WasmSmartContract.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: Executor): Unit = try { - WasmSmartContract.write(writer, instance.wasm) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: Executor, + ): Unit = + try { + WasmSmartContract.write(writer, instance.wasm) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ExecutorDataModel.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ExecutorDataModel.kt index d0dc37429..2d562e9b2 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ExecutorDataModel.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ExecutorDataModel.kt @@ -23,47 +23,51 @@ public data class ExecutorDataModel( public val parameters: Map, public val instructions: List, public val permissions: List, - public val schema: String, + public val schema: Json, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): ExecutorDataModel = try { - ExecutorDataModel( - reader.readMap( - reader.readCompactInt(), - { CustomParameterId.read(reader) }, - { CustomParameter.read(reader) }, - ), - reader.readVec(reader.readCompactInt()) { reader.readString() }, - reader.readVec(reader.readCompactInt()) { reader.readString() }, - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: ExecutorDataModel): Unit = try { - writer.writeCompact(instance.parameters.size) - instance.parameters.toSortedMap( - CustomParameterId.comparator(), - ).forEach { (key, value) -> - CustomParameterId.write(writer, key) - CustomParameter.write(writer, value) - } - writer.writeCompact(instance.instructions.size) - instance.instructions.sortedWith( - String.comparator(), - ).forEach { value -> - writer.writeAsList(value.toByteArray(Charsets.UTF_8)) + override fun read(reader: ScaleCodecReader): ExecutorDataModel = + try { + ExecutorDataModel( + reader.readMap(reader.readCompactInt(), { CustomParameterId.read(reader) }, { CustomParameter.read(reader) }), + reader.readVec(reader.readCompactInt()) { reader.readString() }, + reader.readVec(reader.readCompactInt()) { reader.readString() }, + Json.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) } - writer.writeCompact(instance.permissions.size) - instance.permissions.sortedWith( - String.comparator(), - ).forEach { value -> - writer.writeAsList(value.toByteArray(Charsets.UTF_8)) + + override fun write( + writer: ScaleCodecWriter, + instance: ExecutorDataModel, + ): Unit = + try { + writer.writeCompact(instance.parameters.size) + instance.parameters + .toSortedMap( + CustomParameterId.comparator(), + ).forEach { (key, value) -> + CustomParameterId.write(writer, key) + CustomParameter.write(writer, value) + } + writer.writeCompact(instance.instructions.size) + instance.instructions + .sortedWith( + String.comparator(), + ).forEach { value -> + writer.writeAsList(value.toByteArray(Charsets.UTF_8)) + } + writer.writeCompact(instance.permissions.size) + instance.permissions + .sortedWith( + String.comparator(), + ).forEach { value -> + writer.writeAsList(value.toByteArray(Charsets.UTF_8)) + } + Json.write(writer, instance.schema) + } catch (ex: Exception) { + throw wrapException(ex) } - writer.writeAsList(instance.schema.toByteArray(Charsets.UTF_8)) - } catch (ex: Exception) { - throw wrapException(ex) - } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ExecutorEvent.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ExecutorEvent.kt index e7fb9bd45..61866ad27 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ExecutorEvent.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ExecutorEvent.kt @@ -36,38 +36,43 @@ public sealed class ExecutorEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.ExecutorEvent.Upgraded = try { - Upgraded( - ExecutorUpgrade.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.ExecutorEvent.Upgraded = + try { + Upgraded( + ExecutorUpgrade.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.ExecutorEvent.Upgraded, - ): Unit = try { - ExecutorUpgrade.write(writer, instance.executorUpgrade) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + ExecutorUpgrade.write(writer, instance.executorUpgrade) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): ExecutorEvent = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Upgraded.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + override fun read(reader: ScaleCodecReader): ExecutorEvent = + when (val discriminant = reader.readUByte()) { + 0 -> Upgraded.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: ExecutorEvent) { + override fun write( + writer: ScaleCodecWriter, + instance: ExecutorEvent, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Upgraded.write(writer, instance as Upgraded) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ExecutorEventFilter.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ExecutorEventFilter.kt index 0f92ede73..a05099e85 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ExecutorEventFilter.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ExecutorEventFilter.kt @@ -20,18 +20,23 @@ public data class ExecutorEventFilter( public val eventSet: Long, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): ExecutorEventFilter = try { - ExecutorEventFilter( - reader.readUint32(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): ExecutorEventFilter = + try { + ExecutorEventFilter( + reader.readUint32(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: ExecutorEventFilter): Unit = try { - writer.writeUint32(instance.eventSet) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: ExecutorEventFilter, + ): Unit = + try { + writer.writeUint32(instance.eventSet) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ExecutorUpgrade.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ExecutorUpgrade.kt index 5e08b9b56..772e709de 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ExecutorUpgrade.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ExecutorUpgrade.kt @@ -19,18 +19,23 @@ public data class ExecutorUpgrade( public val newDataModel: ExecutorDataModel, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): ExecutorUpgrade = try { - ExecutorUpgrade( - ExecutorDataModel.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): ExecutorUpgrade = + try { + ExecutorUpgrade( + ExecutorDataModel.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: ExecutorUpgrade): Unit = try { - ExecutorDataModel.write(writer, instance.newDataModel) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: ExecutorUpgrade, + ): Unit = + try { + ExecutorDataModel.write(writer, instance.newDataModel) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FetchSize.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FetchSize.kt index 7883f4fc5..f037c4d4d 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FetchSize.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FetchSize.kt @@ -16,21 +16,26 @@ import kotlin.Unit * Generated from 'FetchSize' regular structure */ public data class FetchSize( - public val fetchSize: NonZeroOfu32? = null, + public val fetchSize: NonZeroOfu64? = null, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FetchSize = try { - FetchSize( - reader.readNullable(NonZeroOfu32) as NonZeroOfu32?, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): FetchSize = + try { + FetchSize( + reader.readNullable(NonZeroOfu64) as NonZeroOfu64?, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: FetchSize): Unit = try { - writer.writeNullable(NonZeroOfu32, instance.fetchSize) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: FetchSize, + ): Unit = + try { + writer.writeNullable(NonZeroOfu64, instance.fetchSize) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAccountById.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAccountById.kt deleted file mode 100644 index 684034e0a..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAccountById.kt +++ /dev/null @@ -1,36 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * FindAccountById - * - * Generated from 'FindAccountById' regular structure - */ -public data class FindAccountById( - public val id: AccountId, -) { - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindAccountById = try { - FindAccountById( - AccountId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: FindAccountById): Unit = try { - AccountId.write(writer, instance.id) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAccountKeyValueByIdAndKey.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAccountKeyValueByIdAndKey.kt deleted file mode 100644 index 3ec7ba137..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAccountKeyValueByIdAndKey.kt +++ /dev/null @@ -1,42 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * FindAccountKeyValueByIdAndKey - * - * Generated from 'FindAccountKeyValueByIdAndKey' regular structure - */ -public data class FindAccountKeyValueByIdAndKey( - public val id: AccountId, - public val key: Name, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): FindAccountKeyValueByIdAndKey = try { - FindAccountKeyValueByIdAndKey( - AccountId.read(reader), - Name.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: FindAccountKeyValueByIdAndKey): Unit = - try { - AccountId.write(writer, instance.id) - Name.write(writer, instance.key) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAccountMetadata.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAccountMetadata.kt index 42c47d23c..8546f0aa1 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAccountMetadata.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAccountMetadata.kt @@ -20,20 +20,25 @@ public data class FindAccountMetadata( public val key: Name, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindAccountMetadata = try { - FindAccountMetadata( - AccountId.read(reader), - Name.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): FindAccountMetadata = + try { + FindAccountMetadata( + AccountId.read(reader), + Name.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: FindAccountMetadata): Unit = try { - AccountId.write(writer, instance.id) - Name.write(writer, instance.key) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: FindAccountMetadata, + ): Unit = + try { + AccountId.write(writer, instance.id) + Name.write(writer, instance.key) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAccounts.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAccounts.kt index f497845e5..41b5b3289 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAccounts.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAccounts.kt @@ -16,25 +16,34 @@ import kotlin.Unit /** * FindAccounts * - * Generated from 'FindAccounts' regular structure + * Generated from 'FindAccounts' tuple structure */ public class FindAccounts { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindAccounts = try { - FindAccounts() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): FindAccounts = + try { + FindAccounts() + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: FindAccounts): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: FindAccounts, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: FindAccounts, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: FindAccounts, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".FindAccounts".hashCode() } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAccountsByDomainId.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAccountsByDomainId.kt deleted file mode 100644 index 9a6a49a13..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAccountsByDomainId.kt +++ /dev/null @@ -1,36 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * FindAccountsByDomainId - * - * Generated from 'FindAccountsByDomainId' regular structure - */ -public data class FindAccountsByDomainId( - public val domain: DomainId, -) { - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindAccountsByDomainId = try { - FindAccountsByDomainId( - DomainId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: FindAccountsByDomainId): Unit = try { - DomainId.write(writer, instance.domain) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAccountsWithAsset.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAccountsWithAsset.kt index e22c8b519..b6aefc0e8 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAccountsWithAsset.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAccountsWithAsset.kt @@ -19,18 +19,23 @@ public data class FindAccountsWithAsset( public val assetDefinition: AssetDefinitionId, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindAccountsWithAsset = try { - FindAccountsWithAsset( - AssetDefinitionId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): FindAccountsWithAsset = + try { + FindAccountsWithAsset( + AssetDefinitionId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: FindAccountsWithAsset): Unit = try { - AssetDefinitionId.write(writer, instance.assetDefinition) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: FindAccountsWithAsset, + ): Unit = + try { + AssetDefinitionId.write(writer, instance.assetDefinition) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindActiveTriggerIds.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindActiveTriggerIds.kt index 4c9688a10..fb848d073 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindActiveTriggerIds.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindActiveTriggerIds.kt @@ -16,25 +16,34 @@ import kotlin.Unit /** * FindActiveTriggerIds * - * Generated from 'FindActiveTriggerIds' regular structure + * Generated from 'FindActiveTriggerIds' tuple structure */ public class FindActiveTriggerIds { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindActiveTriggerIds = try { - FindActiveTriggerIds() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): FindActiveTriggerIds = + try { + FindActiveTriggerIds() + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: FindActiveTriggerIds): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: FindActiveTriggerIds, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: FindActiveTriggerIds, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: FindActiveTriggerIds, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".FindActiveTriggerIds".hashCode() } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllAccounts.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllAccounts.kt deleted file mode 100644 index 481567b5e..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllAccounts.kt +++ /dev/null @@ -1,41 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Any -import kotlin.Boolean -import kotlin.Int -import kotlin.Unit - -/** - * FindAllAccounts - * - * Generated from 'FindAllAccounts' regular structure - */ -public class FindAllAccounts { - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindAllAccounts = try { - FindAllAccounts() - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: FindAllAccounts): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } - - public fun equals(o1: FindAllAccounts, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } - - override fun hashCode(): Int = ".FindAllAccounts".hashCode() - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllActiveTriggerIds.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllActiveTriggerIds.kt deleted file mode 100644 index 03ba4fa3c..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllActiveTriggerIds.kt +++ /dev/null @@ -1,43 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Any -import kotlin.Boolean -import kotlin.Int -import kotlin.Unit - -/** - * FindAllActiveTriggerIds - * - * Generated from 'FindAllActiveTriggerIds' regular structure - */ -public class FindAllActiveTriggerIds { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): FindAllActiveTriggerIds = try { - FindAllActiveTriggerIds() - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: FindAllActiveTriggerIds): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } - - public fun equals(o1: FindAllActiveTriggerIds, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } - - override fun hashCode(): Int = ".FindAllActiveTriggerIds".hashCode() - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllAssets.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllAssets.kt deleted file mode 100644 index 025e17006..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllAssets.kt +++ /dev/null @@ -1,41 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Any -import kotlin.Boolean -import kotlin.Int -import kotlin.Unit - -/** - * FindAllAssets - * - * Generated from 'FindAllAssets' regular structure - */ -public class FindAllAssets { - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindAllAssets = try { - FindAllAssets() - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: FindAllAssets): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } - - public fun equals(o1: FindAllAssets, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } - - override fun hashCode(): Int = ".FindAllAssets".hashCode() - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllAssetsDefinitions.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllAssetsDefinitions.kt deleted file mode 100644 index 7327a6e9f..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllAssetsDefinitions.kt +++ /dev/null @@ -1,43 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Any -import kotlin.Boolean -import kotlin.Int -import kotlin.Unit - -/** - * FindAllAssetsDefinitions - * - * Generated from 'FindAllAssetsDefinitions' regular structure - */ -public class FindAllAssetsDefinitions { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): FindAllAssetsDefinitions = try { - FindAllAssetsDefinitions() - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: FindAllAssetsDefinitions): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } - - public fun equals(o1: FindAllAssetsDefinitions, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } - - override fun hashCode(): Int = ".FindAllAssetsDefinitions".hashCode() - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllBlockHeaders.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllBlockHeaders.kt deleted file mode 100644 index 120b7eddb..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllBlockHeaders.kt +++ /dev/null @@ -1,41 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Any -import kotlin.Boolean -import kotlin.Int -import kotlin.Unit - -/** - * FindAllBlockHeaders - * - * Generated from 'FindAllBlockHeaders' regular structure - */ -public class FindAllBlockHeaders { - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindAllBlockHeaders = try { - FindAllBlockHeaders() - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: FindAllBlockHeaders): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } - - public fun equals(o1: FindAllBlockHeaders, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } - - override fun hashCode(): Int = ".FindAllBlockHeaders".hashCode() - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllBlocks.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllBlocks.kt deleted file mode 100644 index 1ce79fa0d..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllBlocks.kt +++ /dev/null @@ -1,41 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Any -import kotlin.Boolean -import kotlin.Int -import kotlin.Unit - -/** - * FindAllBlocks - * - * Generated from 'FindAllBlocks' regular structure - */ -public class FindAllBlocks { - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindAllBlocks = try { - FindAllBlocks() - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: FindAllBlocks): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } - - public fun equals(o1: FindAllBlocks, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } - - override fun hashCode(): Int = ".FindAllBlocks".hashCode() - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllDomains.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllDomains.kt deleted file mode 100644 index 0e1b0ade0..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllDomains.kt +++ /dev/null @@ -1,41 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Any -import kotlin.Boolean -import kotlin.Int -import kotlin.Unit - -/** - * FindAllDomains - * - * Generated from 'FindAllDomains' regular structure - */ -public class FindAllDomains { - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindAllDomains = try { - FindAllDomains() - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: FindAllDomains): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } - - public fun equals(o1: FindAllDomains, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } - - override fun hashCode(): Int = ".FindAllDomains".hashCode() - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllParameters.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllParameters.kt deleted file mode 100644 index 3cbf81082..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllParameters.kt +++ /dev/null @@ -1,41 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Any -import kotlin.Boolean -import kotlin.Int -import kotlin.Unit - -/** - * FindAllParameters - * - * Generated from 'FindAllParameters' regular structure - */ -public class FindAllParameters { - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindAllParameters = try { - FindAllParameters() - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: FindAllParameters): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } - - public fun equals(o1: FindAllParameters, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } - - override fun hashCode(): Int = ".FindAllParameters".hashCode() - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllPeers.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllPeers.kt deleted file mode 100644 index 71db6836f..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllPeers.kt +++ /dev/null @@ -1,41 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Any -import kotlin.Boolean -import kotlin.Int -import kotlin.Unit - -/** - * FindAllPeers - * - * Generated from 'FindAllPeers' regular structure - */ -public class FindAllPeers { - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindAllPeers = try { - FindAllPeers() - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: FindAllPeers): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } - - public fun equals(o1: FindAllPeers, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } - - override fun hashCode(): Int = ".FindAllPeers".hashCode() - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllRoleIds.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllRoleIds.kt deleted file mode 100644 index c964d9ab4..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllRoleIds.kt +++ /dev/null @@ -1,41 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Any -import kotlin.Boolean -import kotlin.Int -import kotlin.Unit - -/** - * FindAllRoleIds - * - * Generated from 'FindAllRoleIds' regular structure - */ -public class FindAllRoleIds { - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindAllRoleIds = try { - FindAllRoleIds() - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: FindAllRoleIds): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } - - public fun equals(o1: FindAllRoleIds, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } - - override fun hashCode(): Int = ".FindAllRoleIds".hashCode() - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllRoles.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllRoles.kt deleted file mode 100644 index d8adbbec7..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllRoles.kt +++ /dev/null @@ -1,41 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Any -import kotlin.Boolean -import kotlin.Int -import kotlin.Unit - -/** - * FindAllRoles - * - * Generated from 'FindAllRoles' regular structure - */ -public class FindAllRoles { - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindAllRoles = try { - FindAllRoles() - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: FindAllRoles): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } - - public fun equals(o1: FindAllRoles, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } - - override fun hashCode(): Int = ".FindAllRoles".hashCode() - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllTransactions.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllTransactions.kt deleted file mode 100644 index 475f9e132..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAllTransactions.kt +++ /dev/null @@ -1,41 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Any -import kotlin.Boolean -import kotlin.Int -import kotlin.Unit - -/** - * FindAllTransactions - * - * Generated from 'FindAllTransactions' regular structure - */ -public class FindAllTransactions { - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindAllTransactions = try { - FindAllTransactions() - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: FindAllTransactions): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } - - public fun equals(o1: FindAllTransactions, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } - - override fun hashCode(): Int = ".FindAllTransactions".hashCode() - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetById.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetById.kt deleted file mode 100644 index e9757c51a..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetById.kt +++ /dev/null @@ -1,36 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * FindAssetById - * - * Generated from 'FindAssetById' regular structure - */ -public data class FindAssetById( - public val id: AssetId, -) { - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindAssetById = try { - FindAssetById( - AssetId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: FindAssetById): Unit = try { - AssetId.write(writer, instance.id) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetDefinitionById.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetDefinitionById.kt deleted file mode 100644 index 116a42897..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetDefinitionById.kt +++ /dev/null @@ -1,38 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * FindAssetDefinitionById - * - * Generated from 'FindAssetDefinitionById' regular structure - */ -public data class FindAssetDefinitionById( - public val id: AssetDefinitionId, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): FindAssetDefinitionById = try { - FindAssetDefinitionById( - AssetDefinitionId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: FindAssetDefinitionById): Unit = try { - AssetDefinitionId.write(writer, instance.id) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetDefinitionKeyValueByIdAndKey.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetDefinitionKeyValueByIdAndKey.kt deleted file mode 100644 index ca002dd8a..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetDefinitionKeyValueByIdAndKey.kt +++ /dev/null @@ -1,41 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * FindAssetDefinitionKeyValueByIdAndKey - * - * Generated from 'FindAssetDefinitionKeyValueByIdAndKey' regular structure - */ -public data class FindAssetDefinitionKeyValueByIdAndKey( - public val id: AssetDefinitionId, - public val key: Name, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): FindAssetDefinitionKeyValueByIdAndKey = try { - FindAssetDefinitionKeyValueByIdAndKey( - AssetDefinitionId.read(reader), - Name.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: FindAssetDefinitionKeyValueByIdAndKey): Unit = try { - AssetDefinitionId.write(writer, instance.id) - Name.write(writer, instance.key) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetDefinitionMetadata.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetDefinitionMetadata.kt index 62eb5f346..db171cfd1 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetDefinitionMetadata.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetDefinitionMetadata.kt @@ -22,20 +22,25 @@ public data class FindAssetDefinitionMetadata( public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindAssetDefinitionMetadata = try { - FindAssetDefinitionMetadata( - AssetDefinitionId.read(reader), - Name.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): FindAssetDefinitionMetadata = + try { + FindAssetDefinitionMetadata( + AssetDefinitionId.read(reader), + Name.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: FindAssetDefinitionMetadata): Unit = try { - AssetDefinitionId.write(writer, instance.id) - Name.write(writer, instance.key) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: FindAssetDefinitionMetadata, + ): Unit = + try { + AssetDefinitionId.write(writer, instance.id) + Name.write(writer, instance.key) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetKeyValueByIdAndKey.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetKeyValueByIdAndKey.kt deleted file mode 100644 index d81e70e13..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetKeyValueByIdAndKey.kt +++ /dev/null @@ -1,41 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * FindAssetKeyValueByIdAndKey - * - * Generated from 'FindAssetKeyValueByIdAndKey' regular structure - */ -public data class FindAssetKeyValueByIdAndKey( - public val id: AssetId, - public val key: Name, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): FindAssetKeyValueByIdAndKey = try { - FindAssetKeyValueByIdAndKey( - AssetId.read(reader), - Name.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: FindAssetKeyValueByIdAndKey): Unit = try { - AssetId.write(writer, instance.id) - Name.write(writer, instance.key) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetMetadata.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetMetadata.kt index 2dbe3cd3f..e4652360b 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetMetadata.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetMetadata.kt @@ -20,20 +20,25 @@ public data class FindAssetMetadata( public val key: Name, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindAssetMetadata = try { - FindAssetMetadata( - AssetId.read(reader), - Name.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): FindAssetMetadata = + try { + FindAssetMetadata( + AssetId.read(reader), + Name.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: FindAssetMetadata): Unit = try { - AssetId.write(writer, instance.id) - Name.write(writer, instance.key) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: FindAssetMetadata, + ): Unit = + try { + AssetId.write(writer, instance.id) + Name.write(writer, instance.key) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetQuantityById.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetQuantityById.kt index bc6c76a13..1b3f6e1d2 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetQuantityById.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetQuantityById.kt @@ -19,18 +19,23 @@ public data class FindAssetQuantityById( public val id: AssetId, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindAssetQuantityById = try { - FindAssetQuantityById( - AssetId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): FindAssetQuantityById = + try { + FindAssetQuantityById( + AssetId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: FindAssetQuantityById): Unit = try { - AssetId.write(writer, instance.id) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: FindAssetQuantityById, + ): Unit = + try { + AssetId.write(writer, instance.id) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssets.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssets.kt index 4de441a0d..5c1660add 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssets.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssets.kt @@ -16,25 +16,34 @@ import kotlin.Unit /** * FindAssets * - * Generated from 'FindAssets' regular structure + * Generated from 'FindAssets' tuple structure */ public class FindAssets { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindAssets = try { - FindAssets() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): FindAssets = + try { + FindAssets() + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: FindAssets): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: FindAssets, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: FindAssets, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: FindAssets, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".FindAssets".hashCode() } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetsByAccountId.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetsByAccountId.kt deleted file mode 100644 index 4f4f75f40..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetsByAccountId.kt +++ /dev/null @@ -1,36 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * FindAssetsByAccountId - * - * Generated from 'FindAssetsByAccountId' regular structure - */ -public data class FindAssetsByAccountId( - public val account: AccountId, -) { - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindAssetsByAccountId = try { - FindAssetsByAccountId( - AccountId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: FindAssetsByAccountId): Unit = try { - AccountId.write(writer, instance.account) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetsByAssetDefinitionId.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetsByAssetDefinitionId.kt deleted file mode 100644 index cdcfc5bbe..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetsByAssetDefinitionId.kt +++ /dev/null @@ -1,39 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * FindAssetsByAssetDefinitionId - * - * Generated from 'FindAssetsByAssetDefinitionId' regular structure - */ -public data class FindAssetsByAssetDefinitionId( - public val assetDefinition: AssetDefinitionId, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): FindAssetsByAssetDefinitionId = try { - FindAssetsByAssetDefinitionId( - AssetDefinitionId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: FindAssetsByAssetDefinitionId): Unit = - try { - AssetDefinitionId.write(writer, instance.assetDefinition) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetsByDomainId.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetsByDomainId.kt deleted file mode 100644 index 19ac46ef9..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetsByDomainId.kt +++ /dev/null @@ -1,36 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * FindAssetsByDomainId - * - * Generated from 'FindAssetsByDomainId' regular structure - */ -public data class FindAssetsByDomainId( - public val domain: DomainId, -) { - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindAssetsByDomainId = try { - FindAssetsByDomainId( - DomainId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: FindAssetsByDomainId): Unit = try { - DomainId.write(writer, instance.domain) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetsByDomainIdAndAssetDefinitionId.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetsByDomainIdAndAssetDefinitionId.kt deleted file mode 100644 index cfdadd4f2..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetsByDomainIdAndAssetDefinitionId.kt +++ /dev/null @@ -1,44 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * FindAssetsByDomainIdAndAssetDefinitionId - * - * Generated from 'FindAssetsByDomainIdAndAssetDefinitionId' regular structure - */ -public data class FindAssetsByDomainIdAndAssetDefinitionId( - public val domain: DomainId, - public val assetDefinition: AssetDefinitionId, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): FindAssetsByDomainIdAndAssetDefinitionId = try { - FindAssetsByDomainIdAndAssetDefinitionId( - DomainId.read(reader), - AssetDefinitionId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: FindAssetsByDomainIdAndAssetDefinitionId, - ): Unit = try { - DomainId.write(writer, instance.domain) - AssetDefinitionId.write(writer, instance.assetDefinition) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetsByName.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetsByName.kt deleted file mode 100644 index 6a2f1ebe0..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetsByName.kt +++ /dev/null @@ -1,36 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * FindAssetsByName - * - * Generated from 'FindAssetsByName' regular structure - */ -public data class FindAssetsByName( - public val name: Name, -) { - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindAssetsByName = try { - FindAssetsByName( - Name.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: FindAssetsByName): Unit = try { - Name.write(writer, instance.name) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetsDefinitions.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetsDefinitions.kt index f714d7fe5..27937b871 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetsDefinitions.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindAssetsDefinitions.kt @@ -16,25 +16,34 @@ import kotlin.Unit /** * FindAssetsDefinitions * - * Generated from 'FindAssetsDefinitions' regular structure + * Generated from 'FindAssetsDefinitions' tuple structure */ public class FindAssetsDefinitions { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindAssetsDefinitions = try { - FindAssetsDefinitions() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): FindAssetsDefinitions = + try { + FindAssetsDefinitions() + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: FindAssetsDefinitions): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: FindAssetsDefinitions, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: FindAssetsDefinitions, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: FindAssetsDefinitions, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".FindAssetsDefinitions".hashCode() } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindBlockHeaderByHash.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindBlockHeaderByHash.kt deleted file mode 100644 index 7f2cc1271..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindBlockHeaderByHash.kt +++ /dev/null @@ -1,36 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * FindBlockHeaderByHash - * - * Generated from 'FindBlockHeaderByHash' regular structure - */ -public data class FindBlockHeaderByHash( - public val hash: HashOf, -) { - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindBlockHeaderByHash = try { - FindBlockHeaderByHash( - HashOf.read(reader) as HashOf, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: FindBlockHeaderByHash): Unit = try { - HashOf.write(writer, instance.hash) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindBlockHeaders.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindBlockHeaders.kt index d76648349..bf0f7608e 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindBlockHeaders.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindBlockHeaders.kt @@ -16,25 +16,34 @@ import kotlin.Unit /** * FindBlockHeaders * - * Generated from 'FindBlockHeaders' regular structure + * Generated from 'FindBlockHeaders' tuple structure */ public class FindBlockHeaders { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindBlockHeaders = try { - FindBlockHeaders() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): FindBlockHeaders = + try { + FindBlockHeaders() + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: FindBlockHeaders): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: FindBlockHeaders, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: FindBlockHeaders, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: FindBlockHeaders, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".FindBlockHeaders".hashCode() } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindBlocks.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindBlocks.kt index 950ecc220..2659055a2 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindBlocks.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindBlocks.kt @@ -16,25 +16,34 @@ import kotlin.Unit /** * FindBlocks * - * Generated from 'FindBlocks' regular structure + * Generated from 'FindBlocks' tuple structure */ public class FindBlocks { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindBlocks = try { - FindBlocks() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): FindBlocks = + try { + FindBlocks() + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: FindBlocks): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: FindBlocks, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: FindBlocks, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: FindBlocks, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".FindBlocks".hashCode() } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindDomainById.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindDomainById.kt deleted file mode 100644 index f2043fecb..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindDomainById.kt +++ /dev/null @@ -1,36 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * FindDomainById - * - * Generated from 'FindDomainById' regular structure - */ -public data class FindDomainById( - public val id: DomainId, -) { - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindDomainById = try { - FindDomainById( - DomainId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: FindDomainById): Unit = try { - DomainId.write(writer, instance.id) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindDomainKeyValueByIdAndKey.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindDomainKeyValueByIdAndKey.kt deleted file mode 100644 index 75f2c65c3..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindDomainKeyValueByIdAndKey.kt +++ /dev/null @@ -1,41 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * FindDomainKeyValueByIdAndKey - * - * Generated from 'FindDomainKeyValueByIdAndKey' regular structure - */ -public data class FindDomainKeyValueByIdAndKey( - public val id: DomainId, - public val key: Name, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): FindDomainKeyValueByIdAndKey = try { - FindDomainKeyValueByIdAndKey( - DomainId.read(reader), - Name.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: FindDomainKeyValueByIdAndKey): Unit = try { - DomainId.write(writer, instance.id) - Name.write(writer, instance.key) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindDomainMetadata.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindDomainMetadata.kt index 8fc317f3a..13bd8bc4a 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindDomainMetadata.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindDomainMetadata.kt @@ -20,20 +20,25 @@ public data class FindDomainMetadata( public val key: Name, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindDomainMetadata = try { - FindDomainMetadata( - DomainId.read(reader), - Name.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): FindDomainMetadata = + try { + FindDomainMetadata( + DomainId.read(reader), + Name.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: FindDomainMetadata): Unit = try { - DomainId.write(writer, instance.id) - Name.write(writer, instance.key) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: FindDomainMetadata, + ): Unit = + try { + DomainId.write(writer, instance.id) + Name.write(writer, instance.key) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindDomains.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindDomains.kt index f38ee835e..092f18781 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindDomains.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindDomains.kt @@ -16,25 +16,34 @@ import kotlin.Unit /** * FindDomains * - * Generated from 'FindDomains' regular structure + * Generated from 'FindDomains' tuple structure */ public class FindDomains { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindDomains = try { - FindDomains() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): FindDomains = + try { + FindDomains() + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: FindDomains): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: FindDomains, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: FindDomains, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: FindDomains, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".FindDomains".hashCode() } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindError.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindError.kt index 6bb6ffa0b..ba2ee86b4 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindError.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindError.kt @@ -36,22 +36,24 @@ public sealed class FindError : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.FindError.Asset = try { - Asset( - AssetId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.FindError.Asset = + try { + Asset( + AssetId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.FindError.Asset, - ): Unit = try { - AssetId.write(writer, instance.assetId) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + AssetId.write(writer, instance.assetId) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -68,22 +70,24 @@ public sealed class FindError : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.FindError.AssetDefinition = try { - AssetDefinition( - AssetDefinitionId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.FindError.AssetDefinition = + try { + AssetDefinition( + AssetDefinitionId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.FindError.AssetDefinition, - ): Unit = try { - AssetDefinitionId.write(writer, instance.assetDefinitionId) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + AssetDefinitionId.write(writer, instance.assetDefinitionId) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -100,22 +104,24 @@ public sealed class FindError : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 2 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.FindError.Account = try { - Account( - AccountId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.FindError.Account = + try { + Account( + AccountId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.FindError.Account, - ): Unit = try { - AccountId.write(writer, instance.accountId) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + AccountId.write(writer, instance.accountId) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -132,22 +138,24 @@ public sealed class FindError : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 3 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.FindError.Domain = try { - Domain( - DomainId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.FindError.Domain = + try { + Domain( + DomainId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.FindError.Domain, - ): Unit = try { - DomainId.write(writer, instance.domainId) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + DomainId.write(writer, instance.domainId) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -164,22 +172,24 @@ public sealed class FindError : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 4 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.FindError.MetadataKey = try { - MetadataKey( - Name.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.FindError.MetadataKey = + try { + MetadataKey( + Name.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.FindError.MetadataKey, - ): Unit = try { - Name.write(writer, instance.name) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + Name.write(writer, instance.name) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -196,22 +206,24 @@ public sealed class FindError : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 5 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.FindError.Block = try { - Block( - HashOf.read(reader) as HashOf, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.FindError.Block = + try { + Block( + HashOf.read(reader) as HashOf, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.FindError.Block, - ): Unit = try { - HashOf.write(writer, instance.hashOf) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + HashOf.write(writer, instance.hashOf) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -228,22 +240,24 @@ public sealed class FindError : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 6 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.FindError.Transaction = try { - Transaction( - HashOf.read(reader) as HashOf, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.FindError.Transaction = + try { + Transaction( + HashOf.read(reader) as HashOf, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.FindError.Transaction, - ): Unit = try { - HashOf.write(writer, instance.hashOf) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + HashOf.write(writer, instance.hashOf) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -272,11 +286,12 @@ public sealed class FindError : ModelEnum { override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.FindError.Peer, - ): Unit = try { - PeerId.write(writer, instance.peerId) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + PeerId.write(writer, instance.peerId) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -293,22 +308,24 @@ public sealed class FindError : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 8 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.FindError.Trigger = try { - Trigger( - TriggerId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.FindError.Trigger = + try { + Trigger( + TriggerId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.FindError.Trigger, - ): Unit = try { - TriggerId.write(writer, instance.triggerId) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + TriggerId.write(writer, instance.triggerId) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -337,11 +354,12 @@ public sealed class FindError : ModelEnum { override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.FindError.Role, - ): Unit = try { - RoleId.write(writer, instance.roleId) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + RoleId.write(writer, instance.roleId) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -358,22 +376,26 @@ public sealed class FindError : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 10 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.FindError.Permission = try { - Permission( - jp.co.soramitsu.iroha2.generated.Permission.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.FindError.Permission = + try { + Permission( + jp.co.soramitsu.iroha2.generated.Permission + .read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.FindError.Permission, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.Permission.write(writer, instance.permission) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + jp.co.soramitsu.iroha2.generated.Permission + .write(writer, instance.permission) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -390,45 +412,51 @@ public sealed class FindError : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 11 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.FindError.PublicKey = try { - PublicKey( - jp.co.soramitsu.iroha2.generated.PublicKey.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.FindError.PublicKey = + try { + PublicKey( + jp.co.soramitsu.iroha2.generated.PublicKey + .read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.FindError.PublicKey, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.PublicKey.write(writer, instance.publicKey) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + jp.co.soramitsu.iroha2.generated.PublicKey + .write(writer, instance.publicKey) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindError = when ( - val discriminant = - reader.readUByte() + override fun read(reader: ScaleCodecReader): FindError = + when (val discriminant = reader.readUByte()) { + 0 -> Asset.read(reader) + 1 -> AssetDefinition.read(reader) + 2 -> Account.read(reader) + 3 -> Domain.read(reader) + 4 -> MetadataKey.read(reader) + 5 -> Block.read(reader) + 6 -> Transaction.read(reader) + 7 -> Peer.read(reader) + 8 -> Trigger.read(reader) + 9 -> Role.read(reader) + 10 -> Permission.read(reader) + 11 -> PublicKey.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: FindError, ) { - 0 -> Asset.read(reader) - 1 -> AssetDefinition.read(reader) - 2 -> Account.read(reader) - 3 -> Domain.read(reader) - 4 -> MetadataKey.read(reader) - 5 -> Block.read(reader) - 6 -> Transaction.read(reader) - 7 -> Peer.read(reader) - 8 -> Trigger.read(reader) - 9 -> Role.read(reader) - 10 -> Permission.read(reader) - 11 -> PublicKey.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: FindError) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Asset.write(writer, instance as Asset) @@ -443,7 +471,8 @@ public sealed class FindError : ModelEnum { 9 -> Role.write(writer, instance as Role) 10 -> Permission.write(writer, instance as Permission) 11 -> PublicKey.write(writer, instance as PublicKey) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindExecutorDataModel.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindExecutorDataModel.kt index 8e0a97916..0ed652ecd 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindExecutorDataModel.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindExecutorDataModel.kt @@ -16,25 +16,34 @@ import kotlin.Unit /** * FindExecutorDataModel * - * Generated from 'FindExecutorDataModel' regular structure + * Generated from 'FindExecutorDataModel' tuple structure */ public class FindExecutorDataModel { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindExecutorDataModel = try { - FindExecutorDataModel() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): FindExecutorDataModel = + try { + FindExecutorDataModel() + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: FindExecutorDataModel): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: FindExecutorDataModel, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: FindExecutorDataModel, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: FindExecutorDataModel, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".FindExecutorDataModel".hashCode() } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindParameters.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindParameters.kt index 38cba1bc0..41fffbcd5 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindParameters.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindParameters.kt @@ -16,25 +16,34 @@ import kotlin.Unit /** * FindParameters * - * Generated from 'FindParameters' regular structure + * Generated from 'FindParameters' tuple structure */ public class FindParameters { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindParameters = try { - FindParameters() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): FindParameters = + try { + FindParameters() + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: FindParameters): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: FindParameters, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: FindParameters, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: FindParameters, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".FindParameters".hashCode() } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindPeers.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindPeers.kt index 37e309d9e..2cbd56b00 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindPeers.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindPeers.kt @@ -16,25 +16,34 @@ import kotlin.Unit /** * FindPeers * - * Generated from 'FindPeers' regular structure + * Generated from 'FindPeers' tuple structure */ public class FindPeers { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindPeers = try { - FindPeers() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): FindPeers = + try { + FindPeers() + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: FindPeers): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: FindPeers, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: FindPeers, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: FindPeers, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".FindPeers".hashCode() } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindPermissionsByAccountId.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindPermissionsByAccountId.kt index f9df0335c..af37ef9d2 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindPermissionsByAccountId.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindPermissionsByAccountId.kt @@ -21,18 +21,23 @@ public data class FindPermissionsByAccountId( public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindPermissionsByAccountId = try { - FindPermissionsByAccountId( - AccountId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): FindPermissionsByAccountId = + try { + FindPermissionsByAccountId( + AccountId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: FindPermissionsByAccountId): Unit = try { - AccountId.write(writer, instance.id) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: FindPermissionsByAccountId, + ): Unit = + try { + AccountId.write(writer, instance.id) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindRoleByRoleId.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindRoleByRoleId.kt deleted file mode 100644 index 1241ec0be..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindRoleByRoleId.kt +++ /dev/null @@ -1,36 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * FindRoleByRoleId - * - * Generated from 'FindRoleByRoleId' regular structure - */ -public data class FindRoleByRoleId( - public val id: RoleId, -) { - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindRoleByRoleId = try { - FindRoleByRoleId( - RoleId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: FindRoleByRoleId): Unit = try { - RoleId.write(writer, instance.id) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindRoleIds.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindRoleIds.kt index eda4a74ae..cca8e1916 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindRoleIds.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindRoleIds.kt @@ -16,25 +16,34 @@ import kotlin.Unit /** * FindRoleIds * - * Generated from 'FindRoleIds' regular structure + * Generated from 'FindRoleIds' tuple structure */ public class FindRoleIds { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindRoleIds = try { - FindRoleIds() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): FindRoleIds = + try { + FindRoleIds() + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: FindRoleIds): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: FindRoleIds, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: FindRoleIds, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: FindRoleIds, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".FindRoleIds".hashCode() } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindRoles.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindRoles.kt index 1544198f0..2e3a9802a 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindRoles.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindRoles.kt @@ -16,25 +16,34 @@ import kotlin.Unit /** * FindRoles * - * Generated from 'FindRoles' regular structure + * Generated from 'FindRoles' tuple structure */ public class FindRoles { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindRoles = try { - FindRoles() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): FindRoles = + try { + FindRoles() + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: FindRoles): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: FindRoles, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: FindRoles, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: FindRoles, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".FindRoles".hashCode() } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindRolesByAccountId.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindRolesByAccountId.kt index 2a2779902..afde5c706 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindRolesByAccountId.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindRolesByAccountId.kt @@ -19,18 +19,23 @@ public data class FindRolesByAccountId( public val id: AccountId, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindRolesByAccountId = try { - FindRolesByAccountId( - AccountId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): FindRolesByAccountId = + try { + FindRolesByAccountId( + AccountId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: FindRolesByAccountId): Unit = try { - AccountId.write(writer, instance.id) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: FindRolesByAccountId, + ): Unit = + try { + AccountId.write(writer, instance.id) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTotalAssetQuantityByAssetDefinitionId.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTotalAssetQuantityByAssetDefinitionId.kt deleted file mode 100644 index a47b6e0e3..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTotalAssetQuantityByAssetDefinitionId.kt +++ /dev/null @@ -1,41 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * FindTotalAssetQuantityByAssetDefinitionId - * - * Generated from 'FindTotalAssetQuantityByAssetDefinitionId' regular structure - */ -public data class FindTotalAssetQuantityByAssetDefinitionId( - public val id: AssetDefinitionId, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): FindTotalAssetQuantityByAssetDefinitionId = try { - FindTotalAssetQuantityByAssetDefinitionId( - AssetDefinitionId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: FindTotalAssetQuantityByAssetDefinitionId, - ): Unit = try { - AssetDefinitionId.write(writer, instance.id) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTransactionByHash.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTransactionByHash.kt deleted file mode 100644 index 2e33e449d..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTransactionByHash.kt +++ /dev/null @@ -1,36 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * FindTransactionByHash - * - * Generated from 'FindTransactionByHash' regular structure - */ -public data class FindTransactionByHash( - public val hash: HashOf, -) { - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindTransactionByHash = try { - FindTransactionByHash( - HashOf.read(reader) as HashOf, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: FindTransactionByHash): Unit = try { - HashOf.write(writer, instance.hash) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTransactions.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTransactions.kt index 5655b26bc..8e3b17b83 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTransactions.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTransactions.kt @@ -16,25 +16,34 @@ import kotlin.Unit /** * FindTransactions * - * Generated from 'FindTransactions' regular structure + * Generated from 'FindTransactions' tuple structure */ public class FindTransactions { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindTransactions = try { - FindTransactions() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): FindTransactions = + try { + FindTransactions() + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: FindTransactions): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: FindTransactions, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: FindTransactions, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: FindTransactions, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".FindTransactions".hashCode() } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTransactionsByAccountId.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTransactionsByAccountId.kt deleted file mode 100644 index 8d1e744a0..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTransactionsByAccountId.kt +++ /dev/null @@ -1,38 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * FindTransactionsByAccountId - * - * Generated from 'FindTransactionsByAccountId' regular structure - */ -public data class FindTransactionsByAccountId( - public val account: AccountId, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): FindTransactionsByAccountId = try { - FindTransactionsByAccountId( - AccountId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: FindTransactionsByAccountId): Unit = try { - AccountId.write(writer, instance.account) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTriggerById.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTriggerById.kt deleted file mode 100644 index 62bcc12a0..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTriggerById.kt +++ /dev/null @@ -1,36 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * FindTriggerById - * - * Generated from 'FindTriggerById' regular structure - */ -public data class FindTriggerById( - public val id: TriggerId, -) { - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindTriggerById = try { - FindTriggerById( - TriggerId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: FindTriggerById): Unit = try { - TriggerId.write(writer, instance.id) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTriggerKeyValueByIdAndKey.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTriggerKeyValueByIdAndKey.kt deleted file mode 100644 index 6991ade0f..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTriggerKeyValueByIdAndKey.kt +++ /dev/null @@ -1,42 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * FindTriggerKeyValueByIdAndKey - * - * Generated from 'FindTriggerKeyValueByIdAndKey' regular structure - */ -public data class FindTriggerKeyValueByIdAndKey( - public val id: TriggerId, - public val key: Name, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): FindTriggerKeyValueByIdAndKey = try { - FindTriggerKeyValueByIdAndKey( - TriggerId.read(reader), - Name.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: FindTriggerKeyValueByIdAndKey): Unit = - try { - TriggerId.write(writer, instance.id) - Name.write(writer, instance.key) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTriggerMetadata.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTriggerMetadata.kt index f9c573e76..c821d9b1d 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTriggerMetadata.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTriggerMetadata.kt @@ -20,20 +20,25 @@ public data class FindTriggerMetadata( public val key: Name, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindTriggerMetadata = try { - FindTriggerMetadata( - TriggerId.read(reader), - Name.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): FindTriggerMetadata = + try { + FindTriggerMetadata( + TriggerId.read(reader), + Name.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: FindTriggerMetadata): Unit = try { - TriggerId.write(writer, instance.id) - Name.write(writer, instance.key) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: FindTriggerMetadata, + ): Unit = + try { + TriggerId.write(writer, instance.id) + Name.write(writer, instance.key) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTriggers.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTriggers.kt index 1c6f355f8..90db7971b 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTriggers.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTriggers.kt @@ -16,25 +16,34 @@ import kotlin.Unit /** * FindTriggers * - * Generated from 'FindTriggers' regular structure + * Generated from 'FindTriggers' tuple structure */ public class FindTriggers { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): FindTriggers = try { - FindTriggers() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): FindTriggers = + try { + FindTriggers() + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: FindTriggers): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: FindTriggers, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: FindTriggers, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: FindTriggers, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".FindTriggers".hashCode() } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTriggersByAuthorityDomainId.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTriggersByAuthorityDomainId.kt deleted file mode 100644 index 22bafc566..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTriggersByAuthorityDomainId.kt +++ /dev/null @@ -1,39 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * FindTriggersByAuthorityDomainId - * - * Generated from 'FindTriggersByAuthorityDomainId' regular structure - */ -public data class FindTriggersByAuthorityDomainId( - public val domain: DomainId, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): FindTriggersByAuthorityDomainId = try { - FindTriggersByAuthorityDomainId( - DomainId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: FindTriggersByAuthorityDomainId): Unit = - try { - DomainId.write(writer, instance.domain) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTriggersByAuthorityId.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTriggersByAuthorityId.kt deleted file mode 100644 index 465aa36b9..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/FindTriggersByAuthorityId.kt +++ /dev/null @@ -1,38 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * FindTriggersByAuthorityId - * - * Generated from 'FindTriggersByAuthorityId' regular structure - */ -public data class FindTriggersByAuthorityId( - public val account: AccountId, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): FindTriggersByAuthorityId = try { - FindTriggersByAuthorityId( - AccountId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: FindTriggersByAuthorityId): Unit = try { - AccountId.write(writer, instance.account) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ForwardCursor.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ForwardCursor.kt index 2e34383b1..8e23c94ba 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ForwardCursor.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ForwardCursor.kt @@ -17,24 +17,29 @@ import kotlin.Unit * Generated from 'ForwardCursor' regular structure */ public data class ForwardCursor( - public val query: String? = null, - public val cursor: NonZeroOfu64? = null, + public val query: String, + public val cursor: NonZeroOfu64, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): ForwardCursor = try { - ForwardCursor( - reader.readNullable(), - reader.readNullable(NonZeroOfu64) as NonZeroOfu64?, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): ForwardCursor = + try { + ForwardCursor( + reader.readString(), + NonZeroOfu64.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: ForwardCursor): Unit = try { - writer.writeNullable(instance.query) - writer.writeNullable(NonZeroOfu64, instance.cursor) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: ForwardCursor, + ): Unit = + try { + writer.writeAsList(instance.query.toByteArray(Charsets.UTF_8)) + NonZeroOfu64.write(writer, instance.cursor) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/GenericPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/GenericPredicateBox.kt deleted file mode 100644 index 2e8de023b..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/GenericPredicateBox.kt +++ /dev/null @@ -1,178 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.ModelEnum -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Any -import kotlin.Int -import kotlin.Unit - -/** - * GenericPredicateBox - * - * Generated from 'GenericPredicateBox' enum - */ -public sealed class GenericPredicateBox : ModelEnum { - /** - * @return Discriminator of variant in enum - */ - public abstract fun discriminant(): Int - - /** - * 'And' variant - */ - public data class And( - public val nonTrivial: NonTrivial>, - ) : GenericPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 0 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.GenericPredicateBox.And = try { - And( - NonTrivial.read(reader) as NonTrivial>, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.GenericPredicateBox.And, - ): Unit = try { - NonTrivial.write(writer, instance.nonTrivial) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Or' variant - */ - public data class Or( - public val nonTrivial: NonTrivial>, - ) : GenericPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 1 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.GenericPredicateBox.Or = try { - Or( - NonTrivial.read(reader) as NonTrivial>, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.GenericPredicateBox.Or, - ): Unit = try { - NonTrivial.write(writer, instance.nonTrivial) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Not' variant - */ - public data class Not( - public val genericPredicateBox: GenericPredicateBox, - ) : GenericPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 2 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.GenericPredicateBox.Not = try { - Not( - GenericPredicateBox.read(reader) as GenericPredicateBox, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.GenericPredicateBox.Not, - ): Unit = try { - GenericPredicateBox.write(writer, instance.genericPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Raw' variant - */ - public data class Raw( - public val queryOutputPredicate: QueryOutputPredicate, - ) : GenericPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 3 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.GenericPredicateBox.Raw = try { - Raw( - QueryOutputPredicate.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.GenericPredicateBox.Raw, - ): Unit = try { - QueryOutputPredicate.write(writer, instance.queryOutputPredicate) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : - ScaleReader>, - ScaleWriter> { - override fun read(reader: ScaleCodecReader): GenericPredicateBox = when ( - val - discriminant = reader.readUByte() - ) { - 0 -> And.read(reader) - 1 -> Or.read(reader) - 2 -> Not.read(reader) - 3 -> Raw.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: GenericPredicateBox) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 0 -> And.write(writer, instance as And) - 1 -> Or.write(writer, instance as Or) - 2 -> Not.write(writer, instance as Not) - 3 -> Raw.write(writer, instance as Raw) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/GenesisWasmAction.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/GenesisWasmAction.kt new file mode 100644 index 000000000..b802944df --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/GenesisWasmAction.kt @@ -0,0 +1,51 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.String +import kotlin.Unit + +/** + * GenesisWasmAction + * + * Generated from 'GenesisWasmAction' regular structure + */ +public data class GenesisWasmAction( + public val executable: String, + public val repeats: Repeats, + public val authority: AccountId, + public val filter: EventFilterBox, +) { + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): GenesisWasmAction = + try { + GenesisWasmAction( + reader.readString(), + Repeats.read(reader), + AccountId.read(reader), + EventFilterBox.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: GenesisWasmAction, + ): Unit = + try { + writer.writeAsList(instance.executable.toByteArray(Charsets.UTF_8)) + Repeats.write(writer, instance.repeats) + AccountId.write(writer, instance.authority) + EventFilterBox.write(writer, instance.filter) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/GenesisWasmTrigger.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/GenesisWasmTrigger.kt new file mode 100644 index 000000000..7d303e475 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/GenesisWasmTrigger.kt @@ -0,0 +1,44 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit + +/** + * GenesisWasmTrigger + * + * Generated from 'GenesisWasmTrigger' regular structure + */ +public data class GenesisWasmTrigger( + public val id: TriggerId, + public val action: GenesisWasmAction, +) { + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): GenesisWasmTrigger = + try { + GenesisWasmTrigger( + TriggerId.read(reader), + GenesisWasmAction.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: GenesisWasmTrigger, + ): Unit = + try { + TriggerId.write(writer, instance.id) + GenesisWasmAction.write(writer, instance.action) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/GrantBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/GrantBox.kt index e59d56c41..75d5e89bc 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/GrantBox.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/GrantBox.kt @@ -36,22 +36,24 @@ public sealed class GrantBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.GrantBox.Permission = try { - Permission( - GrantOfPermissionAndAccount.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.GrantBox.Permission = + try { + Permission( + GrantOfPermissionAndAccount.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.GrantBox.Permission, - ): Unit = try { - GrantOfPermissionAndAccount.write(writer, instance.grantOfPermissionAndAccount) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + GrantOfPermissionAndAccount.write(writer, instance.grantOfPermissionAndAccount) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -80,11 +82,12 @@ public sealed class GrantBox : ModelEnum { override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.GrantBox.Role, - ): Unit = try { - GrantOfRoleIdAndAccount.write(writer, instance.grantOfRoleIdAndAccount) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + GrantOfRoleIdAndAccount.write(writer, instance.grantOfRoleIdAndAccount) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -101,42 +104,47 @@ public sealed class GrantBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 2 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.GrantBox.RolePermission = try { - RolePermission( - GrantOfPermissionAndRole.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.GrantBox.RolePermission = + try { + RolePermission( + GrantOfPermissionAndRole.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.GrantBox.RolePermission, - ): Unit = try { - GrantOfPermissionAndRole.write(writer, instance.grantOfPermissionAndRole) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + GrantOfPermissionAndRole.write(writer, instance.grantOfPermissionAndRole) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): GrantBox = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Permission.read(reader) - 1 -> Role.read(reader) - 2 -> RolePermission.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + override fun read(reader: ScaleCodecReader): GrantBox = + when (val discriminant = reader.readUByte()) { + 0 -> Permission.read(reader) + 1 -> Role.read(reader) + 2 -> RolePermission.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: GrantBox) { + override fun write( + writer: ScaleCodecWriter, + instance: GrantBox, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Permission.write(writer, instance as Permission) 1 -> Role.write(writer, instance as Role) 2 -> RolePermission.write(writer, instance as RolePermission) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/GrantOfPermissionAndAccount.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/GrantOfPermissionAndAccount.kt index 89c3a0087..c212019b1 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/GrantOfPermissionAndAccount.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/GrantOfPermissionAndAccount.kt @@ -3,10 +3,13 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException import kotlin.Unit @@ -18,24 +21,31 @@ import kotlin.Unit public data class GrantOfPermissionAndAccount( public val `object`: Permission, public val destination: AccountId, -) { +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): GrantOfPermissionAndAccount = try { - GrantOfPermissionAndAccount( - Permission.read(reader), - AccountId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): GrantOfPermissionAndAccount = + try { + GrantOfPermissionAndAccount( + Permission.read(reader), + AccountId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: GrantOfPermissionAndAccount): Unit = try { - Permission.write(writer, instance.`object`) - AccountId.write(writer, instance.destination) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: GrantOfPermissionAndAccount, + ): Unit = + try { + Permission.write(writer, instance.`object`) + AccountId.write(writer, instance.destination) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/GrantOfPermissionAndRole.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/GrantOfPermissionAndRole.kt index 75269183a..632552e41 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/GrantOfPermissionAndRole.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/GrantOfPermissionAndRole.kt @@ -3,10 +3,13 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException import kotlin.Unit @@ -18,24 +21,31 @@ import kotlin.Unit public data class GrantOfPermissionAndRole( public val `object`: Permission, public val destination: RoleId, -) { +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): GrantOfPermissionAndRole = try { - GrantOfPermissionAndRole( - Permission.read(reader), - RoleId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): GrantOfPermissionAndRole = + try { + GrantOfPermissionAndRole( + Permission.read(reader), + RoleId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: GrantOfPermissionAndRole): Unit = try { - Permission.write(writer, instance.`object`) - RoleId.write(writer, instance.destination) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: GrantOfPermissionAndRole, + ): Unit = + try { + Permission.write(writer, instance.`object`) + RoleId.write(writer, instance.destination) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/GrantOfRoleIdAndAccount.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/GrantOfRoleIdAndAccount.kt index 549bb4de9..f0c586084 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/GrantOfRoleIdAndAccount.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/GrantOfRoleIdAndAccount.kt @@ -3,10 +3,13 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException import kotlin.Unit @@ -18,24 +21,31 @@ import kotlin.Unit public data class GrantOfRoleIdAndAccount( public val `object`: RoleId, public val destination: AccountId, -) { +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): GrantOfRoleIdAndAccount = try { - GrantOfRoleIdAndAccount( - RoleId.read(reader), - AccountId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): GrantOfRoleIdAndAccount = + try { + GrantOfRoleIdAndAccount( + RoleId.read(reader), + AccountId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: GrantOfRoleIdAndAccount): Unit = try { - RoleId.write(writer, instance.`object`) - AccountId.write(writer, instance.destination) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: GrantOfRoleIdAndAccount, + ): Unit = + try { + RoleId.write(writer, instance.`object`) + AccountId.write(writer, instance.destination) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Hash.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Hash.kt index 6b987937e..6a9bc83df 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Hash.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Hash.kt @@ -32,18 +32,23 @@ public data class Hash( override fun hashCode(): Int = arrayOfU8.contentHashCode() public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): Hash = try { - Hash( - reader.readByteArray(32), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): Hash = + try { + Hash( + reader.readByteArray(32), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: Hash): Unit = try { - writer.writeByteArray(instance.arrayOfU8) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: Hash, + ): Unit = + try { + writer.writeByteArray(instance.arrayOfU8) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/HashOf.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/HashOf.kt index 124af9934..c8420ea58 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/HashOf.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/HashOf.kt @@ -14,24 +14,29 @@ import kotlin.Unit /** * HashOf * - * Generated from 'HashOf' regular structure + * Generated from 'HashOf>' regular structure */ public data class HashOf( public val hash: Hash, ) { public companion object : ScaleReader>, ScaleWriter> { - override fun read(reader: ScaleCodecReader): HashOf = try { - HashOf( - Hash.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): HashOf = + try { + HashOf( + Hash.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: HashOf): Unit = try { - Hash.write(writer, instance.hash) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: HashOf, + ): Unit = + try { + Hash.write(writer, instance.hash) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/IdBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/IdBox.kt index 5271a7e82..180138ff3 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/IdBox.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/IdBox.kt @@ -39,7 +39,8 @@ public sealed class IdBox : ModelEnum { override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.IdBox.DomainId = try { DomainId( - jp.co.soramitsu.iroha2.generated.DomainId.read(reader), + jp.co.soramitsu.iroha2.generated.DomainId + .read(reader), ) } catch (ex: Exception) { throw wrapException(ex) @@ -48,11 +49,13 @@ public sealed class IdBox : ModelEnum { override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.IdBox.DomainId, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.DomainId.write(writer, instance.domainId) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + jp.co.soramitsu.iroha2.generated.DomainId + .write(writer, instance.domainId) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -69,22 +72,26 @@ public sealed class IdBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.IdBox.AccountId = try { - AccountId( - jp.co.soramitsu.iroha2.generated.AccountId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.IdBox.AccountId = + try { + AccountId( + jp.co.soramitsu.iroha2.generated.AccountId + .read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.IdBox.AccountId, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.AccountId.write(writer, instance.accountId) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + jp.co.soramitsu.iroha2.generated.AccountId + .write(writer, instance.accountId) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -101,22 +108,26 @@ public sealed class IdBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 2 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.IdBox.AssetDefinitionId = try { - AssetDefinitionId( - jp.co.soramitsu.iroha2.generated.AssetDefinitionId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.IdBox.AssetDefinitionId = + try { + AssetDefinitionId( + jp.co.soramitsu.iroha2.generated.AssetDefinitionId + .read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.IdBox.AssetDefinitionId, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.AssetDefinitionId.write(writer, instance.assetDefinitionId) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + jp.co.soramitsu.iroha2.generated.AssetDefinitionId + .write(writer, instance.assetDefinitionId) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -136,7 +147,8 @@ public sealed class IdBox : ModelEnum { override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.IdBox.AssetId = try { AssetId( - jp.co.soramitsu.iroha2.generated.AssetId.read(reader), + jp.co.soramitsu.iroha2.generated.AssetId + .read(reader), ) } catch (ex: Exception) { throw wrapException(ex) @@ -145,11 +157,13 @@ public sealed class IdBox : ModelEnum { override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.IdBox.AssetId, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.AssetId.write(writer, instance.assetId) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + jp.co.soramitsu.iroha2.generated.AssetId + .write(writer, instance.assetId) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -169,7 +183,8 @@ public sealed class IdBox : ModelEnum { override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.IdBox.PeerId = try { PeerId( - jp.co.soramitsu.iroha2.generated.PeerId.read(reader), + jp.co.soramitsu.iroha2.generated.PeerId + .read(reader), ) } catch (ex: Exception) { throw wrapException(ex) @@ -178,11 +193,13 @@ public sealed class IdBox : ModelEnum { override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.IdBox.PeerId, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.PeerId.write(writer, instance.peerId) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + jp.co.soramitsu.iroha2.generated.PeerId + .write(writer, instance.peerId) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -199,22 +216,26 @@ public sealed class IdBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 5 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.IdBox.TriggerId = try { - TriggerId( - jp.co.soramitsu.iroha2.generated.TriggerId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.IdBox.TriggerId = + try { + TriggerId( + jp.co.soramitsu.iroha2.generated.TriggerId + .read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.IdBox.TriggerId, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.TriggerId.write(writer, instance.triggerId) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + jp.co.soramitsu.iroha2.generated.TriggerId + .write(writer, instance.triggerId) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -234,7 +255,8 @@ public sealed class IdBox : ModelEnum { override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.IdBox.RoleId = try { RoleId( - jp.co.soramitsu.iroha2.generated.RoleId.read(reader), + jp.co.soramitsu.iroha2.generated.RoleId + .read(reader), ) } catch (ex: Exception) { throw wrapException(ex) @@ -243,11 +265,13 @@ public sealed class IdBox : ModelEnum { override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.IdBox.RoleId, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.RoleId.write(writer, instance.roleId) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + jp.co.soramitsu.iroha2.generated.RoleId + .write(writer, instance.roleId) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -264,22 +288,26 @@ public sealed class IdBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 7 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.IdBox.Permission = try { - Permission( - jp.co.soramitsu.iroha2.generated.Permission.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.IdBox.Permission = + try { + Permission( + jp.co.soramitsu.iroha2.generated.Permission + .read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.IdBox.Permission, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.Permission.write(writer, instance.permission) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + jp.co.soramitsu.iroha2.generated.Permission + .write(writer, instance.permission) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -296,39 +324,48 @@ public sealed class IdBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 8 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.IdBox.CustomParameterId = try { - CustomParameterId( - jp.co.soramitsu.iroha2.generated.CustomParameterId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.IdBox.CustomParameterId = + try { + CustomParameterId( + jp.co.soramitsu.iroha2.generated.CustomParameterId + .read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.IdBox.CustomParameterId, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.CustomParameterId.write(writer, instance.customParameterId) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + jp.co.soramitsu.iroha2.generated.CustomParameterId + .write(writer, instance.customParameterId) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): IdBox = when (val discriminant = reader.readUByte()) { - 0 -> DomainId.read(reader) - 1 -> AccountId.read(reader) - 2 -> AssetDefinitionId.read(reader) - 3 -> AssetId.read(reader) - 4 -> PeerId.read(reader) - 5 -> TriggerId.read(reader) - 6 -> RoleId.read(reader) - 7 -> Permission.read(reader) - 8 -> CustomParameterId.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: IdBox) { + override fun read(reader: ScaleCodecReader): IdBox = + when (val discriminant = reader.readUByte()) { + 0 -> DomainId.read(reader) + 1 -> AccountId.read(reader) + 2 -> AssetDefinitionId.read(reader) + 3 -> AssetId.read(reader) + 4 -> PeerId.read(reader) + 5 -> TriggerId.read(reader) + 6 -> RoleId.read(reader) + 7 -> Permission.read(reader) + 8 -> CustomParameterId.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: IdBox, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> DomainId.write(writer, instance as DomainId) @@ -340,7 +377,8 @@ public sealed class IdBox : ModelEnum { 6 -> RoleId.write(writer, instance as RoleId) 7 -> Permission.write(writer, instance as Permission) 8 -> CustomParameterId.write(writer, instance as CustomParameterId) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/IdentifiableBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/IdentifiableBox.kt deleted file mode 100644 index 02a5a5a20..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/IdentifiableBox.kt +++ /dev/null @@ -1,450 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.ModelEnum -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Int -import kotlin.Unit - -/** - * IdentifiableBox - * - * Generated from 'IdentifiableBox' enum - */ -public sealed class IdentifiableBox : ModelEnum { - /** - * @return Discriminator of variant in enum - */ - public abstract fun discriminant(): Int - - /** - * 'NewDomain' variant - */ - public data class NewDomain( - public val newDomain: jp.co.soramitsu.iroha2.generated.NewDomain, - ) : IdentifiableBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 0 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.IdentifiableBox.NewDomain = try { - NewDomain( - jp.co.soramitsu.iroha2.generated.NewDomain.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.IdentifiableBox.NewDomain, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.NewDomain.write(writer, instance.newDomain) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'NewAccount' variant - */ - public data class NewAccount( - public val newAccount: jp.co.soramitsu.iroha2.generated.NewAccount, - ) : IdentifiableBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 1 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.IdentifiableBox.NewAccount = try { - NewAccount( - jp.co.soramitsu.iroha2.generated.NewAccount.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.IdentifiableBox.NewAccount, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.NewAccount.write(writer, instance.newAccount) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'NewAssetDefinition' variant - */ - public data class NewAssetDefinition( - public val newAssetDefinition: jp.co.soramitsu.iroha2.generated.NewAssetDefinition, - ) : IdentifiableBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 2 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.IdentifiableBox.NewAssetDefinition = try { - NewAssetDefinition( - jp.co.soramitsu.iroha2.generated.NewAssetDefinition.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.IdentifiableBox.NewAssetDefinition, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.NewAssetDefinition.write( - writer, - instance.newAssetDefinition, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'NewRole' variant - */ - public data class NewRole( - public val role: jp.co.soramitsu.iroha2.generated.Role, - ) : IdentifiableBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 3 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.IdentifiableBox.NewRole = try { - NewRole( - jp.co.soramitsu.iroha2.generated.Role.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.IdentifiableBox.NewRole, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.Role.write(writer, instance.role) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Peer' variant - */ - public data class Peer( - public val peer: jp.co.soramitsu.iroha2.generated.Peer, - ) : IdentifiableBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 4 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.IdentifiableBox.Peer = try { - Peer( - jp.co.soramitsu.iroha2.generated.Peer.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.IdentifiableBox.Peer, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.Peer.write(writer, instance.peer) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Domain' variant - */ - public data class Domain( - public val domain: jp.co.soramitsu.iroha2.generated.Domain, - ) : IdentifiableBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 5 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.IdentifiableBox.Domain = try { - Domain( - jp.co.soramitsu.iroha2.generated.Domain.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.IdentifiableBox.Domain, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.Domain.write(writer, instance.domain) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Account' variant - */ - public data class Account( - public val account: jp.co.soramitsu.iroha2.generated.Account, - ) : IdentifiableBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 6 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.IdentifiableBox.Account = try { - Account( - jp.co.soramitsu.iroha2.generated.Account.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.IdentifiableBox.Account, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.Account.write(writer, instance.account) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'AssetDefinition' variant - */ - public data class AssetDefinition( - public val assetDefinition: jp.co.soramitsu.iroha2.generated.AssetDefinition, - ) : IdentifiableBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 7 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.IdentifiableBox.AssetDefinition = try { - AssetDefinition( - jp.co.soramitsu.iroha2.generated.AssetDefinition.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.IdentifiableBox.AssetDefinition, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.AssetDefinition.write(writer, instance.assetDefinition) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Asset' variant - */ - public data class Asset( - public val asset: jp.co.soramitsu.iroha2.generated.Asset, - ) : IdentifiableBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 8 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.IdentifiableBox.Asset = try { - Asset( - jp.co.soramitsu.iroha2.generated.Asset.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.IdentifiableBox.Asset, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.Asset.write(writer, instance.asset) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Trigger' variant - */ - public data class Trigger( - public val trigger: jp.co.soramitsu.iroha2.generated.Trigger, - ) : IdentifiableBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 9 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.IdentifiableBox.Trigger = try { - Trigger( - jp.co.soramitsu.iroha2.generated.Trigger.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.IdentifiableBox.Trigger, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.Trigger.write(writer, instance.trigger) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Role' variant - */ - public data class Role( - public val role: jp.co.soramitsu.iroha2.generated.Role, - ) : IdentifiableBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 10 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.IdentifiableBox.Role = try { - Role( - jp.co.soramitsu.iroha2.generated.Role.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.IdentifiableBox.Role, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.Role.write(writer, instance.role) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'CustomParameter' variant - */ - public data class CustomParameter( - public val customParameter: jp.co.soramitsu.iroha2.generated.CustomParameter, - ) : IdentifiableBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 11 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.IdentifiableBox.CustomParameter = try { - CustomParameter( - jp.co.soramitsu.iroha2.generated.CustomParameter.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.IdentifiableBox.CustomParameter, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.CustomParameter.write(writer, instance.customParameter) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): IdentifiableBox = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> NewDomain.read(reader) - 1 -> NewAccount.read(reader) - 2 -> NewAssetDefinition.read(reader) - 3 -> NewRole.read(reader) - 4 -> Peer.read(reader) - 5 -> Domain.read(reader) - 6 -> Account.read(reader) - 7 -> AssetDefinition.read(reader) - 8 -> Asset.read(reader) - 9 -> Trigger.read(reader) - 10 -> Role.read(reader) - 11 -> CustomParameter.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: IdentifiableBox) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 0 -> NewDomain.write(writer, instance as NewDomain) - 1 -> NewAccount.write(writer, instance as NewAccount) - 2 -> NewAssetDefinition.write(writer, instance as NewAssetDefinition) - 3 -> NewRole.write(writer, instance as NewRole) - 4 -> Peer.write(writer, instance as Peer) - 5 -> Domain.write(writer, instance as Domain) - 6 -> Account.write(writer, instance as Account) - 7 -> AssetDefinition.write(writer, instance as AssetDefinition) - 8 -> Asset.write(writer, instance as Asset) - 9 -> Trigger.write(writer, instance as Trigger) - 10 -> Role.write(writer, instance as Role) - 11 -> CustomParameter.write(writer, instance as CustomParameter) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/InstructionBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/InstructionBox.kt index da498696b..7a85e9410 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/InstructionBox.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/InstructionBox.kt @@ -36,22 +36,24 @@ public sealed class InstructionBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionBox.Register = try { - Register( - RegisterBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionBox.Register = + try { + Register( + RegisterBox.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.InstructionBox.Register, - ): Unit = try { - RegisterBox.write(writer, instance.registerBox) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + RegisterBox.write(writer, instance.registerBox) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -68,22 +70,24 @@ public sealed class InstructionBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionBox.Unregister = try { - Unregister( - UnregisterBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionBox.Unregister = + try { + Unregister( + UnregisterBox.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.InstructionBox.Unregister, - ): Unit = try { - UnregisterBox.write(writer, instance.unregisterBox) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + UnregisterBox.write(writer, instance.unregisterBox) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -100,22 +104,24 @@ public sealed class InstructionBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 2 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionBox.Mint = try { - Mint( - MintBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionBox.Mint = + try { + Mint( + MintBox.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.InstructionBox.Mint, - ): Unit = try { - MintBox.write(writer, instance.mintBox) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + MintBox.write(writer, instance.mintBox) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -132,22 +138,24 @@ public sealed class InstructionBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 3 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionBox.Burn = try { - Burn( - BurnBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionBox.Burn = + try { + Burn( + BurnBox.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.InstructionBox.Burn, - ): Unit = try { - BurnBox.write(writer, instance.burnBox) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + BurnBox.write(writer, instance.burnBox) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -164,22 +172,24 @@ public sealed class InstructionBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 4 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionBox.Transfer = try { - Transfer( - TransferBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionBox.Transfer = + try { + Transfer( + TransferBox.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.InstructionBox.Transfer, - ): Unit = try { - TransferBox.write(writer, instance.transferBox) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + TransferBox.write(writer, instance.transferBox) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -196,22 +206,24 @@ public sealed class InstructionBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 5 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionBox.SetKeyValue = try { - SetKeyValue( - SetKeyValueBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionBox.SetKeyValue = + try { + SetKeyValue( + SetKeyValueBox.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.InstructionBox.SetKeyValue, - ): Unit = try { - SetKeyValueBox.write(writer, instance.setKeyValueBox) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + SetKeyValueBox.write(writer, instance.setKeyValueBox) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -228,22 +240,24 @@ public sealed class InstructionBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 6 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionBox.RemoveKeyValue = try { - RemoveKeyValue( - RemoveKeyValueBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionBox.RemoveKeyValue = + try { + RemoveKeyValue( + RemoveKeyValueBox.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.InstructionBox.RemoveKeyValue, - ): Unit = try { - RemoveKeyValueBox.write(writer, instance.removeKeyValueBox) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + RemoveKeyValueBox.write(writer, instance.removeKeyValueBox) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -260,22 +274,24 @@ public sealed class InstructionBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 7 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionBox.Grant = try { - Grant( - GrantBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionBox.Grant = + try { + Grant( + GrantBox.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.InstructionBox.Grant, - ): Unit = try { - GrantBox.write(writer, instance.grantBox) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + GrantBox.write(writer, instance.grantBox) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -292,22 +308,24 @@ public sealed class InstructionBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 8 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionBox.Revoke = try { - Revoke( - RevokeBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionBox.Revoke = + try { + Revoke( + RevokeBox.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.InstructionBox.Revoke, - ): Unit = try { - RevokeBox.write(writer, instance.revokeBox) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + RevokeBox.write(writer, instance.revokeBox) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -324,22 +342,26 @@ public sealed class InstructionBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 9 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionBox.ExecuteTrigger = try { - ExecuteTrigger( - jp.co.soramitsu.iroha2.generated.ExecuteTrigger.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionBox.ExecuteTrigger = + try { + ExecuteTrigger( + jp.co.soramitsu.iroha2.generated.ExecuteTrigger + .read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.InstructionBox.ExecuteTrigger, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.ExecuteTrigger.write(writer, instance.executeTrigger) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + jp.co.soramitsu.iroha2.generated.ExecuteTrigger + .write(writer, instance.executeTrigger) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -356,22 +378,26 @@ public sealed class InstructionBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 10 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionBox.SetParameter = try { - SetParameter( - jp.co.soramitsu.iroha2.generated.SetParameter.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionBox.SetParameter = + try { + SetParameter( + jp.co.soramitsu.iroha2.generated.SetParameter + .read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.InstructionBox.SetParameter, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.SetParameter.write(writer, instance.setParameter) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + jp.co.soramitsu.iroha2.generated.SetParameter + .write(writer, instance.setParameter) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -388,22 +414,26 @@ public sealed class InstructionBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 11 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionBox.Upgrade = try { - Upgrade( - jp.co.soramitsu.iroha2.generated.Upgrade.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionBox.Upgrade = + try { + Upgrade( + jp.co.soramitsu.iroha2.generated.Upgrade + .read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.InstructionBox.Upgrade, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.Upgrade.write(writer, instance.upgrade) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + jp.co.soramitsu.iroha2.generated.Upgrade + .write(writer, instance.upgrade) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -420,22 +450,26 @@ public sealed class InstructionBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 12 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionBox.Log = try { - Log( - jp.co.soramitsu.iroha2.generated.Log.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionBox.Log = + try { + Log( + jp.co.soramitsu.iroha2.generated.Log + .read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.InstructionBox.Log, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.Log.write(writer, instance.log) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + jp.co.soramitsu.iroha2.generated.Log + .write(writer, instance.log) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -452,47 +486,51 @@ public sealed class InstructionBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 13 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionBox.Custom = try { - Custom( - CustomInstruction.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionBox.Custom = + try { + Custom( + CustomInstruction.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.InstructionBox.Custom, - ): Unit = try { - CustomInstruction.write(writer, instance.customInstruction) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + CustomInstruction.write(writer, instance.customInstruction) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): InstructionBox = when ( - val discriminant = - reader.readUByte() + override fun read(reader: ScaleCodecReader): InstructionBox = + when (val discriminant = reader.readUByte()) { + 0 -> Register.read(reader) + 1 -> Unregister.read(reader) + 2 -> Mint.read(reader) + 3 -> Burn.read(reader) + 4 -> Transfer.read(reader) + 5 -> SetKeyValue.read(reader) + 6 -> RemoveKeyValue.read(reader) + 7 -> Grant.read(reader) + 8 -> Revoke.read(reader) + 9 -> ExecuteTrigger.read(reader) + 10 -> SetParameter.read(reader) + 11 -> Upgrade.read(reader) + 12 -> Log.read(reader) + 13 -> Custom.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: InstructionBox, ) { - 0 -> Register.read(reader) - 1 -> Unregister.read(reader) - 2 -> Mint.read(reader) - 3 -> Burn.read(reader) - 4 -> Transfer.read(reader) - 5 -> SetKeyValue.read(reader) - 6 -> RemoveKeyValue.read(reader) - 7 -> Grant.read(reader) - 8 -> Revoke.read(reader) - 9 -> ExecuteTrigger.read(reader) - 10 -> SetParameter.read(reader) - 11 -> Upgrade.read(reader) - 12 -> Log.read(reader) - 13 -> Custom.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: InstructionBox) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Register.write(writer, instance as Register) @@ -509,7 +547,8 @@ public sealed class InstructionBox : ModelEnum { 11 -> Upgrade.write(writer, instance as Upgrade) 12 -> Log.write(writer, instance as Log) 13 -> Custom.write(writer, instance as Custom) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/InstructionEvaluationError.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/InstructionEvaluationError.kt index 1d78f7592..289709aff 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/InstructionEvaluationError.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/InstructionEvaluationError.kt @@ -37,13 +37,14 @@ public sealed class InstructionEvaluationError : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionEvaluationError.Unsupported = try { - Unsupported( - InstructionType.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionEvaluationError.Unsupported = + try { + Unsupported( + InstructionType.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, @@ -70,22 +71,24 @@ public sealed class InstructionEvaluationError : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionEvaluationError.PermissionParameter = try { - PermissionParameter( - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionEvaluationError.PermissionParameter = + try { + PermissionParameter( + reader.readString(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.InstructionEvaluationError.PermissionParameter, - ): Unit = try { - writer.writeAsList(instance.string.toByteArray(Charsets.UTF_8)) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + writer.writeAsList(instance.string.toByteArray(Charsets.UTF_8)) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -102,44 +105,49 @@ public sealed class InstructionEvaluationError : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 2 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionEvaluationError.Type = try { - Type( - TypeError.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionEvaluationError.Type = + try { + Type( + TypeError.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.InstructionEvaluationError.Type, - ): Unit = try { - TypeError.write(writer, instance.typeError) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + TypeError.write(writer, instance.typeError) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): InstructionEvaluationError = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Unsupported.read(reader) - 1 -> PermissionParameter.read(reader) - 2 -> Type.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + override fun read(reader: ScaleCodecReader): InstructionEvaluationError = + when (val discriminant = reader.readUByte()) { + 0 -> Unsupported.read(reader) + 1 -> PermissionParameter.read(reader) + 2 -> Type.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: InstructionEvaluationError) { + override fun write( + writer: ScaleCodecWriter, + instance: InstructionEvaluationError, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Unsupported.write(writer, instance as Unsupported) 1 -> PermissionParameter.write(writer, instance as PermissionParameter) 2 -> Type.write(writer, instance as Type) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/InstructionExecutionError.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/InstructionExecutionError.kt index 760bb061c..690304176 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/InstructionExecutionError.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/InstructionExecutionError.kt @@ -37,22 +37,24 @@ public sealed class InstructionExecutionError : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionExecutionError.Evaluate = try { - Evaluate( - InstructionEvaluationError.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionExecutionError.Evaluate = + try { + Evaluate( + InstructionEvaluationError.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.InstructionExecutionError.Evaluate, - ): Unit = try { - InstructionEvaluationError.write(writer, instance.instructionEvaluationError) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + InstructionEvaluationError.write(writer, instance.instructionEvaluationError) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -69,22 +71,24 @@ public sealed class InstructionExecutionError : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionExecutionError.Query = try { - Query( - QueryExecutionFail.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionExecutionError.Query = + try { + Query( + QueryExecutionFail.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.InstructionExecutionError.Query, - ): Unit = try { - QueryExecutionFail.write(writer, instance.queryExecutionFail) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + QueryExecutionFail.write(writer, instance.queryExecutionFail) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -101,13 +105,14 @@ public sealed class InstructionExecutionError : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 2 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionExecutionError.Conversion = try { - Conversion( - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionExecutionError.Conversion = + try { + Conversion( + reader.readString(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, @@ -134,22 +139,24 @@ public sealed class InstructionExecutionError : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 3 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionExecutionError.Find = try { - Find( - FindError.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionExecutionError.Find = + try { + Find( + FindError.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.InstructionExecutionError.Find, - ): Unit = try { - FindError.write(writer, instance.findError) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + FindError.write(writer, instance.findError) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -166,13 +173,14 @@ public sealed class InstructionExecutionError : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 4 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionExecutionError.Repetition = try { - Repetition( - RepetitionError.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionExecutionError.Repetition = + try { + Repetition( + RepetitionError.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, @@ -199,13 +207,14 @@ public sealed class InstructionExecutionError : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 5 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionExecutionError.Mintability = try { - Mintability( - MintabilityError.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionExecutionError.Mintability = + try { + Mintability( + MintabilityError.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, @@ -232,22 +241,24 @@ public sealed class InstructionExecutionError : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 6 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionExecutionError.Math = try { - Math( - MathError.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionExecutionError.Math = + try { + Math( + MathError.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.InstructionExecutionError.Math, - ): Unit = try { - MathError.write(writer, instance.mathError) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + MathError.write(writer, instance.mathError) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -264,22 +275,24 @@ public sealed class InstructionExecutionError : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 7 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionExecutionError.InvalidParameter = try { - InvalidParameter( - InvalidParameterError.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionExecutionError.InvalidParameter = + try { + InvalidParameter( + InvalidParameterError.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.InstructionExecutionError.InvalidParameter, - ): Unit = try { - InvalidParameterError.write(writer, instance.invalidParameterError) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + InvalidParameterError.write(writer, instance.invalidParameterError) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -296,44 +309,48 @@ public sealed class InstructionExecutionError : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 8 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionExecutionError.InvariantViolation = try { - InvariantViolation( - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionExecutionError.InvariantViolation = + try { + InvariantViolation( + reader.readString(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.InstructionExecutionError.InvariantViolation, - ): Unit = try { - writer.writeAsList(instance.string.toByteArray(Charsets.UTF_8)) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + writer.writeAsList(instance.string.toByteArray(Charsets.UTF_8)) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): InstructionExecutionError = when ( - val discriminant = - reader.readUByte() + override fun read(reader: ScaleCodecReader): InstructionExecutionError = + when (val discriminant = reader.readUByte()) { + 0 -> Evaluate.read(reader) + 1 -> Query.read(reader) + 2 -> Conversion.read(reader) + 3 -> Find.read(reader) + 4 -> Repetition.read(reader) + 5 -> Mintability.read(reader) + 6 -> Math.read(reader) + 7 -> InvalidParameter.read(reader) + 8 -> InvariantViolation.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: InstructionExecutionError, ) { - 0 -> Evaluate.read(reader) - 1 -> Query.read(reader) - 2 -> Conversion.read(reader) - 3 -> Find.read(reader) - 4 -> Repetition.read(reader) - 5 -> Mintability.read(reader) - 6 -> Math.read(reader) - 7 -> InvalidParameter.read(reader) - 8 -> InvariantViolation.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: InstructionExecutionError) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Evaluate.write(writer, instance as Evaluate) @@ -345,7 +362,8 @@ public sealed class InstructionExecutionError : ModelEnum { 6 -> Math.write(writer, instance as Math) 7 -> InvalidParameter.write(writer, instance as InvalidParameter) 8 -> InvariantViolation.write(writer, instance as InvariantViolation) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/InstructionExecutionFail.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/InstructionExecutionFail.kt index 96f0c4d1b..99cb659d3 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/InstructionExecutionFail.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/InstructionExecutionFail.kt @@ -23,20 +23,25 @@ public data class InstructionExecutionFail( public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): InstructionExecutionFail = try { - InstructionExecutionFail( - InstructionBox.read(reader), - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): InstructionExecutionFail = + try { + InstructionExecutionFail( + InstructionBox.read(reader), + reader.readString(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: InstructionExecutionFail): Unit = try { - InstructionBox.write(writer, instance.instruction) - writer.writeAsList(instance.reason.toByteArray(Charsets.UTF_8)) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: InstructionExecutionFail, + ): Unit = + try { + InstructionBox.write(writer, instance.instruction) + writer.writeAsList(instance.reason.toByteArray(Charsets.UTF_8)) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/InstructionType.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/InstructionType.kt index cd9cc929b..f0fea6067 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/InstructionType.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/InstructionType.kt @@ -25,39 +25,43 @@ public sealed class InstructionType : ModelEnum { */ public abstract fun discriminant(): Int - override fun equals(other: Any?): Boolean = when (this) { - is Register -> Register.equals(this, other) - is Unregister -> Unregister.equals(this, other) - is Mint -> Mint.equals(this, other) - is Burn -> Burn.equals(this, other) - is Transfer -> Transfer.equals(this, other) - is SetKeyValue -> SetKeyValue.equals(this, other) - is RemoveKeyValue -> RemoveKeyValue.equals(this, other) - is Grant -> Grant.equals(this, other) - is Revoke -> Revoke.equals(this, other) - is ExecuteTrigger -> ExecuteTrigger.equals(this, other) - is SetParameter -> SetParameter.equals(this, other) - is Upgrade -> Upgrade.equals(this, other) - is Log -> Log.equals(this, other) - is Custom -> Custom.equals(this, other) - else -> super.equals(other) } - - override fun hashCode(): Int = when (this) { - is Register -> Register.hashCode() - is Unregister -> Unregister.hashCode() - is Mint -> Mint.hashCode() - is Burn -> Burn.hashCode() - is Transfer -> Transfer.hashCode() - is SetKeyValue -> SetKeyValue.hashCode() - is RemoveKeyValue -> RemoveKeyValue.hashCode() - is Grant -> Grant.hashCode() - is Revoke -> Revoke.hashCode() - is ExecuteTrigger -> ExecuteTrigger.hashCode() - is SetParameter -> SetParameter.hashCode() - is Upgrade -> Upgrade.hashCode() - is Log -> Log.hashCode() - is Custom -> Custom.hashCode() - else -> super.hashCode() } + override fun equals(other: Any?): Boolean = + when (this) { + is Register -> Register.equals(this, other) + is Unregister -> Unregister.equals(this, other) + is Mint -> Mint.equals(this, other) + is Burn -> Burn.equals(this, other) + is Transfer -> Transfer.equals(this, other) + is SetKeyValue -> SetKeyValue.equals(this, other) + is RemoveKeyValue -> RemoveKeyValue.equals(this, other) + is Grant -> Grant.equals(this, other) + is Revoke -> Revoke.equals(this, other) + is ExecuteTrigger -> ExecuteTrigger.equals(this, other) + is SetParameter -> SetParameter.equals(this, other) + is Upgrade -> Upgrade.equals(this, other) + is Log -> Log.equals(this, other) + is Custom -> Custom.equals(this, other) + else -> super.equals(other) + } + + override fun hashCode(): Int = + when (this) { + is Register -> Register.hashCode() + is Unregister -> Unregister.hashCode() + is Mint -> Mint.hashCode() + is Burn -> Burn.hashCode() + is Transfer -> Transfer.hashCode() + is SetKeyValue -> SetKeyValue.hashCode() + is RemoveKeyValue -> RemoveKeyValue.hashCode() + is Grant -> Grant.hashCode() + is Revoke -> Revoke.hashCode() + is ExecuteTrigger -> ExecuteTrigger.hashCode() + is SetParameter -> SetParameter.hashCode() + is Upgrade -> Upgrade.hashCode() + is Log -> Log.hashCode() + is Custom -> Custom.hashCode() + else -> super.hashCode() + } /** * 'Register' variant @@ -70,24 +74,30 @@ public sealed class InstructionType : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionType.Register = try { - Register() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionType.Register = + try { + Register() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.InstructionType.Register, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: jp.co.soramitsu.iroha2.generated.InstructionType.Register, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.InstructionType.Register, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".InstructionType.Register".hashCode() } @@ -104,24 +114,30 @@ public sealed class InstructionType : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionType.Unregister = try { - Unregister() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionType.Unregister = + try { + Unregister() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.InstructionType.Unregister, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: jp.co.soramitsu.iroha2.generated.InstructionType.Unregister, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.InstructionType.Unregister, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".InstructionType.Unregister".hashCode() } @@ -138,24 +154,30 @@ public sealed class InstructionType : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 2 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionType.Mint = try { - Mint() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionType.Mint = + try { + Mint() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.InstructionType.Mint, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: jp.co.soramitsu.iroha2.generated.InstructionType.Mint, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.InstructionType.Mint, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".InstructionType.Mint".hashCode() } @@ -172,24 +194,30 @@ public sealed class InstructionType : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 3 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionType.Burn = try { - Burn() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionType.Burn = + try { + Burn() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.InstructionType.Burn, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: jp.co.soramitsu.iroha2.generated.InstructionType.Burn, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.InstructionType.Burn, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".InstructionType.Burn".hashCode() } @@ -206,24 +234,30 @@ public sealed class InstructionType : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 4 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionType.Transfer = try { - Transfer() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionType.Transfer = + try { + Transfer() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.InstructionType.Transfer, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: jp.co.soramitsu.iroha2.generated.InstructionType.Transfer, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.InstructionType.Transfer, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".InstructionType.Transfer".hashCode() } @@ -240,24 +274,30 @@ public sealed class InstructionType : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 5 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionType.SetKeyValue = try { - SetKeyValue() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionType.SetKeyValue = + try { + SetKeyValue() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.InstructionType.SetKeyValue, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: jp.co.soramitsu.iroha2.generated.InstructionType.SetKeyValue, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.InstructionType.SetKeyValue, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".InstructionType.SetKeyValue".hashCode() } @@ -274,27 +314,30 @@ public sealed class InstructionType : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 6 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionType.RemoveKeyValue = try { - RemoveKeyValue() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionType.RemoveKeyValue = + try { + RemoveKeyValue() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.InstructionType.RemoveKeyValue, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } public fun equals( o1: jp.co.soramitsu.iroha2.generated.InstructionType.RemoveKeyValue, o2: Any?, - ): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".InstructionType.RemoveKeyValue".hashCode() } @@ -311,24 +354,30 @@ public sealed class InstructionType : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 7 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionType.Grant = try { - Grant() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionType.Grant = + try { + Grant() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.InstructionType.Grant, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: jp.co.soramitsu.iroha2.generated.InstructionType.Grant, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.InstructionType.Grant, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".InstructionType.Grant".hashCode() } @@ -345,24 +394,30 @@ public sealed class InstructionType : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 8 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionType.Revoke = try { - Revoke() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionType.Revoke = + try { + Revoke() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.InstructionType.Revoke, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: jp.co.soramitsu.iroha2.generated.InstructionType.Revoke, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.InstructionType.Revoke, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".InstructionType.Revoke".hashCode() } @@ -379,27 +434,30 @@ public sealed class InstructionType : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 9 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionType.ExecuteTrigger = try { - ExecuteTrigger() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionType.ExecuteTrigger = + try { + ExecuteTrigger() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.InstructionType.ExecuteTrigger, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } public fun equals( o1: jp.co.soramitsu.iroha2.generated.InstructionType.ExecuteTrigger, o2: Any?, - ): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".InstructionType.ExecuteTrigger".hashCode() } @@ -416,27 +474,30 @@ public sealed class InstructionType : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 10 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionType.SetParameter = try { - SetParameter() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionType.SetParameter = + try { + SetParameter() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.InstructionType.SetParameter, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } public fun equals( o1: jp.co.soramitsu.iroha2.generated.InstructionType.SetParameter, o2: Any?, - ): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".InstructionType.SetParameter".hashCode() } @@ -453,24 +514,30 @@ public sealed class InstructionType : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 11 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionType.Upgrade = try { - Upgrade() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionType.Upgrade = + try { + Upgrade() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.InstructionType.Upgrade, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: jp.co.soramitsu.iroha2.generated.InstructionType.Upgrade, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.InstructionType.Upgrade, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".InstructionType.Upgrade".hashCode() } @@ -487,24 +554,30 @@ public sealed class InstructionType : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 12 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionType.Log = try { - Log() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionType.Log = + try { + Log() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.InstructionType.Log, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: jp.co.soramitsu.iroha2.generated.InstructionType.Log, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.InstructionType.Log, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".InstructionType.Log".hashCode() } @@ -521,51 +594,59 @@ public sealed class InstructionType : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 13 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionType.Custom = try { - Custom() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InstructionType.Custom = + try { + Custom() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.InstructionType.Custom, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: jp.co.soramitsu.iroha2.generated.InstructionType.Custom, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.InstructionType.Custom, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".InstructionType.Custom".hashCode() } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): InstructionType = when ( - val discriminant = - reader.readUByte() + override fun read(reader: ScaleCodecReader): InstructionType = + when (val discriminant = reader.readUByte()) { + 0 -> Register.read(reader) + 1 -> Unregister.read(reader) + 2 -> Mint.read(reader) + 3 -> Burn.read(reader) + 4 -> Transfer.read(reader) + 5 -> SetKeyValue.read(reader) + 6 -> RemoveKeyValue.read(reader) + 7 -> Grant.read(reader) + 8 -> Revoke.read(reader) + 9 -> ExecuteTrigger.read(reader) + 10 -> SetParameter.read(reader) + 11 -> Upgrade.read(reader) + 12 -> Log.read(reader) + 13 -> Custom.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: InstructionType, ) { - 0 -> Register.read(reader) - 1 -> Unregister.read(reader) - 2 -> Mint.read(reader) - 3 -> Burn.read(reader) - 4 -> Transfer.read(reader) - 5 -> SetKeyValue.read(reader) - 6 -> RemoveKeyValue.read(reader) - 7 -> Grant.read(reader) - 8 -> Revoke.read(reader) - 9 -> ExecuteTrigger.read(reader) - 10 -> SetParameter.read(reader) - 11 -> Upgrade.read(reader) - 12 -> Log.read(reader) - 13 -> Custom.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: InstructionType) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Register.write(writer, instance as Register) @@ -582,7 +663,8 @@ public sealed class InstructionType : ModelEnum { 11 -> Upgrade.write(writer, instance as Upgrade) 12 -> Log.write(writer, instance as Log) 13 -> Custom.write(writer, instance as Custom) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/InvalidParameterError.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/InvalidParameterError.kt index 55914c99b..2d2c2af75 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/InvalidParameterError.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/InvalidParameterError.kt @@ -26,13 +26,17 @@ public sealed class InvalidParameterError : ModelEnum { */ public abstract fun discriminant(): Int - override fun equals(other: Any?): Boolean = when (this) { - is TimeTriggerInThePast -> TimeTriggerInThePast.equals(this, other) - else -> super.equals(other) } + override fun equals(other: Any?): Boolean = + when (this) { + is TimeTriggerInThePast -> TimeTriggerInThePast.equals(this, other) + else -> super.equals(other) + } - override fun hashCode(): Int = when (this) { - is TimeTriggerInThePast -> TimeTriggerInThePast.hashCode() - else -> super.hashCode() } + override fun hashCode(): Int = + when (this) { + is TimeTriggerInThePast -> TimeTriggerInThePast.hashCode() + else -> super.hashCode() + } /** * 'Wasm' variant @@ -47,22 +51,24 @@ public sealed class InvalidParameterError : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InvalidParameterError.Wasm = try { - Wasm( - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InvalidParameterError.Wasm = + try { + Wasm( + reader.readString(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.InvalidParameterError.Wasm, - ): Unit = try { - writer.writeAsList(instance.string.toByteArray(Charsets.UTF_8)) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + writer.writeAsList(instance.string.toByteArray(Charsets.UTF_8)) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -77,47 +83,53 @@ public sealed class InvalidParameterError : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InvalidParameterError.TimeTriggerInThePast = try { - TimeTriggerInThePast() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.InvalidParameterError.TimeTriggerInThePast = + try { + TimeTriggerInThePast() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.InvalidParameterError.TimeTriggerInThePast, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } public fun equals( o1: jp.co.soramitsu.iroha2.generated.InvalidParameterError.TimeTriggerInThePast, o2: Any?, - ): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".InvalidParameterError.TimeTriggerInThePast".hashCode() } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): InvalidParameterError = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Wasm.read(reader) - 1 -> TimeTriggerInThePast.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + override fun read(reader: ScaleCodecReader): InvalidParameterError = + when (val discriminant = reader.readUByte()) { + 0 -> Wasm.read(reader) + 1 -> TimeTriggerInThePast.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: InvalidParameterError) { + override fun write( + writer: ScaleCodecWriter, + instance: InvalidParameterError, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Wasm.write(writer, instance as Wasm) 1 -> TimeTriggerInThePast.write(writer, instance as TimeTriggerInThePast) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/IpfsPath.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/IpfsPath.kt index dc195a395..06f534c32 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/IpfsPath.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/IpfsPath.kt @@ -20,18 +20,23 @@ public data class IpfsPath( public val string: String, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): IpfsPath = try { - IpfsPath( - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): IpfsPath = + try { + IpfsPath( + reader.readString(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: IpfsPath): Unit = try { - writer.writeAsList(instance.string.toByteArray(Charsets.UTF_8)) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: IpfsPath, + ): Unit = + try { + writer.writeAsList(instance.string.toByteArray(Charsets.UTF_8)) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Ipv4Addr.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Ipv4Addr.kt index ff92ed36c..a1d3a6ebe 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Ipv4Addr.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Ipv4Addr.kt @@ -32,18 +32,23 @@ public data class Ipv4Addr( override fun hashCode(): Int = arrayOfU8.contentHashCode() public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): Ipv4Addr = try { - Ipv4Addr( - reader.readByteArray(4), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): Ipv4Addr = + try { + Ipv4Addr( + reader.readByteArray(4), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: Ipv4Addr): Unit = try { - writer.writeByteArray(instance.arrayOfU8) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: Ipv4Addr, + ): Unit = + try { + writer.writeByteArray(instance.arrayOfU8) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Ipv6Addr.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Ipv6Addr.kt index 349d53706..3a48bf855 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Ipv6Addr.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Ipv6Addr.kt @@ -21,20 +21,25 @@ public data class Ipv6Addr( public val arrayOfU16: Array, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): Ipv6Addr = try { - Ipv6Addr( - reader.readArray(8) { reader.readUint16() }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): Ipv6Addr = + try { + Ipv6Addr( + reader.readArray(8) { reader.readUint16() }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: Ipv6Addr): Unit = try { - instance.arrayOfU16.forEach { value -> - writer.writeUint16(value) + override fun write( + writer: ScaleCodecWriter, + instance: Ipv6Addr, + ): Unit = + try { + instance.arrayOfU16.forEach { value -> + writer.writeUint16(value) + } + } catch (ex: Exception) { + throw wrapException(ex) } - } catch (ex: Exception) { - throw wrapException(ex) - } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Json.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Json.kt new file mode 100644 index 000000000..7a0b5a21e --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Json.kt @@ -0,0 +1,42 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.String +import kotlin.Unit + +/** + * Json + * + * Generated from 'Json' regular structure + */ +public data class Json( + public val string: String, +) { + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): Json = + try { + Json( + reader.readString(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: Json, + ): Unit = + try { + writer.writeAsList(instance.string.toByteArray(Charsets.UTF_8)) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/JsonPredicateAtom.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/JsonPredicateAtom.kt new file mode 100644 index 000000000..938f827de --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/JsonPredicateAtom.kt @@ -0,0 +1,78 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit + +/** + * JsonPredicateAtom + * + * Generated from 'JsonPredicateAtom' enum + */ +public sealed class JsonPredicateAtom : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Equals' variant + */ + public data class Equals( + public val json: Json, + ) : JsonPredicateAtom() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.JsonPredicateAtom.Equals = + try { + Equals( + Json.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.JsonPredicateAtom.Equals, + ): Unit = + try { + Json.write(writer, instance.json) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): JsonPredicateAtom = + when (val discriminant = reader.readUByte()) { + 0 -> Equals.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: JsonPredicateAtom, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Equals.write(writer, instance as Equals) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/JsonProjectionOfPredicateMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/JsonProjectionOfPredicateMarker.kt new file mode 100644 index 000000000..86499dafe --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/JsonProjectionOfPredicateMarker.kt @@ -0,0 +1,80 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit + +/** + * JsonProjectionOfPredicateMarker + * + * Generated from 'JsonProjectionOfPredicateMarker' enum + */ +public sealed class JsonProjectionOfPredicateMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val jsonPredicateAtom: JsonPredicateAtom, + ) : JsonProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.JsonProjectionOfPredicateMarker.Atom = + try { + Atom( + JsonPredicateAtom.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.JsonProjectionOfPredicateMarker.Atom, + ): Unit = + try { + JsonPredicateAtom.write(writer, instance.jsonPredicateAtom) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): JsonProjectionOfPredicateMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: JsonProjectionOfPredicateMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/JsonProjectionOfSelectorMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/JsonProjectionOfSelectorMarker.kt new file mode 100644 index 000000000..9ffaf8e0c --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/JsonProjectionOfSelectorMarker.kt @@ -0,0 +1,100 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Any +import kotlin.Boolean +import kotlin.Int +import kotlin.Unit + +/** + * JsonProjectionOfSelectorMarker + * + * Generated from 'JsonProjectionOfSelectorMarker' enum + */ +public sealed class JsonProjectionOfSelectorMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + override fun equals(other: Any?): Boolean = + when (this) { + is Atom -> Atom.equals(this, other) + else -> super.equals(other) + } + + override fun hashCode(): Int = + when (this) { + is Atom -> Atom.hashCode() + else -> super.hashCode() + } + + /** + * 'Atom' variant + */ + public class Atom : JsonProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.JsonProjectionOfSelectorMarker.Atom = + try { + Atom() + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.JsonProjectionOfSelectorMarker.Atom, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.JsonProjectionOfSelectorMarker.Atom, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".JsonProjectionOfSelectorMarker.Atom".hashCode() + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): JsonProjectionOfSelectorMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: JsonProjectionOfSelectorMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Level.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Level.kt index c8922439c..88567821e 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Level.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Level.kt @@ -25,21 +25,25 @@ public sealed class Level : ModelEnum { */ public abstract fun discriminant(): Int - override fun equals(other: Any?): Boolean = when (this) { - is TRACE -> TRACE.equals(this, other) - is DEBUG -> DEBUG.equals(this, other) - is INFO -> INFO.equals(this, other) - is WARN -> WARN.equals(this, other) - is ERROR -> ERROR.equals(this, other) - else -> super.equals(other) } - - override fun hashCode(): Int = when (this) { - is TRACE -> TRACE.hashCode() - is DEBUG -> DEBUG.hashCode() - is INFO -> INFO.hashCode() - is WARN -> WARN.hashCode() - is ERROR -> ERROR.hashCode() - else -> super.hashCode() } + override fun equals(other: Any?): Boolean = + when (this) { + is TRACE -> TRACE.equals(this, other) + is DEBUG -> DEBUG.equals(this, other) + is INFO -> INFO.equals(this, other) + is WARN -> WARN.equals(this, other) + is ERROR -> ERROR.equals(this, other) + else -> super.equals(other) + } + + override fun hashCode(): Int = + when (this) { + is TRACE -> TRACE.hashCode() + is DEBUG -> DEBUG.hashCode() + is INFO -> INFO.hashCode() + is WARN -> WARN.hashCode() + is ERROR -> ERROR.hashCode() + else -> super.hashCode() + } /** * 'TRACE' variant @@ -62,16 +66,20 @@ public sealed class Level : ModelEnum { override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.Level.TRACE, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: jp.co.soramitsu.iroha2.generated.Level.TRACE, o2: Any?): Boolean = when - (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.Level.TRACE, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".Level.TRACE".hashCode() } @@ -98,16 +106,20 @@ public sealed class Level : ModelEnum { override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.Level.DEBUG, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: jp.co.soramitsu.iroha2.generated.Level.DEBUG, o2: Any?): Boolean = when - (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.Level.DEBUG, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".Level.DEBUG".hashCode() } @@ -124,25 +136,30 @@ public sealed class Level : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 2 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.Level.INFO = try { - INFO() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.Level.INFO = + try { + INFO() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.Level.INFO, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: jp.co.soramitsu.iroha2.generated.Level.INFO, o2: Any?): Boolean = when - (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.Level.INFO, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".Level.INFO".hashCode() } @@ -159,25 +176,30 @@ public sealed class Level : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 3 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.Level.WARN = try { - WARN() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.Level.WARN = + try { + WARN() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.Level.WARN, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: jp.co.soramitsu.iroha2.generated.Level.WARN, o2: Any?): Boolean = when - (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.Level.WARN, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".Level.WARN".hashCode() } @@ -204,31 +226,40 @@ public sealed class Level : ModelEnum { override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.Level.ERROR, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: jp.co.soramitsu.iroha2.generated.Level.ERROR, o2: Any?): Boolean = when - (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.Level.ERROR, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".Level.ERROR".hashCode() } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): Level = when (val discriminant = reader.readUByte()) { - 0 -> TRACE.read(reader) - 1 -> DEBUG.read(reader) - 2 -> INFO.read(reader) - 3 -> WARN.read(reader) - 4 -> ERROR.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: Level) { + override fun read(reader: ScaleCodecReader): Level = + when (val discriminant = reader.readUByte()) { + 0 -> TRACE.read(reader) + 1 -> DEBUG.read(reader) + 2 -> INFO.read(reader) + 3 -> WARN.read(reader) + 4 -> ERROR.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: Level, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> TRACE.write(writer, instance as TRACE) @@ -236,7 +267,8 @@ public sealed class Level : ModelEnum { 2 -> INFO.write(writer, instance as INFO) 3 -> WARN.write(writer, instance as WARN) 4 -> ERROR.write(writer, instance as ERROR) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Log.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Log.kt index 5f02f1f83..ad801dcb6 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Log.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Log.kt @@ -21,20 +21,25 @@ public data class Log( public val msg: String, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): Log = try { - Log( - Level.read(reader), - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): Log = + try { + Log( + Level.read(reader), + reader.readString(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: Log): Unit = try { - Level.write(writer, instance.level) - writer.writeAsList(instance.msg.toByteArray(Charsets.UTF_8)) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: Log, + ): Unit = + try { + Level.write(writer, instance.level) + writer.writeAsList(instance.msg.toByteArray(Charsets.UTF_8)) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MathError.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MathError.kt index e3ec6fe97..b9f0f0cd6 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MathError.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MathError.kt @@ -26,23 +26,27 @@ public sealed class MathError : ModelEnum { */ public abstract fun discriminant(): Int - override fun equals(other: Any?): Boolean = when (this) { - is Overflow -> Overflow.equals(this, other) - is NotEnoughQuantity -> NotEnoughQuantity.equals(this, other) - is DivideByZero -> DivideByZero.equals(this, other) - is NegativeValue -> NegativeValue.equals(this, other) - is DomainViolation -> DomainViolation.equals(this, other) - is Unknown -> Unknown.equals(this, other) - else -> super.equals(other) } - - override fun hashCode(): Int = when (this) { - is Overflow -> Overflow.hashCode() - is NotEnoughQuantity -> NotEnoughQuantity.hashCode() - is DivideByZero -> DivideByZero.hashCode() - is NegativeValue -> NegativeValue.hashCode() - is DomainViolation -> DomainViolation.hashCode() - is Unknown -> Unknown.hashCode() - else -> super.hashCode() } + override fun equals(other: Any?): Boolean = + when (this) { + is Overflow -> Overflow.equals(this, other) + is NotEnoughQuantity -> NotEnoughQuantity.equals(this, other) + is DivideByZero -> DivideByZero.equals(this, other) + is NegativeValue -> NegativeValue.equals(this, other) + is DomainViolation -> DomainViolation.equals(this, other) + is Unknown -> Unknown.equals(this, other) + else -> super.equals(other) + } + + override fun hashCode(): Int = + when (this) { + is Overflow -> Overflow.hashCode() + is NotEnoughQuantity -> NotEnoughQuantity.hashCode() + is DivideByZero -> DivideByZero.hashCode() + is NegativeValue -> NegativeValue.hashCode() + is DomainViolation -> DomainViolation.hashCode() + is Unknown -> Unknown.hashCode() + else -> super.hashCode() + } /** * 'Overflow' variant @@ -55,24 +59,30 @@ public sealed class MathError : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.MathError.Overflow = try { - Overflow() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.MathError.Overflow = + try { + Overflow() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.MathError.Overflow, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: jp.co.soramitsu.iroha2.generated.MathError.Overflow, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.MathError.Overflow, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".MathError.Overflow".hashCode() } @@ -89,24 +99,30 @@ public sealed class MathError : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.MathError.NotEnoughQuantity = try { - NotEnoughQuantity() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.MathError.NotEnoughQuantity = + try { + NotEnoughQuantity() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.MathError.NotEnoughQuantity, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: jp.co.soramitsu.iroha2.generated.MathError.NotEnoughQuantity, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.MathError.NotEnoughQuantity, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".MathError.NotEnoughQuantity".hashCode() } @@ -123,24 +139,30 @@ public sealed class MathError : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 2 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.MathError.DivideByZero = try { - DivideByZero() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.MathError.DivideByZero = + try { + DivideByZero() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.MathError.DivideByZero, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: jp.co.soramitsu.iroha2.generated.MathError.DivideByZero, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.MathError.DivideByZero, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".MathError.DivideByZero".hashCode() } @@ -157,24 +179,30 @@ public sealed class MathError : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 3 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.MathError.NegativeValue = try { - NegativeValue() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.MathError.NegativeValue = + try { + NegativeValue() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.MathError.NegativeValue, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: jp.co.soramitsu.iroha2.generated.MathError.NegativeValue, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.MathError.NegativeValue, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".MathError.NegativeValue".hashCode() } @@ -191,24 +219,30 @@ public sealed class MathError : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 4 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.MathError.DomainViolation = try { - DomainViolation() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.MathError.DomainViolation = + try { + DomainViolation() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.MathError.DomainViolation, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: jp.co.soramitsu.iroha2.generated.MathError.DomainViolation, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.MathError.DomainViolation, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".MathError.DomainViolation".hashCode() } @@ -225,21 +259,26 @@ public sealed class MathError : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 5 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.MathError.Unknown = try { - Unknown() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.MathError.Unknown = + try { + Unknown() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.MathError.Unknown, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: jp.co.soramitsu.iroha2.generated.MathError.Unknown, o2: Any?): Boolean = + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.MathError.Unknown, + o2: Any?, + ): Boolean = when (o2) { null -> false else -> o2::class == o1::class @@ -262,40 +301,44 @@ public sealed class MathError : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 6 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.MathError.FixedPointConversion = try { - FixedPointConversion( - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.MathError.FixedPointConversion = + try { + FixedPointConversion( + reader.readString(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.MathError.FixedPointConversion, - ): Unit = try { - writer.writeAsList(instance.string.toByteArray(Charsets.UTF_8)) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + writer.writeAsList(instance.string.toByteArray(Charsets.UTF_8)) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): MathError = when ( - val discriminant = - reader.readUByte() + override fun read(reader: ScaleCodecReader): MathError = + when (val discriminant = reader.readUByte()) { + 0 -> Overflow.read(reader) + 1 -> NotEnoughQuantity.read(reader) + 2 -> DivideByZero.read(reader) + 3 -> NegativeValue.read(reader) + 4 -> DomainViolation.read(reader) + 5 -> Unknown.read(reader) + 6 -> FixedPointConversion.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: MathError, ) { - 0 -> Overflow.read(reader) - 1 -> NotEnoughQuantity.read(reader) - 2 -> DivideByZero.read(reader) - 3 -> NegativeValue.read(reader) - 4 -> DomainViolation.read(reader) - 5 -> Unknown.read(reader) - 6 -> FixedPointConversion.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: MathError) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Overflow.write(writer, instance as Overflow) @@ -305,7 +348,8 @@ public sealed class MathError : ModelEnum { 4 -> DomainViolation.write(writer, instance as DomainViolation) 5 -> Unknown.write(writer, instance as Unknown) 6 -> FixedPointConversion.write(writer, instance as FixedPointConversion) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Metadata.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Metadata.kt index 528ddc575..b27486fc4 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Metadata.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Metadata.kt @@ -9,7 +9,6 @@ import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter import jp.co.soramitsu.iroha2.comparator import jp.co.soramitsu.iroha2.wrapException -import kotlin.String import kotlin.Unit import kotlin.collections.Map @@ -19,27 +18,33 @@ import kotlin.collections.Map * Generated from 'Metadata' regular structure */ public data class Metadata( - public val sortedMapOfName: Map, + public val sortedMapOfName: Map, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): Metadata = try { - Metadata( - reader.readMap(reader.readCompactInt(), { Name.read(reader) }, { reader.readString() }), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): Metadata = + try { + Metadata( + reader.readMap(reader.readCompactInt(), { Name.read(reader) }, { Json.read(reader) }), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: Metadata): Unit = try { - writer.writeCompact(instance.sortedMapOfName.size) - instance.sortedMapOfName.toSortedMap( - Name.comparator(), - ).forEach { (key, value) -> - Name.write(writer, key) - writer.writeAsList(value.toByteArray(Charsets.UTF_8)) + override fun write( + writer: ScaleCodecWriter, + instance: Metadata, + ): Unit = + try { + writer.writeCompact(instance.sortedMapOfName.size) + instance.sortedMapOfName + .toSortedMap( + Name.comparator(), + ).forEach { (key, value) -> + Name.write(writer, key) + Json.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) } - } catch (ex: Exception) { - throw wrapException(ex) - } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataChangedOfAccountId.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataChangedOfAccountId.kt index 6e8a77ace..76b24e352 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataChangedOfAccountId.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataChangedOfAccountId.kt @@ -8,7 +8,6 @@ import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter import jp.co.soramitsu.iroha2.wrapException -import kotlin.String import kotlin.Unit /** @@ -19,27 +18,32 @@ import kotlin.Unit public data class MetadataChangedOfAccountId( public val target: AccountId, public val key: Name, - public val `value`: String, + public val `value`: Json, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): MetadataChangedOfAccountId = try { - MetadataChangedOfAccountId( - AccountId.read(reader), - Name.read(reader), - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): MetadataChangedOfAccountId = + try { + MetadataChangedOfAccountId( + AccountId.read(reader), + Name.read(reader), + Json.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: MetadataChangedOfAccountId): Unit = try { - AccountId.write(writer, instance.target) - Name.write(writer, instance.key) - writer.writeAsList(instance.`value`.toByteArray(Charsets.UTF_8)) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: MetadataChangedOfAccountId, + ): Unit = + try { + AccountId.write(writer, instance.target) + Name.write(writer, instance.key) + Json.write(writer, instance.`value`) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataChangedOfAssetDefinitionId.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataChangedOfAssetDefinitionId.kt index dca636649..700a4a0d5 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataChangedOfAssetDefinitionId.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataChangedOfAssetDefinitionId.kt @@ -8,7 +8,6 @@ import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter import jp.co.soramitsu.iroha2.wrapException -import kotlin.String import kotlin.Unit /** @@ -19,27 +18,32 @@ import kotlin.Unit public data class MetadataChangedOfAssetDefinitionId( public val target: AssetDefinitionId, public val key: Name, - public val `value`: String, + public val `value`: Json, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): MetadataChangedOfAssetDefinitionId = try { - MetadataChangedOfAssetDefinitionId( - AssetDefinitionId.read(reader), - Name.read(reader), - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): MetadataChangedOfAssetDefinitionId = + try { + MetadataChangedOfAssetDefinitionId( + AssetDefinitionId.read(reader), + Name.read(reader), + Json.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: MetadataChangedOfAssetDefinitionId): Unit = try { - AssetDefinitionId.write(writer, instance.target) - Name.write(writer, instance.key) - writer.writeAsList(instance.`value`.toByteArray(Charsets.UTF_8)) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: MetadataChangedOfAssetDefinitionId, + ): Unit = + try { + AssetDefinitionId.write(writer, instance.target) + Name.write(writer, instance.key) + Json.write(writer, instance.`value`) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataChangedOfAssetId.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataChangedOfAssetId.kt index dd84cede1..c4a845543 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataChangedOfAssetId.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataChangedOfAssetId.kt @@ -8,7 +8,6 @@ import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter import jp.co.soramitsu.iroha2.wrapException -import kotlin.String import kotlin.Unit /** @@ -19,27 +18,32 @@ import kotlin.Unit public data class MetadataChangedOfAssetId( public val target: AssetId, public val key: Name, - public val `value`: String, + public val `value`: Json, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): MetadataChangedOfAssetId = try { - MetadataChangedOfAssetId( - AssetId.read(reader), - Name.read(reader), - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): MetadataChangedOfAssetId = + try { + MetadataChangedOfAssetId( + AssetId.read(reader), + Name.read(reader), + Json.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: MetadataChangedOfAssetId): Unit = try { - AssetId.write(writer, instance.target) - Name.write(writer, instance.key) - writer.writeAsList(instance.`value`.toByteArray(Charsets.UTF_8)) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: MetadataChangedOfAssetId, + ): Unit = + try { + AssetId.write(writer, instance.target) + Name.write(writer, instance.key) + Json.write(writer, instance.`value`) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataChangedOfDomainId.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataChangedOfDomainId.kt index f3be34eeb..b9bb64fba 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataChangedOfDomainId.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataChangedOfDomainId.kt @@ -8,7 +8,6 @@ import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter import jp.co.soramitsu.iroha2.wrapException -import kotlin.String import kotlin.Unit /** @@ -19,27 +18,32 @@ import kotlin.Unit public data class MetadataChangedOfDomainId( public val target: DomainId, public val key: Name, - public val `value`: String, + public val `value`: Json, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): MetadataChangedOfDomainId = try { - MetadataChangedOfDomainId( - DomainId.read(reader), - Name.read(reader), - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): MetadataChangedOfDomainId = + try { + MetadataChangedOfDomainId( + DomainId.read(reader), + Name.read(reader), + Json.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: MetadataChangedOfDomainId): Unit = try { - DomainId.write(writer, instance.target) - Name.write(writer, instance.key) - writer.writeAsList(instance.`value`.toByteArray(Charsets.UTF_8)) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: MetadataChangedOfDomainId, + ): Unit = + try { + DomainId.write(writer, instance.target) + Name.write(writer, instance.key) + Json.write(writer, instance.`value`) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataChangedOfTriggerId.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataChangedOfTriggerId.kt index 7145c306b..e996ea761 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataChangedOfTriggerId.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataChangedOfTriggerId.kt @@ -8,7 +8,6 @@ import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter import jp.co.soramitsu.iroha2.wrapException -import kotlin.String import kotlin.Unit /** @@ -19,27 +18,32 @@ import kotlin.Unit public data class MetadataChangedOfTriggerId( public val target: TriggerId, public val key: Name, - public val `value`: String, + public val `value`: Json, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): MetadataChangedOfTriggerId = try { - MetadataChangedOfTriggerId( - TriggerId.read(reader), - Name.read(reader), - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): MetadataChangedOfTriggerId = + try { + MetadataChangedOfTriggerId( + TriggerId.read(reader), + Name.read(reader), + Json.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: MetadataChangedOfTriggerId): Unit = try { - TriggerId.write(writer, instance.target) - Name.write(writer, instance.key) - writer.writeAsList(instance.`value`.toByteArray(Charsets.UTF_8)) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: MetadataChangedOfTriggerId, + ): Unit = + try { + TriggerId.write(writer, instance.target) + Name.write(writer, instance.key) + Json.write(writer, instance.`value`) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataKeyProjectionOfPredicateMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataKeyProjectionOfPredicateMarker.kt new file mode 100644 index 000000000..b33c0fffe --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataKeyProjectionOfPredicateMarker.kt @@ -0,0 +1,46 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit + +/** + * MetadataKeyProjectionOfPredicateMarker + * + * Generated from 'MetadataKeyProjectionOfPredicateMarker' regular structure + */ +public data class MetadataKeyProjectionOfPredicateMarker( + public val key: Name, + public val projection: JsonProjectionOfPredicateMarker, +) { + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): MetadataKeyProjectionOfPredicateMarker = + try { + MetadataKeyProjectionOfPredicateMarker( + Name.read(reader), + JsonProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: MetadataKeyProjectionOfPredicateMarker, + ): Unit = + try { + Name.write(writer, instance.key) + JsonProjectionOfPredicateMarker.write(writer, instance.projection) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataKeyProjectionOfSelectorMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataKeyProjectionOfSelectorMarker.kt new file mode 100644 index 000000000..e885b4a34 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataKeyProjectionOfSelectorMarker.kt @@ -0,0 +1,46 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit + +/** + * MetadataKeyProjectionOfSelectorMarker + * + * Generated from 'MetadataKeyProjectionOfSelectorMarker' regular structure + */ +public data class MetadataKeyProjectionOfSelectorMarker( + public val key: Name, + public val projection: JsonProjectionOfSelectorMarker, +) { + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): MetadataKeyProjectionOfSelectorMarker = + try { + MetadataKeyProjectionOfSelectorMarker( + Name.read(reader), + JsonProjectionOfSelectorMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: MetadataKeyProjectionOfSelectorMarker, + ): Unit = + try { + Name.write(writer, instance.key) + JsonProjectionOfSelectorMarker.write(writer, instance.projection) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataPredicateAtom.kt similarity index 55% rename from modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataPredicateBox.kt rename to modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataPredicateAtom.kt index 1c99d97cd..b1d8a467c 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataPredicateBox.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataPredicateAtom.kt @@ -11,27 +11,30 @@ import jp.co.soramitsu.iroha2.codec.ScaleWriter import kotlin.Int /** - * MetadataPredicateBox + * MetadataPredicateAtom * - * Generated from 'MetadataPredicateBox' enum + * Generated from 'MetadataPredicateAtom' enum */ -public sealed class MetadataPredicateBox : ModelEnum { +public sealed class MetadataPredicateAtom : ModelEnum { /** * @return Discriminator of variant in enum */ public abstract fun discriminant(): Int - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): MetadataPredicateBox = when ( - val discriminant = - reader.readUByte() - ) { - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): MetadataPredicateAtom = + when (val discriminant = reader.readUByte()) { + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: MetadataPredicateBox) { + override fun write( + writer: ScaleCodecWriter, + instance: MetadataPredicateAtom, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataProjectionOfPredicateMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataProjectionOfPredicateMarker.kt new file mode 100644 index 000000000..15b0c69fd --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataProjectionOfPredicateMarker.kt @@ -0,0 +1,116 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit + +/** + * MetadataProjectionOfPredicateMarker + * + * Generated from 'MetadataProjectionOfPredicateMarker' enum + */ +public sealed class MetadataProjectionOfPredicateMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val metadataPredicateAtom: MetadataPredicateAtom, + ) : MetadataProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.MetadataProjectionOfPredicateMarker.Atom = + try { + Atom( + MetadataPredicateAtom.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.MetadataProjectionOfPredicateMarker.Atom, + ): Unit = + try { + MetadataPredicateAtom.write(writer, instance.metadataPredicateAtom) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Key' variant + */ + public data class Key( + public val metadataKeyProjectionOfPredicateMarker: MetadataKeyProjectionOfPredicateMarker, + ) : MetadataProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.MetadataProjectionOfPredicateMarker.Key = + try { + Key( + MetadataKeyProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.MetadataProjectionOfPredicateMarker.Key, + ): Unit = + try { + MetadataKeyProjectionOfPredicateMarker.write(writer, instance.metadataKeyProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): MetadataProjectionOfPredicateMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Key.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: MetadataProjectionOfPredicateMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Key.write(writer, instance as Key) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataProjectionOfSelectorMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataProjectionOfSelectorMarker.kt new file mode 100644 index 000000000..6d54f06e2 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MetadataProjectionOfSelectorMarker.kt @@ -0,0 +1,136 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Any +import kotlin.Boolean +import kotlin.Int +import kotlin.Unit + +/** + * MetadataProjectionOfSelectorMarker + * + * Generated from 'MetadataProjectionOfSelectorMarker' enum + */ +public sealed class MetadataProjectionOfSelectorMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + override fun equals(other: Any?): Boolean = + when (this) { + is Atom -> Atom.equals(this, other) + else -> super.equals(other) + } + + override fun hashCode(): Int = + when (this) { + is Atom -> Atom.hashCode() + else -> super.hashCode() + } + + /** + * 'Atom' variant + */ + public class Atom : MetadataProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.MetadataProjectionOfSelectorMarker.Atom = + try { + Atom() + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.MetadataProjectionOfSelectorMarker.Atom, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.MetadataProjectionOfSelectorMarker.Atom, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".MetadataProjectionOfSelectorMarker.Atom".hashCode() + } + } + + /** + * 'Key' variant + */ + public data class Key( + public val metadataKeyProjectionOfSelectorMarker: MetadataKeyProjectionOfSelectorMarker, + ) : MetadataProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.MetadataProjectionOfSelectorMarker.Key = + try { + Key( + MetadataKeyProjectionOfSelectorMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.MetadataProjectionOfSelectorMarker.Key, + ): Unit = + try { + MetadataKeyProjectionOfSelectorMarker.write(writer, instance.metadataKeyProjectionOfSelectorMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): MetadataProjectionOfSelectorMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Key.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: MetadataProjectionOfSelectorMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Key.write(writer, instance as Key) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MintBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MintBox.kt index dad362578..3b56fd8c2 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MintBox.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MintBox.kt @@ -48,11 +48,12 @@ public sealed class MintBox : ModelEnum { override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.MintBox.Asset, - ): Unit = try { - MintOfNumericAndAsset.write(writer, instance.mintOfNumericAndAsset) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + MintOfNumericAndAsset.write(writer, instance.mintOfNumericAndAsset) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -69,40 +70,45 @@ public sealed class MintBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.MintBox.TriggerRepetitions = try { - TriggerRepetitions( - MintOfu32AndTrigger.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.MintBox.TriggerRepetitions = + try { + TriggerRepetitions( + MintOfu32AndTrigger.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.MintBox.TriggerRepetitions, - ): Unit = try { - MintOfu32AndTrigger.write(writer, instance.mintOfu32AndTrigger) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + MintOfu32AndTrigger.write(writer, instance.mintOfu32AndTrigger) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): MintBox = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Asset.read(reader) - 1 -> TriggerRepetitions.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + override fun read(reader: ScaleCodecReader): MintBox = + when (val discriminant = reader.readUByte()) { + 0 -> Asset.read(reader) + 1 -> TriggerRepetitions.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: MintBox) { + override fun write( + writer: ScaleCodecWriter, + instance: MintBox, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Asset.write(writer, instance as Asset) 1 -> TriggerRepetitions.write(writer, instance as TriggerRepetitions) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MintOfNumericAndAsset.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MintOfNumericAndAsset.kt index bfb7c849b..de2586562 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MintOfNumericAndAsset.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MintOfNumericAndAsset.kt @@ -3,10 +3,13 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException import kotlin.Unit @@ -18,22 +21,29 @@ import kotlin.Unit public data class MintOfNumericAndAsset( public val `object`: Numeric, public val destination: AssetId, -) { +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): MintOfNumericAndAsset = try { - MintOfNumericAndAsset( - Numeric.read(reader), - AssetId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): MintOfNumericAndAsset = + try { + MintOfNumericAndAsset( + Numeric.read(reader), + AssetId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: MintOfNumericAndAsset): Unit = try { - Numeric.write(writer, instance.`object`) - AssetId.write(writer, instance.destination) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: MintOfNumericAndAsset, + ): Unit = + try { + Numeric.write(writer, instance.`object`) + AssetId.write(writer, instance.destination) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MintOfu32AndTrigger.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MintOfu32AndTrigger.kt index 35f188325..1da1d2f22 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MintOfu32AndTrigger.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MintOfu32AndTrigger.kt @@ -3,10 +3,13 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException import kotlin.Long import kotlin.Unit @@ -19,22 +22,29 @@ import kotlin.Unit public data class MintOfu32AndTrigger( public val `object`: Long, public val destination: TriggerId, -) { +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): MintOfu32AndTrigger = try { - MintOfu32AndTrigger( - reader.readUint32(), - TriggerId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): MintOfu32AndTrigger = + try { + MintOfu32AndTrigger( + reader.readUint32(), + TriggerId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: MintOfu32AndTrigger): Unit = try { - writer.writeUint32(instance.`object`) - TriggerId.write(writer, instance.destination) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: MintOfu32AndTrigger, + ): Unit = + try { + writer.writeUint32(instance.`object`) + TriggerId.write(writer, instance.destination) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MintabilityError.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MintabilityError.kt index 8cd0c7be6..c19b89cba 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MintabilityError.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MintabilityError.kt @@ -25,15 +25,19 @@ public sealed class MintabilityError : ModelEnum { */ public abstract fun discriminant(): Int - override fun equals(other: Any?): Boolean = when (this) { - is MintUnmintable -> MintUnmintable.equals(this, other) - is ForbidMintOnMintable -> ForbidMintOnMintable.equals(this, other) - else -> super.equals(other) } + override fun equals(other: Any?): Boolean = + when (this) { + is MintUnmintable -> MintUnmintable.equals(this, other) + is ForbidMintOnMintable -> ForbidMintOnMintable.equals(this, other) + else -> super.equals(other) + } - override fun hashCode(): Int = when (this) { - is MintUnmintable -> MintUnmintable.hashCode() - is ForbidMintOnMintable -> ForbidMintOnMintable.hashCode() - else -> super.hashCode() } + override fun hashCode(): Int = + when (this) { + is MintUnmintable -> MintUnmintable.hashCode() + is ForbidMintOnMintable -> ForbidMintOnMintable.hashCode() + else -> super.hashCode() + } /** * 'MintUnmintable' variant @@ -46,27 +50,30 @@ public sealed class MintabilityError : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.MintabilityError.MintUnmintable = try { - MintUnmintable() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.MintabilityError.MintUnmintable = + try { + MintUnmintable() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.MintabilityError.MintUnmintable, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } public fun equals( o1: jp.co.soramitsu.iroha2.generated.MintabilityError.MintUnmintable, o2: Any?, - ): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".MintabilityError.MintUnmintable".hashCode() } @@ -83,11 +90,12 @@ public sealed class MintabilityError : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.MintabilityError.ForbidMintOnMintable = try { - ForbidMintOnMintable() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.MintabilityError.ForbidMintOnMintable = + try { + ForbidMintOnMintable() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, @@ -101,30 +109,34 @@ public sealed class MintabilityError : ModelEnum { public fun equals( o1: jp.co.soramitsu.iroha2.generated.MintabilityError.ForbidMintOnMintable, o2: Any?, - ): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".MintabilityError.ForbidMintOnMintable".hashCode() } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): MintabilityError = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> MintUnmintable.read(reader) - 1 -> ForbidMintOnMintable.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + override fun read(reader: ScaleCodecReader): MintabilityError = + when (val discriminant = reader.readUByte()) { + 0 -> MintUnmintable.read(reader) + 1 -> ForbidMintOnMintable.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: MintabilityError) { + override fun write( + writer: ScaleCodecWriter, + instance: MintabilityError, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> MintUnmintable.write(writer, instance as MintUnmintable) 1 -> ForbidMintOnMintable.write(writer, instance as ForbidMintOnMintable) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Mintable.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Mintable.kt index acce75b1b..8f39510c3 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Mintable.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Mintable.kt @@ -25,17 +25,21 @@ public sealed class Mintable : ModelEnum { */ public abstract fun discriminant(): Int - override fun equals(other: Any?): Boolean = when (this) { - is Infinitely -> Infinitely.equals(this, other) - is Once -> Once.equals(this, other) - is Not -> Not.equals(this, other) - else -> super.equals(other) } - - override fun hashCode(): Int = when (this) { - is Infinitely -> Infinitely.hashCode() - is Once -> Once.hashCode() - is Not -> Not.hashCode() - else -> super.hashCode() } + override fun equals(other: Any?): Boolean = + when (this) { + is Infinitely -> Infinitely.equals(this, other) + is Once -> Once.equals(this, other) + is Not -> Not.equals(this, other) + else -> super.equals(other) + } + + override fun hashCode(): Int = + when (this) { + is Infinitely -> Infinitely.hashCode() + is Once -> Once.hashCode() + is Not -> Not.hashCode() + else -> super.hashCode() + } /** * 'Infinitely' variant @@ -48,24 +52,30 @@ public sealed class Mintable : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.Mintable.Infinitely = try { - Infinitely() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.Mintable.Infinitely = + try { + Infinitely() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.Mintable.Infinitely, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: jp.co.soramitsu.iroha2.generated.Mintable.Infinitely, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.Mintable.Infinitely, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".Mintable.Infinitely".hashCode() } @@ -92,12 +102,16 @@ public sealed class Mintable : ModelEnum { override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.Mintable.Once, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: jp.co.soramitsu.iroha2.generated.Mintable.Once, o2: Any?): Boolean = + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.Mintable.Once, + o2: Any?, + ): Boolean = when (o2) { null -> false else -> o2::class == o1::class @@ -128,38 +142,45 @@ public sealed class Mintable : ModelEnum { override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.Mintable.Not, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: jp.co.soramitsu.iroha2.generated.Mintable.Not, o2: Any?): Boolean = when - (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.Mintable.Not, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".Mintable.Not".hashCode() } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): Mintable = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Infinitely.read(reader) - 1 -> Once.read(reader) - 2 -> Not.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + override fun read(reader: ScaleCodecReader): Mintable = + when (val discriminant = reader.readUByte()) { + 0 -> Infinitely.read(reader) + 1 -> Once.read(reader) + 2 -> Not.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: Mintable) { + override fun write( + writer: ScaleCodecWriter, + instance: Mintable, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Infinitely.write(writer, instance as Infinitely) 1 -> Once.write(writer, instance as Once) 2 -> Not.write(writer, instance as Not) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Mismatch.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Mismatch.kt index 081ad703b..3d1a43acc 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Mismatch.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Mismatch.kt @@ -21,20 +21,25 @@ public data class Mismatch( public val `actual`: AssetType, ) { public companion object : ScaleReader>, ScaleWriter> { - override fun read(reader: ScaleCodecReader): Mismatch = try { - Mismatch( - AssetType.read(reader), - AssetType.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): Mismatch = + try { + Mismatch( + AssetType.read(reader), + AssetType.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: Mismatch): Unit = try { - AssetType.write(writer, instance.expected) - AssetType.write(writer, instance.`actual`) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: Mismatch, + ): Unit = + try { + AssetType.write(writer, instance.expected) + AssetType.write(writer, instance.`actual`) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MultisigAccountArgs.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MultisigAccountArgs.kt new file mode 100644 index 000000000..67922d4ba --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MultisigAccountArgs.kt @@ -0,0 +1,66 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.comparator +import jp.co.soramitsu.iroha2.wrapException +import java.math.BigInteger +import kotlin.Int +import kotlin.Short +import kotlin.Unit +import kotlin.collections.Map + +/** + * MultisigAccountArgs + * + * Generated from 'MultisigAccountArgs' regular structure + */ +public data class MultisigAccountArgs( + public val account: PublicKey, + public val signatories: Map, + public val quorum: Int, + public val transactionTtlMs: BigInteger, +) { + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): MultisigAccountArgs = + try { + MultisigAccountArgs( + PublicKey.read(reader), + reader.readMap( + reader.readCompactInt(), + { AccountId.read(reader) }, + { reader.readUByte().toShort() }, + ), + reader.readUint16(), + reader.readUint64(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: MultisigAccountArgs, + ): Unit = + try { + PublicKey.write(writer, instance.account) + writer.writeCompact(instance.signatories.size) + instance.signatories + .toSortedMap( + AccountId.comparator(), + ).forEach { (key, value) -> + AccountId.write(writer, key) + writer.writeUByte(value) + } + writer.writeUint16(instance.quorum) + writer.writeUint64(instance.transactionTtlMs) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MultisigApprove.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MultisigApprove.kt new file mode 100644 index 000000000..1f0d97ffb --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MultisigApprove.kt @@ -0,0 +1,46 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelCustomInstruction +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit +import kotlin.collections.List + +/** + * MultisigApprove + * + * Generated from 'MultisigApprove' regular structure + */ +public data class MultisigApprove( + public val account: AccountId, + public val instructionsHash: HashOf>, +) : ModelCustomInstruction { + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): MultisigApprove = + try { + MultisigApprove( + AccountId.read(reader), + HashOf.read(reader) as HashOf>, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: MultisigApprove, + ): Unit = + try { + AccountId.write(writer, instance.account) + HashOf.write(writer, instance.instructionsHash) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MultisigInstructionBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MultisigInstructionBox.kt new file mode 100644 index 000000000..c849d8818 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MultisigInstructionBox.kt @@ -0,0 +1,152 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit + +/** + * MultisigInstructionBox + * + * Generated from 'MultisigInstructionBox' enum + */ +public sealed class MultisigInstructionBox : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Register' variant + */ + public data class Register( + public val multisigRegister: MultisigRegister, + ) : MultisigInstructionBox() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.MultisigInstructionBox.Register = + try { + Register( + MultisigRegister.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.MultisigInstructionBox.Register, + ): Unit = + try { + MultisigRegister.write(writer, instance.multisigRegister) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Propose' variant + */ + public data class Propose( + public val multisigPropose: MultisigPropose, + ) : MultisigInstructionBox() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.MultisigInstructionBox.Propose = + try { + Propose( + MultisigPropose.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.MultisigInstructionBox.Propose, + ): Unit = + try { + MultisigPropose.write(writer, instance.multisigPropose) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Approve' variant + */ + public data class Approve( + public val multisigApprove: MultisigApprove, + ) : MultisigInstructionBox() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 2 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.MultisigInstructionBox.Approve = + try { + Approve( + MultisigApprove.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.MultisigInstructionBox.Approve, + ): Unit = + try { + MultisigApprove.write(writer, instance.multisigApprove) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): MultisigInstructionBox = + when (val discriminant = reader.readUByte()) { + 0 -> Register.read(reader) + 1 -> Propose.read(reader) + 2 -> Approve.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: MultisigInstructionBox, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Register.write(writer, instance as Register) + 1 -> Propose.write(writer, instance as Propose) + 2 -> Approve.write(writer, instance as Approve) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MultisigProposalValue.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MultisigProposalValue.kt new file mode 100644 index 000000000..d21049072 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MultisigProposalValue.kt @@ -0,0 +1,67 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.codec.reader.BoolReader +import jp.co.soramitsu.iroha2.codec.writer.BoolWriter +import jp.co.soramitsu.iroha2.comparator +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Boolean +import kotlin.Unit +import kotlin.collections.List + +/** + * MultisigProposalValue + * + * Generated from 'MultisigProposalValue' regular structure + */ +public data class MultisigProposalValue( + public val instructions: List, + public val proposedAtMs: NonZeroOfu64, + public val expiresAtMs: NonZeroOfu64, + public val approvals: List, + public val isRelayed: Boolean? = null, +) { + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): MultisigProposalValue = + try { + MultisigProposalValue( + reader.readVec(reader.readCompactInt()) { InstructionBox.read(reader) }, + NonZeroOfu64.read(reader), + NonZeroOfu64.read(reader), + reader.readVec(reader.readCompactInt()) { AccountId.read(reader) }, + reader.readNullable(BoolReader()), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: MultisigProposalValue, + ): Unit = + try { + writer.writeCompact(instance.instructions.size) + instance.instructions.forEach { value -> + InstructionBox.write(writer, value) + } + NonZeroOfu64.write(writer, instance.proposedAtMs) + NonZeroOfu64.write(writer, instance.expiresAtMs) + writer.writeCompact(instance.approvals.size) + instance.approvals + .sortedWith( + AccountId.comparator(), + ).forEach { value -> + AccountId.write(writer, value) + } + writer.writeNullable(BoolWriter(), instance.isRelayed) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MultisigPropose.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MultisigPropose.kt new file mode 100644 index 000000000..51624119d --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MultisigPropose.kt @@ -0,0 +1,52 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelCustomInstruction +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit +import kotlin.collections.List + +/** + * MultisigPropose + * + * Generated from 'MultisigPropose' regular structure + */ +public data class MultisigPropose( + public val account: AccountId, + public val instructions: List, + public val transactionTtlMs: NonZeroOfu64? = null, +) : ModelCustomInstruction { + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): MultisigPropose = + try { + MultisigPropose( + AccountId.read(reader), + reader.readVec(reader.readCompactInt()) { InstructionBox.read(reader) }, + reader.readNullable(NonZeroOfu64) as NonZeroOfu64?, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: MultisigPropose, + ): Unit = + try { + AccountId.write(writer, instance.account) + writer.writeCompact(instance.instructions.size) + instance.instructions.forEach { value -> + InstructionBox.write(writer, value) + } + writer.writeNullable(NonZeroOfu64, instance.transactionTtlMs) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MultisigRegister.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MultisigRegister.kt new file mode 100644 index 000000000..9483366c1 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MultisigRegister.kt @@ -0,0 +1,45 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelCustomInstruction +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit + +/** + * MultisigRegister + * + * Generated from 'MultisigRegister' regular structure + */ +public data class MultisigRegister( + public val account: AccountId, + public val spec: MultisigSpec, +) : ModelCustomInstruction { + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): MultisigRegister = + try { + MultisigRegister( + AccountId.read(reader), + MultisigSpec.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: MultisigRegister, + ): Unit = + try { + AccountId.write(writer, instance.account) + MultisigSpec.write(writer, instance.spec) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MultisigSpec.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MultisigSpec.kt new file mode 100644 index 000000000..742e73c23 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MultisigSpec.kt @@ -0,0 +1,57 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.comparator +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Short +import kotlin.Unit +import kotlin.collections.Map + +/** + * MultisigSpec + * + * Generated from 'MultisigSpec' regular structure + */ +public data class MultisigSpec( + public val signatories: Map, + public val quorum: NonZeroOfu16, + public val transactionTtlMs: NonZeroOfu64, +) { + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): MultisigSpec = + try { + MultisigSpec( + reader.readMap(reader.readCompactInt(), { AccountId.read(reader) }, { reader.readUByte().toShort() }), + NonZeroOfu16.read(reader), + NonZeroOfu64.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: MultisigSpec, + ): Unit = + try { + writer.writeCompact(instance.signatories.size) + instance.signatories + .toSortedMap( + AccountId.comparator(), + ).forEach { (key, value) -> + AccountId.write(writer, key) + writer.writeUByte(value) + } + NonZeroOfu16.write(writer, instance.quorum) + NonZeroOfu64.write(writer, instance.transactionTtlMs) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MultisigTransactionArgs.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MultisigTransactionArgs.kt new file mode 100644 index 000000000..fded2794e --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/MultisigTransactionArgs.kt @@ -0,0 +1,123 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit +import kotlin.collections.List + +/** + * MultisigTransactionArgs + * + * Generated from 'MultisigTransactionArgs' enum + */ +public sealed class MultisigTransactionArgs : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Propose' variant + */ + public data class Propose( + public val vec: List, + ) : MultisigTransactionArgs() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.MultisigTransactionArgs.Propose = + try { + Propose( + reader.readVec(reader.readCompactInt()) { InstructionBox.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.MultisigTransactionArgs.Propose, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + InstructionBox.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Approve' variant + */ + public data class Approve( + public val hashOf: HashOf>, + ) : MultisigTransactionArgs() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.MultisigTransactionArgs.Approve = + try { + Approve( + HashOf.read(reader) as HashOf>, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.MultisigTransactionArgs.Approve, + ): Unit = + try { + HashOf.write(writer, instance.hashOf) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): MultisigTransactionArgs = + when ( + val discriminant = + reader.readUByte() + ) { + 0 -> Propose.read(reader) + 1 -> Approve.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: MultisigTransactionArgs, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Propose.write(writer, instance as Propose) + 1 -> Approve.write(writer, instance as Approve) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Name.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Name.kt index 2798439ce..f9d460d2a 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Name.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Name.kt @@ -20,18 +20,23 @@ public data class Name( public val string: String, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): Name = try { - Name( - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): Name = + try { + Name( + reader.readString(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: Name): Unit = try { - writer.writeAsList(instance.string.toByteArray(Charsets.UTF_8)) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: Name, + ): Unit = + try { + writer.writeAsList(instance.string.toByteArray(Charsets.UTF_8)) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NameProjectionOfPredicateMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NameProjectionOfPredicateMarker.kt new file mode 100644 index 000000000..140813db9 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NameProjectionOfPredicateMarker.kt @@ -0,0 +1,80 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit + +/** + * NameProjectionOfPredicateMarker + * + * Generated from 'NameProjectionOfPredicateMarker' enum + */ +public sealed class NameProjectionOfPredicateMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val stringPredicateAtom: StringPredicateAtom, + ) : NameProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.NameProjectionOfPredicateMarker.Atom = + try { + Atom( + StringPredicateAtom.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.NameProjectionOfPredicateMarker.Atom, + ): Unit = + try { + StringPredicateAtom.write(writer, instance.stringPredicateAtom) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): NameProjectionOfPredicateMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: NameProjectionOfPredicateMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NameProjectionOfSelectorMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NameProjectionOfSelectorMarker.kt new file mode 100644 index 000000000..f5d4e4bce --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NameProjectionOfSelectorMarker.kt @@ -0,0 +1,100 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Any +import kotlin.Boolean +import kotlin.Int +import kotlin.Unit + +/** + * NameProjectionOfSelectorMarker + * + * Generated from 'NameProjectionOfSelectorMarker' enum + */ +public sealed class NameProjectionOfSelectorMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + override fun equals(other: Any?): Boolean = + when (this) { + is Atom -> Atom.equals(this, other) + else -> super.equals(other) + } + + override fun hashCode(): Int = + when (this) { + is Atom -> Atom.hashCode() + else -> super.hashCode() + } + + /** + * 'Atom' variant + */ + public class Atom : NameProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.NameProjectionOfSelectorMarker.Atom = + try { + Atom() + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.NameProjectionOfSelectorMarker.Atom, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.NameProjectionOfSelectorMarker.Atom, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".NameProjectionOfSelectorMarker.Atom".hashCode() + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): NameProjectionOfSelectorMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: NameProjectionOfSelectorMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NewAccount.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NewAccount.kt index 048a59580..dd6c489a1 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NewAccount.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NewAccount.kt @@ -20,20 +20,25 @@ public data class NewAccount( public val metadata: Metadata, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): NewAccount = try { - NewAccount( - AccountId.read(reader), - Metadata.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): NewAccount = + try { + NewAccount( + AccountId.read(reader), + Metadata.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: NewAccount): Unit = try { - AccountId.write(writer, instance.id) - Metadata.write(writer, instance.metadata) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: NewAccount, + ): Unit = + try { + AccountId.write(writer, instance.id) + Metadata.write(writer, instance.metadata) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NewAssetDefinition.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NewAssetDefinition.kt index 723b7c43c..66c90ad76 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NewAssetDefinition.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NewAssetDefinition.kt @@ -23,26 +23,31 @@ public data class NewAssetDefinition( public val metadata: Metadata, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): NewAssetDefinition = try { - NewAssetDefinition( - AssetDefinitionId.read(reader), - AssetType.read(reader), - Mintable.read(reader), - reader.readNullable(IpfsPath) as IpfsPath?, - Metadata.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): NewAssetDefinition = + try { + NewAssetDefinition( + AssetDefinitionId.read(reader), + AssetType.read(reader), + Mintable.read(reader), + reader.readNullable(IpfsPath) as IpfsPath?, + Metadata.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: NewAssetDefinition): Unit = try { - AssetDefinitionId.write(writer, instance.id) - AssetType.write(writer, instance.type) - Mintable.write(writer, instance.mintable) - writer.writeNullable(IpfsPath, instance.logo) - Metadata.write(writer, instance.metadata) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: NewAssetDefinition, + ): Unit = + try { + AssetDefinitionId.write(writer, instance.id) + AssetType.write(writer, instance.type) + Mintable.write(writer, instance.mintable) + writer.writeNullable(IpfsPath, instance.logo) + Metadata.write(writer, instance.metadata) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NewDomain.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NewDomain.kt index da7638840..dcb8fb755 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NewDomain.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NewDomain.kt @@ -21,22 +21,27 @@ public data class NewDomain( public val metadata: Metadata, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): NewDomain = try { - NewDomain( - DomainId.read(reader), - reader.readNullable(IpfsPath) as IpfsPath?, - Metadata.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): NewDomain = + try { + NewDomain( + DomainId.read(reader), + reader.readNullable(IpfsPath) as IpfsPath?, + Metadata.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: NewDomain): Unit = try { - DomainId.write(writer, instance.id) - writer.writeNullable(IpfsPath, instance.logo) - Metadata.write(writer, instance.metadata) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: NewDomain, + ): Unit = + try { + DomainId.write(writer, instance.id) + writer.writeNullable(IpfsPath, instance.logo) + Metadata.write(writer, instance.metadata) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NewRole.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NewRole.kt new file mode 100644 index 000000000..ae93ae460 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NewRole.kt @@ -0,0 +1,44 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit + +/** + * NewRole + * + * Generated from 'NewRole' regular structure + */ +public data class NewRole( + public val `inner`: Role, + public val grantTo: AccountId, +) { + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): NewRole = + try { + NewRole( + Role.read(reader), + AccountId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: NewRole, + ): Unit = + try { + Role.write(writer, instance.`inner`) + AccountId.write(writer, instance.grantTo) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NonTrivial.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NonTrivial.kt deleted file mode 100644 index 29e2e976d..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NonTrivial.kt +++ /dev/null @@ -1,44 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Any -import kotlin.Unit -import kotlin.collections.List - -/** - * NonTrivial - * - * Generated from 'NonTrivial>' regular structure - */ -public data class NonTrivial( - public val vecOfQueryOutputPredicate: List>, -) { - public companion object : ScaleReader>, ScaleWriter> { - override fun read(reader: ScaleCodecReader): NonTrivial = try { - NonTrivial( - reader.readVec(reader.readCompactInt()) { - GenericPredicateBox.read(reader) as - GenericPredicateBox - }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: NonTrivial): Unit = try { - writer.writeCompact(instance.vecOfQueryOutputPredicate.size) - instance.vecOfQueryOutputPredicate.forEach { value -> - GenericPredicateBox.write(writer, value) - } - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NonZeroOfu16.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NonZeroOfu16.kt new file mode 100644 index 000000000..cc89623e5 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NonZeroOfu16.kt @@ -0,0 +1,42 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit + +/** + * NonZeroOfu16 + * + * Generated from 'NonZeroOfu16' regular structure + */ +public data class NonZeroOfu16( + public val u16: Int, +) { + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): NonZeroOfu16 = + try { + NonZeroOfu16( + reader.readUint16(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: NonZeroOfu16, + ): Unit = + try { + writer.writeUint16(instance.u16) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NonZeroOfu32.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NonZeroOfu32.kt index 986c92f85..e28363684 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NonZeroOfu32.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NonZeroOfu32.kt @@ -20,18 +20,23 @@ public data class NonZeroOfu32( public val u32: Long, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): NonZeroOfu32 = try { - NonZeroOfu32( - reader.readUint32(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): NonZeroOfu32 = + try { + NonZeroOfu32( + reader.readUint32(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: NonZeroOfu32): Unit = try { - writer.writeUint32(instance.u32) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: NonZeroOfu32, + ): Unit = + try { + writer.writeUint32(instance.u32) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NonZeroOfu64.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NonZeroOfu64.kt index b397f7460..b2a8bbf66 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NonZeroOfu64.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NonZeroOfu64.kt @@ -20,18 +20,23 @@ public data class NonZeroOfu64( public val u64: BigInteger, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): NonZeroOfu64 = try { - NonZeroOfu64( - reader.readUint64(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): NonZeroOfu64 = + try { + NonZeroOfu64( + reader.readUint64(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: NonZeroOfu64): Unit = try { - writer.writeUint64(instance.u64) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: NonZeroOfu64, + ): Unit = + try { + writer.writeUint64(instance.u64) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Numeric.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Numeric.kt index 20b5baa41..78270d18e 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Numeric.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Numeric.kt @@ -24,20 +24,25 @@ public data class Numeric( public val scale: Long, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): Numeric = try { - Numeric( - reader.read(CompactBigIntReader()), - reader.readCompactInt().toLong(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): Numeric = + try { + Numeric( + reader.read(CompactBigIntReader()), + reader.readCompactInt().toLong(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: Numeric): Unit = try { - writer.write(CompactULongWriter(), instance.mantissa.toLong()) - writer.write(CompactULongWriter(), instance.scale.toLong()) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: Numeric, + ): Unit = + try { + writer.write(CompactULongWriter(), instance.mantissa.toLong()) + writer.write(CompactULongWriter(), instance.scale.toLong()) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NumericPredicateAtom.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NumericPredicateAtom.kt new file mode 100644 index 000000000..3ab8c6e62 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NumericPredicateAtom.kt @@ -0,0 +1,40 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import kotlin.Int + +/** + * NumericPredicateAtom + * + * Generated from 'NumericPredicateAtom' enum + */ +public sealed class NumericPredicateAtom : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): NumericPredicateAtom = + when (val discriminant = reader.readUByte()) { + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: NumericPredicateAtom, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NumericProjectionOfPredicateMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NumericProjectionOfPredicateMarker.kt new file mode 100644 index 000000000..488d8768a --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NumericProjectionOfPredicateMarker.kt @@ -0,0 +1,80 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit + +/** + * NumericProjectionOfPredicateMarker + * + * Generated from 'NumericProjectionOfPredicateMarker' enum + */ +public sealed class NumericProjectionOfPredicateMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val numericPredicateAtom: NumericPredicateAtom, + ) : NumericProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.NumericProjectionOfPredicateMarker.Atom = + try { + Atom( + NumericPredicateAtom.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.NumericProjectionOfPredicateMarker.Atom, + ): Unit = + try { + NumericPredicateAtom.write(writer, instance.numericPredicateAtom) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): NumericProjectionOfPredicateMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: NumericProjectionOfPredicateMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NumericProjectionOfSelectorMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NumericProjectionOfSelectorMarker.kt new file mode 100644 index 000000000..d7bafa26a --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NumericProjectionOfSelectorMarker.kt @@ -0,0 +1,100 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Any +import kotlin.Boolean +import kotlin.Int +import kotlin.Unit + +/** + * NumericProjectionOfSelectorMarker + * + * Generated from 'NumericProjectionOfSelectorMarker' enum + */ +public sealed class NumericProjectionOfSelectorMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + override fun equals(other: Any?): Boolean = + when (this) { + is Atom -> Atom.equals(this, other) + else -> super.equals(other) + } + + override fun hashCode(): Int = + when (this) { + is Atom -> Atom.hashCode() + else -> super.hashCode() + } + + /** + * 'Atom' variant + */ + public class Atom : NumericProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.NumericProjectionOfSelectorMarker.Atom = + try { + Atom() + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.NumericProjectionOfSelectorMarker.Atom, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.NumericProjectionOfSelectorMarker.Atom, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".NumericProjectionOfSelectorMarker.Atom".hashCode() + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): NumericProjectionOfSelectorMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: NumericProjectionOfSelectorMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NumericSpec.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NumericSpec.kt index 257bb0c76..3109c2827 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NumericSpec.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/NumericSpec.kt @@ -20,18 +20,23 @@ public data class NumericSpec( public val scale: Long? = null, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): NumericSpec = try { - NumericSpec( - reader.readNullable(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): NumericSpec = + try { + NumericSpec( + reader.readNullable(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: NumericSpec): Unit = try { - writer.writeNullable(instance.scale) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: NumericSpec, + ): Unit = + try { + writer.writeNullable(instance.scale) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Pagination.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Pagination.kt index cf62e6c1f..872801ae6 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Pagination.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Pagination.kt @@ -8,6 +8,7 @@ import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter import jp.co.soramitsu.iroha2.wrapException +import java.math.BigInteger import kotlin.Unit /** @@ -16,24 +17,29 @@ import kotlin.Unit * Generated from 'Pagination' regular structure */ public data class Pagination( - public val limit: NonZeroOfu32? = null, - public val start: NonZeroOfu64? = null, + public val limit: NonZeroOfu64? = null, + public val offset: BigInteger, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): Pagination = try { - Pagination( - reader.readNullable(NonZeroOfu32) as NonZeroOfu32?, - reader.readNullable(NonZeroOfu64) as NonZeroOfu64?, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): Pagination = + try { + Pagination( + reader.readNullable(NonZeroOfu64) as NonZeroOfu64?, + reader.readUint64(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: Pagination): Unit = try { - writer.writeNullable(NonZeroOfu32, instance.limit) - writer.writeNullable(NonZeroOfu64, instance.start) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: Pagination, + ): Unit = + try { + writer.writeNullable(NonZeroOfu64, instance.limit) + writer.writeUint64(instance.offset) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Parameter.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Parameter.kt index 5147fa1bf..75b5541c1 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Parameter.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Parameter.kt @@ -36,22 +36,24 @@ public sealed class Parameter : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.Parameter.Sumeragi = try { - Sumeragi( - SumeragiParameter.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.Parameter.Sumeragi = + try { + Sumeragi( + SumeragiParameter.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.Parameter.Sumeragi, - ): Unit = try { - SumeragiParameter.write(writer, instance.sumeragiParameter) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + SumeragiParameter.write(writer, instance.sumeragiParameter) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -68,22 +70,24 @@ public sealed class Parameter : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.Parameter.Block = try { - Block( - BlockParameter.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.Parameter.Block = + try { + Block( + BlockParameter.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.Parameter.Block, - ): Unit = try { - BlockParameter.write(writer, instance.blockParameter) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + BlockParameter.write(writer, instance.blockParameter) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -100,22 +104,24 @@ public sealed class Parameter : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 2 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.Parameter.Transaction = try { - Transaction( - TransactionParameter.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.Parameter.Transaction = + try { + Transaction( + TransactionParameter.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.Parameter.Transaction, - ): Unit = try { - TransactionParameter.write(writer, instance.transactionParameter) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + TransactionParameter.write(writer, instance.transactionParameter) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -132,22 +138,24 @@ public sealed class Parameter : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 3 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.Parameter.SmartContract = try { - SmartContract( - SmartContractParameter.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.Parameter.SmartContract = + try { + SmartContract( + SmartContractParameter.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.Parameter.SmartContract, - ): Unit = try { - SmartContractParameter.write(writer, instance.smartContractParameter) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + SmartContractParameter.write(writer, instance.smartContractParameter) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -164,22 +172,24 @@ public sealed class Parameter : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 4 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.Parameter.Executor = try { - Executor( - SmartContractParameter.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.Parameter.Executor = + try { + Executor( + SmartContractParameter.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.Parameter.Executor, - ): Unit = try { - SmartContractParameter.write(writer, instance.smartContractParameter) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + SmartContractParameter.write(writer, instance.smartContractParameter) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -196,39 +206,43 @@ public sealed class Parameter : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 5 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.Parameter.Custom = try { - Custom( - CustomParameter.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.Parameter.Custom = + try { + Custom( + CustomParameter.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.Parameter.Custom, - ): Unit = try { - CustomParameter.write(writer, instance.customParameter) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + CustomParameter.write(writer, instance.customParameter) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): Parameter = when ( - val discriminant = - reader.readUByte() + override fun read(reader: ScaleCodecReader): Parameter = + when (val discriminant = reader.readUByte()) { + 0 -> Sumeragi.read(reader) + 1 -> Block.read(reader) + 2 -> Transaction.read(reader) + 3 -> SmartContract.read(reader) + 4 -> Executor.read(reader) + 5 -> Custom.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: Parameter, ) { - 0 -> Sumeragi.read(reader) - 1 -> Block.read(reader) - 2 -> Transaction.read(reader) - 3 -> SmartContract.read(reader) - 4 -> Executor.read(reader) - 5 -> Custom.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: Parameter) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Sumeragi.write(writer, instance as Sumeragi) @@ -237,7 +251,8 @@ public sealed class Parameter : ModelEnum { 3 -> SmartContract.write(writer, instance as SmartContract) 4 -> Executor.write(writer, instance as Executor) 5 -> Custom.write(writer, instance as Custom) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ParameterChanged.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ParameterChanged.kt index ae97fda88..106eae71d 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ParameterChanged.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ParameterChanged.kt @@ -20,20 +20,25 @@ public data class ParameterChanged( public val newValue: Parameter, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): ParameterChanged = try { - ParameterChanged( - Parameter.read(reader), - Parameter.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): ParameterChanged = + try { + ParameterChanged( + Parameter.read(reader), + Parameter.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: ParameterChanged): Unit = try { - Parameter.write(writer, instance.oldValue) - Parameter.write(writer, instance.newValue) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: ParameterChanged, + ): Unit = + try { + Parameter.write(writer, instance.oldValue) + Parameter.write(writer, instance.newValue) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Parameters.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Parameters.kt index 30c7f5a03..613c700df 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Parameters.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Parameters.kt @@ -26,38 +26,40 @@ public data class Parameters( public val custom: Map, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): Parameters = try { - Parameters( - SumeragiParameters.read(reader), - BlockParameters.read(reader), - TransactionParameters.read(reader), - SmartContractParameters.read(reader), - SmartContractParameters.read(reader), - reader.readMap( - reader.readCompactInt(), - { CustomParameterId.read(reader) }, - { CustomParameter.read(reader) }, - ), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): Parameters = + try { + Parameters( + SumeragiParameters.read(reader), + BlockParameters.read(reader), + TransactionParameters.read(reader), + SmartContractParameters.read(reader), + SmartContractParameters.read(reader), + reader.readMap(reader.readCompactInt(), { CustomParameterId.read(reader) }, { CustomParameter.read(reader) }), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: Parameters): Unit = try { - SumeragiParameters.write(writer, instance.sumeragi) - BlockParameters.write(writer, instance.block) - TransactionParameters.write(writer, instance.transaction) - SmartContractParameters.write(writer, instance.executor) - SmartContractParameters.write(writer, instance.smartContract) - writer.writeCompact(instance.custom.size) - instance.custom.toSortedMap( - CustomParameterId.comparator(), - ).forEach { (key, value) -> - CustomParameterId.write(writer, key) - CustomParameter.write(writer, value) + override fun write( + writer: ScaleCodecWriter, + instance: Parameters, + ): Unit = + try { + SumeragiParameters.write(writer, instance.sumeragi) + BlockParameters.write(writer, instance.block) + TransactionParameters.write(writer, instance.transaction) + SmartContractParameters.write(writer, instance.executor) + SmartContractParameters.write(writer, instance.smartContract) + writer.writeCompact(instance.custom.size) + instance.custom + .toSortedMap( + CustomParameterId.comparator(), + ).forEach { (key, value) -> + CustomParameterId.write(writer, key) + CustomParameter.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) } - } catch (ex: Exception) { - throw wrapException(ex) - } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Peer.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Peer.kt index 9416e6de0..a6209ae82 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Peer.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Peer.kt @@ -16,21 +16,29 @@ import kotlin.Unit * Generated from 'Peer' regular structure */ public data class Peer( + public val address: SocketAddr, public val id: PeerId, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): Peer = try { - Peer( - PeerId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): Peer = + try { + Peer( + SocketAddr.read(reader), + PeerId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: Peer): Unit = try { - PeerId.write(writer, instance.id) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: Peer, + ): Unit = + try { + SocketAddr.write(writer, instance.address) + PeerId.write(writer, instance.id) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PeerEvent.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PeerEvent.kt index f9e262fc7..594fd22a4 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PeerEvent.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PeerEvent.kt @@ -36,22 +36,24 @@ public sealed class PeerEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.PeerEvent.Added = try { - Added( - PeerId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.PeerEvent.Added = + try { + Added( + PeerId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.PeerEvent.Added, - ): Unit = try { - PeerId.write(writer, instance.peerId) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + PeerId.write(writer, instance.peerId) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -68,40 +70,45 @@ public sealed class PeerEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.PeerEvent.Removed = try { - Removed( - PeerId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.PeerEvent.Removed = + try { + Removed( + PeerId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.PeerEvent.Removed, - ): Unit = try { - PeerId.write(writer, instance.peerId) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + PeerId.write(writer, instance.peerId) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): PeerEvent = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Added.read(reader) - 1 -> Removed.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + override fun read(reader: ScaleCodecReader): PeerEvent = + when (val discriminant = reader.readUByte()) { + 0 -> Added.read(reader) + 1 -> Removed.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: PeerEvent) { + override fun write( + writer: ScaleCodecWriter, + instance: PeerEvent, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Added.write(writer, instance as Added) 1 -> Removed.write(writer, instance as Removed) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PeerEventFilter.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PeerEventFilter.kt index 6d56f9e64..31d40335f 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PeerEventFilter.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PeerEventFilter.kt @@ -21,20 +21,25 @@ public data class PeerEventFilter( public val eventSet: Long, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): PeerEventFilter = try { - PeerEventFilter( - reader.readNullable(PeerId) as PeerId?, - reader.readUint32(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): PeerEventFilter = + try { + PeerEventFilter( + reader.readNullable(PeerId) as PeerId?, + reader.readUint32(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: PeerEventFilter): Unit = try { - writer.writeNullable(PeerId, instance.idMatcher) - writer.writeUint32(instance.eventSet) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: PeerEventFilter, + ): Unit = + try { + writer.writeNullable(PeerId, instance.idMatcher) + writer.writeUint32(instance.eventSet) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PeerId.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PeerId.kt index 05f994f5d..f0a8850b6 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PeerId.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PeerId.kt @@ -16,24 +16,26 @@ import kotlin.Unit * Generated from 'PeerId' regular structure */ public data class PeerId( - public val address: SocketAddr, public val publicKey: PublicKey, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): PeerId = try { - PeerId( - SocketAddr.read(reader), - PublicKey.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): PeerId = + try { + PeerId( + PublicKey.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: PeerId): Unit = try { - SocketAddr.write(writer, instance.address) - PublicKey.write(writer, instance.publicKey) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: PeerId, + ): Unit = + try { + PublicKey.write(writer, instance.publicKey) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PeerIdPredicateAtom.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PeerIdPredicateAtom.kt new file mode 100644 index 000000000..ed87a4763 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PeerIdPredicateAtom.kt @@ -0,0 +1,40 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import kotlin.Int + +/** + * PeerIdPredicateAtom + * + * Generated from 'PeerIdPredicateAtom' enum + */ +public sealed class PeerIdPredicateAtom : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): PeerIdPredicateAtom = + when (val discriminant = reader.readUByte()) { + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: PeerIdPredicateAtom, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PeerIdProjectionOfPredicateMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PeerIdProjectionOfPredicateMarker.kt new file mode 100644 index 000000000..099b71ebc --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PeerIdProjectionOfPredicateMarker.kt @@ -0,0 +1,116 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit + +/** + * PeerIdProjectionOfPredicateMarker + * + * Generated from 'PeerIdProjectionOfPredicateMarker' enum + */ +public sealed class PeerIdProjectionOfPredicateMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val peerIdPredicateAtom: PeerIdPredicateAtom, + ) : PeerIdProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.PeerIdProjectionOfPredicateMarker.Atom = + try { + Atom( + PeerIdPredicateAtom.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.PeerIdProjectionOfPredicateMarker.Atom, + ): Unit = + try { + PeerIdPredicateAtom.write(writer, instance.peerIdPredicateAtom) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'PublicKey' variant + */ + public data class PublicKey( + public val publicKeyProjectionOfPredicateMarker: PublicKeyProjectionOfPredicateMarker, + ) : PeerIdProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.PeerIdProjectionOfPredicateMarker.PublicKey = + try { + PublicKey( + PublicKeyProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.PeerIdProjectionOfPredicateMarker.PublicKey, + ): Unit = + try { + PublicKeyProjectionOfPredicateMarker.write(writer, instance.publicKeyProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): PeerIdProjectionOfPredicateMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> PublicKey.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: PeerIdProjectionOfPredicateMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> PublicKey.write(writer, instance as PublicKey) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PeerIdProjectionOfSelectorMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PeerIdProjectionOfSelectorMarker.kt new file mode 100644 index 000000000..5461549cc --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PeerIdProjectionOfSelectorMarker.kt @@ -0,0 +1,136 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Any +import kotlin.Boolean +import kotlin.Int +import kotlin.Unit + +/** + * PeerIdProjectionOfSelectorMarker + * + * Generated from 'PeerIdProjectionOfSelectorMarker' enum + */ +public sealed class PeerIdProjectionOfSelectorMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + override fun equals(other: Any?): Boolean = + when (this) { + is Atom -> Atom.equals(this, other) + else -> super.equals(other) + } + + override fun hashCode(): Int = + when (this) { + is Atom -> Atom.hashCode() + else -> super.hashCode() + } + + /** + * 'Atom' variant + */ + public class Atom : PeerIdProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.PeerIdProjectionOfSelectorMarker.Atom = + try { + Atom() + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.PeerIdProjectionOfSelectorMarker.Atom, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.PeerIdProjectionOfSelectorMarker.Atom, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".PeerIdProjectionOfSelectorMarker.Atom".hashCode() + } + } + + /** + * 'PublicKey' variant + */ + public data class PublicKey( + public val publicKeyProjectionOfSelectorMarker: PublicKeyProjectionOfSelectorMarker, + ) : PeerIdProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.PeerIdProjectionOfSelectorMarker.PublicKey = + try { + PublicKey( + PublicKeyProjectionOfSelectorMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.PeerIdProjectionOfSelectorMarker.PublicKey, + ): Unit = + try { + PublicKeyProjectionOfSelectorMarker.write(writer, instance.publicKeyProjectionOfSelectorMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): PeerIdProjectionOfSelectorMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> PublicKey.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: PeerIdProjectionOfSelectorMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> PublicKey.write(writer, instance as PublicKey) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Permission.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Permission.kt index 4fd9a4e3c..b963985b6 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Permission.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Permission.kt @@ -18,23 +18,28 @@ import kotlin.Unit */ public data class Permission( public val name: String, - public val payload: String, + public val payload: Json, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): Permission = try { - Permission( - reader.readString(), - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): Permission = + try { + Permission( + reader.readString(), + Json.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: Permission): Unit = try { - writer.writeAsList(instance.name.toByteArray(Charsets.UTF_8)) - writer.writeAsList(instance.payload.toByteArray(Charsets.UTF_8)) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: Permission, + ): Unit = + try { + writer.writeAsList(instance.name.toByteArray(Charsets.UTF_8)) + Json.write(writer, instance.payload) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PermissionPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PermissionPredicateAtom.kt similarity index 54% rename from modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PermissionPredicateBox.kt rename to modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PermissionPredicateAtom.kt index 993954fde..18314c4db 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PermissionPredicateBox.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PermissionPredicateAtom.kt @@ -11,27 +11,32 @@ import jp.co.soramitsu.iroha2.codec.ScaleWriter import kotlin.Int /** - * PermissionPredicateBox + * PermissionPredicateAtom * - * Generated from 'PermissionPredicateBox' enum + * Generated from 'PermissionPredicateAtom' enum */ -public sealed class PermissionPredicateBox : ModelEnum { +public sealed class PermissionPredicateAtom : ModelEnum { /** * @return Discriminator of variant in enum */ public abstract fun discriminant(): Int - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): PermissionPredicateBox = when ( - val discriminant = - reader.readUByte() - ) { - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): PermissionPredicateAtom = + when (val discriminant = reader.readUByte()) { + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: PermissionPredicateBox) { + override fun write( + writer: ScaleCodecWriter, + instance: PermissionPredicateAtom, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PermissionProjectionOfPredicateMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PermissionProjectionOfPredicateMarker.kt new file mode 100644 index 000000000..69329a69e --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PermissionProjectionOfPredicateMarker.kt @@ -0,0 +1,80 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit + +/** + * PermissionProjectionOfPredicateMarker + * + * Generated from 'PermissionProjectionOfPredicateMarker' enum + */ +public sealed class PermissionProjectionOfPredicateMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val permissionPredicateAtom: PermissionPredicateAtom, + ) : PermissionProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.PermissionProjectionOfPredicateMarker.Atom = + try { + Atom( + PermissionPredicateAtom.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.PermissionProjectionOfPredicateMarker.Atom, + ): Unit = + try { + PermissionPredicateAtom.write(writer, instance.permissionPredicateAtom) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): PermissionProjectionOfPredicateMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: PermissionProjectionOfPredicateMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PermissionProjectionOfSelectorMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PermissionProjectionOfSelectorMarker.kt new file mode 100644 index 000000000..184c373fb --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PermissionProjectionOfSelectorMarker.kt @@ -0,0 +1,100 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Any +import kotlin.Boolean +import kotlin.Int +import kotlin.Unit + +/** + * PermissionProjectionOfSelectorMarker + * + * Generated from 'PermissionProjectionOfSelectorMarker' enum + */ +public sealed class PermissionProjectionOfSelectorMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + override fun equals(other: Any?): Boolean = + when (this) { + is Atom -> Atom.equals(this, other) + else -> super.equals(other) + } + + override fun hashCode(): Int = + when (this) { + is Atom -> Atom.hashCode() + else -> super.hashCode() + } + + /** + * 'Atom' variant + */ + public class Atom : PermissionProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.PermissionProjectionOfSelectorMarker.Atom = + try { + Atom() + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.PermissionProjectionOfSelectorMarker.Atom, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.PermissionProjectionOfSelectorMarker.Atom, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".PermissionProjectionOfSelectorMarker.Atom".hashCode() + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): PermissionProjectionOfSelectorMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: PermissionProjectionOfSelectorMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PipelineEventBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PipelineEventBox.kt index 2b02650d1..f14cb776e 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PipelineEventBox.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PipelineEventBox.kt @@ -36,22 +36,24 @@ public sealed class PipelineEventBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.PipelineEventBox.Transaction = try { - Transaction( - TransactionEvent.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.PipelineEventBox.Transaction = + try { + Transaction( + TransactionEvent.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.PipelineEventBox.Transaction, - ): Unit = try { - TransactionEvent.write(writer, instance.transactionEvent) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + TransactionEvent.write(writer, instance.transactionEvent) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -68,40 +70,45 @@ public sealed class PipelineEventBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.PipelineEventBox.Block = try { - Block( - BlockEvent.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.PipelineEventBox.Block = + try { + Block( + BlockEvent.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.PipelineEventBox.Block, - ): Unit = try { - BlockEvent.write(writer, instance.blockEvent) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + BlockEvent.write(writer, instance.blockEvent) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): PipelineEventBox = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Transaction.read(reader) - 1 -> Block.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + override fun read(reader: ScaleCodecReader): PipelineEventBox = + when (val discriminant = reader.readUByte()) { + 0 -> Transaction.read(reader) + 1 -> Block.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: PipelineEventBox) { + override fun write( + writer: ScaleCodecWriter, + instance: PipelineEventBox, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Transaction.write(writer, instance as Transaction) 1 -> Block.write(writer, instance as Block) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PipelineEventFilterBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PipelineEventFilterBox.kt index 6d6b170ec..e190f77a0 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PipelineEventFilterBox.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PipelineEventFilterBox.kt @@ -36,22 +36,24 @@ public sealed class PipelineEventFilterBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.PipelineEventFilterBox.Transaction = try { - Transaction( - TransactionEventFilter.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.PipelineEventFilterBox.Transaction = + try { + Transaction( + TransactionEventFilter.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.PipelineEventFilterBox.Transaction, - ): Unit = try { - TransactionEventFilter.write(writer, instance.transactionEventFilter) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + TransactionEventFilter.write(writer, instance.transactionEventFilter) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -68,40 +70,47 @@ public sealed class PipelineEventFilterBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.PipelineEventFilterBox.Block = try { - Block( - BlockEventFilter.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.PipelineEventFilterBox.Block = + try { + Block( + BlockEventFilter.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.PipelineEventFilterBox.Block, - ): Unit = try { - BlockEventFilter.write(writer, instance.blockEventFilter) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + BlockEventFilter.write(writer, instance.blockEventFilter) + } catch (ex: Exception) { + throw wrapException(ex) + } } } - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): PipelineEventFilterBox = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Transaction.read(reader) - 1 -> Block.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): PipelineEventFilterBox = + when (val discriminant = reader.readUByte()) { + 0 -> Transaction.read(reader) + 1 -> Block.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: PipelineEventFilterBox) { + override fun write( + writer: ScaleCodecWriter, + instance: PipelineEventFilterBox, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Transaction.write(writer, instance as Transaction) 1 -> Block.write(writer, instance as Block) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PublicKey.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PublicKey.kt index 56b6b44b2..67d0afded 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PublicKey.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PublicKey.kt @@ -34,20 +34,25 @@ public data class PublicKey( override fun hashCode(): Int = algorithm.hashCode() * 31 + payload.contentHashCode() public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): PublicKey = try { - PublicKey( - Algorithm.read(reader), - reader.readByteArray(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): PublicKey = + try { + PublicKey( + Algorithm.read(reader), + reader.readByteArray(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: PublicKey): Unit = try { - Algorithm.write(writer, instance.algorithm) - writer.writeAsList(instance.payload) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: PublicKey, + ): Unit = + try { + Algorithm.write(writer, instance.algorithm) + writer.writeAsList(instance.payload) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PublicKeyPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PublicKeyPredicateAtom.kt similarity index 54% rename from modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PublicKeyPredicateBox.kt rename to modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PublicKeyPredicateAtom.kt index 9ae7921f2..8128a0573 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PublicKeyPredicateBox.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PublicKeyPredicateAtom.kt @@ -13,11 +13,11 @@ import kotlin.Int import kotlin.Unit /** - * PublicKeyPredicateBox + * PublicKeyPredicateAtom * - * Generated from 'PublicKeyPredicateBox' enum + * Generated from 'PublicKeyPredicateAtom' enum */ -public sealed class PublicKeyPredicateBox : ModelEnum { +public sealed class PublicKeyPredicateAtom : ModelEnum { /** * @return Discriminator of variant in enum */ @@ -28,46 +28,53 @@ public sealed class PublicKeyPredicateBox : ModelEnum { */ public data class Equals( public val publicKey: PublicKey, - ) : PublicKeyPredicateBox() { + ) : PublicKeyPredicateAtom() { override fun discriminant(): Int = DISCRIMINANT public companion object : - ScaleReader, - ScaleWriter { + ScaleReader, + ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.PublicKeyPredicateBox.Equals = try { - Equals( - PublicKey.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.PublicKeyPredicateAtom.Equals = + try { + Equals( + PublicKey.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.PublicKeyPredicateBox.Equals, - ): Unit = try { - PublicKey.write(writer, instance.publicKey) - } catch (ex: Exception) { - throw wrapException(ex) - } + instance: jp.co.soramitsu.iroha2.generated.PublicKeyPredicateAtom.Equals, + ): Unit = + try { + PublicKey.write(writer, instance.publicKey) + } catch (ex: Exception) { + throw wrapException(ex) + } } } - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): PublicKeyPredicateBox = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Equals.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): PublicKeyPredicateAtom = + when (val discriminant = reader.readUByte()) { + 0 -> Equals.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: PublicKeyPredicateBox) { + override fun write( + writer: ScaleCodecWriter, + instance: PublicKeyPredicateAtom, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Equals.write(writer, instance as Equals) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PublicKeyProjectionOfPredicateMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PublicKeyProjectionOfPredicateMarker.kt new file mode 100644 index 000000000..7a8bf6f25 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PublicKeyProjectionOfPredicateMarker.kt @@ -0,0 +1,80 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit + +/** + * PublicKeyProjectionOfPredicateMarker + * + * Generated from 'PublicKeyProjectionOfPredicateMarker' enum + */ +public sealed class PublicKeyProjectionOfPredicateMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val publicKeyPredicateAtom: PublicKeyPredicateAtom, + ) : PublicKeyProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.PublicKeyProjectionOfPredicateMarker.Atom = + try { + Atom( + PublicKeyPredicateAtom.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.PublicKeyProjectionOfPredicateMarker.Atom, + ): Unit = + try { + PublicKeyPredicateAtom.write(writer, instance.publicKeyPredicateAtom) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): PublicKeyProjectionOfPredicateMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: PublicKeyProjectionOfPredicateMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PublicKeyProjectionOfSelectorMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PublicKeyProjectionOfSelectorMarker.kt new file mode 100644 index 000000000..0739678e6 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/PublicKeyProjectionOfSelectorMarker.kt @@ -0,0 +1,100 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Any +import kotlin.Boolean +import kotlin.Int +import kotlin.Unit + +/** + * PublicKeyProjectionOfSelectorMarker + * + * Generated from 'PublicKeyProjectionOfSelectorMarker' enum + */ +public sealed class PublicKeyProjectionOfSelectorMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + override fun equals(other: Any?): Boolean = + when (this) { + is Atom -> Atom.equals(this, other) + else -> super.equals(other) + } + + override fun hashCode(): Int = + when (this) { + is Atom -> Atom.hashCode() + else -> super.hashCode() + } + + /** + * 'Atom' variant + */ + public class Atom : PublicKeyProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.PublicKeyProjectionOfSelectorMarker.Atom = + try { + Atom() + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.PublicKeyProjectionOfSelectorMarker.Atom, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.PublicKeyProjectionOfSelectorMarker.Atom, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".PublicKeyProjectionOfSelectorMarker.Atom".hashCode() + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): PublicKeyProjectionOfSelectorMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: PublicKeyProjectionOfSelectorMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryBox.kt index 75343e0a7..85d24dcc4 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryBox.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryBox.kt @@ -24,100 +24,101 @@ public sealed class QueryBox : ModelEnum { public abstract fun discriminant(): Int /** - * 'FindAllAccounts' variant + * 'FindDomains' variant */ - public data class FindAllAccounts( - public val findAllAccounts: jp.co.soramitsu.iroha2.generated.FindAllAccounts, + public data class FindDomains( + public val queryWithFilterOfFindDomains: QueryWithFilterOfFindDomains, ) : QueryBox() { override fun discriminant(): Int = DISCRIMINANT public companion object : - ScaleReader, - ScaleWriter { + ScaleReader, + ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindAllAccounts = try { - FindAllAccounts( - jp.co.soramitsu.iroha2.generated.FindAllAccounts.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindDomains = + try { + FindDomains( + QueryWithFilterOfFindDomains.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindAllAccounts, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindAllAccounts.write(writer, instance.findAllAccounts) - } catch (ex: Exception) { - throw wrapException(ex) - } + instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindDomains, + ): Unit = + try { + QueryWithFilterOfFindDomains.write(writer, instance.queryWithFilterOfFindDomains) + } catch (ex: Exception) { + throw wrapException(ex) + } } } /** - * 'FindAccountById' variant + * 'FindAccounts' variant */ - public data class FindAccountById( - public val findAccountById: jp.co.soramitsu.iroha2.generated.FindAccountById, + public data class FindAccounts( + public val queryWithFilterOfFindAccounts: QueryWithFilterOfFindAccounts, ) : QueryBox() { override fun discriminant(): Int = DISCRIMINANT public companion object : - ScaleReader, - ScaleWriter { + ScaleReader, + ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindAccountById = try { - FindAccountById( - jp.co.soramitsu.iroha2.generated.FindAccountById.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindAccounts = + try { + FindAccounts( + QueryWithFilterOfFindAccounts.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindAccountById, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindAccountById.write(writer, instance.findAccountById) - } catch (ex: Exception) { - throw wrapException(ex) - } + instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindAccounts, + ): Unit = + try { + QueryWithFilterOfFindAccounts.write(writer, instance.queryWithFilterOfFindAccounts) + } catch (ex: Exception) { + throw wrapException(ex) + } } } /** - * 'FindAccountKeyValueByIdAndKey' variant + * 'FindAssets' variant */ - public data class FindAccountKeyValueByIdAndKey( - public val findAccountKeyValueByIdAndKey: - jp.co.soramitsu.iroha2.generated.FindAccountKeyValueByIdAndKey, + public data class FindAssets( + public val queryWithFilterOfFindAssets: QueryWithFilterOfFindAssets, ) : QueryBox() { override fun discriminant(): Int = DISCRIMINANT public companion object : - ScaleReader, - ScaleWriter { + ScaleReader, + ScaleWriter { public const val DISCRIMINANT: Int = 2 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindAccountKeyValueByIdAndKey = try { - FindAccountKeyValueByIdAndKey( - jp.co.soramitsu.iroha2.generated.FindAccountKeyValueByIdAndKey.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindAssets = + try { + FindAssets( + QueryWithFilterOfFindAssets.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindAccountKeyValueByIdAndKey, + instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindAssets, ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindAccountKeyValueByIdAndKey.write( - writer, - instance.findAccountKeyValueByIdAndKey, - ) + QueryWithFilterOfFindAssets.write(writer, instance.queryWithFilterOfFindAssets) } catch (ex: Exception) { throw wrapException(ex) } @@ -125,307 +126,305 @@ public sealed class QueryBox : ModelEnum { } /** - * 'FindAccountsByDomainId' variant + * 'FindAssetsDefinitions' variant */ - public data class FindAccountsByDomainId( - public val findAccountsByDomainId: jp.co.soramitsu.iroha2.generated.FindAccountsByDomainId, + public data class FindAssetsDefinitions( + public val queryWithFilterOfFindAssetsDefinitions: QueryWithFilterOfFindAssetsDefinitions, ) : QueryBox() { override fun discriminant(): Int = DISCRIMINANT public companion object : - ScaleReader, - ScaleWriter { + ScaleReader, + ScaleWriter { public const val DISCRIMINANT: Int = 3 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindAccountsByDomainId = try { - FindAccountsByDomainId( - jp.co.soramitsu.iroha2.generated.FindAccountsByDomainId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindAssetsDefinitions = + try { + FindAssetsDefinitions( + QueryWithFilterOfFindAssetsDefinitions.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindAccountsByDomainId, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindAccountsByDomainId.write( - writer, - instance.findAccountsByDomainId, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindAssetsDefinitions, + ): Unit = + try { + QueryWithFilterOfFindAssetsDefinitions.write(writer, instance.queryWithFilterOfFindAssetsDefinitions) + } catch (ex: Exception) { + throw wrapException(ex) + } } } /** - * 'FindAccountsWithAsset' variant + * 'FindRoles' variant */ - public data class FindAccountsWithAsset( - public val findAccountsWithAsset: jp.co.soramitsu.iroha2.generated.FindAccountsWithAsset, + public data class FindRoles( + public val queryWithFilterOfFindRoles: QueryWithFilterOfFindRoles, ) : QueryBox() { override fun discriminant(): Int = DISCRIMINANT public companion object : - ScaleReader, - ScaleWriter { + ScaleReader, + ScaleWriter { public const val DISCRIMINANT: Int = 4 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindAccountsWithAsset = try { - FindAccountsWithAsset( - jp.co.soramitsu.iroha2.generated.FindAccountsWithAsset.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindRoles = + try { + FindRoles( + QueryWithFilterOfFindRoles.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindAccountsWithAsset, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindAccountsWithAsset.write( - writer, - instance.findAccountsWithAsset, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindRoles, + ): Unit = + try { + QueryWithFilterOfFindRoles.write(writer, instance.queryWithFilterOfFindRoles) + } catch (ex: Exception) { + throw wrapException(ex) + } } } /** - * 'FindAllAssets' variant + * 'FindRoleIds' variant */ - public data class FindAllAssets( - public val findAllAssets: jp.co.soramitsu.iroha2.generated.FindAllAssets, + public data class FindRoleIds( + public val queryWithFilterOfFindRoleIds: QueryWithFilterOfFindRoleIds, ) : QueryBox() { override fun discriminant(): Int = DISCRIMINANT public companion object : - ScaleReader, - ScaleWriter { + ScaleReader, + ScaleWriter { public const val DISCRIMINANT: Int = 5 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindAllAssets = try { - FindAllAssets( - jp.co.soramitsu.iroha2.generated.FindAllAssets.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindRoleIds = + try { + FindRoleIds( + QueryWithFilterOfFindRoleIds.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindAllAssets, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindAllAssets.write(writer, instance.findAllAssets) - } catch (ex: Exception) { - throw wrapException(ex) - } + instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindRoleIds, + ): Unit = + try { + QueryWithFilterOfFindRoleIds.write(writer, instance.queryWithFilterOfFindRoleIds) + } catch (ex: Exception) { + throw wrapException(ex) + } } } /** - * 'FindAllAssetsDefinitions' variant + * 'FindPermissionsByAccountId' variant */ - public data class FindAllAssetsDefinitions( - public val findAllAssetsDefinitions: jp.co.soramitsu.iroha2.generated.FindAllAssetsDefinitions, + public data class FindPermissionsByAccountId( + public val queryWithFilterOfFindPermissionsByAccountId: QueryWithFilterOfFindPermissionsByAccountId, ) : QueryBox() { override fun discriminant(): Int = DISCRIMINANT public companion object : - ScaleReader, - ScaleWriter { + ScaleReader, + ScaleWriter { public const val DISCRIMINANT: Int = 6 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindAllAssetsDefinitions = try { - FindAllAssetsDefinitions( - jp.co.soramitsu.iroha2.generated.FindAllAssetsDefinitions.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindPermissionsByAccountId = + try { + FindPermissionsByAccountId( + QueryWithFilterOfFindPermissionsByAccountId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindAllAssetsDefinitions, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindAllAssetsDefinitions.write( - writer, - instance.findAllAssetsDefinitions, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindPermissionsByAccountId, + ): Unit = + try { + QueryWithFilterOfFindPermissionsByAccountId.write(writer, instance.queryWithFilterOfFindPermissionsByAccountId) + } catch (ex: Exception) { + throw wrapException(ex) + } } } /** - * 'FindAssetById' variant + * 'FindRolesByAccountId' variant */ - public data class FindAssetById( - public val findAssetById: jp.co.soramitsu.iroha2.generated.FindAssetById, + public data class FindRolesByAccountId( + public val queryWithFilterOfFindRolesByAccountId: QueryWithFilterOfFindRolesByAccountId, ) : QueryBox() { override fun discriminant(): Int = DISCRIMINANT public companion object : - ScaleReader, - ScaleWriter { + ScaleReader, + ScaleWriter { public const val DISCRIMINANT: Int = 7 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindAssetById = try { - FindAssetById( - jp.co.soramitsu.iroha2.generated.FindAssetById.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindRolesByAccountId = + try { + FindRolesByAccountId( + QueryWithFilterOfFindRolesByAccountId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindAssetById, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindAssetById.write(writer, instance.findAssetById) - } catch (ex: Exception) { - throw wrapException(ex) - } + instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindRolesByAccountId, + ): Unit = + try { + QueryWithFilterOfFindRolesByAccountId.write(writer, instance.queryWithFilterOfFindRolesByAccountId) + } catch (ex: Exception) { + throw wrapException(ex) + } } } /** - * 'FindAssetDefinitionById' variant + * 'FindAccountsWithAsset' variant */ - public data class FindAssetDefinitionById( - public val findAssetDefinitionById: jp.co.soramitsu.iroha2.generated.FindAssetDefinitionById, + public data class FindAccountsWithAsset( + public val queryWithFilterOfFindAccountsWithAsset: QueryWithFilterOfFindAccountsWithAsset, ) : QueryBox() { override fun discriminant(): Int = DISCRIMINANT public companion object : - ScaleReader, - ScaleWriter { + ScaleReader, + ScaleWriter { public const val DISCRIMINANT: Int = 8 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindAssetDefinitionById = try { - FindAssetDefinitionById( - jp.co.soramitsu.iroha2.generated.FindAssetDefinitionById.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindAccountsWithAsset = + try { + FindAccountsWithAsset( + QueryWithFilterOfFindAccountsWithAsset.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindAssetDefinitionById, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindAssetDefinitionById.write( - writer, - instance.findAssetDefinitionById, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindAccountsWithAsset, + ): Unit = + try { + QueryWithFilterOfFindAccountsWithAsset.write(writer, instance.queryWithFilterOfFindAccountsWithAsset) + } catch (ex: Exception) { + throw wrapException(ex) + } } } /** - * 'FindAssetsByName' variant + * 'FindPeers' variant */ - public data class FindAssetsByName( - public val findAssetsByName: jp.co.soramitsu.iroha2.generated.FindAssetsByName, + public data class FindPeers( + public val queryWithFilterOfFindPeers: QueryWithFilterOfFindPeers, ) : QueryBox() { override fun discriminant(): Int = DISCRIMINANT public companion object : - ScaleReader, - ScaleWriter { + ScaleReader, + ScaleWriter { public const val DISCRIMINANT: Int = 9 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindAssetsByName = try { - FindAssetsByName( - jp.co.soramitsu.iroha2.generated.FindAssetsByName.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindPeers = + try { + FindPeers( + QueryWithFilterOfFindPeers.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindAssetsByName, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindAssetsByName.write(writer, instance.findAssetsByName) - } catch (ex: Exception) { - throw wrapException(ex) - } + instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindPeers, + ): Unit = + try { + QueryWithFilterOfFindPeers.write(writer, instance.queryWithFilterOfFindPeers) + } catch (ex: Exception) { + throw wrapException(ex) + } } } /** - * 'FindAssetsByAccountId' variant + * 'FindActiveTriggerIds' variant */ - public data class FindAssetsByAccountId( - public val findAssetsByAccountId: jp.co.soramitsu.iroha2.generated.FindAssetsByAccountId, + public data class FindActiveTriggerIds( + public val queryWithFilterOfFindActiveTriggerIds: QueryWithFilterOfFindActiveTriggerIds, ) : QueryBox() { override fun discriminant(): Int = DISCRIMINANT public companion object : - ScaleReader, - ScaleWriter { + ScaleReader, + ScaleWriter { public const val DISCRIMINANT: Int = 10 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindAssetsByAccountId = try { - FindAssetsByAccountId( - jp.co.soramitsu.iroha2.generated.FindAssetsByAccountId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindActiveTriggerIds = + try { + FindActiveTriggerIds( + QueryWithFilterOfFindActiveTriggerIds.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindAssetsByAccountId, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindAssetsByAccountId.write( - writer, - instance.findAssetsByAccountId, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindActiveTriggerIds, + ): Unit = + try { + QueryWithFilterOfFindActiveTriggerIds.write(writer, instance.queryWithFilterOfFindActiveTriggerIds) + } catch (ex: Exception) { + throw wrapException(ex) + } } } /** - * 'FindAssetsByAssetDefinitionId' variant + * 'FindTriggers' variant */ - public data class FindAssetsByAssetDefinitionId( - public val findAssetsByAssetDefinitionId: - jp.co.soramitsu.iroha2.generated.FindAssetsByAssetDefinitionId, + public data class FindTriggers( + public val queryWithFilterOfFindTriggers: QueryWithFilterOfFindTriggers, ) : QueryBox() { override fun discriminant(): Int = DISCRIMINANT public companion object : - ScaleReader, - ScaleWriter { + ScaleReader, + ScaleWriter { public const val DISCRIMINANT: Int = 11 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindAssetsByAssetDefinitionId = try { - FindAssetsByAssetDefinitionId( - jp.co.soramitsu.iroha2.generated.FindAssetsByAssetDefinitionId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindTriggers = + try { + FindTriggers( + QueryWithFilterOfFindTriggers.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindAssetsByAssetDefinitionId, + instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindTriggers, ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindAssetsByAssetDefinitionId.write( - writer, - instance.findAssetsByAssetDefinitionId, - ) + QueryWithFilterOfFindTriggers.write(writer, instance.queryWithFilterOfFindTriggers) } catch (ex: Exception) { throw wrapException(ex) } @@ -433,1080 +432,151 @@ public sealed class QueryBox : ModelEnum { } /** - * 'FindAssetsByDomainId' variant + * 'FindTransactions' variant */ - public data class FindAssetsByDomainId( - public val findAssetsByDomainId: jp.co.soramitsu.iroha2.generated.FindAssetsByDomainId, + public data class FindTransactions( + public val queryWithFilterOfFindTransactions: QueryWithFilterOfFindTransactions, ) : QueryBox() { override fun discriminant(): Int = DISCRIMINANT public companion object : - ScaleReader, - ScaleWriter { + ScaleReader, + ScaleWriter { public const val DISCRIMINANT: Int = 12 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindAssetsByDomainId = try { - FindAssetsByDomainId( - jp.co.soramitsu.iroha2.generated.FindAssetsByDomainId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindTransactions = + try { + FindTransactions( + QueryWithFilterOfFindTransactions.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindAssetsByDomainId, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindAssetsByDomainId.write( - writer, - instance.findAssetsByDomainId, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindTransactions, + ): Unit = + try { + QueryWithFilterOfFindTransactions.write(writer, instance.queryWithFilterOfFindTransactions) + } catch (ex: Exception) { + throw wrapException(ex) + } } } /** - * 'FindAssetsByDomainIdAndAssetDefinitionId' variant + * 'FindBlocks' variant */ - public data class FindAssetsByDomainIdAndAssetDefinitionId( - public val findAssetsByDomainIdAndAssetDefinitionId: - jp.co.soramitsu.iroha2.generated.FindAssetsByDomainIdAndAssetDefinitionId, + public data class FindBlocks( + public val queryWithFilterOfFindBlocks: QueryWithFilterOfFindBlocks, ) : QueryBox() { override fun discriminant(): Int = DISCRIMINANT public companion object : - ScaleReader, - ScaleWriter { + ScaleReader, + ScaleWriter { public const val DISCRIMINANT: Int = 13 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindAssetsByDomainIdAndAssetDefinitionId = try { - FindAssetsByDomainIdAndAssetDefinitionId( - jp.co.soramitsu.iroha2.generated.FindAssetsByDomainIdAndAssetDefinitionId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindBlocks = + try { + FindBlocks( + QueryWithFilterOfFindBlocks.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindAssetsByDomainIdAndAssetDefinitionId, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindAssetsByDomainIdAndAssetDefinitionId.write( - writer, - instance.findAssetsByDomainIdAndAssetDefinitionId, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindBlocks, + ): Unit = + try { + QueryWithFilterOfFindBlocks.write(writer, instance.queryWithFilterOfFindBlocks) + } catch (ex: Exception) { + throw wrapException(ex) + } } } /** - * 'FindAssetQuantityById' variant + * 'FindBlockHeaders' variant */ - public data class FindAssetQuantityById( - public val findAssetQuantityById: jp.co.soramitsu.iroha2.generated.FindAssetQuantityById, + public data class FindBlockHeaders( + public val queryWithFilterOfFindBlockHeaders: QueryWithFilterOfFindBlockHeaders, ) : QueryBox() { override fun discriminant(): Int = DISCRIMINANT public companion object : - ScaleReader, - ScaleWriter { + ScaleReader, + ScaleWriter { public const val DISCRIMINANT: Int = 14 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindAssetQuantityById = try { - FindAssetQuantityById( - jp.co.soramitsu.iroha2.generated.FindAssetQuantityById.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindAssetQuantityById, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindAssetQuantityById.write( - writer, - instance.findAssetQuantityById, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'FindTotalAssetQuantityByAssetDefinitionId' variant - */ - public data class FindTotalAssetQuantityByAssetDefinitionId( - public val findTotalAssetQuantityByAssetDefinitionId: - jp.co.soramitsu.iroha2.generated.FindTotalAssetQuantityByAssetDefinitionId, - ) : QueryBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 15 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindTotalAssetQuantityByAssetDefinitionId = try { - FindTotalAssetQuantityByAssetDefinitionId( - jp.co.soramitsu.iroha2.generated.FindTotalAssetQuantityByAssetDefinitionId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindTotalAssetQuantityByAssetDefinitionId, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindTotalAssetQuantityByAssetDefinitionId.write( - writer, - instance.findTotalAssetQuantityByAssetDefinitionId, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'FindAssetKeyValueByIdAndKey' variant - */ - public data class FindAssetKeyValueByIdAndKey( - public val findAssetKeyValueByIdAndKey: - jp.co.soramitsu.iroha2.generated.FindAssetKeyValueByIdAndKey, - ) : QueryBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 16 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindAssetKeyValueByIdAndKey = try { - FindAssetKeyValueByIdAndKey( - jp.co.soramitsu.iroha2.generated.FindAssetKeyValueByIdAndKey.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindAssetKeyValueByIdAndKey, - ): Unit = + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindBlockHeaders = try { - jp.co.soramitsu.iroha2.generated.FindAssetKeyValueByIdAndKey.write( - writer, - instance.findAssetKeyValueByIdAndKey, + FindBlockHeaders( + QueryWithFilterOfFindBlockHeaders.read(reader), ) } catch (ex: Exception) { throw wrapException(ex) } - } - } - - /** - * 'FindAssetDefinitionKeyValueByIdAndKey' variant - */ - public data class FindAssetDefinitionKeyValueByIdAndKey( - public val findAssetDefinitionKeyValueByIdAndKey: - jp.co.soramitsu.iroha2.generated.FindAssetDefinitionKeyValueByIdAndKey, - ) : QueryBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 17 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindAssetDefinitionKeyValueByIdAndKey = try { - FindAssetDefinitionKeyValueByIdAndKey( - jp.co.soramitsu.iroha2.generated.FindAssetDefinitionKeyValueByIdAndKey.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindAssetDefinitionKeyValueByIdAndKey, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindAssetDefinitionKeyValueByIdAndKey.write( - writer, - instance.findAssetDefinitionKeyValueByIdAndKey, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'FindAllDomains' variant - */ - public data class FindAllDomains( - public val findAllDomains: jp.co.soramitsu.iroha2.generated.FindAllDomains, - ) : QueryBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 18 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindAllDomains = try { - FindAllDomains( - jp.co.soramitsu.iroha2.generated.FindAllDomains.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } override fun write( writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindAllDomains, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindAllDomains.write(writer, instance.findAllDomains) - } catch (ex: Exception) { - throw wrapException(ex) - } + instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindBlockHeaders, + ): Unit = + try { + QueryWithFilterOfFindBlockHeaders.write(writer, instance.queryWithFilterOfFindBlockHeaders) + } catch (ex: Exception) { + throw wrapException(ex) + } } } - /** - * 'FindDomainById' variant - */ - public data class FindDomainById( - public val findDomainById: jp.co.soramitsu.iroha2.generated.FindDomainById, - ) : QueryBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 19 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindDomainById = try { - FindDomainById( - jp.co.soramitsu.iroha2.generated.FindDomainById.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindDomainById, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindDomainById.write(writer, instance.findDomainById) - } catch (ex: Exception) { - throw wrapException(ex) + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): QueryBox = + when (val discriminant = reader.readUByte()) { + 0 -> FindDomains.read(reader) + 1 -> FindAccounts.read(reader) + 2 -> FindAssets.read(reader) + 3 -> FindAssetsDefinitions.read(reader) + 4 -> FindRoles.read(reader) + 5 -> FindRoleIds.read(reader) + 6 -> FindPermissionsByAccountId.read(reader) + 7 -> FindRolesByAccountId.read(reader) + 8 -> FindAccountsWithAsset.read(reader) + 9 -> FindPeers.read(reader) + 10 -> FindActiveTriggerIds.read(reader) + 11 -> FindTriggers.read(reader) + 12 -> FindTransactions.read(reader) + 13 -> FindBlocks.read(reader) + 14 -> FindBlockHeaders.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: QueryBox, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> FindDomains.write(writer, instance as FindDomains) + 1 -> FindAccounts.write(writer, instance as FindAccounts) + 2 -> FindAssets.write(writer, instance as FindAssets) + 3 -> FindAssetsDefinitions.write(writer, instance as FindAssetsDefinitions) + 4 -> FindRoles.write(writer, instance as FindRoles) + 5 -> FindRoleIds.write(writer, instance as FindRoleIds) + 6 -> FindPermissionsByAccountId.write(writer, instance as FindPermissionsByAccountId) + 7 -> FindRolesByAccountId.write(writer, instance as FindRolesByAccountId) + 8 -> FindAccountsWithAsset.write(writer, instance as FindAccountsWithAsset) + 9 -> FindPeers.write(writer, instance as FindPeers) + 10 -> FindActiveTriggerIds.write(writer, instance as FindActiveTriggerIds) + 11 -> FindTriggers.write(writer, instance as FindTriggers) + 12 -> FindTransactions.write(writer, instance as FindTransactions) + 13 -> FindBlocks.write(writer, instance as FindBlocks) + 14 -> FindBlockHeaders.write(writer, instance as FindBlockHeaders) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } } } - - /** - * 'FindDomainKeyValueByIdAndKey' variant - */ - public data class FindDomainKeyValueByIdAndKey( - public val findDomainKeyValueByIdAndKey: - jp.co.soramitsu.iroha2.generated.FindDomainKeyValueByIdAndKey, - ) : QueryBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 20 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindDomainKeyValueByIdAndKey = try { - FindDomainKeyValueByIdAndKey( - jp.co.soramitsu.iroha2.generated.FindDomainKeyValueByIdAndKey.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindDomainKeyValueByIdAndKey, - ): Unit = - try { - jp.co.soramitsu.iroha2.generated.FindDomainKeyValueByIdAndKey.write( - writer, - instance.findDomainKeyValueByIdAndKey, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'FindAllPeers' variant - */ - public data class FindAllPeers( - public val findAllPeers: jp.co.soramitsu.iroha2.generated.FindAllPeers, - ) : QueryBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 21 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindAllPeers = try { - FindAllPeers( - jp.co.soramitsu.iroha2.generated.FindAllPeers.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindAllPeers, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindAllPeers.write(writer, instance.findAllPeers) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'FindAllBlocks' variant - */ - public data class FindAllBlocks( - public val findAllBlocks: jp.co.soramitsu.iroha2.generated.FindAllBlocks, - ) : QueryBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 22 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindAllBlocks = try { - FindAllBlocks( - jp.co.soramitsu.iroha2.generated.FindAllBlocks.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindAllBlocks, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindAllBlocks.write(writer, instance.findAllBlocks) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'FindAllBlockHeaders' variant - */ - public data class FindAllBlockHeaders( - public val findAllBlockHeaders: jp.co.soramitsu.iroha2.generated.FindAllBlockHeaders, - ) : QueryBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 23 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindAllBlockHeaders = try { - FindAllBlockHeaders( - jp.co.soramitsu.iroha2.generated.FindAllBlockHeaders.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindAllBlockHeaders, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindAllBlockHeaders.write( - writer, - instance.findAllBlockHeaders, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'FindBlockHeaderByHash' variant - */ - public data class FindBlockHeaderByHash( - public val findBlockHeaderByHash: jp.co.soramitsu.iroha2.generated.FindBlockHeaderByHash, - ) : QueryBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 24 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindBlockHeaderByHash = try { - FindBlockHeaderByHash( - jp.co.soramitsu.iroha2.generated.FindBlockHeaderByHash.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindBlockHeaderByHash, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindBlockHeaderByHash.write( - writer, - instance.findBlockHeaderByHash, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'FindAllTransactions' variant - */ - public data class FindAllTransactions( - public val findAllTransactions: jp.co.soramitsu.iroha2.generated.FindAllTransactions, - ) : QueryBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 25 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindAllTransactions = try { - FindAllTransactions( - jp.co.soramitsu.iroha2.generated.FindAllTransactions.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindAllTransactions, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindAllTransactions.write( - writer, - instance.findAllTransactions, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'FindTransactionsByAccountId' variant - */ - public data class FindTransactionsByAccountId( - public val findTransactionsByAccountId: - jp.co.soramitsu.iroha2.generated.FindTransactionsByAccountId, - ) : QueryBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 26 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindTransactionsByAccountId = try { - FindTransactionsByAccountId( - jp.co.soramitsu.iroha2.generated.FindTransactionsByAccountId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindTransactionsByAccountId, - ): Unit = - try { - jp.co.soramitsu.iroha2.generated.FindTransactionsByAccountId.write( - writer, - instance.findTransactionsByAccountId, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'FindTransactionByHash' variant - */ - public data class FindTransactionByHash( - public val findTransactionByHash: jp.co.soramitsu.iroha2.generated.FindTransactionByHash, - ) : QueryBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 27 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindTransactionByHash = try { - FindTransactionByHash( - jp.co.soramitsu.iroha2.generated.FindTransactionByHash.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindTransactionByHash, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindTransactionByHash.write( - writer, - instance.findTransactionByHash, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'FindPermissionsByAccountId' variant - */ - public data class FindPermissionsByAccountId( - public val findPermissionsByAccountId: - jp.co.soramitsu.iroha2.generated.FindPermissionsByAccountId, - ) : QueryBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 28 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindPermissionsByAccountId = try { - FindPermissionsByAccountId( - jp.co.soramitsu.iroha2.generated.FindPermissionsByAccountId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindPermissionsByAccountId, - ): Unit = - try { - jp.co.soramitsu.iroha2.generated.FindPermissionsByAccountId.write( - writer, - instance.findPermissionsByAccountId, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'FindExecutorDataModel' variant - */ - public data class FindExecutorDataModel( - public val findExecutorDataModel: jp.co.soramitsu.iroha2.generated.FindExecutorDataModel, - ) : QueryBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 29 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindExecutorDataModel = try { - FindExecutorDataModel( - jp.co.soramitsu.iroha2.generated.FindExecutorDataModel.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindExecutorDataModel, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindExecutorDataModel.write( - writer, - instance.findExecutorDataModel, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'FindAllActiveTriggerIds' variant - */ - public data class FindAllActiveTriggerIds( - public val findAllActiveTriggerIds: jp.co.soramitsu.iroha2.generated.FindAllActiveTriggerIds, - ) : QueryBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 30 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindAllActiveTriggerIds = try { - FindAllActiveTriggerIds( - jp.co.soramitsu.iroha2.generated.FindAllActiveTriggerIds.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindAllActiveTriggerIds, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindAllActiveTriggerIds.write( - writer, - instance.findAllActiveTriggerIds, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'FindTriggerById' variant - */ - public data class FindTriggerById( - public val findTriggerById: jp.co.soramitsu.iroha2.generated.FindTriggerById, - ) : QueryBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 31 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindTriggerById = try { - FindTriggerById( - jp.co.soramitsu.iroha2.generated.FindTriggerById.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindTriggerById, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindTriggerById.write(writer, instance.findTriggerById) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'FindTriggerKeyValueByIdAndKey' variant - */ - public data class FindTriggerKeyValueByIdAndKey( - public val findTriggerKeyValueByIdAndKey: - jp.co.soramitsu.iroha2.generated.FindTriggerKeyValueByIdAndKey, - ) : QueryBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 32 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindTriggerKeyValueByIdAndKey = try { - FindTriggerKeyValueByIdAndKey( - jp.co.soramitsu.iroha2.generated.FindTriggerKeyValueByIdAndKey.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindTriggerKeyValueByIdAndKey, - ): Unit = - try { - jp.co.soramitsu.iroha2.generated.FindTriggerKeyValueByIdAndKey.write( - writer, - instance.findTriggerKeyValueByIdAndKey, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'FindTriggersByAuthorityId' variant - */ - public data class FindTriggersByAuthorityId( - public val findTriggersByAuthorityId: - jp.co.soramitsu.iroha2.generated.FindTriggersByAuthorityId, - ) : QueryBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 33 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindTriggersByAuthorityId = try { - FindTriggersByAuthorityId( - jp.co.soramitsu.iroha2.generated.FindTriggersByAuthorityId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindTriggersByAuthorityId, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindTriggersByAuthorityId.write( - writer, - instance.findTriggersByAuthorityId, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'FindTriggersByAuthorityDomainId' variant - */ - public data class FindTriggersByAuthorityDomainId( - public val findTriggersByAuthorityDomainId: - jp.co.soramitsu.iroha2.generated.FindTriggersByAuthorityDomainId, - ) : QueryBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 34 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindTriggersByAuthorityDomainId = try { - FindTriggersByAuthorityDomainId( - jp.co.soramitsu.iroha2.generated.FindTriggersByAuthorityDomainId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindTriggersByAuthorityDomainId, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindTriggersByAuthorityDomainId.write( - writer, - instance.findTriggersByAuthorityDomainId, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'FindAllRoles' variant - */ - public data class FindAllRoles( - public val findAllRoles: jp.co.soramitsu.iroha2.generated.FindAllRoles, - ) : QueryBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 35 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindAllRoles = try { - FindAllRoles( - jp.co.soramitsu.iroha2.generated.FindAllRoles.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindAllRoles, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindAllRoles.write(writer, instance.findAllRoles) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'FindAllRoleIds' variant - */ - public data class FindAllRoleIds( - public val findAllRoleIds: jp.co.soramitsu.iroha2.generated.FindAllRoleIds, - ) : QueryBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 36 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindAllRoleIds = try { - FindAllRoleIds( - jp.co.soramitsu.iroha2.generated.FindAllRoleIds.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindAllRoleIds, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindAllRoleIds.write(writer, instance.findAllRoleIds) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'FindRoleByRoleId' variant - */ - public data class FindRoleByRoleId( - public val findRoleByRoleId: jp.co.soramitsu.iroha2.generated.FindRoleByRoleId, - ) : QueryBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 37 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindRoleByRoleId = try { - FindRoleByRoleId( - jp.co.soramitsu.iroha2.generated.FindRoleByRoleId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindRoleByRoleId, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindRoleByRoleId.write(writer, instance.findRoleByRoleId) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'FindRolesByAccountId' variant - */ - public data class FindRolesByAccountId( - public val findRolesByAccountId: jp.co.soramitsu.iroha2.generated.FindRolesByAccountId, - ) : QueryBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 38 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindRolesByAccountId = try { - FindRolesByAccountId( - jp.co.soramitsu.iroha2.generated.FindRolesByAccountId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindRolesByAccountId, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindRolesByAccountId.write( - writer, - instance.findRolesByAccountId, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'FindAllParameters' variant - */ - public data class FindAllParameters( - public val findAllParameters: jp.co.soramitsu.iroha2.generated.FindAllParameters, - ) : QueryBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 39 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryBox.FindAllParameters = try { - FindAllParameters( - jp.co.soramitsu.iroha2.generated.FindAllParameters.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryBox.FindAllParameters, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindAllParameters.write(writer, instance.findAllParameters) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): QueryBox = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> FindAllAccounts.read(reader) - 1 -> FindAccountById.read(reader) - 2 -> FindAccountKeyValueByIdAndKey.read(reader) - 3 -> FindAccountsByDomainId.read(reader) - 4 -> FindAccountsWithAsset.read(reader) - 5 -> FindAllAssets.read(reader) - 6 -> FindAllAssetsDefinitions.read(reader) - 7 -> FindAssetById.read(reader) - 8 -> FindAssetDefinitionById.read(reader) - 9 -> FindAssetsByName.read(reader) - 10 -> FindAssetsByAccountId.read(reader) - 11 -> FindAssetsByAssetDefinitionId.read(reader) - 12 -> FindAssetsByDomainId.read(reader) - 13 -> FindAssetsByDomainIdAndAssetDefinitionId.read(reader) - 14 -> FindAssetQuantityById.read(reader) - 15 -> FindTotalAssetQuantityByAssetDefinitionId.read(reader) - 16 -> FindAssetKeyValueByIdAndKey.read(reader) - 17 -> FindAssetDefinitionKeyValueByIdAndKey.read(reader) - 18 -> FindAllDomains.read(reader) - 19 -> FindDomainById.read(reader) - 20 -> FindDomainKeyValueByIdAndKey.read(reader) - 21 -> FindAllPeers.read(reader) - 22 -> FindAllBlocks.read(reader) - 23 -> FindAllBlockHeaders.read(reader) - 24 -> FindBlockHeaderByHash.read(reader) - 25 -> FindAllTransactions.read(reader) - 26 -> FindTransactionsByAccountId.read(reader) - 27 -> FindTransactionByHash.read(reader) - 28 -> FindPermissionsByAccountId.read(reader) - 29 -> FindExecutorDataModel.read(reader) - 30 -> FindAllActiveTriggerIds.read(reader) - 31 -> FindTriggerById.read(reader) - 32 -> FindTriggerKeyValueByIdAndKey.read(reader) - 33 -> FindTriggersByAuthorityId.read(reader) - 34 -> FindTriggersByAuthorityDomainId.read(reader) - 35 -> FindAllRoles.read(reader) - 36 -> FindAllRoleIds.read(reader) - 37 -> FindRoleByRoleId.read(reader) - 38 -> FindRolesByAccountId.read(reader) - 39 -> FindAllParameters.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: QueryBox) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 0 -> FindAllAccounts.write(writer, instance as FindAllAccounts) - 1 -> FindAccountById.write(writer, instance as FindAccountById) - 2 -> FindAccountKeyValueByIdAndKey.write(writer, instance as FindAccountKeyValueByIdAndKey) - 3 -> FindAccountsByDomainId.write(writer, instance as FindAccountsByDomainId) - 4 -> FindAccountsWithAsset.write(writer, instance as FindAccountsWithAsset) - 5 -> FindAllAssets.write(writer, instance as FindAllAssets) - 6 -> FindAllAssetsDefinitions.write(writer, instance as FindAllAssetsDefinitions) - 7 -> FindAssetById.write(writer, instance as FindAssetById) - 8 -> FindAssetDefinitionById.write(writer, instance as FindAssetDefinitionById) - 9 -> FindAssetsByName.write(writer, instance as FindAssetsByName) - 10 -> FindAssetsByAccountId.write(writer, instance as FindAssetsByAccountId) - 11 -> FindAssetsByAssetDefinitionId.write(writer, instance as FindAssetsByAssetDefinitionId) - 12 -> FindAssetsByDomainId.write(writer, instance as FindAssetsByDomainId) - 13 -> FindAssetsByDomainIdAndAssetDefinitionId.write( - writer, - instance as - FindAssetsByDomainIdAndAssetDefinitionId, - ) - 14 -> FindAssetQuantityById.write(writer, instance as FindAssetQuantityById) - 15 -> FindTotalAssetQuantityByAssetDefinitionId.write( - writer, - instance as - FindTotalAssetQuantityByAssetDefinitionId, - ) - 16 -> FindAssetKeyValueByIdAndKey.write(writer, instance as FindAssetKeyValueByIdAndKey) - 17 -> FindAssetDefinitionKeyValueByIdAndKey.write( - writer, - instance as - FindAssetDefinitionKeyValueByIdAndKey, - ) - 18 -> FindAllDomains.write(writer, instance as FindAllDomains) - 19 -> FindDomainById.write(writer, instance as FindDomainById) - 20 -> FindDomainKeyValueByIdAndKey.write(writer, instance as FindDomainKeyValueByIdAndKey) - 21 -> FindAllPeers.write(writer, instance as FindAllPeers) - 22 -> FindAllBlocks.write(writer, instance as FindAllBlocks) - 23 -> FindAllBlockHeaders.write(writer, instance as FindAllBlockHeaders) - 24 -> FindBlockHeaderByHash.write(writer, instance as FindBlockHeaderByHash) - 25 -> FindAllTransactions.write(writer, instance as FindAllTransactions) - 26 -> FindTransactionsByAccountId.write(writer, instance as FindTransactionsByAccountId) - 27 -> FindTransactionByHash.write(writer, instance as FindTransactionByHash) - 28 -> FindPermissionsByAccountId.write(writer, instance as FindPermissionsByAccountId) - 29 -> FindExecutorDataModel.write(writer, instance as FindExecutorDataModel) - 30 -> FindAllActiveTriggerIds.write(writer, instance as FindAllActiveTriggerIds) - 31 -> FindTriggerById.write(writer, instance as FindTriggerById) - 32 -> FindTriggerKeyValueByIdAndKey.write(writer, instance as FindTriggerKeyValueByIdAndKey) - 33 -> FindTriggersByAuthorityId.write(writer, instance as FindTriggersByAuthorityId) - 34 -> FindTriggersByAuthorityDomainId.write( - writer, - instance as - FindTriggersByAuthorityDomainId, - ) - 35 -> FindAllRoles.write(writer, instance as FindAllRoles) - 36 -> FindAllRoleIds.write(writer, instance as FindAllRoleIds) - 37 -> FindRoleByRoleId.write(writer, instance as FindRoleByRoleId) - 38 -> FindRolesByAccountId.write(writer, instance as FindRolesByAccountId) - 39 -> FindAllParameters.write(writer, instance as FindAllParameters) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryExecutionFail.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryExecutionFail.kt index 95ae72765..4246c4e98 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryExecutionFail.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryExecutionFail.kt @@ -26,19 +26,27 @@ public sealed class QueryExecutionFail : ModelEnum { */ public abstract fun discriminant(): Int - override fun equals(other: Any?): Boolean = when (this) { - is UnknownCursor -> UnknownCursor.equals(this, other) - is FetchSizeTooBig -> FetchSizeTooBig.equals(this, other) - is InvalidSingularParameters -> InvalidSingularParameters.equals(this, other) - is CapacityLimit -> CapacityLimit.equals(this, other) - else -> super.equals(other) } - - override fun hashCode(): Int = when (this) { - is UnknownCursor -> UnknownCursor.hashCode() - is FetchSizeTooBig -> FetchSizeTooBig.hashCode() - is InvalidSingularParameters -> InvalidSingularParameters.hashCode() - is CapacityLimit -> CapacityLimit.hashCode() - else -> super.hashCode() } + override fun equals(other: Any?): Boolean = + when (this) { + is NotFound -> NotFound.equals(this, other) + is CursorMismatch -> CursorMismatch.equals(this, other) + is CursorDone -> CursorDone.equals(this, other) + is FetchSizeTooBig -> FetchSizeTooBig.equals(this, other) + is InvalidSingularParameters -> InvalidSingularParameters.equals(this, other) + is CapacityLimit -> CapacityLimit.equals(this, other) + else -> super.equals(other) + } + + override fun hashCode(): Int = + when (this) { + is NotFound -> NotFound.hashCode() + is CursorMismatch -> CursorMismatch.hashCode() + is CursorDone -> CursorDone.hashCode() + is FetchSizeTooBig -> FetchSizeTooBig.hashCode() + is InvalidSingularParameters -> InvalidSingularParameters.hashCode() + is CapacityLimit -> CapacityLimit.hashCode() + else -> super.hashCode() + } /** * 'Find' variant @@ -53,22 +61,24 @@ public sealed class QueryExecutionFail : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryExecutionFail.Find = try { - Find( - FindError.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryExecutionFail.Find = + try { + Find( + FindError.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.QueryExecutionFail.Find, - ): Unit = try { - FindError.write(writer, instance.findError) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + FindError.write(writer, instance.findError) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -85,59 +95,144 @@ public sealed class QueryExecutionFail : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryExecutionFail.Conversion = try { - Conversion( - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryExecutionFail.Conversion = + try { + Conversion( + reader.readString(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.QueryExecutionFail.Conversion, - ): Unit = try { - writer.writeAsList(instance.string.toByteArray(Charsets.UTF_8)) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + writer.writeAsList(instance.string.toByteArray(Charsets.UTF_8)) + } catch (ex: Exception) { + throw wrapException(ex) + } } } /** - * 'UnknownCursor' variant + * 'NotFound' variant */ - public class UnknownCursor : QueryExecutionFail() { + public class NotFound : QueryExecutionFail() { override fun discriminant(): Int = DISCRIMINANT public companion object : - ScaleReader, - ScaleWriter { + ScaleReader, + ScaleWriter { public const val DISCRIMINANT: Int = 2 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryExecutionFail.UnknownCursor = try { - UnknownCursor() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryExecutionFail.NotFound = + try { + NotFound() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryExecutionFail.UnknownCursor, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + instance: jp.co.soramitsu.iroha2.generated.QueryExecutionFail.NotFound, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } public fun equals( - o1: jp.co.soramitsu.iroha2.generated.QueryExecutionFail.UnknownCursor, + o1: jp.co.soramitsu.iroha2.generated.QueryExecutionFail.NotFound, o2: Any?, - ): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".QueryExecutionFail.NotFound".hashCode() + } + } + + /** + * 'CursorMismatch' variant + */ + public class CursorMismatch : QueryExecutionFail() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 3 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryExecutionFail.CursorMismatch = + try { + CursorMismatch() + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.QueryExecutionFail.CursorMismatch, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.QueryExecutionFail.CursorMismatch, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".QueryExecutionFail.CursorMismatch".hashCode() + } + } - override fun hashCode(): Int = ".QueryExecutionFail.UnknownCursor".hashCode() + /** + * 'CursorDone' variant + */ + public class CursorDone : QueryExecutionFail() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 4 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryExecutionFail.CursorDone = + try { + CursorDone() + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.QueryExecutionFail.CursorDone, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.QueryExecutionFail.CursorDone, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".QueryExecutionFail.CursorDone".hashCode() } } @@ -150,29 +245,32 @@ public sealed class QueryExecutionFail : ModelEnum { public companion object : ScaleReader, ScaleWriter { - public const val DISCRIMINANT: Int = 3 + public const val DISCRIMINANT: Int = 5 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryExecutionFail.FetchSizeTooBig = try { - FetchSizeTooBig() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryExecutionFail.FetchSizeTooBig = + try { + FetchSizeTooBig() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.QueryExecutionFail.FetchSizeTooBig, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } public fun equals( o1: jp.co.soramitsu.iroha2.generated.QueryExecutionFail.FetchSizeTooBig, o2: Any?, - ): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".QueryExecutionFail.FetchSizeTooBig".hashCode() } @@ -187,29 +285,32 @@ public sealed class QueryExecutionFail : ModelEnum { public companion object : ScaleReader, ScaleWriter { - public const val DISCRIMINANT: Int = 4 + public const val DISCRIMINANT: Int = 6 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryExecutionFail.InvalidSingularParameters = try { - InvalidSingularParameters() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryExecutionFail.InvalidSingularParameters = + try { + InvalidSingularParameters() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.QueryExecutionFail.InvalidSingularParameters, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } public fun equals( o1: jp.co.soramitsu.iroha2.generated.QueryExecutionFail.InvalidSingularParameters, o2: Any?, - ): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".QueryExecutionFail.InvalidSingularParameters".hashCode() } @@ -224,57 +325,67 @@ public sealed class QueryExecutionFail : ModelEnum { public companion object : ScaleReader, ScaleWriter { - public const val DISCRIMINANT: Int = 5 + public const val DISCRIMINANT: Int = 7 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryExecutionFail.CapacityLimit = try { - CapacityLimit() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryExecutionFail.CapacityLimit = + try { + CapacityLimit() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.QueryExecutionFail.CapacityLimit, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } public fun equals( o1: jp.co.soramitsu.iroha2.generated.QueryExecutionFail.CapacityLimit, o2: Any?, - ): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".QueryExecutionFail.CapacityLimit".hashCode() } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): QueryExecutionFail = when ( - val discriminant = - reader.readUByte() + override fun read(reader: ScaleCodecReader): QueryExecutionFail = + when (val discriminant = reader.readUByte()) { + 0 -> Find.read(reader) + 1 -> Conversion.read(reader) + 2 -> NotFound.read(reader) + 3 -> CursorMismatch.read(reader) + 4 -> CursorDone.read(reader) + 5 -> FetchSizeTooBig.read(reader) + 6 -> InvalidSingularParameters.read(reader) + 7 -> CapacityLimit.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: QueryExecutionFail, ) { - 0 -> Find.read(reader) - 1 -> Conversion.read(reader) - 2 -> UnknownCursor.read(reader) - 3 -> FetchSizeTooBig.read(reader) - 4 -> InvalidSingularParameters.read(reader) - 5 -> CapacityLimit.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: QueryExecutionFail) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Find.write(writer, instance as Find) 1 -> Conversion.write(writer, instance as Conversion) - 2 -> UnknownCursor.write(writer, instance as UnknownCursor) - 3 -> FetchSizeTooBig.write(writer, instance as FetchSizeTooBig) - 4 -> InvalidSingularParameters.write(writer, instance as InvalidSingularParameters) - 5 -> CapacityLimit.write(writer, instance as CapacityLimit) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + 2 -> NotFound.write(writer, instance as NotFound) + 3 -> CursorMismatch.write(writer, instance as CursorMismatch) + 4 -> CursorDone.write(writer, instance as CursorDone) + 5 -> FetchSizeTooBig.write(writer, instance as FetchSizeTooBig) + 6 -> InvalidSingularParameters.write(writer, instance as InvalidSingularParameters) + 7 -> CapacityLimit.write(writer, instance as CapacityLimit) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryOutput.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryOutput.kt index ca2118d63..994d9f6fd 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryOutput.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryOutput.kt @@ -17,27 +17,32 @@ import kotlin.Unit * Generated from 'QueryOutput' regular structure */ public data class QueryOutput( - public val batch: QueryOutputBatchBox, + public val batch: QueryOutputBatchBoxTuple, public val remainingItems: BigInteger, public val continueCursor: ForwardCursor? = null, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): QueryOutput = try { - QueryOutput( - QueryOutputBatchBox.read(reader), - reader.readUint64(), - reader.readNullable(ForwardCursor) as ForwardCursor?, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): QueryOutput = + try { + QueryOutput( + QueryOutputBatchBoxTuple.read(reader), + reader.readUint64(), + reader.readNullable(ForwardCursor) as ForwardCursor?, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: QueryOutput): Unit = try { - QueryOutputBatchBox.write(writer, instance.batch) - writer.writeUint64(instance.remainingItems) - writer.writeNullable(ForwardCursor, instance.continueCursor) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: QueryOutput, + ): Unit = + try { + QueryOutputBatchBoxTuple.write(writer, instance.batch) + writer.writeUint64(instance.remainingItems) + writer.writeNullable(ForwardCursor, instance.continueCursor) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryOutputBatchBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryOutputBatchBox.kt index 9e42159c6..744336658 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryOutputBatchBox.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryOutputBatchBox.kt @@ -24,6 +24,289 @@ public sealed class QueryOutputBatchBox : ModelEnum { */ public abstract fun discriminant(): Int + /** + * 'PublicKey' variant + */ + public data class PublicKey( + public val vec: List, + ) : QueryOutputBatchBox() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.PublicKey = + try { + PublicKey( + reader.readVec(reader.readCompactInt()) { + jp.co.soramitsu.iroha2.generated.PublicKey + .read(reader) + }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.PublicKey, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + jp.co.soramitsu.iroha2.generated.PublicKey + .write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'String' variant + */ + public data class String( + public val vec: List, + ) : QueryOutputBatchBox() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.String = + try { + String( + reader.readVec(reader.readCompactInt()) { reader.readString() }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.String, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + writer.writeAsList(value.toByteArray(Charsets.UTF_8)) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Metadata' variant + */ + public data class Metadata( + public val vec: List, + ) : QueryOutputBatchBox() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 2 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Metadata = + try { + Metadata( + reader.readVec(reader.readCompactInt()) { + jp.co.soramitsu.iroha2.generated.Metadata + .read(reader) + }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Metadata, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + jp.co.soramitsu.iroha2.generated.Metadata + .write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Json' variant + */ + public data class Json( + public val vec: List, + ) : QueryOutputBatchBox() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 3 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Json = + try { + Json( + reader.readVec(reader.readCompactInt()) { + jp.co.soramitsu.iroha2.generated.Json + .read(reader) + }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Json, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + jp.co.soramitsu.iroha2.generated.Json + .write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Numeric' variant + */ + public data class Numeric( + public val vec: List, + ) : QueryOutputBatchBox() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 4 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Numeric = + try { + Numeric( + reader.readVec(reader.readCompactInt()) { + jp.co.soramitsu.iroha2.generated.Numeric + .read(reader) + }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Numeric, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + jp.co.soramitsu.iroha2.generated.Numeric + .write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Name' variant + */ + public data class Name( + public val vec: List, + ) : QueryOutputBatchBox() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 5 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Name = + try { + Name( + reader.readVec(reader.readCompactInt()) { + jp.co.soramitsu.iroha2.generated.Name + .read(reader) + }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Name, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + jp.co.soramitsu.iroha2.generated.Name + .write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'DomainId' variant + */ + public data class DomainId( + public val vec: List, + ) : QueryOutputBatchBox() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 6 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.DomainId = + try { + DomainId( + reader.readVec(reader.readCompactInt()) { + jp.co.soramitsu.iroha2.generated.DomainId + .read(reader) + }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.DomainId, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + jp.co.soramitsu.iroha2.generated.DomainId + .write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + /** * 'Domain' variant */ @@ -35,27 +318,74 @@ public sealed class QueryOutputBatchBox : ModelEnum { public companion object : ScaleReader, ScaleWriter { - public const val DISCRIMINANT: Int = 0 + public const val DISCRIMINANT: Int = 7 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Domain = try { - Domain( - reader.readVec(reader.readCompactInt()) { jp.co.soramitsu.iroha2.generated.Domain.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Domain = + try { + Domain( + reader.readVec(reader.readCompactInt()) { + jp.co.soramitsu.iroha2.generated.Domain + .read(reader) + }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Domain, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - jp.co.soramitsu.iroha2.generated.Domain.write(writer, value) + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + jp.co.soramitsu.iroha2.generated.Domain + .write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'AccountId' variant + */ + public data class AccountId( + public val vec: List, + ) : QueryOutputBatchBox() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 8 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.AccountId = + try { + AccountId( + reader.readVec(reader.readCompactInt()) { + jp.co.soramitsu.iroha2.generated.AccountId + .read(reader) + }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.AccountId, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + jp.co.soramitsu.iroha2.generated.AccountId + .write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) } - } catch (ex: Exception) { - throw wrapException(ex) - } } } @@ -70,94 +400,357 @@ public sealed class QueryOutputBatchBox : ModelEnum { public companion object : ScaleReader, ScaleWriter { - public const val DISCRIMINANT: Int = 1 + public const val DISCRIMINANT: Int = 9 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Account = try { - Account( - reader.readVec(reader.readCompactInt()) { jp.co.soramitsu.iroha2.generated.Account.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Account = + try { + Account( + reader.readVec(reader.readCompactInt()) { + jp.co.soramitsu.iroha2.generated.Account + .read(reader) + }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Account, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - jp.co.soramitsu.iroha2.generated.Account.write(writer, value) + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + jp.co.soramitsu.iroha2.generated.Account + .write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'AssetId' variant + */ + public data class AssetId( + public val vec: List, + ) : QueryOutputBatchBox() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 10 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.AssetId = + try { + AssetId( + reader.readVec(reader.readCompactInt()) { + jp.co.soramitsu.iroha2.generated.AssetId + .read(reader) + }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.AssetId, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + jp.co.soramitsu.iroha2.generated.AssetId + .write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Asset' variant + */ + public data class Asset( + public val vec: List, + ) : QueryOutputBatchBox() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 11 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Asset = + try { + Asset( + reader.readVec(reader.readCompactInt()) { + jp.co.soramitsu.iroha2.generated.Asset + .read(reader) + }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Asset, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + jp.co.soramitsu.iroha2.generated.Asset + .write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'AssetValue' variant + */ + public data class AssetValue( + public val vec: List, + ) : QueryOutputBatchBox() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 12 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.AssetValue = + try { + AssetValue( + reader.readVec(reader.readCompactInt()) { + jp.co.soramitsu.iroha2.generated.AssetValue + .read(reader) + }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.AssetValue, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + jp.co.soramitsu.iroha2.generated.AssetValue + .write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'AssetDefinitionId' variant + */ + public data class AssetDefinitionId( + public val vec: List, + ) : QueryOutputBatchBox() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 13 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.AssetDefinitionId = + try { + AssetDefinitionId( + reader.readVec(reader.readCompactInt()) { + jp.co.soramitsu.iroha2.generated.AssetDefinitionId + .read(reader) + }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.AssetDefinitionId, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + jp.co.soramitsu.iroha2.generated.AssetDefinitionId + .write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'AssetDefinition' variant + */ + public data class AssetDefinition( + public val vec: List, + ) : QueryOutputBatchBox() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 14 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.AssetDefinition = + try { + AssetDefinition( + reader.readVec(reader.readCompactInt()) { + jp.co.soramitsu.iroha2.generated.AssetDefinition + .read(reader) + }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.AssetDefinition, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + jp.co.soramitsu.iroha2.generated.AssetDefinition + .write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Role' variant + */ + public data class Role( + public val vec: List, + ) : QueryOutputBatchBox() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 15 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Role = + try { + Role( + reader.readVec(reader.readCompactInt()) { + jp.co.soramitsu.iroha2.generated.Role + .read(reader) + }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Role, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + jp.co.soramitsu.iroha2.generated.Role + .write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) } - } catch (ex: Exception) { - throw wrapException(ex) - } } } /** - * 'Asset' variant + * 'Parameter' variant */ - public data class Asset( - public val vec: List, + public data class Parameter( + public val vec: List, ) : QueryOutputBatchBox() { override fun discriminant(): Int = DISCRIMINANT public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 2 + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 16 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Asset = try { - Asset( - reader.readVec(reader.readCompactInt()) { jp.co.soramitsu.iroha2.generated.Asset.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Parameter = + try { + Parameter( + reader.readVec(reader.readCompactInt()) { + jp.co.soramitsu.iroha2.generated.Parameter + .read(reader) + }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Asset, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - jp.co.soramitsu.iroha2.generated.Asset.write(writer, value) + instance: jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Parameter, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + jp.co.soramitsu.iroha2.generated.Parameter + .write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) } - } catch (ex: Exception) { - throw wrapException(ex) - } } } /** - * 'AssetDefinition' variant + * 'Permission' variant */ - public data class AssetDefinition( - public val vec: List, + public data class Permission( + public val vec: List, ) : QueryOutputBatchBox() { override fun discriminant(): Int = DISCRIMINANT public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 3 + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 17 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.AssetDefinition = try { - AssetDefinition( - reader.readVec(reader.readCompactInt()) { jp.co.soramitsu.iroha2.generated.AssetDefinition.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Permission = + try { + Permission( + reader.readVec(reader.readCompactInt()) { + jp.co.soramitsu.iroha2.generated.Permission + .read(reader) + }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.AssetDefinition, + instance: jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Permission, ): Unit = try { writer.writeCompact(instance.vec.size) instance.vec.forEach { value -> - jp.co.soramitsu.iroha2.generated.AssetDefinition.write(writer, value) + jp.co.soramitsu.iroha2.generated.Permission + .write(writer, value) } } catch (ex: Exception) { throw wrapException(ex) @@ -166,142 +759,164 @@ public sealed class QueryOutputBatchBox : ModelEnum { } /** - * 'Role' variant + * 'CommittedTransaction' variant */ - public data class Role( - public val vec: List, + public data class CommittedTransaction( + public val vec: List, ) : QueryOutputBatchBox() { override fun discriminant(): Int = DISCRIMINANT public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 4 + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 18 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Role = try { - Role( - reader.readVec(reader.readCompactInt()) { jp.co.soramitsu.iroha2.generated.Role.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.CommittedTransaction = + try { + CommittedTransaction( + reader.readVec(reader.readCompactInt()) { + jp.co.soramitsu.iroha2.generated.CommittedTransaction + .read(reader) + }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Role, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - jp.co.soramitsu.iroha2.generated.Role.write(writer, value) + instance: jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.CommittedTransaction, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + jp.co.soramitsu.iroha2.generated.CommittedTransaction + .write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) } - } catch (ex: Exception) { - throw wrapException(ex) - } } } /** - * 'Parameter' variant + * 'SignedTransaction' variant */ - public data class Parameter( - public val vec: List, + public data class SignedTransaction( + public val vec: List, ) : QueryOutputBatchBox() { override fun discriminant(): Int = DISCRIMINANT public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 5 + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 19 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Parameter = try { - Parameter( - reader.readVec(reader.readCompactInt()) { jp.co.soramitsu.iroha2.generated.Parameter.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.SignedTransaction = + try { + SignedTransaction( + reader.readVec(reader.readCompactInt()) { + jp.co.soramitsu.iroha2.generated.SignedTransaction + .read(reader) + }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Parameter, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - jp.co.soramitsu.iroha2.generated.Parameter.write(writer, value) + instance: jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.SignedTransaction, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + jp.co.soramitsu.iroha2.generated.SignedTransaction + .write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) } - } catch (ex: Exception) { - throw wrapException(ex) - } } } /** - * 'Permission' variant + * 'TransactionHash' variant */ - public data class Permission( - public val vec: List, + public data class TransactionHash( + public val vec: List>, ) : QueryOutputBatchBox() { override fun discriminant(): Int = DISCRIMINANT public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 6 + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 20 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Permission = try { - Permission( - reader.readVec(reader.readCompactInt()) { jp.co.soramitsu.iroha2.generated.Permission.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.TransactionHash = + try { + TransactionHash( + reader.readVec( + reader.readCompactInt(), + ) { HashOf.read(reader) as HashOf }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Permission, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - jp.co.soramitsu.iroha2.generated.Permission.write(writer, value) + instance: jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.TransactionHash, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + HashOf.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) } - } catch (ex: Exception) { - throw wrapException(ex) - } } } /** - * 'Transaction' variant + * 'TransactionRejectionReason' variant */ - public data class Transaction( - public val vec: List, + public data class TransactionRejectionReason( + public val vec: List, ) : QueryOutputBatchBox() { override fun discriminant(): Int = DISCRIMINANT public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 7 + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 21 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Transaction = try { - Transaction( - reader.readVec(reader.readCompactInt()) { TransactionQueryOutput.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.TransactionRejectionReason = + try { + TransactionRejectionReason( + reader.readVec(reader.readCompactInt()) { + reader.readNullable( + jp.co.soramitsu.iroha2.generated.TransactionRejectionReason, + ) as jp.co.soramitsu.iroha2.generated.TransactionRejectionReason? + }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Transaction, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - TransactionQueryOutput.write(writer, value) - } - } catch (ex: Exception) { - throw wrapException(ex) - } + instance: jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.TransactionRejectionReason, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + writer.writeNullable(jp.co.soramitsu.iroha2.generated.TransactionRejectionReason, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -309,34 +924,36 @@ public sealed class QueryOutputBatchBox : ModelEnum { * 'Peer' variant */ public data class Peer( - public val vec: List, + public val vec: List, ) : QueryOutputBatchBox() { override fun discriminant(): Int = DISCRIMINANT public companion object : ScaleReader, ScaleWriter { - public const val DISCRIMINANT: Int = 8 + public const val DISCRIMINANT: Int = 22 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Peer = try { - Peer( - reader.readVec(reader.readCompactInt()) { jp.co.soramitsu.iroha2.generated.Peer.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Peer = + try { + Peer( + reader.readVec(reader.readCompactInt()) { PeerId.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Peer, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - jp.co.soramitsu.iroha2.generated.Peer.write(writer, value) + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + PeerId.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) } - } catch (ex: Exception) { - throw wrapException(ex) - } } } @@ -351,27 +968,33 @@ public sealed class QueryOutputBatchBox : ModelEnum { public companion object : ScaleReader, ScaleWriter { - public const val DISCRIMINANT: Int = 9 + public const val DISCRIMINANT: Int = 23 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.RoleId = try { - RoleId( - reader.readVec(reader.readCompactInt()) { jp.co.soramitsu.iroha2.generated.RoleId.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.RoleId = + try { + RoleId( + reader.readVec(reader.readCompactInt()) { + jp.co.soramitsu.iroha2.generated.RoleId + .read(reader) + }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.RoleId, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - jp.co.soramitsu.iroha2.generated.RoleId.write(writer, value) + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + jp.co.soramitsu.iroha2.generated.RoleId + .write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) } - } catch (ex: Exception) { - throw wrapException(ex) - } } } @@ -386,27 +1009,33 @@ public sealed class QueryOutputBatchBox : ModelEnum { public companion object : ScaleReader, ScaleWriter { - public const val DISCRIMINANT: Int = 10 + public const val DISCRIMINANT: Int = 24 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.TriggerId = try { - TriggerId( - reader.readVec(reader.readCompactInt()) { jp.co.soramitsu.iroha2.generated.TriggerId.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.TriggerId = + try { + TriggerId( + reader.readVec(reader.readCompactInt()) { + jp.co.soramitsu.iroha2.generated.TriggerId + .read(reader) + }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.TriggerId, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - jp.co.soramitsu.iroha2.generated.TriggerId.write(writer, value) + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + jp.co.soramitsu.iroha2.generated.TriggerId + .write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) } - } catch (ex: Exception) { - throw wrapException(ex) - } } } @@ -421,27 +1050,74 @@ public sealed class QueryOutputBatchBox : ModelEnum { public companion object : ScaleReader, ScaleWriter { - public const val DISCRIMINANT: Int = 11 + public const val DISCRIMINANT: Int = 25 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Trigger = try { - Trigger( - reader.readVec(reader.readCompactInt()) { jp.co.soramitsu.iroha2.generated.Trigger.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Trigger = + try { + Trigger( + reader.readVec(reader.readCompactInt()) { + jp.co.soramitsu.iroha2.generated.Trigger + .read(reader) + }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Trigger, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - jp.co.soramitsu.iroha2.generated.Trigger.write(writer, value) + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + jp.co.soramitsu.iroha2.generated.Trigger + .write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Action' variant + */ + public data class Action( + public val vec: List, + ) : QueryOutputBatchBox() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 26 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Action = + try { + Action( + reader.readVec(reader.readCompactInt()) { + jp.co.soramitsu.iroha2.generated.Action + .read(reader) + }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Action, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + jp.co.soramitsu.iroha2.generated.Action + .write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) } - } catch (ex: Exception) { - throw wrapException(ex) - } } } @@ -456,27 +1132,29 @@ public sealed class QueryOutputBatchBox : ModelEnum { public companion object : ScaleReader, ScaleWriter { - public const val DISCRIMINANT: Int = 12 + public const val DISCRIMINANT: Int = 27 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Block = try { - Block( - reader.readVec(reader.readCompactInt()) { SignedBlock.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Block = + try { + Block( + reader.readVec(reader.readCompactInt()) { SignedBlock.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.Block, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - SignedBlock.write(writer, value) + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + SignedBlock.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) } - } catch (ex: Exception) { - throw wrapException(ex) - } } } @@ -491,69 +1169,149 @@ public sealed class QueryOutputBatchBox : ModelEnum { public companion object : ScaleReader, ScaleWriter { - public const val DISCRIMINANT: Int = 13 + public const val DISCRIMINANT: Int = 28 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.BlockHeader = try { - BlockHeader( - reader.readVec(reader.readCompactInt()) { jp.co.soramitsu.iroha2.generated.BlockHeader.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.BlockHeader = + try { + BlockHeader( + reader.readVec(reader.readCompactInt()) { + jp.co.soramitsu.iroha2.generated.BlockHeader + .read(reader) + }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.BlockHeader, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - jp.co.soramitsu.iroha2.generated.BlockHeader.write(writer, value) + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + jp.co.soramitsu.iroha2.generated.BlockHeader + .write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'BlockHeaderHash' variant + */ + public data class BlockHeaderHash( + public val vec: List>, + ) : QueryOutputBatchBox() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 29 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.BlockHeaderHash = + try { + BlockHeaderHash( + reader.readVec( + reader.readCompactInt(), + ) { HashOf.read(reader) as HashOf }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox.BlockHeaderHash, + ): Unit = + try { + writer.writeCompact(instance.vec.size) + instance.vec.forEach { value -> + HashOf.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) } - } catch (ex: Exception) { - throw wrapException(ex) - } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): QueryOutputBatchBox = when ( - val discriminant = - reader.readUByte() + override fun read(reader: ScaleCodecReader): QueryOutputBatchBox = + when (val discriminant = reader.readUByte()) { + 0 -> PublicKey.read(reader) + 1 -> String.read(reader) + 2 -> Metadata.read(reader) + 3 -> Json.read(reader) + 4 -> Numeric.read(reader) + 5 -> Name.read(reader) + 6 -> DomainId.read(reader) + 7 -> Domain.read(reader) + 8 -> AccountId.read(reader) + 9 -> Account.read(reader) + 10 -> AssetId.read(reader) + 11 -> Asset.read(reader) + 12 -> AssetValue.read(reader) + 13 -> AssetDefinitionId.read(reader) + 14 -> AssetDefinition.read(reader) + 15 -> Role.read(reader) + 16 -> Parameter.read(reader) + 17 -> Permission.read(reader) + 18 -> CommittedTransaction.read(reader) + 19 -> SignedTransaction.read(reader) + 20 -> TransactionHash.read(reader) + 21 -> TransactionRejectionReason.read(reader) + 22 -> Peer.read(reader) + 23 -> RoleId.read(reader) + 24 -> TriggerId.read(reader) + 25 -> Trigger.read(reader) + 26 -> Action.read(reader) + 27 -> Block.read(reader) + 28 -> BlockHeader.read(reader) + 29 -> BlockHeaderHash.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: QueryOutputBatchBox, ) { - 0 -> Domain.read(reader) - 1 -> Account.read(reader) - 2 -> Asset.read(reader) - 3 -> AssetDefinition.read(reader) - 4 -> Role.read(reader) - 5 -> Parameter.read(reader) - 6 -> Permission.read(reader) - 7 -> Transaction.read(reader) - 8 -> Peer.read(reader) - 9 -> RoleId.read(reader) - 10 -> TriggerId.read(reader) - 11 -> Trigger.read(reader) - 12 -> Block.read(reader) - 13 -> BlockHeader.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: QueryOutputBatchBox) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { - 0 -> Domain.write(writer, instance as Domain) - 1 -> Account.write(writer, instance as Account) - 2 -> Asset.write(writer, instance as Asset) - 3 -> AssetDefinition.write(writer, instance as AssetDefinition) - 4 -> Role.write(writer, instance as Role) - 5 -> Parameter.write(writer, instance as Parameter) - 6 -> Permission.write(writer, instance as Permission) - 7 -> Transaction.write(writer, instance as Transaction) - 8 -> Peer.write(writer, instance as Peer) - 9 -> RoleId.write(writer, instance as RoleId) - 10 -> TriggerId.write(writer, instance as TriggerId) - 11 -> Trigger.write(writer, instance as Trigger) - 12 -> Block.write(writer, instance as Block) - 13 -> BlockHeader.write(writer, instance as BlockHeader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + 0 -> PublicKey.write(writer, instance as PublicKey) + 1 -> String.write(writer, instance as String) + 2 -> Metadata.write(writer, instance as Metadata) + 3 -> Json.write(writer, instance as Json) + 4 -> Numeric.write(writer, instance as Numeric) + 5 -> Name.write(writer, instance as Name) + 6 -> DomainId.write(writer, instance as DomainId) + 7 -> Domain.write(writer, instance as Domain) + 8 -> AccountId.write(writer, instance as AccountId) + 9 -> Account.write(writer, instance as Account) + 10 -> AssetId.write(writer, instance as AssetId) + 11 -> Asset.write(writer, instance as Asset) + 12 -> AssetValue.write(writer, instance as AssetValue) + 13 -> AssetDefinitionId.write(writer, instance as AssetDefinitionId) + 14 -> AssetDefinition.write(writer, instance as AssetDefinition) + 15 -> Role.write(writer, instance as Role) + 16 -> Parameter.write(writer, instance as Parameter) + 17 -> Permission.write(writer, instance as Permission) + 18 -> CommittedTransaction.write(writer, instance as CommittedTransaction) + 19 -> SignedTransaction.write(writer, instance as SignedTransaction) + 20 -> TransactionHash.write(writer, instance as TransactionHash) + 21 -> TransactionRejectionReason.write(writer, instance as TransactionRejectionReason) + 22 -> Peer.write(writer, instance as Peer) + 23 -> RoleId.write(writer, instance as RoleId) + 24 -> TriggerId.write(writer, instance as TriggerId) + 25 -> Trigger.write(writer, instance as Trigger) + 26 -> Action.write(writer, instance as Action) + 27 -> Block.write(writer, instance as Block) + 28 -> BlockHeader.write(writer, instance as BlockHeader) + 29 -> BlockHeaderHash.write(writer, instance as BlockHeaderHash) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryOutputBatchBoxTuple.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryOutputBatchBoxTuple.kt new file mode 100644 index 000000000..04aa9c229 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryOutputBatchBoxTuple.kt @@ -0,0 +1,47 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit +import kotlin.collections.List + +/** + * QueryOutputBatchBoxTuple + * + * Generated from 'QueryOutputBatchBoxTuple' regular structure + */ +public data class QueryOutputBatchBoxTuple( + public val tuple: List, +) { + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): QueryOutputBatchBoxTuple = + try { + QueryOutputBatchBoxTuple( + reader.readVec(reader.readCompactInt()) { QueryOutputBatchBox.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: QueryOutputBatchBoxTuple, + ): Unit = + try { + writer.writeCompact(instance.tuple.size) + instance.tuple.forEach { value -> + QueryOutputBatchBox.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryOutputBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryOutputBox.kt deleted file mode 100644 index 6417bf9f1..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryOutputBox.kt +++ /dev/null @@ -1,418 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.ModelEnum -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Int -import kotlin.String -import kotlin.Unit -import kotlin.collections.List - -/** - * QueryOutputBox - * - * Generated from 'QueryOutputBox' enum - */ -public sealed class QueryOutputBox : ModelEnum { - /** - * @return Discriminator of variant in enum - */ - public abstract fun discriminant(): Int - - /** - * 'Id' variant - */ - public data class Id( - public val idBox: IdBox, - ) : QueryOutputBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 0 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBox.Id = try { - Id( - IdBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryOutputBox.Id, - ): Unit = try { - IdBox.write(writer, instance.idBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Identifiable' variant - */ - public data class Identifiable( - public val identifiableBox: IdentifiableBox, - ) : QueryOutputBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 1 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBox.Identifiable = try { - Identifiable( - IdentifiableBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryOutputBox.Identifiable, - ): Unit = try { - IdentifiableBox.write(writer, instance.identifiableBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Transaction' variant - */ - public data class Transaction( - public val transactionQueryOutput: TransactionQueryOutput, - ) : QueryOutputBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 2 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBox.Transaction = try { - Transaction( - TransactionQueryOutput.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryOutputBox.Transaction, - ): Unit = try { - TransactionQueryOutput.write(writer, instance.transactionQueryOutput) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Permission' variant - */ - public data class Permission( - public val permission: jp.co.soramitsu.iroha2.generated.Permission, - ) : QueryOutputBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 3 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBox.Permission = try { - Permission( - jp.co.soramitsu.iroha2.generated.Permission.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryOutputBox.Permission, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.Permission.write(writer, instance.permission) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Parameters' variant - */ - public data class Parameters( - public val parameters: jp.co.soramitsu.iroha2.generated.Parameters, - ) : QueryOutputBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 4 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBox.Parameters = try { - Parameters( - jp.co.soramitsu.iroha2.generated.Parameters.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryOutputBox.Parameters, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.Parameters.write(writer, instance.parameters) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Metadata' variant - */ - public data class Metadata( - public val string: String, - ) : QueryOutputBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 5 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBox.Metadata = try { - Metadata( - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryOutputBox.Metadata, - ): Unit = try { - writer.writeAsList(instance.string.toByteArray(Charsets.UTF_8)) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Numeric' variant - */ - public data class Numeric( - public val numeric: jp.co.soramitsu.iroha2.generated.Numeric, - ) : QueryOutputBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 6 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBox.Numeric = try { - Numeric( - jp.co.soramitsu.iroha2.generated.Numeric.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryOutputBox.Numeric, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.Numeric.write(writer, instance.numeric) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'BlockHeader' variant - */ - public data class BlockHeader( - public val blockHeader: jp.co.soramitsu.iroha2.generated.BlockHeader, - ) : QueryOutputBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 7 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBox.BlockHeader = try { - BlockHeader( - jp.co.soramitsu.iroha2.generated.BlockHeader.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryOutputBox.BlockHeader, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.BlockHeader.write(writer, instance.blockHeader) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Block' variant - */ - public data class Block( - public val signedBlock: SignedBlock, - ) : QueryOutputBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 8 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBox.Block = try { - Block( - SignedBlock.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryOutputBox.Block, - ): Unit = try { - SignedBlock.write(writer, instance.signedBlock) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'ExecutorDataModel' variant - */ - public data class ExecutorDataModel( - public val executorDataModel: jp.co.soramitsu.iroha2.generated.ExecutorDataModel, - ) : QueryOutputBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 9 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBox.ExecutorDataModel = try { - ExecutorDataModel( - jp.co.soramitsu.iroha2.generated.ExecutorDataModel.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryOutputBox.ExecutorDataModel, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.ExecutorDataModel.write(writer, instance.executorDataModel) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Vec' variant - */ - public data class Vec( - public val vec: List, - ) : QueryOutputBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 10 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputBox.Vec = try { - Vec( - reader.readVec(reader.readCompactInt()) { QueryOutputBox.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryOutputBox.Vec, - ): Unit = try { - writer.writeCompact(instance.vec.size) - instance.vec.forEach { value -> - QueryOutputBox.write(writer, value) - } - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): QueryOutputBox = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Id.read(reader) - 1 -> Identifiable.read(reader) - 2 -> Transaction.read(reader) - 3 -> Permission.read(reader) - 4 -> Parameters.read(reader) - 5 -> Metadata.read(reader) - 6 -> Numeric.read(reader) - 7 -> BlockHeader.read(reader) - 8 -> Block.read(reader) - 9 -> ExecutorDataModel.read(reader) - 10 -> Vec.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: QueryOutputBox) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 0 -> Id.write(writer, instance as Id) - 1 -> Identifiable.write(writer, instance as Identifiable) - 2 -> Transaction.write(writer, instance as Transaction) - 3 -> Permission.write(writer, instance as Permission) - 4 -> Parameters.write(writer, instance as Parameters) - 5 -> Metadata.write(writer, instance as Metadata) - 6 -> Numeric.write(writer, instance as Numeric) - 7 -> BlockHeader.write(writer, instance as BlockHeader) - 8 -> Block.write(writer, instance as Block) - 9 -> ExecutorDataModel.write(writer, instance as ExecutorDataModel) - 10 -> Vec.write(writer, instance as Vec) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryOutputPredicate.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryOutputPredicate.kt deleted file mode 100644 index a7372b445..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryOutputPredicate.kt +++ /dev/null @@ -1,255 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.ModelEnum -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Any -import kotlin.Boolean -import kotlin.Int -import kotlin.Unit - -/** - * QueryOutputPredicate - * - * Generated from 'QueryOutputPredicate' enum - */ -public sealed class QueryOutputPredicate : ModelEnum { - /** - * @return Discriminator of variant in enum - */ - public abstract fun discriminant(): Int - - override fun equals(other: Any?): Boolean = when (this) { - is Pass -> Pass.equals(this, other) - else -> super.equals(other) } - - override fun hashCode(): Int = when (this) { - is Pass -> Pass.hashCode() - else -> super.hashCode() } - - /** - * 'Identifiable' variant - */ - public data class Identifiable( - public val stringPredicate: StringPredicate, - ) : QueryOutputPredicate() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 0 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputPredicate.Identifiable = try { - Identifiable( - StringPredicate.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryOutputPredicate.Identifiable, - ): Unit = try { - StringPredicate.write(writer, instance.stringPredicate) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Container' variant - */ - public data class Container( - public val container: jp.co.soramitsu.iroha2.generated.Container, - ) : QueryOutputPredicate() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 1 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputPredicate.Container = try { - Container( - jp.co.soramitsu.iroha2.generated.Container.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryOutputPredicate.Container, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.Container.write(writer, instance.container) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Display' variant - */ - public data class Display( - public val stringPredicate: StringPredicate, - ) : QueryOutputPredicate() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 2 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputPredicate.Display = try { - Display( - StringPredicate.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryOutputPredicate.Display, - ): Unit = try { - StringPredicate.write(writer, instance.stringPredicate) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Numerical' variant - */ - public data class Numerical( - public val semiRange: SemiRange, - ) : QueryOutputPredicate() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 3 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputPredicate.Numerical = try { - Numerical( - SemiRange.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryOutputPredicate.Numerical, - ): Unit = try { - SemiRange.write(writer, instance.semiRange) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'TimeStamp' variant - */ - public data class TimeStamp( - public val semiIntervalOfu128: SemiIntervalOfu128, - ) : QueryOutputPredicate() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 4 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputPredicate.TimeStamp = try { - TimeStamp( - SemiIntervalOfu128.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryOutputPredicate.TimeStamp, - ): Unit = try { - SemiIntervalOfu128.write(writer, instance.semiIntervalOfu128) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Pass' variant - */ - public class Pass : QueryOutputPredicate() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 5 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryOutputPredicate.Pass = try { - Pass() - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.QueryOutputPredicate.Pass, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } - - public fun equals(o1: jp.co.soramitsu.iroha2.generated.QueryOutputPredicate.Pass, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } - - override fun hashCode(): Int = ".QueryOutputPredicate.Pass".hashCode() - } - } - - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): QueryOutputPredicate = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Identifiable.read(reader) - 1 -> Container.read(reader) - 2 -> Display.read(reader) - 3 -> Numerical.read(reader) - 4 -> TimeStamp.read(reader) - 5 -> Pass.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: QueryOutputPredicate) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 0 -> Identifiable.write(writer, instance as Identifiable) - 1 -> Container.write(writer, instance as Container) - 2 -> Display.write(writer, instance as Display) - 3 -> Numerical.write(writer, instance as Numerical) - 4 -> TimeStamp.write(writer, instance as TimeStamp) - 5 -> Pass.write(writer, instance as Pass) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryParams.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryParams.kt index b5c257627..faa6cb07f 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryParams.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryParams.kt @@ -21,22 +21,27 @@ public data class QueryParams( public val fetchSize: FetchSize, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): QueryParams = try { - QueryParams( - Pagination.read(reader), - Sorting.read(reader), - FetchSize.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): QueryParams = + try { + QueryParams( + Pagination.read(reader), + Sorting.read(reader), + FetchSize.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: QueryParams): Unit = try { - Pagination.write(writer, instance.pagination) - Sorting.write(writer, instance.sorting) - FetchSize.write(writer, instance.fetchSize) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: QueryParams, + ): Unit = + try { + Pagination.write(writer, instance.pagination) + Sorting.write(writer, instance.sorting) + FetchSize.write(writer, instance.fetchSize) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryRequest.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryRequest.kt index ff3cfe367..97e1d2de1 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryRequest.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryRequest.kt @@ -36,22 +36,24 @@ public sealed class QueryRequest : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryRequest.Singular = try { - Singular( - SingularQueryBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryRequest.Singular = + try { + Singular( + SingularQueryBox.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.QueryRequest.Singular, - ): Unit = try { - SingularQueryBox.write(writer, instance.singularQueryBox) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + SingularQueryBox.write(writer, instance.singularQueryBox) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -68,22 +70,24 @@ public sealed class QueryRequest : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryRequest.Start = try { - Start( - QueryWithParams.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryRequest.Start = + try { + Start( + QueryWithParams.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.QueryRequest.Start, - ): Unit = try { - QueryWithParams.write(writer, instance.queryWithParams) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + QueryWithParams.write(writer, instance.queryWithParams) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -100,42 +104,47 @@ public sealed class QueryRequest : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 2 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryRequest.Continue = try { - Continue( - ForwardCursor.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryRequest.Continue = + try { + Continue( + ForwardCursor.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.QueryRequest.Continue, - ): Unit = try { - ForwardCursor.write(writer, instance.forwardCursor) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + ForwardCursor.write(writer, instance.forwardCursor) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): QueryRequest = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Singular.read(reader) - 1 -> Start.read(reader) - 2 -> Continue.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + override fun read(reader: ScaleCodecReader): QueryRequest = + when (val discriminant = reader.readUByte()) { + 0 -> Singular.read(reader) + 1 -> Start.read(reader) + 2 -> Continue.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: QueryRequest) { + override fun write( + writer: ScaleCodecWriter, + instance: QueryRequest, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Singular.write(writer, instance as Singular) 1 -> Start.write(writer, instance as Start) 2 -> Continue.write(writer, instance as Continue) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryRequestWithAuthority.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryRequestWithAuthority.kt index d5022d5a4..fc6392860 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryRequestWithAuthority.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryRequestWithAuthority.kt @@ -22,20 +22,25 @@ public data class QueryRequestWithAuthority( public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): QueryRequestWithAuthority = try { - QueryRequestWithAuthority( - AccountId.read(reader), - QueryRequest.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): QueryRequestWithAuthority = + try { + QueryRequestWithAuthority( + AccountId.read(reader), + QueryRequest.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: QueryRequestWithAuthority): Unit = try { - AccountId.write(writer, instance.authority) - QueryRequest.write(writer, instance.request) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: QueryRequestWithAuthority, + ): Unit = + try { + AccountId.write(writer, instance.authority) + QueryRequest.write(writer, instance.request) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryResponse.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryResponse.kt index 2d52787a9..3d104d4b1 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryResponse.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryResponse.kt @@ -36,22 +36,24 @@ public sealed class QueryResponse : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryResponse.Singular = try { - Singular( - SingularQueryOutputBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryResponse.Singular = + try { + Singular( + SingularQueryOutputBox.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.QueryResponse.Singular, - ): Unit = try { - SingularQueryOutputBox.write(writer, instance.singularQueryOutputBox) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + SingularQueryOutputBox.write(writer, instance.singularQueryOutputBox) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -68,40 +70,45 @@ public sealed class QueryResponse : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryResponse.Iterable = try { - Iterable( - QueryOutput.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.QueryResponse.Iterable = + try { + Iterable( + QueryOutput.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.QueryResponse.Iterable, - ): Unit = try { - QueryOutput.write(writer, instance.queryOutput) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + QueryOutput.write(writer, instance.queryOutput) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): QueryResponse = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Singular.read(reader) - 1 -> Iterable.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + override fun read(reader: ScaleCodecReader): QueryResponse = + when (val discriminant = reader.readUByte()) { + 0 -> Singular.read(reader) + 1 -> Iterable.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: QueryResponse) { + override fun write( + writer: ScaleCodecWriter, + instance: QueryResponse, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Singular.write(writer, instance as Singular) 1 -> Iterable.write(writer, instance as Iterable) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QuerySignature.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QuerySignature.kt index 7528943ff..6d6eb8c84 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QuerySignature.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QuerySignature.kt @@ -16,21 +16,26 @@ import kotlin.Unit * Generated from 'QuerySignature' regular structure */ public data class QuerySignature( - public val signatureOfOfClientQueryPayload: SignatureOf, + public val signatureOfOfQueryRequestWithAuthority: SignatureOf, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): QuerySignature = try { - QuerySignature( - SignatureOf.read(reader) as SignatureOf, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): QuerySignature = + try { + QuerySignature( + SignatureOf.read(reader) as SignatureOf, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: QuerySignature): Unit = try { - SignatureOf.write(writer, instance.signatureOfOfClientQueryPayload) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: QuerySignature, + ): Unit = + try { + SignatureOf.write(writer, instance.signatureOfOfQueryRequestWithAuthority) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindAccounts.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindAccounts.kt new file mode 100644 index 000000000..6928b5b60 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindAccounts.kt @@ -0,0 +1,49 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit + +/** + * QueryWithFilterOfFindAccounts + * + * Generated from 'QueryWithFilterOfFindAccounts' regular structure + */ +public data class QueryWithFilterOfFindAccounts( + public val query: FindAccounts, + public val predicate: CompoundPredicateOfAccount, + public val selector: SelectorTupleOfAccount, +) { + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): QueryWithFilterOfFindAccounts = + try { + QueryWithFilterOfFindAccounts( + FindAccounts.read(reader), + CompoundPredicateOfAccount.read(reader), + SelectorTupleOfAccount.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: QueryWithFilterOfFindAccounts, + ): Unit = + try { + FindAccounts.write(writer, instance.query) + CompoundPredicateOfAccount.write(writer, instance.predicate) + SelectorTupleOfAccount.write(writer, instance.selector) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindAccountsAndAccountPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindAccountsAndAccountPredicateBox.kt deleted file mode 100644 index a4a51d0ae..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindAccountsAndAccountPredicateBox.kt +++ /dev/null @@ -1,44 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * QueryWithFilterOfFindAccountsAndAccountPredicateBox - * - * Generated from 'QueryWithFilterOfFindAccountsAndAccountPredicateBox' regular structure - */ -public data class QueryWithFilterOfFindAccountsAndAccountPredicateBox( - public val query: FindAccounts, - public val predicate: CompoundPredicateOfAccountPredicateBox, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): QueryWithFilterOfFindAccountsAndAccountPredicateBox = try { - QueryWithFilterOfFindAccountsAndAccountPredicateBox( - FindAccounts.read(reader), - CompoundPredicateOfAccountPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: QueryWithFilterOfFindAccountsAndAccountPredicateBox, - ): Unit = try { - FindAccounts.write(writer, instance.query) - CompoundPredicateOfAccountPredicateBox.write(writer, instance.predicate) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindAccountsWithAsset.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindAccountsWithAsset.kt new file mode 100644 index 000000000..7b4e79ff4 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindAccountsWithAsset.kt @@ -0,0 +1,49 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit + +/** + * QueryWithFilterOfFindAccountsWithAsset + * + * Generated from 'QueryWithFilterOfFindAccountsWithAsset' regular structure + */ +public data class QueryWithFilterOfFindAccountsWithAsset( + public val query: FindAccountsWithAsset, + public val predicate: CompoundPredicateOfAccount, + public val selector: SelectorTupleOfAccount, +) { + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): QueryWithFilterOfFindAccountsWithAsset = + try { + QueryWithFilterOfFindAccountsWithAsset( + FindAccountsWithAsset.read(reader), + CompoundPredicateOfAccount.read(reader), + SelectorTupleOfAccount.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: QueryWithFilterOfFindAccountsWithAsset, + ): Unit = + try { + FindAccountsWithAsset.write(writer, instance.query) + CompoundPredicateOfAccount.write(writer, instance.predicate) + SelectorTupleOfAccount.write(writer, instance.selector) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindAccountsWithAssetAndAccountPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindAccountsWithAssetAndAccountPredicateBox.kt deleted file mode 100644 index 9d646852b..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindAccountsWithAssetAndAccountPredicateBox.kt +++ /dev/null @@ -1,44 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * QueryWithFilterOfFindAccountsWithAssetAndAccountPredicateBox - * - * Generated from 'QueryWithFilterOfFindAccountsWithAssetAndAccountPredicateBox' regular structure - */ -public data class QueryWithFilterOfFindAccountsWithAssetAndAccountPredicateBox( - public val query: FindAccountsWithAsset, - public val predicate: CompoundPredicateOfAccountPredicateBox, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): QueryWithFilterOfFindAccountsWithAssetAndAccountPredicateBox = try { - QueryWithFilterOfFindAccountsWithAssetAndAccountPredicateBox( - FindAccountsWithAsset.read(reader), - CompoundPredicateOfAccountPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: QueryWithFilterOfFindAccountsWithAssetAndAccountPredicateBox, - ): Unit = try { - FindAccountsWithAsset.write(writer, instance.query) - CompoundPredicateOfAccountPredicateBox.write(writer, instance.predicate) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindActiveTriggerIds.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindActiveTriggerIds.kt new file mode 100644 index 000000000..d3d61e8b3 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindActiveTriggerIds.kt @@ -0,0 +1,49 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit + +/** + * QueryWithFilterOfFindActiveTriggerIds + * + * Generated from 'QueryWithFilterOfFindActiveTriggerIds' regular structure + */ +public data class QueryWithFilterOfFindActiveTriggerIds( + public val query: FindActiveTriggerIds, + public val predicate: CompoundPredicateOfTriggerId, + public val selector: SelectorTupleOfTriggerId, +) { + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): QueryWithFilterOfFindActiveTriggerIds = + try { + QueryWithFilterOfFindActiveTriggerIds( + FindActiveTriggerIds.read(reader), + CompoundPredicateOfTriggerId.read(reader), + SelectorTupleOfTriggerId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: QueryWithFilterOfFindActiveTriggerIds, + ): Unit = + try { + FindActiveTriggerIds.write(writer, instance.query) + CompoundPredicateOfTriggerId.write(writer, instance.predicate) + SelectorTupleOfTriggerId.write(writer, instance.selector) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindActiveTriggerIdsAndTriggerIdPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindActiveTriggerIdsAndTriggerIdPredicateBox.kt deleted file mode 100644 index 920c2eaac..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindActiveTriggerIdsAndTriggerIdPredicateBox.kt +++ /dev/null @@ -1,44 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * QueryWithFilterOfFindActiveTriggerIdsAndTriggerIdPredicateBox - * - * Generated from 'QueryWithFilterOfFindActiveTriggerIdsAndTriggerIdPredicateBox' regular structure - */ -public data class QueryWithFilterOfFindActiveTriggerIdsAndTriggerIdPredicateBox( - public val query: FindActiveTriggerIds, - public val predicate: CompoundPredicateOfTriggerIdPredicateBox, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): QueryWithFilterOfFindActiveTriggerIdsAndTriggerIdPredicateBox = try { - QueryWithFilterOfFindActiveTriggerIdsAndTriggerIdPredicateBox( - FindActiveTriggerIds.read(reader), - CompoundPredicateOfTriggerIdPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: QueryWithFilterOfFindActiveTriggerIdsAndTriggerIdPredicateBox, - ): Unit = try { - FindActiveTriggerIds.write(writer, instance.query) - CompoundPredicateOfTriggerIdPredicateBox.write(writer, instance.predicate) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindAssets.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindAssets.kt new file mode 100644 index 000000000..d29227450 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindAssets.kt @@ -0,0 +1,49 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit + +/** + * QueryWithFilterOfFindAssets + * + * Generated from 'QueryWithFilterOfFindAssets' regular structure + */ +public data class QueryWithFilterOfFindAssets( + public val query: FindAssets, + public val predicate: CompoundPredicateOfAsset, + public val selector: SelectorTupleOfAsset, +) { + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): QueryWithFilterOfFindAssets = + try { + QueryWithFilterOfFindAssets( + FindAssets.read(reader), + CompoundPredicateOfAsset.read(reader), + SelectorTupleOfAsset.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: QueryWithFilterOfFindAssets, + ): Unit = + try { + FindAssets.write(writer, instance.query) + CompoundPredicateOfAsset.write(writer, instance.predicate) + SelectorTupleOfAsset.write(writer, instance.selector) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindAssetsAndAssetPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindAssetsAndAssetPredicateBox.kt deleted file mode 100644 index ea622c55d..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindAssetsAndAssetPredicateBox.kt +++ /dev/null @@ -1,45 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * QueryWithFilterOfFindAssetsAndAssetPredicateBox - * - * Generated from 'QueryWithFilterOfFindAssetsAndAssetPredicateBox' regular structure - */ -public data class QueryWithFilterOfFindAssetsAndAssetPredicateBox( - public val query: FindAssets, - public val predicate: CompoundPredicateOfAssetPredicateBox, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): QueryWithFilterOfFindAssetsAndAssetPredicateBox = - try { - QueryWithFilterOfFindAssetsAndAssetPredicateBox( - FindAssets.read(reader), - CompoundPredicateOfAssetPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: QueryWithFilterOfFindAssetsAndAssetPredicateBox, - ): Unit = try { - FindAssets.write(writer, instance.query) - CompoundPredicateOfAssetPredicateBox.write(writer, instance.predicate) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindAssetsDefinitions.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindAssetsDefinitions.kt new file mode 100644 index 000000000..a26a3a845 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindAssetsDefinitions.kt @@ -0,0 +1,49 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit + +/** + * QueryWithFilterOfFindAssetsDefinitions + * + * Generated from 'QueryWithFilterOfFindAssetsDefinitions' regular structure + */ +public data class QueryWithFilterOfFindAssetsDefinitions( + public val query: FindAssetsDefinitions, + public val predicate: CompoundPredicateOfAssetDefinition, + public val selector: SelectorTupleOfAssetDefinition, +) { + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): QueryWithFilterOfFindAssetsDefinitions = + try { + QueryWithFilterOfFindAssetsDefinitions( + FindAssetsDefinitions.read(reader), + CompoundPredicateOfAssetDefinition.read(reader), + SelectorTupleOfAssetDefinition.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: QueryWithFilterOfFindAssetsDefinitions, + ): Unit = + try { + FindAssetsDefinitions.write(writer, instance.query) + CompoundPredicateOfAssetDefinition.write(writer, instance.predicate) + SelectorTupleOfAssetDefinition.write(writer, instance.selector) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindAssetsDefinitionsAndAssetDefinitionPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindAssetsDefinitionsAndAssetDefinitionPredicateBox.kt deleted file mode 100644 index c2ab18e3c..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindAssetsDefinitionsAndAssetDefinitionPredicateBox.kt +++ /dev/null @@ -1,45 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * QueryWithFilterOfFindAssetsDefinitionsAndAssetDefinitionPredicateBox - * - * Generated from 'QueryWithFilterOfFindAssetsDefinitionsAndAssetDefinitionPredicateBox' regular - * structure - */ -public data class QueryWithFilterOfFindAssetsDefinitionsAndAssetDefinitionPredicateBox( - public val query: FindAssetsDefinitions, - public val predicate: CompoundPredicateOfAssetDefinitionPredicateBox, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): QueryWithFilterOfFindAssetsDefinitionsAndAssetDefinitionPredicateBox = try { - QueryWithFilterOfFindAssetsDefinitionsAndAssetDefinitionPredicateBox( - FindAssetsDefinitions.read(reader), - CompoundPredicateOfAssetDefinitionPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: QueryWithFilterOfFindAssetsDefinitionsAndAssetDefinitionPredicateBox, - ): Unit = try { - FindAssetsDefinitions.write(writer, instance.query) - CompoundPredicateOfAssetDefinitionPredicateBox.write(writer, instance.predicate) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindBlockHeaders.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindBlockHeaders.kt new file mode 100644 index 000000000..eba0decd0 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindBlockHeaders.kt @@ -0,0 +1,49 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit + +/** + * QueryWithFilterOfFindBlockHeaders + * + * Generated from 'QueryWithFilterOfFindBlockHeaders' regular structure + */ +public data class QueryWithFilterOfFindBlockHeaders( + public val query: FindBlockHeaders, + public val predicate: CompoundPredicateOfBlockHeader, + public val selector: SelectorTupleOfBlockHeader, +) { + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): QueryWithFilterOfFindBlockHeaders = + try { + QueryWithFilterOfFindBlockHeaders( + FindBlockHeaders.read(reader), + CompoundPredicateOfBlockHeader.read(reader), + SelectorTupleOfBlockHeader.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: QueryWithFilterOfFindBlockHeaders, + ): Unit = + try { + FindBlockHeaders.write(writer, instance.query) + CompoundPredicateOfBlockHeader.write(writer, instance.predicate) + SelectorTupleOfBlockHeader.write(writer, instance.selector) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindBlockHeadersAndBlockHeaderPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindBlockHeadersAndBlockHeaderPredicateBox.kt deleted file mode 100644 index 443a157b9..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindBlockHeadersAndBlockHeaderPredicateBox.kt +++ /dev/null @@ -1,44 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * QueryWithFilterOfFindBlockHeadersAndBlockHeaderPredicateBox - * - * Generated from 'QueryWithFilterOfFindBlockHeadersAndBlockHeaderPredicateBox' regular structure - */ -public data class QueryWithFilterOfFindBlockHeadersAndBlockHeaderPredicateBox( - public val query: FindBlockHeaders, - public val predicate: CompoundPredicateOfBlockHeaderPredicateBox, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): QueryWithFilterOfFindBlockHeadersAndBlockHeaderPredicateBox = try { - QueryWithFilterOfFindBlockHeadersAndBlockHeaderPredicateBox( - FindBlockHeaders.read(reader), - CompoundPredicateOfBlockHeaderPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: QueryWithFilterOfFindBlockHeadersAndBlockHeaderPredicateBox, - ): Unit = try { - FindBlockHeaders.write(writer, instance.query) - CompoundPredicateOfBlockHeaderPredicateBox.write(writer, instance.predicate) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindBlocks.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindBlocks.kt new file mode 100644 index 000000000..d6efc4156 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindBlocks.kt @@ -0,0 +1,49 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit + +/** + * QueryWithFilterOfFindBlocks + * + * Generated from 'QueryWithFilterOfFindBlocks' regular structure + */ +public data class QueryWithFilterOfFindBlocks( + public val query: FindBlocks, + public val predicate: CompoundPredicateOfSignedBlock, + public val selector: SelectorTupleOfSignedBlock, +) { + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): QueryWithFilterOfFindBlocks = + try { + QueryWithFilterOfFindBlocks( + FindBlocks.read(reader), + CompoundPredicateOfSignedBlock.read(reader), + SelectorTupleOfSignedBlock.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: QueryWithFilterOfFindBlocks, + ): Unit = + try { + FindBlocks.write(writer, instance.query) + CompoundPredicateOfSignedBlock.write(writer, instance.predicate) + SelectorTupleOfSignedBlock.write(writer, instance.selector) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindBlocksAndSignedBlockPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindBlocksAndSignedBlockPredicateBox.kt deleted file mode 100644 index 1abc8b831..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindBlocksAndSignedBlockPredicateBox.kt +++ /dev/null @@ -1,44 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * QueryWithFilterOfFindBlocksAndSignedBlockPredicateBox - * - * Generated from 'QueryWithFilterOfFindBlocksAndSignedBlockPredicateBox' regular structure - */ -public data class QueryWithFilterOfFindBlocksAndSignedBlockPredicateBox( - public val query: FindBlocks, - public val predicate: CompoundPredicateOfSignedBlockPredicateBox, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): QueryWithFilterOfFindBlocksAndSignedBlockPredicateBox = try { - QueryWithFilterOfFindBlocksAndSignedBlockPredicateBox( - FindBlocks.read(reader), - CompoundPredicateOfSignedBlockPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: QueryWithFilterOfFindBlocksAndSignedBlockPredicateBox, - ): Unit = try { - FindBlocks.write(writer, instance.query) - CompoundPredicateOfSignedBlockPredicateBox.write(writer, instance.predicate) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindDomains.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindDomains.kt new file mode 100644 index 000000000..10c2e9f76 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindDomains.kt @@ -0,0 +1,49 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit + +/** + * QueryWithFilterOfFindDomains + * + * Generated from 'QueryWithFilterOfFindDomains' regular structure + */ +public data class QueryWithFilterOfFindDomains( + public val query: FindDomains, + public val predicate: CompoundPredicateOfDomain, + public val selector: SelectorTupleOfDomain, +) { + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): QueryWithFilterOfFindDomains = + try { + QueryWithFilterOfFindDomains( + FindDomains.read(reader), + CompoundPredicateOfDomain.read(reader), + SelectorTupleOfDomain.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: QueryWithFilterOfFindDomains, + ): Unit = + try { + FindDomains.write(writer, instance.query) + CompoundPredicateOfDomain.write(writer, instance.predicate) + SelectorTupleOfDomain.write(writer, instance.selector) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindDomainsAndDomainPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindDomainsAndDomainPredicateBox.kt deleted file mode 100644 index c006d5f81..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindDomainsAndDomainPredicateBox.kt +++ /dev/null @@ -1,45 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * QueryWithFilterOfFindDomainsAndDomainPredicateBox - * - * Generated from 'QueryWithFilterOfFindDomainsAndDomainPredicateBox' regular structure - */ -public data class QueryWithFilterOfFindDomainsAndDomainPredicateBox( - public val query: FindDomains, - public val predicate: CompoundPredicateOfDomainPredicateBox, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): QueryWithFilterOfFindDomainsAndDomainPredicateBox = - try { - QueryWithFilterOfFindDomainsAndDomainPredicateBox( - FindDomains.read(reader), - CompoundPredicateOfDomainPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: QueryWithFilterOfFindDomainsAndDomainPredicateBox, - ): Unit = try { - FindDomains.write(writer, instance.query) - CompoundPredicateOfDomainPredicateBox.write(writer, instance.predicate) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindPeers.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindPeers.kt new file mode 100644 index 000000000..5b2b7c703 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindPeers.kt @@ -0,0 +1,49 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit + +/** + * QueryWithFilterOfFindPeers + * + * Generated from 'QueryWithFilterOfFindPeers' regular structure + */ +public data class QueryWithFilterOfFindPeers( + public val query: FindPeers, + public val predicate: CompoundPredicateOfPeerId, + public val selector: SelectorTupleOfPeerId, +) { + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): QueryWithFilterOfFindPeers = + try { + QueryWithFilterOfFindPeers( + FindPeers.read(reader), + CompoundPredicateOfPeerId.read(reader), + SelectorTupleOfPeerId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: QueryWithFilterOfFindPeers, + ): Unit = + try { + FindPeers.write(writer, instance.query) + CompoundPredicateOfPeerId.write(writer, instance.predicate) + SelectorTupleOfPeerId.write(writer, instance.selector) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindPeersAndPeerPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindPeersAndPeerPredicateBox.kt deleted file mode 100644 index 4946c4665..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindPeersAndPeerPredicateBox.kt +++ /dev/null @@ -1,44 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * QueryWithFilterOfFindPeersAndPeerPredicateBox - * - * Generated from 'QueryWithFilterOfFindPeersAndPeerPredicateBox' regular structure - */ -public data class QueryWithFilterOfFindPeersAndPeerPredicateBox( - public val query: FindPeers, - public val predicate: CompoundPredicateOfPeerPredicateBox, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): QueryWithFilterOfFindPeersAndPeerPredicateBox = try { - QueryWithFilterOfFindPeersAndPeerPredicateBox( - FindPeers.read(reader), - CompoundPredicateOfPeerPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: QueryWithFilterOfFindPeersAndPeerPredicateBox, - ): Unit = try { - FindPeers.write(writer, instance.query) - CompoundPredicateOfPeerPredicateBox.write(writer, instance.predicate) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindPermissionsByAccountId.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindPermissionsByAccountId.kt new file mode 100644 index 000000000..73e850365 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindPermissionsByAccountId.kt @@ -0,0 +1,49 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit + +/** + * QueryWithFilterOfFindPermissionsByAccountId + * + * Generated from 'QueryWithFilterOfFindPermissionsByAccountId' regular structure + */ +public data class QueryWithFilterOfFindPermissionsByAccountId( + public val query: FindPermissionsByAccountId, + public val predicate: CompoundPredicateOfPermission, + public val selector: SelectorTupleOfPermission, +) { + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): QueryWithFilterOfFindPermissionsByAccountId = + try { + QueryWithFilterOfFindPermissionsByAccountId( + FindPermissionsByAccountId.read(reader), + CompoundPredicateOfPermission.read(reader), + SelectorTupleOfPermission.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: QueryWithFilterOfFindPermissionsByAccountId, + ): Unit = + try { + FindPermissionsByAccountId.write(writer, instance.query) + CompoundPredicateOfPermission.write(writer, instance.predicate) + SelectorTupleOfPermission.write(writer, instance.selector) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindPermissionsByAccountIdAndPermissionPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindPermissionsByAccountIdAndPermissionPredicateBox.kt deleted file mode 100644 index ead92ed58..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindPermissionsByAccountIdAndPermissionPredicateBox.kt +++ /dev/null @@ -1,45 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * QueryWithFilterOfFindPermissionsByAccountIdAndPermissionPredicateBox - * - * Generated from 'QueryWithFilterOfFindPermissionsByAccountIdAndPermissionPredicateBox' regular - * structure - */ -public data class QueryWithFilterOfFindPermissionsByAccountIdAndPermissionPredicateBox( - public val query: FindPermissionsByAccountId, - public val predicate: CompoundPredicateOfPermissionPredicateBox, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): QueryWithFilterOfFindPermissionsByAccountIdAndPermissionPredicateBox = try { - QueryWithFilterOfFindPermissionsByAccountIdAndPermissionPredicateBox( - FindPermissionsByAccountId.read(reader), - CompoundPredicateOfPermissionPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: QueryWithFilterOfFindPermissionsByAccountIdAndPermissionPredicateBox, - ): Unit = try { - FindPermissionsByAccountId.write(writer, instance.query) - CompoundPredicateOfPermissionPredicateBox.write(writer, instance.predicate) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindRoleIds.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindRoleIds.kt new file mode 100644 index 000000000..a0e723fe8 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindRoleIds.kt @@ -0,0 +1,49 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit + +/** + * QueryWithFilterOfFindRoleIds + * + * Generated from 'QueryWithFilterOfFindRoleIds' regular structure + */ +public data class QueryWithFilterOfFindRoleIds( + public val query: FindRoleIds, + public val predicate: CompoundPredicateOfRoleId, + public val selector: SelectorTupleOfRoleId, +) { + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): QueryWithFilterOfFindRoleIds = + try { + QueryWithFilterOfFindRoleIds( + FindRoleIds.read(reader), + CompoundPredicateOfRoleId.read(reader), + SelectorTupleOfRoleId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: QueryWithFilterOfFindRoleIds, + ): Unit = + try { + FindRoleIds.write(writer, instance.query) + CompoundPredicateOfRoleId.write(writer, instance.predicate) + SelectorTupleOfRoleId.write(writer, instance.selector) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindRoleIdsAndRoleIdPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindRoleIdsAndRoleIdPredicateBox.kt deleted file mode 100644 index a4c8c3dd9..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindRoleIdsAndRoleIdPredicateBox.kt +++ /dev/null @@ -1,45 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * QueryWithFilterOfFindRoleIdsAndRoleIdPredicateBox - * - * Generated from 'QueryWithFilterOfFindRoleIdsAndRoleIdPredicateBox' regular structure - */ -public data class QueryWithFilterOfFindRoleIdsAndRoleIdPredicateBox( - public val query: FindRoleIds, - public val predicate: CompoundPredicateOfRoleIdPredicateBox, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): QueryWithFilterOfFindRoleIdsAndRoleIdPredicateBox = - try { - QueryWithFilterOfFindRoleIdsAndRoleIdPredicateBox( - FindRoleIds.read(reader), - CompoundPredicateOfRoleIdPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: QueryWithFilterOfFindRoleIdsAndRoleIdPredicateBox, - ): Unit = try { - FindRoleIds.write(writer, instance.query) - CompoundPredicateOfRoleIdPredicateBox.write(writer, instance.predicate) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindRoles.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindRoles.kt new file mode 100644 index 000000000..e5ae43452 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindRoles.kt @@ -0,0 +1,49 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit + +/** + * QueryWithFilterOfFindRoles + * + * Generated from 'QueryWithFilterOfFindRoles' regular structure + */ +public data class QueryWithFilterOfFindRoles( + public val query: FindRoles, + public val predicate: CompoundPredicateOfRole, + public val selector: SelectorTupleOfRole, +) { + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): QueryWithFilterOfFindRoles = + try { + QueryWithFilterOfFindRoles( + FindRoles.read(reader), + CompoundPredicateOfRole.read(reader), + SelectorTupleOfRole.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: QueryWithFilterOfFindRoles, + ): Unit = + try { + FindRoles.write(writer, instance.query) + CompoundPredicateOfRole.write(writer, instance.predicate) + SelectorTupleOfRole.write(writer, instance.selector) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindRolesAndRolePredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindRolesAndRolePredicateBox.kt deleted file mode 100644 index b4704915c..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindRolesAndRolePredicateBox.kt +++ /dev/null @@ -1,44 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * QueryWithFilterOfFindRolesAndRolePredicateBox - * - * Generated from 'QueryWithFilterOfFindRolesAndRolePredicateBox' regular structure - */ -public data class QueryWithFilterOfFindRolesAndRolePredicateBox( - public val query: FindRoles, - public val predicate: CompoundPredicateOfRolePredicateBox, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): QueryWithFilterOfFindRolesAndRolePredicateBox = try { - QueryWithFilterOfFindRolesAndRolePredicateBox( - FindRoles.read(reader), - CompoundPredicateOfRolePredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: QueryWithFilterOfFindRolesAndRolePredicateBox, - ): Unit = try { - FindRoles.write(writer, instance.query) - CompoundPredicateOfRolePredicateBox.write(writer, instance.predicate) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindRolesByAccountId.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindRolesByAccountId.kt new file mode 100644 index 000000000..5634031e7 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindRolesByAccountId.kt @@ -0,0 +1,49 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit + +/** + * QueryWithFilterOfFindRolesByAccountId + * + * Generated from 'QueryWithFilterOfFindRolesByAccountId' regular structure + */ +public data class QueryWithFilterOfFindRolesByAccountId( + public val query: FindRolesByAccountId, + public val predicate: CompoundPredicateOfRoleId, + public val selector: SelectorTupleOfRoleId, +) { + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): QueryWithFilterOfFindRolesByAccountId = + try { + QueryWithFilterOfFindRolesByAccountId( + FindRolesByAccountId.read(reader), + CompoundPredicateOfRoleId.read(reader), + SelectorTupleOfRoleId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: QueryWithFilterOfFindRolesByAccountId, + ): Unit = + try { + FindRolesByAccountId.write(writer, instance.query) + CompoundPredicateOfRoleId.write(writer, instance.predicate) + SelectorTupleOfRoleId.write(writer, instance.selector) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindRolesByAccountIdAndRoleIdPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindRolesByAccountIdAndRoleIdPredicateBox.kt deleted file mode 100644 index 5858cb40b..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindRolesByAccountIdAndRoleIdPredicateBox.kt +++ /dev/null @@ -1,44 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * QueryWithFilterOfFindRolesByAccountIdAndRoleIdPredicateBox - * - * Generated from 'QueryWithFilterOfFindRolesByAccountIdAndRoleIdPredicateBox' regular structure - */ -public data class QueryWithFilterOfFindRolesByAccountIdAndRoleIdPredicateBox( - public val query: FindRolesByAccountId, - public val predicate: CompoundPredicateOfRoleIdPredicateBox, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): QueryWithFilterOfFindRolesByAccountIdAndRoleIdPredicateBox = try { - QueryWithFilterOfFindRolesByAccountIdAndRoleIdPredicateBox( - FindRolesByAccountId.read(reader), - CompoundPredicateOfRoleIdPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: QueryWithFilterOfFindRolesByAccountIdAndRoleIdPredicateBox, - ): Unit = try { - FindRolesByAccountId.write(writer, instance.query) - CompoundPredicateOfRoleIdPredicateBox.write(writer, instance.predicate) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindTransactions.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindTransactions.kt new file mode 100644 index 000000000..cbc73184a --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindTransactions.kt @@ -0,0 +1,49 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit + +/** + * QueryWithFilterOfFindTransactions + * + * Generated from 'QueryWithFilterOfFindTransactions' regular structure + */ +public data class QueryWithFilterOfFindTransactions( + public val query: FindTransactions, + public val predicate: CompoundPredicateOfCommittedTransaction, + public val selector: SelectorTupleOfCommittedTransaction, +) { + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): QueryWithFilterOfFindTransactions = + try { + QueryWithFilterOfFindTransactions( + FindTransactions.read(reader), + CompoundPredicateOfCommittedTransaction.read(reader), + SelectorTupleOfCommittedTransaction.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: QueryWithFilterOfFindTransactions, + ): Unit = + try { + FindTransactions.write(writer, instance.query) + CompoundPredicateOfCommittedTransaction.write(writer, instance.predicate) + SelectorTupleOfCommittedTransaction.write(writer, instance.selector) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindTransactionsAndTransactionQueryOutputPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindTransactionsAndTransactionQueryOutputPredicateBox.kt deleted file mode 100644 index e3981ae9b..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindTransactionsAndTransactionQueryOutputPredicateBox.kt +++ /dev/null @@ -1,46 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * QueryWithFilterOfFindTransactionsAndTransactionQueryOutputPredicateBox - * - * Generated from 'QueryWithFilterOfFindTransactionsAndTransactionQueryOutputPredicateBox' regular - * structure - */ -public data class QueryWithFilterOfFindTransactionsAndTransactionQueryOutputPredicateBox( - public val query: FindTransactions, - public val predicate: CompoundPredicateOfTransactionQueryOutputPredicateBox, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): QueryWithFilterOfFindTransactionsAndTransactionQueryOutputPredicateBox = try { - QueryWithFilterOfFindTransactionsAndTransactionQueryOutputPredicateBox( - FindTransactions.read(reader), - CompoundPredicateOfTransactionQueryOutputPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: QueryWithFilterOfFindTransactionsAndTransactionQueryOutputPredicateBox, - ): Unit = - try { - FindTransactions.write(writer, instance.query) - CompoundPredicateOfTransactionQueryOutputPredicateBox.write(writer, instance.predicate) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindTriggers.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindTriggers.kt new file mode 100644 index 000000000..ed42d5384 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindTriggers.kt @@ -0,0 +1,49 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit + +/** + * QueryWithFilterOfFindTriggers + * + * Generated from 'QueryWithFilterOfFindTriggers' regular structure + */ +public data class QueryWithFilterOfFindTriggers( + public val query: FindTriggers, + public val predicate: CompoundPredicateOfTrigger, + public val selector: SelectorTupleOfTrigger, +) { + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): QueryWithFilterOfFindTriggers = + try { + QueryWithFilterOfFindTriggers( + FindTriggers.read(reader), + CompoundPredicateOfTrigger.read(reader), + SelectorTupleOfTrigger.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: QueryWithFilterOfFindTriggers, + ): Unit = + try { + FindTriggers.write(writer, instance.query) + CompoundPredicateOfTrigger.write(writer, instance.predicate) + SelectorTupleOfTrigger.write(writer, instance.selector) + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindTriggersAndTriggerPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindTriggersAndTriggerPredicateBox.kt deleted file mode 100644 index 37f3623d4..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithFilterOfFindTriggersAndTriggerPredicateBox.kt +++ /dev/null @@ -1,44 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * QueryWithFilterOfFindTriggersAndTriggerPredicateBox - * - * Generated from 'QueryWithFilterOfFindTriggersAndTriggerPredicateBox' regular structure - */ -public data class QueryWithFilterOfFindTriggersAndTriggerPredicateBox( - public val query: FindTriggers, - public val predicate: CompoundPredicateOfTriggerPredicateBox, -) { - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): QueryWithFilterOfFindTriggersAndTriggerPredicateBox = try { - QueryWithFilterOfFindTriggersAndTriggerPredicateBox( - FindTriggers.read(reader), - CompoundPredicateOfTriggerPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: QueryWithFilterOfFindTriggersAndTriggerPredicateBox, - ): Unit = try { - FindTriggers.write(writer, instance.query) - CompoundPredicateOfTriggerPredicateBox.write(writer, instance.predicate) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithParams.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithParams.kt index 9005e17be..5499f0af7 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithParams.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/QueryWithParams.kt @@ -20,20 +20,25 @@ public data class QueryWithParams( public val params: QueryParams, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): QueryWithParams = try { - QueryWithParams( - QueryBox.read(reader), - QueryParams.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): QueryWithParams = + try { + QueryWithParams( + QueryBox.read(reader), + QueryParams.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: QueryWithParams): Unit = try { - QueryBox.write(writer, instance.query) - QueryParams.write(writer, instance.params) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: QueryWithParams, + ): Unit = + try { + QueryBox.write(writer, instance.query) + QueryParams.write(writer, instance.params) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RawGenesisTransaction.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RawGenesisTransaction.kt index 46c194d64..2da22941b 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RawGenesisTransaction.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RawGenesisTransaction.kt @@ -20,40 +20,51 @@ import kotlin.collections.List public data class RawGenesisTransaction( public val chain: ChainId, public val executor: String, - public val parameters: List, + public val parameters: Parameters? = null, public val instructions: List, + public val wasmDir: String, + public val wasmTriggers: List, public val topology: List, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): RawGenesisTransaction = try { - RawGenesisTransaction( - ChainId.read(reader), - reader.readString(), - reader.readVec(reader.readCompactInt()) { Parameter.read(reader) }, - reader.readVec(reader.readCompactInt()) { InstructionBox.read(reader) }, - reader.readVec(reader.readCompactInt()) { PeerId.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: RawGenesisTransaction): Unit = try { - ChainId.write(writer, instance.chain) - writer.writeAsList(instance.executor.toByteArray(Charsets.UTF_8)) - writer.writeCompact(instance.parameters.size) - instance.parameters.forEach { value -> - Parameter.write(writer, value) - } - writer.writeCompact(instance.instructions.size) - instance.instructions.forEach { value -> - InstructionBox.write(writer, value) + override fun read(reader: ScaleCodecReader): RawGenesisTransaction = + try { + RawGenesisTransaction( + ChainId.read(reader), + reader.readString(), + reader.readNullable(Parameters) as Parameters?, + reader.readVec(reader.readCompactInt()) { InstructionBox.read(reader) }, + reader.readString(), + reader.readVec(reader.readCompactInt()) { GenesisWasmTrigger.read(reader) }, + reader.readVec(reader.readCompactInt()) { PeerId.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) } - writer.writeCompact(instance.topology.size) - instance.topology.forEach { value -> - PeerId.write(writer, value) + + override fun write( + writer: ScaleCodecWriter, + instance: RawGenesisTransaction, + ): Unit = + try { + ChainId.write(writer, instance.chain) + writer.writeAsList(instance.executor.toByteArray(Charsets.UTF_8)) + writer.writeNullable(Parameters, instance.parameters) + writer.writeCompact(instance.instructions.size) + instance.instructions.forEach { value -> + InstructionBox.write(writer, value) + } + writer.writeAsList(instance.wasmDir.toByteArray(Charsets.UTF_8)) + writer.writeCompact(instance.wasmTriggers.size) + instance.wasmTriggers.forEach { value -> + GenesisWasmTrigger.write(writer, value) + } + writer.writeCompact(instance.topology.size) + instance.topology.forEach { value -> + PeerId.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) } - } catch (ex: Exception) { - throw wrapException(ex) - } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RegisterBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RegisterBox.kt index e7f11559a..be9b0a1f9 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RegisterBox.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RegisterBox.kt @@ -36,22 +36,24 @@ public sealed class RegisterBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RegisterBox.Peer = try { - Peer( - RegisterOfPeer.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RegisterBox.Peer = + try { + Peer( + RegisterOfPeer.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.RegisterBox.Peer, - ): Unit = try { - RegisterOfPeer.write(writer, instance.registerOfPeer) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + RegisterOfPeer.write(writer, instance.registerOfPeer) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -68,22 +70,24 @@ public sealed class RegisterBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RegisterBox.Domain = try { - Domain( - RegisterOfDomain.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RegisterBox.Domain = + try { + Domain( + RegisterOfDomain.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.RegisterBox.Domain, - ): Unit = try { - RegisterOfDomain.write(writer, instance.registerOfDomain) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + RegisterOfDomain.write(writer, instance.registerOfDomain) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -100,22 +104,24 @@ public sealed class RegisterBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 2 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RegisterBox.Account = try { - Account( - RegisterOfAccount.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RegisterBox.Account = + try { + Account( + RegisterOfAccount.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.RegisterBox.Account, - ): Unit = try { - RegisterOfAccount.write(writer, instance.registerOfAccount) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + RegisterOfAccount.write(writer, instance.registerOfAccount) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -132,22 +138,24 @@ public sealed class RegisterBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 3 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RegisterBox.AssetDefinition = try { - AssetDefinition( - RegisterOfAssetDefinition.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RegisterBox.AssetDefinition = + try { + AssetDefinition( + RegisterOfAssetDefinition.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.RegisterBox.AssetDefinition, - ): Unit = try { - RegisterOfAssetDefinition.write(writer, instance.registerOfAssetDefinition) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + RegisterOfAssetDefinition.write(writer, instance.registerOfAssetDefinition) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -164,22 +172,24 @@ public sealed class RegisterBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 4 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RegisterBox.Asset = try { - Asset( - RegisterOfAsset.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RegisterBox.Asset = + try { + Asset( + RegisterOfAsset.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.RegisterBox.Asset, - ): Unit = try { - RegisterOfAsset.write(writer, instance.registerOfAsset) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + RegisterOfAsset.write(writer, instance.registerOfAsset) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -196,22 +206,24 @@ public sealed class RegisterBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 5 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RegisterBox.Role = try { - Role( - RegisterOfRole.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RegisterBox.Role = + try { + Role( + RegisterOfRole.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.RegisterBox.Role, - ): Unit = try { - RegisterOfRole.write(writer, instance.registerOfRole) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + RegisterOfRole.write(writer, instance.registerOfRole) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -228,40 +240,44 @@ public sealed class RegisterBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 6 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RegisterBox.Trigger = try { - Trigger( - RegisterOfTrigger.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RegisterBox.Trigger = + try { + Trigger( + RegisterOfTrigger.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.RegisterBox.Trigger, - ): Unit = try { - RegisterOfTrigger.write(writer, instance.registerOfTrigger) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + RegisterOfTrigger.write(writer, instance.registerOfTrigger) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): RegisterBox = when ( - val discriminant = - reader.readUByte() + override fun read(reader: ScaleCodecReader): RegisterBox = + when (val discriminant = reader.readUByte()) { + 0 -> Peer.read(reader) + 1 -> Domain.read(reader) + 2 -> Account.read(reader) + 3 -> AssetDefinition.read(reader) + 4 -> Asset.read(reader) + 5 -> Role.read(reader) + 6 -> Trigger.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: RegisterBox, ) { - 0 -> Peer.read(reader) - 1 -> Domain.read(reader) - 2 -> Account.read(reader) - 3 -> AssetDefinition.read(reader) - 4 -> Asset.read(reader) - 5 -> Role.read(reader) - 6 -> Trigger.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: RegisterBox) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Peer.write(writer, instance as Peer) @@ -271,7 +287,8 @@ public sealed class RegisterBox : ModelEnum { 4 -> Asset.write(writer, instance as Asset) 5 -> Role.write(writer, instance as Role) 6 -> Trigger.write(writer, instance as Trigger) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RegisterOfAccount.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RegisterOfAccount.kt index c363b6de8..7da579e06 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RegisterOfAccount.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RegisterOfAccount.kt @@ -3,10 +3,13 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException import kotlin.Unit @@ -17,20 +20,27 @@ import kotlin.Unit */ public data class RegisterOfAccount( public val `object`: NewAccount, -) { +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): RegisterOfAccount = try { - RegisterOfAccount( - NewAccount.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): RegisterOfAccount = + try { + RegisterOfAccount( + NewAccount.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: RegisterOfAccount): Unit = try { - NewAccount.write(writer, instance.`object`) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: RegisterOfAccount, + ): Unit = + try { + NewAccount.write(writer, instance.`object`) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RegisterOfAsset.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RegisterOfAsset.kt index e396d10a5..03d23c012 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RegisterOfAsset.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RegisterOfAsset.kt @@ -3,10 +3,13 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException import kotlin.Unit @@ -17,20 +20,27 @@ import kotlin.Unit */ public data class RegisterOfAsset( public val `object`: Asset, -) { +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): RegisterOfAsset = try { - RegisterOfAsset( - Asset.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): RegisterOfAsset = + try { + RegisterOfAsset( + Asset.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: RegisterOfAsset): Unit = try { - Asset.write(writer, instance.`object`) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: RegisterOfAsset, + ): Unit = + try { + Asset.write(writer, instance.`object`) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RegisterOfAssetDefinition.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RegisterOfAssetDefinition.kt index b10f8253d..f6cc4f6ec 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RegisterOfAssetDefinition.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RegisterOfAssetDefinition.kt @@ -3,10 +3,13 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException import kotlin.Unit @@ -17,22 +20,29 @@ import kotlin.Unit */ public data class RegisterOfAssetDefinition( public val `object`: NewAssetDefinition, -) { +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): RegisterOfAssetDefinition = try { - RegisterOfAssetDefinition( - NewAssetDefinition.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): RegisterOfAssetDefinition = + try { + RegisterOfAssetDefinition( + NewAssetDefinition.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: RegisterOfAssetDefinition): Unit = try { - NewAssetDefinition.write(writer, instance.`object`) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: RegisterOfAssetDefinition, + ): Unit = + try { + NewAssetDefinition.write(writer, instance.`object`) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RegisterOfDomain.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RegisterOfDomain.kt index 0ac22fac3..6095d5abd 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RegisterOfDomain.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RegisterOfDomain.kt @@ -3,10 +3,13 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException import kotlin.Unit @@ -17,20 +20,27 @@ import kotlin.Unit */ public data class RegisterOfDomain( public val `object`: NewDomain, -) { +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): RegisterOfDomain = try { - RegisterOfDomain( - NewDomain.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): RegisterOfDomain = + try { + RegisterOfDomain( + NewDomain.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: RegisterOfDomain): Unit = try { - NewDomain.write(writer, instance.`object`) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: RegisterOfDomain, + ): Unit = + try { + NewDomain.write(writer, instance.`object`) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RegisterOfPeer.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RegisterOfPeer.kt index d737b9d71..431862fe3 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RegisterOfPeer.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RegisterOfPeer.kt @@ -3,10 +3,13 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException import kotlin.Unit @@ -16,21 +19,28 @@ import kotlin.Unit * Generated from 'RegisterOfPeer' regular structure */ public data class RegisterOfPeer( - public val `object`: Peer, -) { + public val `object`: PeerId, +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): RegisterOfPeer = try { - RegisterOfPeer( - Peer.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): RegisterOfPeer = + try { + RegisterOfPeer( + PeerId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: RegisterOfPeer): Unit = try { - Peer.write(writer, instance.`object`) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: RegisterOfPeer, + ): Unit = + try { + PeerId.write(writer, instance.`object`) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RegisterOfRole.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RegisterOfRole.kt index 365468328..8cd528f7f 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RegisterOfRole.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RegisterOfRole.kt @@ -3,10 +3,13 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException import kotlin.Unit @@ -16,21 +19,28 @@ import kotlin.Unit * Generated from 'RegisterOfRole' regular structure */ public data class RegisterOfRole( - public val `object`: Role, -) { + public val `object`: NewRole, +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): RegisterOfRole = try { - RegisterOfRole( - Role.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): RegisterOfRole = + try { + RegisterOfRole( + NewRole.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: RegisterOfRole): Unit = try { - Role.write(writer, instance.`object`) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: RegisterOfRole, + ): Unit = + try { + NewRole.write(writer, instance.`object`) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RegisterOfTrigger.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RegisterOfTrigger.kt index df06f66b7..f5e4dc702 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RegisterOfTrigger.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RegisterOfTrigger.kt @@ -3,10 +3,13 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException import kotlin.Unit @@ -17,20 +20,27 @@ import kotlin.Unit */ public data class RegisterOfTrigger( public val `object`: Trigger, -) { +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): RegisterOfTrigger = try { - RegisterOfTrigger( - Trigger.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): RegisterOfTrigger = + try { + RegisterOfTrigger( + Trigger.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: RegisterOfTrigger): Unit = try { - Trigger.write(writer, instance.`object`) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: RegisterOfTrigger, + ): Unit = + try { + Trigger.write(writer, instance.`object`) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RemoveKeyValueBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RemoveKeyValueBox.kt index 79c343373..3bb53dfaf 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RemoveKeyValueBox.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RemoveKeyValueBox.kt @@ -36,22 +36,24 @@ public sealed class RemoveKeyValueBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RemoveKeyValueBox.Domain = try { - Domain( - RemoveKeyValueOfDomain.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RemoveKeyValueBox.Domain = + try { + Domain( + RemoveKeyValueOfDomain.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.RemoveKeyValueBox.Domain, - ): Unit = try { - RemoveKeyValueOfDomain.write(writer, instance.removeKeyValueOfDomain) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + RemoveKeyValueOfDomain.write(writer, instance.removeKeyValueOfDomain) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -68,22 +70,24 @@ public sealed class RemoveKeyValueBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RemoveKeyValueBox.Account = try { - Account( - RemoveKeyValueOfAccount.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RemoveKeyValueBox.Account = + try { + Account( + RemoveKeyValueOfAccount.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.RemoveKeyValueBox.Account, - ): Unit = try { - RemoveKeyValueOfAccount.write(writer, instance.removeKeyValueOfAccount) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + RemoveKeyValueOfAccount.write(writer, instance.removeKeyValueOfAccount) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -100,22 +104,24 @@ public sealed class RemoveKeyValueBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 2 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RemoveKeyValueBox.AssetDefinition = try { - AssetDefinition( - RemoveKeyValueOfAssetDefinition.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RemoveKeyValueBox.AssetDefinition = + try { + AssetDefinition( + RemoveKeyValueOfAssetDefinition.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.RemoveKeyValueBox.AssetDefinition, - ): Unit = try { - RemoveKeyValueOfAssetDefinition.write(writer, instance.removeKeyValueOfAssetDefinition) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + RemoveKeyValueOfAssetDefinition.write(writer, instance.removeKeyValueOfAssetDefinition) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -132,22 +138,24 @@ public sealed class RemoveKeyValueBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 3 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RemoveKeyValueBox.Asset = try { - Asset( - RemoveKeyValueOfAsset.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RemoveKeyValueBox.Asset = + try { + Asset( + RemoveKeyValueOfAsset.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.RemoveKeyValueBox.Asset, - ): Unit = try { - RemoveKeyValueOfAsset.write(writer, instance.removeKeyValueOfAsset) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + RemoveKeyValueOfAsset.write(writer, instance.removeKeyValueOfAsset) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -164,38 +172,42 @@ public sealed class RemoveKeyValueBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 4 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RemoveKeyValueBox.Trigger = try { - Trigger( - RemoveKeyValueOfTrigger.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RemoveKeyValueBox.Trigger = + try { + Trigger( + RemoveKeyValueOfTrigger.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.RemoveKeyValueBox.Trigger, - ): Unit = try { - RemoveKeyValueOfTrigger.write(writer, instance.removeKeyValueOfTrigger) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + RemoveKeyValueOfTrigger.write(writer, instance.removeKeyValueOfTrigger) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): RemoveKeyValueBox = when ( - val discriminant = - reader.readUByte() + override fun read(reader: ScaleCodecReader): RemoveKeyValueBox = + when (val discriminant = reader.readUByte()) { + 0 -> Domain.read(reader) + 1 -> Account.read(reader) + 2 -> AssetDefinition.read(reader) + 3 -> Asset.read(reader) + 4 -> Trigger.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: RemoveKeyValueBox, ) { - 0 -> Domain.read(reader) - 1 -> Account.read(reader) - 2 -> AssetDefinition.read(reader) - 3 -> Asset.read(reader) - 4 -> Trigger.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: RemoveKeyValueBox) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Domain.write(writer, instance as Domain) @@ -203,7 +215,8 @@ public sealed class RemoveKeyValueBox : ModelEnum { 2 -> AssetDefinition.write(writer, instance as AssetDefinition) 3 -> Asset.write(writer, instance as Asset) 4 -> Trigger.write(writer, instance as Trigger) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RemoveKeyValueOfAccount.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RemoveKeyValueOfAccount.kt index 0dd32975f..51504b550 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RemoveKeyValueOfAccount.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RemoveKeyValueOfAccount.kt @@ -3,10 +3,13 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException import kotlin.Unit @@ -18,24 +21,31 @@ import kotlin.Unit public data class RemoveKeyValueOfAccount( public val `object`: AccountId, public val key: Name, -) { +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): RemoveKeyValueOfAccount = try { - RemoveKeyValueOfAccount( - AccountId.read(reader), - Name.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): RemoveKeyValueOfAccount = + try { + RemoveKeyValueOfAccount( + AccountId.read(reader), + Name.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: RemoveKeyValueOfAccount): Unit = try { - AccountId.write(writer, instance.`object`) - Name.write(writer, instance.key) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: RemoveKeyValueOfAccount, + ): Unit = + try { + AccountId.write(writer, instance.`object`) + Name.write(writer, instance.key) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RemoveKeyValueOfAsset.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RemoveKeyValueOfAsset.kt index 40b180b03..f9d70bf5d 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RemoveKeyValueOfAsset.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RemoveKeyValueOfAsset.kt @@ -3,10 +3,13 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException import kotlin.Unit @@ -18,22 +21,29 @@ import kotlin.Unit public data class RemoveKeyValueOfAsset( public val `object`: AssetId, public val key: Name, -) { +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): RemoveKeyValueOfAsset = try { - RemoveKeyValueOfAsset( - AssetId.read(reader), - Name.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): RemoveKeyValueOfAsset = + try { + RemoveKeyValueOfAsset( + AssetId.read(reader), + Name.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: RemoveKeyValueOfAsset): Unit = try { - AssetId.write(writer, instance.`object`) - Name.write(writer, instance.key) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: RemoveKeyValueOfAsset, + ): Unit = + try { + AssetId.write(writer, instance.`object`) + Name.write(writer, instance.key) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RemoveKeyValueOfAssetDefinition.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RemoveKeyValueOfAssetDefinition.kt index 29112f1e2..1f595ca47 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RemoveKeyValueOfAssetDefinition.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RemoveKeyValueOfAssetDefinition.kt @@ -3,10 +3,13 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException import kotlin.Unit @@ -18,20 +21,26 @@ import kotlin.Unit public data class RemoveKeyValueOfAssetDefinition( public val `object`: AssetDefinitionId, public val key: Name, -) { +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): RemoveKeyValueOfAssetDefinition = try { - RemoveKeyValueOfAssetDefinition( - AssetDefinitionId.read(reader), - Name.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): RemoveKeyValueOfAssetDefinition = + try { + RemoveKeyValueOfAssetDefinition( + AssetDefinitionId.read(reader), + Name.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: RemoveKeyValueOfAssetDefinition): Unit = + override fun write( + writer: ScaleCodecWriter, + instance: RemoveKeyValueOfAssetDefinition, + ): Unit = try { AssetDefinitionId.write(writer, instance.`object`) Name.write(writer, instance.key) diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RemoveKeyValueOfDomain.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RemoveKeyValueOfDomain.kt index ff8e6d616..df88fdfad 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RemoveKeyValueOfDomain.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RemoveKeyValueOfDomain.kt @@ -3,10 +3,13 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException import kotlin.Unit @@ -18,22 +21,31 @@ import kotlin.Unit public data class RemoveKeyValueOfDomain( public val `object`: DomainId, public val key: Name, -) { - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): RemoveKeyValueOfDomain = try { - RemoveKeyValueOfDomain( - DomainId.read(reader), - Name.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() - override fun write(writer: ScaleCodecWriter, instance: RemoveKeyValueOfDomain): Unit = try { - DomainId.write(writer, instance.`object`) - Name.write(writer, instance.key) - } catch (ex: Exception) { - throw wrapException(ex) - } + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): RemoveKeyValueOfDomain = + try { + RemoveKeyValueOfDomain( + DomainId.read(reader), + Name.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: RemoveKeyValueOfDomain, + ): Unit = + try { + DomainId.write(writer, instance.`object`) + Name.write(writer, instance.key) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RemoveKeyValueOfTrigger.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RemoveKeyValueOfTrigger.kt index a56c4aef6..ac9a022d2 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RemoveKeyValueOfTrigger.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RemoveKeyValueOfTrigger.kt @@ -3,10 +3,13 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException import kotlin.Unit @@ -18,24 +21,31 @@ import kotlin.Unit public data class RemoveKeyValueOfTrigger( public val `object`: TriggerId, public val key: Name, -) { +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): RemoveKeyValueOfTrigger = try { - RemoveKeyValueOfTrigger( - TriggerId.read(reader), - Name.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): RemoveKeyValueOfTrigger = + try { + RemoveKeyValueOfTrigger( + TriggerId.read(reader), + Name.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: RemoveKeyValueOfTrigger): Unit = try { - TriggerId.write(writer, instance.`object`) - Name.write(writer, instance.key) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: RemoveKeyValueOfTrigger, + ): Unit = + try { + TriggerId.write(writer, instance.`object`) + Name.write(writer, instance.key) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Repeats.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Repeats.kt index 3e24b8c18..9c453e1c4 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Repeats.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Repeats.kt @@ -26,13 +26,17 @@ public sealed class Repeats : ModelEnum { */ public abstract fun discriminant(): Int - override fun equals(other: Any?): Boolean = when (this) { - is Indefinitely -> Indefinitely.equals(this, other) - else -> super.equals(other) } + override fun equals(other: Any?): Boolean = + when (this) { + is Indefinitely -> Indefinitely.equals(this, other) + else -> super.equals(other) + } - override fun hashCode(): Int = when (this) { - is Indefinitely -> Indefinitely.hashCode() - else -> super.hashCode() } + override fun hashCode(): Int = + when (this) { + is Indefinitely -> Indefinitely.hashCode() + else -> super.hashCode() + } /** * 'Indefinitely' variant @@ -45,24 +49,30 @@ public sealed class Repeats : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.Repeats.Indefinitely = try { - Indefinitely() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.Repeats.Indefinitely = + try { + Indefinitely() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.Repeats.Indefinitely, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } - - public fun equals(o1: jp.co.soramitsu.iroha2.generated.Repeats.Indefinitely, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.Repeats.Indefinitely, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".Repeats.Indefinitely".hashCode() } @@ -81,40 +91,45 @@ public sealed class Repeats : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.Repeats.Exactly = try { - Exactly( - reader.readUint32(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.Repeats.Exactly = + try { + Exactly( + reader.readUint32(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.Repeats.Exactly, - ): Unit = try { - writer.writeUint32(instance.u32) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + writer.writeUint32(instance.u32) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): Repeats = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Indefinitely.read(reader) - 1 -> Exactly.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + override fun read(reader: ScaleCodecReader): Repeats = + when (val discriminant = reader.readUByte()) { + 0 -> Indefinitely.read(reader) + 1 -> Exactly.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: Repeats) { + override fun write( + writer: ScaleCodecWriter, + instance: Repeats, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Indefinitely.write(writer, instance as Indefinitely) 1 -> Exactly.write(writer, instance as Exactly) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RepetitionError.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RepetitionError.kt index a06f9d5fb..b7f414db4 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RepetitionError.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RepetitionError.kt @@ -20,20 +20,25 @@ public data class RepetitionError( public val id: IdBox, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): RepetitionError = try { - RepetitionError( - InstructionType.read(reader), - IdBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): RepetitionError = + try { + RepetitionError( + InstructionType.read(reader), + IdBox.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: RepetitionError): Unit = try { - InstructionType.write(writer, instance.instruction) - IdBox.write(writer, instance.id) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: RepetitionError, + ): Unit = + try { + InstructionType.write(writer, instance.instruction) + IdBox.write(writer, instance.id) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RevokeBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RevokeBox.kt index d33a4d908..9484358cf 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RevokeBox.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RevokeBox.kt @@ -36,22 +36,24 @@ public sealed class RevokeBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RevokeBox.Permission = try { - Permission( - RevokeOfPermissionAndAccount.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RevokeBox.Permission = + try { + Permission( + RevokeOfPermissionAndAccount.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.RevokeBox.Permission, - ): Unit = try { - RevokeOfPermissionAndAccount.write(writer, instance.revokeOfPermissionAndAccount) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + RevokeOfPermissionAndAccount.write(writer, instance.revokeOfPermissionAndAccount) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -80,11 +82,12 @@ public sealed class RevokeBox : ModelEnum { override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.RevokeBox.Role, - ): Unit = try { - RevokeOfRoleIdAndAccount.write(writer, instance.revokeOfRoleIdAndAccount) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + RevokeOfRoleIdAndAccount.write(writer, instance.revokeOfRoleIdAndAccount) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -101,42 +104,47 @@ public sealed class RevokeBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 2 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RevokeBox.RolePermission = try { - RolePermission( - RevokeOfPermissionAndRole.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RevokeBox.RolePermission = + try { + RolePermission( + RevokeOfPermissionAndRole.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.RevokeBox.RolePermission, - ): Unit = try { - RevokeOfPermissionAndRole.write(writer, instance.revokeOfPermissionAndRole) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + RevokeOfPermissionAndRole.write(writer, instance.revokeOfPermissionAndRole) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): RevokeBox = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Permission.read(reader) - 1 -> Role.read(reader) - 2 -> RolePermission.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + override fun read(reader: ScaleCodecReader): RevokeBox = + when (val discriminant = reader.readUByte()) { + 0 -> Permission.read(reader) + 1 -> Role.read(reader) + 2 -> RolePermission.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: RevokeBox) { + override fun write( + writer: ScaleCodecWriter, + instance: RevokeBox, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Permission.write(writer, instance as Permission) 1 -> Role.write(writer, instance as Role) 2 -> RolePermission.write(writer, instance as RolePermission) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RevokeOfPermissionAndAccount.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RevokeOfPermissionAndAccount.kt index 4c9ad2cb6..6ce4f77ec 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RevokeOfPermissionAndAccount.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RevokeOfPermissionAndAccount.kt @@ -3,10 +3,13 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException import kotlin.Unit @@ -18,24 +21,31 @@ import kotlin.Unit public data class RevokeOfPermissionAndAccount( public val `object`: Permission, public val destination: AccountId, -) { +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): RevokeOfPermissionAndAccount = try { - RevokeOfPermissionAndAccount( - Permission.read(reader), - AccountId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): RevokeOfPermissionAndAccount = + try { + RevokeOfPermissionAndAccount( + Permission.read(reader), + AccountId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: RevokeOfPermissionAndAccount): Unit = try { - Permission.write(writer, instance.`object`) - AccountId.write(writer, instance.destination) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: RevokeOfPermissionAndAccount, + ): Unit = + try { + Permission.write(writer, instance.`object`) + AccountId.write(writer, instance.destination) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RevokeOfPermissionAndRole.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RevokeOfPermissionAndRole.kt index 6fe6d70cd..167d8536e 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RevokeOfPermissionAndRole.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RevokeOfPermissionAndRole.kt @@ -3,10 +3,13 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException import kotlin.Unit @@ -18,24 +21,31 @@ import kotlin.Unit public data class RevokeOfPermissionAndRole( public val `object`: Permission, public val destination: RoleId, -) { +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): RevokeOfPermissionAndRole = try { - RevokeOfPermissionAndRole( - Permission.read(reader), - RoleId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): RevokeOfPermissionAndRole = + try { + RevokeOfPermissionAndRole( + Permission.read(reader), + RoleId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: RevokeOfPermissionAndRole): Unit = try { - Permission.write(writer, instance.`object`) - RoleId.write(writer, instance.destination) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: RevokeOfPermissionAndRole, + ): Unit = + try { + Permission.write(writer, instance.`object`) + RoleId.write(writer, instance.destination) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RevokeOfRoleIdAndAccount.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RevokeOfRoleIdAndAccount.kt index 7387e7dec..6ccad1349 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RevokeOfRoleIdAndAccount.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RevokeOfRoleIdAndAccount.kt @@ -3,10 +3,13 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException import kotlin.Unit @@ -18,24 +21,31 @@ import kotlin.Unit public data class RevokeOfRoleIdAndAccount( public val `object`: RoleId, public val destination: AccountId, -) { +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): RevokeOfRoleIdAndAccount = try { - RevokeOfRoleIdAndAccount( - RoleId.read(reader), - AccountId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): RevokeOfRoleIdAndAccount = + try { + RevokeOfRoleIdAndAccount( + RoleId.read(reader), + AccountId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: RevokeOfRoleIdAndAccount): Unit = try { - RoleId.write(writer, instance.`object`) - AccountId.write(writer, instance.destination) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: RevokeOfRoleIdAndAccount, + ): Unit = + try { + RoleId.write(writer, instance.`object`) + AccountId.write(writer, instance.destination) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Role.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Role.kt index 4356646b9..a947189ed 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Role.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Role.kt @@ -22,25 +22,31 @@ public data class Role( public val permissions: List, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): Role = try { - Role( - RoleId.read(reader), - reader.readVec(reader.readCompactInt()) { Permission.read(reader) }, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): Role = + try { + Role( + RoleId.read(reader), + reader.readVec(reader.readCompactInt()) { Permission.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: Role): Unit = try { - RoleId.write(writer, instance.id) - writer.writeCompact(instance.permissions.size) - instance.permissions.sortedWith( - Permission.comparator(), - ).forEach { value -> - Permission.write(writer, value) + override fun write( + writer: ScaleCodecWriter, + instance: Role, + ): Unit = + try { + RoleId.write(writer, instance.id) + writer.writeCompact(instance.permissions.size) + instance.permissions + .sortedWith( + Permission.comparator(), + ).forEach { value -> + Permission.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) } - } catch (ex: Exception) { - throw wrapException(ex) - } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RoleEvent.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RoleEvent.kt index aaba5e3b2..444e4a69f 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RoleEvent.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RoleEvent.kt @@ -36,22 +36,24 @@ public sealed class RoleEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RoleEvent.Created = try { - Created( - Role.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RoleEvent.Created = + try { + Created( + Role.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.RoleEvent.Created, - ): Unit = try { - Role.write(writer, instance.role) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + Role.write(writer, instance.role) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -68,22 +70,24 @@ public sealed class RoleEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RoleEvent.Deleted = try { - Deleted( - RoleId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RoleEvent.Deleted = + try { + Deleted( + RoleId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.RoleEvent.Deleted, - ): Unit = try { - RoleId.write(writer, instance.roleId) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + RoleId.write(writer, instance.roleId) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -100,22 +104,24 @@ public sealed class RoleEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 2 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RoleEvent.PermissionAdded = try { - PermissionAdded( - RolePermissionChanged.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RoleEvent.PermissionAdded = + try { + PermissionAdded( + RolePermissionChanged.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.RoleEvent.PermissionAdded, - ): Unit = try { - RolePermissionChanged.write(writer, instance.rolePermissionChanged) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + RolePermissionChanged.write(writer, instance.rolePermissionChanged) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -132,44 +138,49 @@ public sealed class RoleEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 3 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RoleEvent.PermissionRemoved = try { - PermissionRemoved( - RolePermissionChanged.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RoleEvent.PermissionRemoved = + try { + PermissionRemoved( + RolePermissionChanged.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.RoleEvent.PermissionRemoved, - ): Unit = try { - RolePermissionChanged.write(writer, instance.rolePermissionChanged) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + RolePermissionChanged.write(writer, instance.rolePermissionChanged) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): RoleEvent = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Created.read(reader) - 1 -> Deleted.read(reader) - 2 -> PermissionAdded.read(reader) - 3 -> PermissionRemoved.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + override fun read(reader: ScaleCodecReader): RoleEvent = + when (val discriminant = reader.readUByte()) { + 0 -> Created.read(reader) + 1 -> Deleted.read(reader) + 2 -> PermissionAdded.read(reader) + 3 -> PermissionRemoved.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: RoleEvent) { + override fun write( + writer: ScaleCodecWriter, + instance: RoleEvent, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Created.write(writer, instance as Created) 1 -> Deleted.write(writer, instance as Deleted) 2 -> PermissionAdded.write(writer, instance as PermissionAdded) 3 -> PermissionRemoved.write(writer, instance as PermissionRemoved) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RoleEventFilter.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RoleEventFilter.kt index 09e852602..0fb0e6910 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RoleEventFilter.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RoleEventFilter.kt @@ -21,20 +21,25 @@ public data class RoleEventFilter( public val eventSet: Long, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): RoleEventFilter = try { - RoleEventFilter( - reader.readNullable(RoleId) as RoleId?, - reader.readUint32(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): RoleEventFilter = + try { + RoleEventFilter( + reader.readNullable(RoleId) as RoleId?, + reader.readUint32(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: RoleEventFilter): Unit = try { - writer.writeNullable(RoleId, instance.idMatcher) - writer.writeUint32(instance.eventSet) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: RoleEventFilter, + ): Unit = + try { + writer.writeNullable(RoleId, instance.idMatcher) + writer.writeUint32(instance.eventSet) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RoleId.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RoleId.kt index 4de915b52..e8e2564a2 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RoleId.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RoleId.kt @@ -19,18 +19,23 @@ public data class RoleId( public val name: Name, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): RoleId = try { - RoleId( - Name.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): RoleId = + try { + RoleId( + Name.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: RoleId): Unit = try { - Name.write(writer, instance.name) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: RoleId, + ): Unit = + try { + Name.write(writer, instance.name) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RoleIdPredicateAtom.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RoleIdPredicateAtom.kt new file mode 100644 index 000000000..b5ea3f555 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RoleIdPredicateAtom.kt @@ -0,0 +1,78 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit + +/** + * RoleIdPredicateAtom + * + * Generated from 'RoleIdPredicateAtom' enum + */ +public sealed class RoleIdPredicateAtom : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Equals' variant + */ + public data class Equals( + public val roleId: RoleId, + ) : RoleIdPredicateAtom() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RoleIdPredicateAtom.Equals = + try { + Equals( + RoleId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.RoleIdPredicateAtom.Equals, + ): Unit = + try { + RoleId.write(writer, instance.roleId) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): RoleIdPredicateAtom = + when (val discriminant = reader.readUByte()) { + 0 -> Equals.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: RoleIdPredicateAtom, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Equals.write(writer, instance as Equals) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RoleIdPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RoleIdPredicateBox.kt deleted file mode 100644 index b135134c4..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RoleIdPredicateBox.kt +++ /dev/null @@ -1,107 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.ModelEnum -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Int -import kotlin.Unit - -/** - * RoleIdPredicateBox - * - * Generated from 'RoleIdPredicateBox' enum - */ -public sealed class RoleIdPredicateBox : ModelEnum { - /** - * @return Discriminator of variant in enum - */ - public abstract fun discriminant(): Int - - /** - * 'Equals' variant - */ - public data class Equals( - public val roleId: RoleId, - ) : RoleIdPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 0 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RoleIdPredicateBox.Equals = try { - Equals( - RoleId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.RoleIdPredicateBox.Equals, - ): Unit = try { - RoleId.write(writer, instance.roleId) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Name' variant - */ - public data class Name( - public val stringPredicateBox: StringPredicateBox, - ) : RoleIdPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 1 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RoleIdPredicateBox.Name = try { - Name( - StringPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.RoleIdPredicateBox.Name, - ): Unit = try { - StringPredicateBox.write(writer, instance.stringPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): RoleIdPredicateBox = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Equals.read(reader) - 1 -> Name.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: RoleIdPredicateBox) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 0 -> Equals.write(writer, instance as Equals) - 1 -> Name.write(writer, instance as Name) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RoleIdProjectionOfPredicateMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RoleIdProjectionOfPredicateMarker.kt new file mode 100644 index 000000000..3a834b4fc --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RoleIdProjectionOfPredicateMarker.kt @@ -0,0 +1,116 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit + +/** + * RoleIdProjectionOfPredicateMarker + * + * Generated from 'RoleIdProjectionOfPredicateMarker' enum + */ +public sealed class RoleIdProjectionOfPredicateMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val roleIdPredicateAtom: RoleIdPredicateAtom, + ) : RoleIdProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RoleIdProjectionOfPredicateMarker.Atom = + try { + Atom( + RoleIdPredicateAtom.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.RoleIdProjectionOfPredicateMarker.Atom, + ): Unit = + try { + RoleIdPredicateAtom.write(writer, instance.roleIdPredicateAtom) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Name' variant + */ + public data class Name( + public val nameProjectionOfPredicateMarker: NameProjectionOfPredicateMarker, + ) : RoleIdProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RoleIdProjectionOfPredicateMarker.Name = + try { + Name( + NameProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.RoleIdProjectionOfPredicateMarker.Name, + ): Unit = + try { + NameProjectionOfPredicateMarker.write(writer, instance.nameProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): RoleIdProjectionOfPredicateMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Name.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: RoleIdProjectionOfPredicateMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Name.write(writer, instance as Name) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RoleIdProjectionOfSelectorMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RoleIdProjectionOfSelectorMarker.kt new file mode 100644 index 000000000..4fb80f3b8 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RoleIdProjectionOfSelectorMarker.kt @@ -0,0 +1,136 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Any +import kotlin.Boolean +import kotlin.Int +import kotlin.Unit + +/** + * RoleIdProjectionOfSelectorMarker + * + * Generated from 'RoleIdProjectionOfSelectorMarker' enum + */ +public sealed class RoleIdProjectionOfSelectorMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + override fun equals(other: Any?): Boolean = + when (this) { + is Atom -> Atom.equals(this, other) + else -> super.equals(other) + } + + override fun hashCode(): Int = + when (this) { + is Atom -> Atom.hashCode() + else -> super.hashCode() + } + + /** + * 'Atom' variant + */ + public class Atom : RoleIdProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RoleIdProjectionOfSelectorMarker.Atom = + try { + Atom() + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.RoleIdProjectionOfSelectorMarker.Atom, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.RoleIdProjectionOfSelectorMarker.Atom, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".RoleIdProjectionOfSelectorMarker.Atom".hashCode() + } + } + + /** + * 'Name' variant + */ + public data class Name( + public val nameProjectionOfSelectorMarker: NameProjectionOfSelectorMarker, + ) : RoleIdProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RoleIdProjectionOfSelectorMarker.Name = + try { + Name( + NameProjectionOfSelectorMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.RoleIdProjectionOfSelectorMarker.Name, + ): Unit = + try { + NameProjectionOfSelectorMarker.write(writer, instance.nameProjectionOfSelectorMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): RoleIdProjectionOfSelectorMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Name.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: RoleIdProjectionOfSelectorMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Name.write(writer, instance as Name) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RolePermissionChanged.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RolePermissionChanged.kt index 035ef8d14..731d1f81b 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RolePermissionChanged.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RolePermissionChanged.kt @@ -20,20 +20,25 @@ public data class RolePermissionChanged( public val permission: Permission, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): RolePermissionChanged = try { - RolePermissionChanged( - RoleId.read(reader), - Permission.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): RolePermissionChanged = + try { + RolePermissionChanged( + RoleId.read(reader), + Permission.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: RolePermissionChanged): Unit = try { - RoleId.write(writer, instance.role) - Permission.write(writer, instance.permission) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: RolePermissionChanged, + ): Unit = + try { + RoleId.write(writer, instance.role) + Permission.write(writer, instance.permission) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetValuePredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RolePredicateAtom.kt similarity index 51% rename from modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetValuePredicateBox.kt rename to modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RolePredicateAtom.kt index b6746406a..5d5050e1e 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/AssetValuePredicateBox.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RolePredicateAtom.kt @@ -11,27 +11,30 @@ import jp.co.soramitsu.iroha2.codec.ScaleWriter import kotlin.Int /** - * AssetValuePredicateBox + * RolePredicateAtom * - * Generated from 'AssetValuePredicateBox' enum + * Generated from 'RolePredicateAtom' enum */ -public sealed class AssetValuePredicateBox : ModelEnum { +public sealed class RolePredicateAtom : ModelEnum { /** * @return Discriminator of variant in enum */ public abstract fun discriminant(): Int - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): AssetValuePredicateBox = when ( - val discriminant = - reader.readUByte() - ) { - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): RolePredicateAtom = + when (val discriminant = reader.readUByte()) { + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: AssetValuePredicateBox) { + override fun write( + writer: ScaleCodecWriter, + instance: RolePredicateAtom, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RolePredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RolePredicateBox.kt deleted file mode 100644 index a7cbdd9a5..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RolePredicateBox.kt +++ /dev/null @@ -1,73 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.ModelEnum -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Int -import kotlin.Unit - -/** - * RolePredicateBox - * - * Generated from 'RolePredicateBox' enum - */ -public sealed class RolePredicateBox : ModelEnum { - /** - * @return Discriminator of variant in enum - */ - public abstract fun discriminant(): Int - - /** - * 'Id' variant - */ - public data class Id( - public val roleIdPredicateBox: RoleIdPredicateBox, - ) : RolePredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 0 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RolePredicateBox.Id = try { - Id( - RoleIdPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.RolePredicateBox.Id, - ): Unit = try { - RoleIdPredicateBox.write(writer, instance.roleIdPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): RolePredicateBox = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Id.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: RolePredicateBox) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 0 -> Id.write(writer, instance as Id) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RoleProjectionOfPredicateMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RoleProjectionOfPredicateMarker.kt new file mode 100644 index 000000000..7742c93b5 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RoleProjectionOfPredicateMarker.kt @@ -0,0 +1,116 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit + +/** + * RoleProjectionOfPredicateMarker + * + * Generated from 'RoleProjectionOfPredicateMarker' enum + */ +public sealed class RoleProjectionOfPredicateMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val rolePredicateAtom: RolePredicateAtom, + ) : RoleProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RoleProjectionOfPredicateMarker.Atom = + try { + Atom( + RolePredicateAtom.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.RoleProjectionOfPredicateMarker.Atom, + ): Unit = + try { + RolePredicateAtom.write(writer, instance.rolePredicateAtom) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Id' variant + */ + public data class Id( + public val roleIdProjectionOfPredicateMarker: RoleIdProjectionOfPredicateMarker, + ) : RoleProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RoleProjectionOfPredicateMarker.Id = + try { + Id( + RoleIdProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.RoleProjectionOfPredicateMarker.Id, + ): Unit = + try { + RoleIdProjectionOfPredicateMarker.write(writer, instance.roleIdProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): RoleProjectionOfPredicateMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Id.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: RoleProjectionOfPredicateMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Id.write(writer, instance as Id) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RoleProjectionOfSelectorMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RoleProjectionOfSelectorMarker.kt new file mode 100644 index 000000000..f55f53e75 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/RoleProjectionOfSelectorMarker.kt @@ -0,0 +1,136 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Any +import kotlin.Boolean +import kotlin.Int +import kotlin.Unit + +/** + * RoleProjectionOfSelectorMarker + * + * Generated from 'RoleProjectionOfSelectorMarker' enum + */ +public sealed class RoleProjectionOfSelectorMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + override fun equals(other: Any?): Boolean = + when (this) { + is Atom -> Atom.equals(this, other) + else -> super.equals(other) + } + + override fun hashCode(): Int = + when (this) { + is Atom -> Atom.hashCode() + else -> super.hashCode() + } + + /** + * 'Atom' variant + */ + public class Atom : RoleProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RoleProjectionOfSelectorMarker.Atom = + try { + Atom() + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.RoleProjectionOfSelectorMarker.Atom, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.RoleProjectionOfSelectorMarker.Atom, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".RoleProjectionOfSelectorMarker.Atom".hashCode() + } + } + + /** + * 'Id' variant + */ + public data class Id( + public val roleIdProjectionOfSelectorMarker: RoleIdProjectionOfSelectorMarker, + ) : RoleProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.RoleProjectionOfSelectorMarker.Id = + try { + Id( + RoleIdProjectionOfSelectorMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.RoleProjectionOfSelectorMarker.Id, + ): Unit = + try { + RoleIdProjectionOfSelectorMarker.write(writer, instance.roleIdProjectionOfSelectorMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): RoleProjectionOfSelectorMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Id.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: RoleProjectionOfSelectorMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Id.write(writer, instance as Id) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Schedule.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Schedule.kt index 32d3d9d0a..b38a5ad91 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Schedule.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Schedule.kt @@ -21,20 +21,25 @@ public data class Schedule( public val periodMs: BigInteger? = null, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): Schedule = try { - Schedule( - reader.readUint64(), - reader.readNullable(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): Schedule = + try { + Schedule( + reader.readUint64(), + reader.readNullable(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: Schedule): Unit = try { - writer.writeUint64(instance.startMs) - writer.writeNullable(instance.periodMs) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: Schedule, + ): Unit = + try { + writer.writeUint64(instance.startMs) + writer.writeNullable(instance.periodMs) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfAccount.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfAccount.kt new file mode 100644 index 000000000..e26604694 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfAccount.kt @@ -0,0 +1,47 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit +import kotlin.collections.List + +/** + * SelectorTupleOfAccount + * + * Generated from 'SelectorTupleOfAccount' regular structure + */ +public data class SelectorTupleOfAccount( + public val vecOfAccountProjectionOfSelectorMarker: List, +) { + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): SelectorTupleOfAccount = + try { + SelectorTupleOfAccount( + reader.readVec(reader.readCompactInt()) { AccountProjectionOfSelectorMarker.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: SelectorTupleOfAccount, + ): Unit = + try { + writer.writeCompact(instance.vecOfAccountProjectionOfSelectorMarker.size) + instance.vecOfAccountProjectionOfSelectorMarker.forEach { value -> + AccountProjectionOfSelectorMarker.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfAsset.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfAsset.kt new file mode 100644 index 000000000..b11a667f5 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfAsset.kt @@ -0,0 +1,45 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit +import kotlin.collections.List + +/** + * SelectorTupleOfAsset + * + * Generated from 'SelectorTupleOfAsset' regular structure + */ +public data class SelectorTupleOfAsset( + public val vecOfAssetProjectionOfSelectorMarker: List, +) { + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): SelectorTupleOfAsset = + try { + SelectorTupleOfAsset( + reader.readVec(reader.readCompactInt()) { AssetProjectionOfSelectorMarker.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: SelectorTupleOfAsset, + ): Unit = + try { + writer.writeCompact(instance.vecOfAssetProjectionOfSelectorMarker.size) + instance.vecOfAssetProjectionOfSelectorMarker.forEach { value -> + AssetProjectionOfSelectorMarker.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfAssetDefinition.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfAssetDefinition.kt new file mode 100644 index 000000000..f168b11bf --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfAssetDefinition.kt @@ -0,0 +1,47 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit +import kotlin.collections.List + +/** + * SelectorTupleOfAssetDefinition + * + * Generated from 'SelectorTupleOfAssetDefinition' regular structure + */ +public data class SelectorTupleOfAssetDefinition( + public val vecOfAssetDefinitionProjectionOfSelectorMarker: List, +) { + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): SelectorTupleOfAssetDefinition = + try { + SelectorTupleOfAssetDefinition( + reader.readVec(reader.readCompactInt()) { AssetDefinitionProjectionOfSelectorMarker.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: SelectorTupleOfAssetDefinition, + ): Unit = + try { + writer.writeCompact(instance.vecOfAssetDefinitionProjectionOfSelectorMarker.size) + instance.vecOfAssetDefinitionProjectionOfSelectorMarker.forEach { value -> + AssetDefinitionProjectionOfSelectorMarker.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfBlockHeader.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfBlockHeader.kt new file mode 100644 index 000000000..435eb170a --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfBlockHeader.kt @@ -0,0 +1,47 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit +import kotlin.collections.List + +/** + * SelectorTupleOfBlockHeader + * + * Generated from 'SelectorTupleOfBlockHeader' regular structure + */ +public data class SelectorTupleOfBlockHeader( + public val vecOfBlockHeaderProjectionOfSelectorMarker: List, +) { + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): SelectorTupleOfBlockHeader = + try { + SelectorTupleOfBlockHeader( + reader.readVec(reader.readCompactInt()) { BlockHeaderProjectionOfSelectorMarker.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: SelectorTupleOfBlockHeader, + ): Unit = + try { + writer.writeCompact(instance.vecOfBlockHeaderProjectionOfSelectorMarker.size) + instance.vecOfBlockHeaderProjectionOfSelectorMarker.forEach { value -> + BlockHeaderProjectionOfSelectorMarker.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfCommittedTransaction.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfCommittedTransaction.kt new file mode 100644 index 000000000..d86f1d233 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfCommittedTransaction.kt @@ -0,0 +1,47 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit +import kotlin.collections.List + +/** + * SelectorTupleOfCommittedTransaction + * + * Generated from 'SelectorTupleOfCommittedTransaction' regular structure + */ +public data class SelectorTupleOfCommittedTransaction( + public val vecOfCommittedTransactionProjectionOfSelectorMarker: List, +) { + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): SelectorTupleOfCommittedTransaction = + try { + SelectorTupleOfCommittedTransaction( + reader.readVec(reader.readCompactInt()) { CommittedTransactionProjectionOfSelectorMarker.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: SelectorTupleOfCommittedTransaction, + ): Unit = + try { + writer.writeCompact(instance.vecOfCommittedTransactionProjectionOfSelectorMarker.size) + instance.vecOfCommittedTransactionProjectionOfSelectorMarker.forEach { value -> + CommittedTransactionProjectionOfSelectorMarker.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfDomain.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfDomain.kt new file mode 100644 index 000000000..7342b5237 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfDomain.kt @@ -0,0 +1,45 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit +import kotlin.collections.List + +/** + * SelectorTupleOfDomain + * + * Generated from 'SelectorTupleOfDomain' regular structure + */ +public data class SelectorTupleOfDomain( + public val vecOfDomainProjectionOfSelectorMarker: List, +) { + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): SelectorTupleOfDomain = + try { + SelectorTupleOfDomain( + reader.readVec(reader.readCompactInt()) { DomainProjectionOfSelectorMarker.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: SelectorTupleOfDomain, + ): Unit = + try { + writer.writeCompact(instance.vecOfDomainProjectionOfSelectorMarker.size) + instance.vecOfDomainProjectionOfSelectorMarker.forEach { value -> + DomainProjectionOfSelectorMarker.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfPeerId.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfPeerId.kt new file mode 100644 index 000000000..c107edb95 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfPeerId.kt @@ -0,0 +1,45 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit +import kotlin.collections.List + +/** + * SelectorTupleOfPeerId + * + * Generated from 'SelectorTupleOfPeerId' regular structure + */ +public data class SelectorTupleOfPeerId( + public val vecOfPeerIdProjectionOfSelectorMarker: List, +) { + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): SelectorTupleOfPeerId = + try { + SelectorTupleOfPeerId( + reader.readVec(reader.readCompactInt()) { PeerIdProjectionOfSelectorMarker.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: SelectorTupleOfPeerId, + ): Unit = + try { + writer.writeCompact(instance.vecOfPeerIdProjectionOfSelectorMarker.size) + instance.vecOfPeerIdProjectionOfSelectorMarker.forEach { value -> + PeerIdProjectionOfSelectorMarker.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfPermission.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfPermission.kt new file mode 100644 index 000000000..646aec579 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfPermission.kt @@ -0,0 +1,47 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit +import kotlin.collections.List + +/** + * SelectorTupleOfPermission + * + * Generated from 'SelectorTupleOfPermission' regular structure + */ +public data class SelectorTupleOfPermission( + public val vecOfPermissionProjectionOfSelectorMarker: List, +) { + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): SelectorTupleOfPermission = + try { + SelectorTupleOfPermission( + reader.readVec(reader.readCompactInt()) { PermissionProjectionOfSelectorMarker.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: SelectorTupleOfPermission, + ): Unit = + try { + writer.writeCompact(instance.vecOfPermissionProjectionOfSelectorMarker.size) + instance.vecOfPermissionProjectionOfSelectorMarker.forEach { value -> + PermissionProjectionOfSelectorMarker.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfRole.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfRole.kt new file mode 100644 index 000000000..332a76777 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfRole.kt @@ -0,0 +1,45 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit +import kotlin.collections.List + +/** + * SelectorTupleOfRole + * + * Generated from 'SelectorTupleOfRole' regular structure + */ +public data class SelectorTupleOfRole( + public val vecOfRoleProjectionOfSelectorMarker: List, +) { + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): SelectorTupleOfRole = + try { + SelectorTupleOfRole( + reader.readVec(reader.readCompactInt()) { RoleProjectionOfSelectorMarker.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: SelectorTupleOfRole, + ): Unit = + try { + writer.writeCompact(instance.vecOfRoleProjectionOfSelectorMarker.size) + instance.vecOfRoleProjectionOfSelectorMarker.forEach { value -> + RoleProjectionOfSelectorMarker.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfRoleId.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfRoleId.kt new file mode 100644 index 000000000..ce3f0f5c8 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfRoleId.kt @@ -0,0 +1,45 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit +import kotlin.collections.List + +/** + * SelectorTupleOfRoleId + * + * Generated from 'SelectorTupleOfRoleId' regular structure + */ +public data class SelectorTupleOfRoleId( + public val vecOfRoleIdProjectionOfSelectorMarker: List, +) { + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): SelectorTupleOfRoleId = + try { + SelectorTupleOfRoleId( + reader.readVec(reader.readCompactInt()) { RoleIdProjectionOfSelectorMarker.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: SelectorTupleOfRoleId, + ): Unit = + try { + writer.writeCompact(instance.vecOfRoleIdProjectionOfSelectorMarker.size) + instance.vecOfRoleIdProjectionOfSelectorMarker.forEach { value -> + RoleIdProjectionOfSelectorMarker.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfSignedBlock.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfSignedBlock.kt new file mode 100644 index 000000000..517f06f56 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfSignedBlock.kt @@ -0,0 +1,47 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit +import kotlin.collections.List + +/** + * SelectorTupleOfSignedBlock + * + * Generated from 'SelectorTupleOfSignedBlock' regular structure + */ +public data class SelectorTupleOfSignedBlock( + public val vecOfSignedBlockProjectionOfSelectorMarker: List, +) { + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): SelectorTupleOfSignedBlock = + try { + SelectorTupleOfSignedBlock( + reader.readVec(reader.readCompactInt()) { SignedBlockProjectionOfSelectorMarker.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: SelectorTupleOfSignedBlock, + ): Unit = + try { + writer.writeCompact(instance.vecOfSignedBlockProjectionOfSelectorMarker.size) + instance.vecOfSignedBlockProjectionOfSelectorMarker.forEach { value -> + SignedBlockProjectionOfSelectorMarker.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfTrigger.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfTrigger.kt new file mode 100644 index 000000000..d49da503a --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfTrigger.kt @@ -0,0 +1,47 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit +import kotlin.collections.List + +/** + * SelectorTupleOfTrigger + * + * Generated from 'SelectorTupleOfTrigger' regular structure + */ +public data class SelectorTupleOfTrigger( + public val vecOfTriggerProjectionOfSelectorMarker: List, +) { + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): SelectorTupleOfTrigger = + try { + SelectorTupleOfTrigger( + reader.readVec(reader.readCompactInt()) { TriggerProjectionOfSelectorMarker.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: SelectorTupleOfTrigger, + ): Unit = + try { + writer.writeCompact(instance.vecOfTriggerProjectionOfSelectorMarker.size) + instance.vecOfTriggerProjectionOfSelectorMarker.forEach { value -> + TriggerProjectionOfSelectorMarker.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfTriggerId.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfTriggerId.kt new file mode 100644 index 000000000..ac31b4219 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SelectorTupleOfTriggerId.kt @@ -0,0 +1,47 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Unit +import kotlin.collections.List + +/** + * SelectorTupleOfTriggerId + * + * Generated from 'SelectorTupleOfTriggerId' regular structure + */ +public data class SelectorTupleOfTriggerId( + public val vecOfTriggerIdProjectionOfSelectorMarker: List, +) { + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): SelectorTupleOfTriggerId = + try { + SelectorTupleOfTriggerId( + reader.readVec(reader.readCompactInt()) { TriggerIdProjectionOfSelectorMarker.read(reader) }, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: SelectorTupleOfTriggerId, + ): Unit = + try { + writer.writeCompact(instance.vecOfTriggerIdProjectionOfSelectorMarker.size) + instance.vecOfTriggerIdProjectionOfSelectorMarker.forEach { value -> + TriggerIdProjectionOfSelectorMarker.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SemiIntervalOfNumeric.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SemiIntervalOfNumeric.kt deleted file mode 100644 index 1a07dae75..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SemiIntervalOfNumeric.kt +++ /dev/null @@ -1,39 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * SemiIntervalOfNumeric - * - * Generated from 'SemiIntervalOfNumeric' regular structure - */ -public data class SemiIntervalOfNumeric( - public val start: Numeric, - public val limit: Numeric, -) { - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): SemiIntervalOfNumeric = try { - SemiIntervalOfNumeric( - Numeric.read(reader), - Numeric.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: SemiIntervalOfNumeric): Unit = try { - Numeric.write(writer, instance.start) - Numeric.write(writer, instance.limit) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SemiIntervalOfu128.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SemiIntervalOfu128.kt deleted file mode 100644 index 92df5d35e..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SemiIntervalOfu128.kt +++ /dev/null @@ -1,40 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import java.math.BigInteger -import kotlin.Unit - -/** - * SemiIntervalOfu128 - * - * Generated from 'SemiIntervalOfu128' regular structure - */ -public data class SemiIntervalOfu128( - public val start: BigInteger, - public val limit: BigInteger, -) { - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): SemiIntervalOfu128 = try { - SemiIntervalOfu128( - reader.readUint128(), - reader.readUint128(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: SemiIntervalOfu128): Unit = try { - writer.writeUint128(instance.start) - writer.writeUint128(instance.limit) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SemiRange.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SemiRange.kt deleted file mode 100644 index c562ab382..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SemiRange.kt +++ /dev/null @@ -1,73 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.ModelEnum -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Int -import kotlin.Unit - -/** - * SemiRange - * - * Generated from 'SemiRange' enum - */ -public sealed class SemiRange : ModelEnum { - /** - * @return Discriminator of variant in enum - */ - public abstract fun discriminant(): Int - - /** - * 'Numeric' variant - */ - public data class Numeric( - public val semiIntervalOfNumeric: SemiIntervalOfNumeric, - ) : SemiRange() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 0 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SemiRange.Numeric = try { - Numeric( - SemiIntervalOfNumeric.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.SemiRange.Numeric, - ): Unit = try { - SemiIntervalOfNumeric.write(writer, instance.semiIntervalOfNumeric) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): SemiRange = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Numeric.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: SemiRange) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 0 -> Numeric.write(writer, instance as Numeric) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SetKeyValueBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SetKeyValueBox.kt index c19a76f64..c8c4609fa 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SetKeyValueBox.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SetKeyValueBox.kt @@ -36,22 +36,24 @@ public sealed class SetKeyValueBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SetKeyValueBox.Domain = try { - Domain( - SetKeyValueOfDomain.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SetKeyValueBox.Domain = + try { + Domain( + SetKeyValueOfDomain.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.SetKeyValueBox.Domain, - ): Unit = try { - SetKeyValueOfDomain.write(writer, instance.setKeyValueOfDomain) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + SetKeyValueOfDomain.write(writer, instance.setKeyValueOfDomain) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -68,22 +70,24 @@ public sealed class SetKeyValueBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SetKeyValueBox.Account = try { - Account( - SetKeyValueOfAccount.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SetKeyValueBox.Account = + try { + Account( + SetKeyValueOfAccount.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.SetKeyValueBox.Account, - ): Unit = try { - SetKeyValueOfAccount.write(writer, instance.setKeyValueOfAccount) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + SetKeyValueOfAccount.write(writer, instance.setKeyValueOfAccount) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -100,22 +104,24 @@ public sealed class SetKeyValueBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 2 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SetKeyValueBox.AssetDefinition = try { - AssetDefinition( - SetKeyValueOfAssetDefinition.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SetKeyValueBox.AssetDefinition = + try { + AssetDefinition( + SetKeyValueOfAssetDefinition.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.SetKeyValueBox.AssetDefinition, - ): Unit = try { - SetKeyValueOfAssetDefinition.write(writer, instance.setKeyValueOfAssetDefinition) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + SetKeyValueOfAssetDefinition.write(writer, instance.setKeyValueOfAssetDefinition) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -132,22 +138,24 @@ public sealed class SetKeyValueBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 3 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SetKeyValueBox.Asset = try { - Asset( - SetKeyValueOfAsset.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SetKeyValueBox.Asset = + try { + Asset( + SetKeyValueOfAsset.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.SetKeyValueBox.Asset, - ): Unit = try { - SetKeyValueOfAsset.write(writer, instance.setKeyValueOfAsset) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + SetKeyValueOfAsset.write(writer, instance.setKeyValueOfAsset) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -164,38 +172,42 @@ public sealed class SetKeyValueBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 4 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SetKeyValueBox.Trigger = try { - Trigger( - SetKeyValueOfTrigger.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SetKeyValueBox.Trigger = + try { + Trigger( + SetKeyValueOfTrigger.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.SetKeyValueBox.Trigger, - ): Unit = try { - SetKeyValueOfTrigger.write(writer, instance.setKeyValueOfTrigger) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + SetKeyValueOfTrigger.write(writer, instance.setKeyValueOfTrigger) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): SetKeyValueBox = when ( - val discriminant = - reader.readUByte() + override fun read(reader: ScaleCodecReader): SetKeyValueBox = + when (val discriminant = reader.readUByte()) { + 0 -> Domain.read(reader) + 1 -> Account.read(reader) + 2 -> AssetDefinition.read(reader) + 3 -> Asset.read(reader) + 4 -> Trigger.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: SetKeyValueBox, ) { - 0 -> Domain.read(reader) - 1 -> Account.read(reader) - 2 -> AssetDefinition.read(reader) - 3 -> Asset.read(reader) - 4 -> Trigger.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: SetKeyValueBox) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Domain.write(writer, instance as Domain) @@ -203,7 +215,8 @@ public sealed class SetKeyValueBox : ModelEnum { 2 -> AssetDefinition.write(writer, instance as AssetDefinition) 3 -> Asset.write(writer, instance as Asset) 4 -> Trigger.write(writer, instance as Trigger) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SetKeyValueOfAccount.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SetKeyValueOfAccount.kt index efad75449..e32223741 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SetKeyValueOfAccount.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SetKeyValueOfAccount.kt @@ -3,12 +3,14 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException -import kotlin.String import kotlin.Unit /** @@ -19,25 +21,32 @@ import kotlin.Unit public data class SetKeyValueOfAccount( public val `object`: AccountId, public val key: Name, - public val `value`: String, -) { + public val `value`: Json, +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): SetKeyValueOfAccount = try { - SetKeyValueOfAccount( - AccountId.read(reader), - Name.read(reader), - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): SetKeyValueOfAccount = + try { + SetKeyValueOfAccount( + AccountId.read(reader), + Name.read(reader), + Json.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: SetKeyValueOfAccount): Unit = try { - AccountId.write(writer, instance.`object`) - Name.write(writer, instance.key) - writer.writeAsList(instance.`value`.toByteArray(Charsets.UTF_8)) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: SetKeyValueOfAccount, + ): Unit = + try { + AccountId.write(writer, instance.`object`) + Name.write(writer, instance.key) + Json.write(writer, instance.`value`) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SetKeyValueOfAsset.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SetKeyValueOfAsset.kt index 2320c7fb3..1e18b21e9 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SetKeyValueOfAsset.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SetKeyValueOfAsset.kt @@ -3,12 +3,14 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException -import kotlin.String import kotlin.Unit /** @@ -19,25 +21,32 @@ import kotlin.Unit public data class SetKeyValueOfAsset( public val `object`: AssetId, public val key: Name, - public val `value`: String, -) { + public val `value`: Json, +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): SetKeyValueOfAsset = try { - SetKeyValueOfAsset( - AssetId.read(reader), - Name.read(reader), - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): SetKeyValueOfAsset = + try { + SetKeyValueOfAsset( + AssetId.read(reader), + Name.read(reader), + Json.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: SetKeyValueOfAsset): Unit = try { - AssetId.write(writer, instance.`object`) - Name.write(writer, instance.key) - writer.writeAsList(instance.`value`.toByteArray(Charsets.UTF_8)) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: SetKeyValueOfAsset, + ): Unit = + try { + AssetId.write(writer, instance.`object`) + Name.write(writer, instance.key) + Json.write(writer, instance.`value`) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SetKeyValueOfAssetDefinition.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SetKeyValueOfAssetDefinition.kt index eb8709d8a..37d4af12e 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SetKeyValueOfAssetDefinition.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SetKeyValueOfAssetDefinition.kt @@ -3,12 +3,14 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException -import kotlin.String import kotlin.Unit /** @@ -19,27 +21,34 @@ import kotlin.Unit public data class SetKeyValueOfAssetDefinition( public val `object`: AssetDefinitionId, public val key: Name, - public val `value`: String, -) { + public val `value`: Json, +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): SetKeyValueOfAssetDefinition = try { - SetKeyValueOfAssetDefinition( - AssetDefinitionId.read(reader), - Name.read(reader), - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): SetKeyValueOfAssetDefinition = + try { + SetKeyValueOfAssetDefinition( + AssetDefinitionId.read(reader), + Name.read(reader), + Json.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: SetKeyValueOfAssetDefinition): Unit = try { - AssetDefinitionId.write(writer, instance.`object`) - Name.write(writer, instance.key) - writer.writeAsList(instance.`value`.toByteArray(Charsets.UTF_8)) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: SetKeyValueOfAssetDefinition, + ): Unit = + try { + AssetDefinitionId.write(writer, instance.`object`) + Name.write(writer, instance.key) + Json.write(writer, instance.`value`) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SetKeyValueOfDomain.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SetKeyValueOfDomain.kt index 10db30b74..69f7b811b 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SetKeyValueOfDomain.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SetKeyValueOfDomain.kt @@ -3,12 +3,14 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException -import kotlin.String import kotlin.Unit /** @@ -19,25 +21,32 @@ import kotlin.Unit public data class SetKeyValueOfDomain( public val `object`: DomainId, public val key: Name, - public val `value`: String, -) { + public val `value`: Json, +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): SetKeyValueOfDomain = try { - SetKeyValueOfDomain( - DomainId.read(reader), - Name.read(reader), - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): SetKeyValueOfDomain = + try { + SetKeyValueOfDomain( + DomainId.read(reader), + Name.read(reader), + Json.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: SetKeyValueOfDomain): Unit = try { - DomainId.write(writer, instance.`object`) - Name.write(writer, instance.key) - writer.writeAsList(instance.`value`.toByteArray(Charsets.UTF_8)) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: SetKeyValueOfDomain, + ): Unit = + try { + DomainId.write(writer, instance.`object`) + Name.write(writer, instance.key) + Json.write(writer, instance.`value`) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SetKeyValueOfTrigger.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SetKeyValueOfTrigger.kt index 4fdf66491..e3c07a479 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SetKeyValueOfTrigger.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SetKeyValueOfTrigger.kt @@ -3,12 +3,14 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException -import kotlin.String import kotlin.Unit /** @@ -19,25 +21,32 @@ import kotlin.Unit public data class SetKeyValueOfTrigger( public val `object`: TriggerId, public val key: Name, - public val `value`: String, -) { + public val `value`: Json, +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): SetKeyValueOfTrigger = try { - SetKeyValueOfTrigger( - TriggerId.read(reader), - Name.read(reader), - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): SetKeyValueOfTrigger = + try { + SetKeyValueOfTrigger( + TriggerId.read(reader), + Name.read(reader), + Json.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: SetKeyValueOfTrigger): Unit = try { - TriggerId.write(writer, instance.`object`) - Name.write(writer, instance.key) - writer.writeAsList(instance.`value`.toByteArray(Charsets.UTF_8)) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: SetKeyValueOfTrigger, + ): Unit = + try { + TriggerId.write(writer, instance.`object`) + Name.write(writer, instance.key) + Json.write(writer, instance.`value`) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SetParameter.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SetParameter.kt index 6c4bf13ac..927e3d08d 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SetParameter.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SetParameter.kt @@ -3,10 +3,13 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException import kotlin.Unit @@ -17,20 +20,27 @@ import kotlin.Unit */ public data class SetParameter( public val parameter: Parameter, -) { +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): SetParameter = try { - SetParameter( - Parameter.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): SetParameter = + try { + SetParameter( + Parameter.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: SetParameter): Unit = try { - Parameter.write(writer, instance.parameter) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: SetParameter, + ): Unit = + try { + Parameter.write(writer, instance.parameter) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Signature.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Signature.kt index 0a4d8663c..bce52915f 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Signature.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Signature.kt @@ -32,18 +32,23 @@ public data class Signature( override fun hashCode(): Int = payload.contentHashCode() public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): Signature = try { - Signature( - reader.readByteArray(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): Signature = + try { + Signature( + reader.readByteArray(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: Signature): Unit = try { - writer.writeAsList(instance.payload) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: Signature, + ): Unit = + try { + writer.writeAsList(instance.payload) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignatureOf.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignatureOf.kt index 20e1027d8..125230803 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignatureOf.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignatureOf.kt @@ -20,18 +20,23 @@ public data class SignatureOf( public val signature: Signature, ) { public companion object : ScaleReader>, ScaleWriter> { - override fun read(reader: ScaleCodecReader): SignatureOf = try { - SignatureOf( - Signature.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): SignatureOf = + try { + SignatureOf( + Signature.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: SignatureOf): Unit = try { - Signature.write(writer, instance.signature) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: SignatureOf, + ): Unit = + try { + Signature.write(writer, instance.signature) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedBlock.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedBlock.kt index 78e399da4..cabaae0ce 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedBlock.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedBlock.kt @@ -48,27 +48,31 @@ public sealed class SignedBlock : ModelEnum { override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.SignedBlock.V1, - ): Unit = try { - SignedBlockV1.write(writer, instance.signedBlockV1) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + SignedBlockV1.write(writer, instance.signedBlockV1) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): SignedBlock = when ( - val discriminant = - reader.readUByte() - ) { - 1 -> V1.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + override fun read(reader: ScaleCodecReader): SignedBlock = + when (val discriminant = reader.readUByte()) { + 1 -> V1.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: SignedBlock) { + override fun write( + writer: ScaleCodecWriter, + instance: SignedBlock, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 1 -> V1.write(writer, instance as V1) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedBlockPredicateAtom.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedBlockPredicateAtom.kt new file mode 100644 index 000000000..0dcd217b5 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedBlockPredicateAtom.kt @@ -0,0 +1,42 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import kotlin.Int + +/** + * SignedBlockPredicateAtom + * + * Generated from 'SignedBlockPredicateAtom' enum + */ +public sealed class SignedBlockPredicateAtom : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): SignedBlockPredicateAtom = + when (val discriminant = reader.readUByte()) { + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: SignedBlockPredicateAtom, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedBlockPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedBlockPredicateBox.kt deleted file mode 100644 index 57b480932..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedBlockPredicateBox.kt +++ /dev/null @@ -1,75 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.ModelEnum -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Int -import kotlin.Unit - -/** - * SignedBlockPredicateBox - * - * Generated from 'SignedBlockPredicateBox' enum - */ -public sealed class SignedBlockPredicateBox : ModelEnum { - /** - * @return Discriminator of variant in enum - */ - public abstract fun discriminant(): Int - - /** - * 'Header' variant - */ - public data class Header( - public val blockHeaderPredicateBox: BlockHeaderPredicateBox, - ) : SignedBlockPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 0 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SignedBlockPredicateBox.Header = try { - Header( - BlockHeaderPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.SignedBlockPredicateBox.Header, - ): Unit = try { - BlockHeaderPredicateBox.write(writer, instance.blockHeaderPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): SignedBlockPredicateBox = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Header.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: SignedBlockPredicateBox) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 0 -> Header.write(writer, instance as Header) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedBlockProjectionOfPredicateMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedBlockProjectionOfPredicateMarker.kt new file mode 100644 index 000000000..bd7a73f55 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedBlockProjectionOfPredicateMarker.kt @@ -0,0 +1,116 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit + +/** + * SignedBlockProjectionOfPredicateMarker + * + * Generated from 'SignedBlockProjectionOfPredicateMarker' enum + */ +public sealed class SignedBlockProjectionOfPredicateMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val signedBlockPredicateAtom: SignedBlockPredicateAtom, + ) : SignedBlockProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SignedBlockProjectionOfPredicateMarker.Atom = + try { + Atom( + SignedBlockPredicateAtom.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.SignedBlockProjectionOfPredicateMarker.Atom, + ): Unit = + try { + SignedBlockPredicateAtom.write(writer, instance.signedBlockPredicateAtom) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Header' variant + */ + public data class Header( + public val blockHeaderProjectionOfPredicateMarker: BlockHeaderProjectionOfPredicateMarker, + ) : SignedBlockProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SignedBlockProjectionOfPredicateMarker.Header = + try { + Header( + BlockHeaderProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.SignedBlockProjectionOfPredicateMarker.Header, + ): Unit = + try { + BlockHeaderProjectionOfPredicateMarker.write(writer, instance.blockHeaderProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): SignedBlockProjectionOfPredicateMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Header.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: SignedBlockProjectionOfPredicateMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Header.write(writer, instance as Header) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedBlockProjectionOfSelectorMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedBlockProjectionOfSelectorMarker.kt new file mode 100644 index 000000000..aa19fe59a --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedBlockProjectionOfSelectorMarker.kt @@ -0,0 +1,136 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Any +import kotlin.Boolean +import kotlin.Int +import kotlin.Unit + +/** + * SignedBlockProjectionOfSelectorMarker + * + * Generated from 'SignedBlockProjectionOfSelectorMarker' enum + */ +public sealed class SignedBlockProjectionOfSelectorMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + override fun equals(other: Any?): Boolean = + when (this) { + is Atom -> Atom.equals(this, other) + else -> super.equals(other) + } + + override fun hashCode(): Int = + when (this) { + is Atom -> Atom.hashCode() + else -> super.hashCode() + } + + /** + * 'Atom' variant + */ + public class Atom : SignedBlockProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SignedBlockProjectionOfSelectorMarker.Atom = + try { + Atom() + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.SignedBlockProjectionOfSelectorMarker.Atom, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.SignedBlockProjectionOfSelectorMarker.Atom, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".SignedBlockProjectionOfSelectorMarker.Atom".hashCode() + } + } + + /** + * 'Header' variant + */ + public data class Header( + public val blockHeaderProjectionOfSelectorMarker: BlockHeaderProjectionOfSelectorMarker, + ) : SignedBlockProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SignedBlockProjectionOfSelectorMarker.Header = + try { + Header( + BlockHeaderProjectionOfSelectorMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.SignedBlockProjectionOfSelectorMarker.Header, + ): Unit = + try { + BlockHeaderProjectionOfSelectorMarker.write(writer, instance.blockHeaderProjectionOfSelectorMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): SignedBlockProjectionOfSelectorMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Header.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: SignedBlockProjectionOfSelectorMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Header.write(writer, instance as Header) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedBlockV1.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedBlockV1.kt index 01a858097..98caad323 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedBlockV1.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedBlockV1.kt @@ -8,8 +8,10 @@ import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter import jp.co.soramitsu.iroha2.wrapException +import java.math.BigInteger import kotlin.Unit import kotlin.collections.List +import kotlin.collections.Map /** * SignedBlockV1 @@ -19,25 +21,37 @@ import kotlin.collections.List public data class SignedBlockV1( public val signatures: List, public val payload: BlockPayload, + public val errors: Map, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): SignedBlockV1 = try { - SignedBlockV1( - reader.readVec(reader.readCompactInt()) { BlockSignature.read(reader) }, - BlockPayload.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): SignedBlockV1 = + try { + SignedBlockV1( + reader.readVec(reader.readCompactInt()) { BlockSignature.read(reader) }, + BlockPayload.read(reader), + reader.readMap(reader.readCompactInt(), { reader.readUint64() }, { TransactionRejectionReason.read(reader) }), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: SignedBlockV1): Unit = try { - writer.writeCompact(instance.signatures.size) - instance.signatures.forEach { value -> - BlockSignature.write(writer, value) + override fun write( + writer: ScaleCodecWriter, + instance: SignedBlockV1, + ): Unit = + try { + writer.writeCompact(instance.signatures.size) + instance.signatures.forEach { value -> + BlockSignature.write(writer, value) + } + BlockPayload.write(writer, instance.payload) + writer.writeCompact(instance.errors.size) + instance.errors.toSortedMap().forEach { (key, value) -> + writer.writeUint64(key) + TransactionRejectionReason.write(writer, value) + } + } catch (ex: Exception) { + throw wrapException(ex) } - BlockPayload.write(writer, instance.payload) - } catch (ex: Exception) { - throw wrapException(ex) - } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedQuery.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedQuery.kt index 5a7bb5853..a65267acb 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedQuery.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedQuery.kt @@ -48,27 +48,31 @@ public sealed class SignedQuery : ModelEnum { override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.SignedQuery.V1, - ): Unit = try { - SignedQueryV1.write(writer, instance.signedQueryV1) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + SignedQueryV1.write(writer, instance.signedQueryV1) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): SignedQuery = when ( - val discriminant = - reader.readUByte() - ) { - 1 -> V1.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + override fun read(reader: ScaleCodecReader): SignedQuery = + when (val discriminant = reader.readUByte()) { + 1 -> V1.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: SignedQuery) { + override fun write( + writer: ScaleCodecWriter, + instance: SignedQuery, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 1 -> V1.write(writer, instance as V1) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedQueryV1.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedQueryV1.kt index 26b05dc30..417a912b1 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedQueryV1.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedQueryV1.kt @@ -17,23 +17,28 @@ import kotlin.Unit */ public data class SignedQueryV1( public val signature: QuerySignature, - public val payload: ClientQueryPayload, + public val payload: QueryRequestWithAuthority, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): SignedQueryV1 = try { - SignedQueryV1( - QuerySignature.read(reader), - ClientQueryPayload.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): SignedQueryV1 = + try { + SignedQueryV1( + QuerySignature.read(reader), + QueryRequestWithAuthority.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: SignedQueryV1): Unit = try { - QuerySignature.write(writer, instance.signature) - ClientQueryPayload.write(writer, instance.payload) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: SignedQueryV1, + ): Unit = + try { + QuerySignature.write(writer, instance.signature) + QueryRequestWithAuthority.write(writer, instance.payload) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedTransaction.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedTransaction.kt index 18c1ad006..68ab1b5ea 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedTransaction.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedTransaction.kt @@ -36,38 +36,43 @@ public sealed class SignedTransaction : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SignedTransaction.V1 = try { - V1( - SignedTransactionV1.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SignedTransaction.V1 = + try { + V1( + SignedTransactionV1.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.SignedTransaction.V1, - ): Unit = try { - SignedTransactionV1.write(writer, instance.signedTransactionV1) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + SignedTransactionV1.write(writer, instance.signedTransactionV1) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): SignedTransaction = when ( - val discriminant = - reader.readUByte() - ) { - 1 -> V1.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + override fun read(reader: ScaleCodecReader): SignedTransaction = + when (val discriminant = reader.readUByte()) { + 1 -> V1.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: SignedTransaction) { + override fun write( + writer: ScaleCodecWriter, + instance: SignedTransaction, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 1 -> V1.write(writer, instance as V1) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedTransactionPredicateAtom.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedTransactionPredicateAtom.kt new file mode 100644 index 000000000..d32fbef90 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedTransactionPredicateAtom.kt @@ -0,0 +1,42 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import kotlin.Int + +/** + * SignedTransactionPredicateAtom + * + * Generated from 'SignedTransactionPredicateAtom' enum + */ +public sealed class SignedTransactionPredicateAtom : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): SignedTransactionPredicateAtom = + when (val discriminant = reader.readUByte()) { + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: SignedTransactionPredicateAtom, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedTransactionPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedTransactionPredicateBox.kt deleted file mode 100644 index 14b8caa70..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedTransactionPredicateBox.kt +++ /dev/null @@ -1,109 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.ModelEnum -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Int -import kotlin.Unit - -/** - * SignedTransactionPredicateBox - * - * Generated from 'SignedTransactionPredicateBox' enum - */ -public sealed class SignedTransactionPredicateBox : ModelEnum { - /** - * @return Discriminator of variant in enum - */ - public abstract fun discriminant(): Int - - /** - * 'Hash' variant - */ - public data class Hash( - public val transactionHashPredicateBox: TransactionHashPredicateBox, - ) : SignedTransactionPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 0 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SignedTransactionPredicateBox.Hash = try { - Hash( - TransactionHashPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.SignedTransactionPredicateBox.Hash, - ): Unit = try { - TransactionHashPredicateBox.write(writer, instance.transactionHashPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Authority' variant - */ - public data class Authority( - public val accountIdPredicateBox: AccountIdPredicateBox, - ) : SignedTransactionPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 1 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SignedTransactionPredicateBox.Authority = try { - Authority( - AccountIdPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.SignedTransactionPredicateBox.Authority, - ): Unit = try { - AccountIdPredicateBox.write(writer, instance.accountIdPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): SignedTransactionPredicateBox = when ( - val - discriminant = reader.readUByte() - ) { - 0 -> Hash.read(reader) - 1 -> Authority.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: SignedTransactionPredicateBox) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 0 -> Hash.write(writer, instance as Hash) - 1 -> Authority.write(writer, instance as Authority) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedTransactionProjectionOfPredicateMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedTransactionProjectionOfPredicateMarker.kt new file mode 100644 index 000000000..150420ffe --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedTransactionProjectionOfPredicateMarker.kt @@ -0,0 +1,158 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit + +/** + * SignedTransactionProjectionOfPredicateMarker + * + * Generated from 'SignedTransactionProjectionOfPredicateMarker' enum + */ +public sealed class SignedTransactionProjectionOfPredicateMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val signedTransactionPredicateAtom: SignedTransactionPredicateAtom, + ) : SignedTransactionProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read( + reader: ScaleCodecReader, + ): jp.co.soramitsu.iroha2.generated.SignedTransactionProjectionOfPredicateMarker.Atom = + try { + Atom( + SignedTransactionPredicateAtom.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.SignedTransactionProjectionOfPredicateMarker.Atom, + ): Unit = + try { + SignedTransactionPredicateAtom.write(writer, instance.signedTransactionPredicateAtom) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Hash' variant + */ + public data class Hash( + public val transactionHashProjectionOfPredicateMarker: TransactionHashProjectionOfPredicateMarker, + ) : SignedTransactionProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read( + reader: ScaleCodecReader, + ): jp.co.soramitsu.iroha2.generated.SignedTransactionProjectionOfPredicateMarker.Hash = + try { + Hash( + TransactionHashProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.SignedTransactionProjectionOfPredicateMarker.Hash, + ): Unit = + try { + TransactionHashProjectionOfPredicateMarker.write(writer, instance.transactionHashProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Authority' variant + */ + public data class Authority( + public val accountIdProjectionOfPredicateMarker: AccountIdProjectionOfPredicateMarker, + ) : SignedTransactionProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 2 + + override fun read( + reader: ScaleCodecReader, + ): jp.co.soramitsu.iroha2.generated.SignedTransactionProjectionOfPredicateMarker.Authority = + try { + Authority( + AccountIdProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.SignedTransactionProjectionOfPredicateMarker.Authority, + ): Unit = + try { + AccountIdProjectionOfPredicateMarker.write(writer, instance.accountIdProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): SignedTransactionProjectionOfPredicateMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Hash.read(reader) + 2 -> Authority.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: SignedTransactionProjectionOfPredicateMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Hash.write(writer, instance as Hash) + 2 -> Authority.write(writer, instance as Authority) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedTransactionProjectionOfSelectorMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedTransactionProjectionOfSelectorMarker.kt new file mode 100644 index 000000000..318625f2e --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedTransactionProjectionOfSelectorMarker.kt @@ -0,0 +1,174 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Any +import kotlin.Boolean +import kotlin.Int +import kotlin.Unit + +/** + * SignedTransactionProjectionOfSelectorMarker + * + * Generated from 'SignedTransactionProjectionOfSelectorMarker' enum + */ +public sealed class SignedTransactionProjectionOfSelectorMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + override fun equals(other: Any?): Boolean = + when (this) { + is Atom -> Atom.equals(this, other) + else -> super.equals(other) + } + + override fun hashCode(): Int = + when (this) { + is Atom -> Atom.hashCode() + else -> super.hashCode() + } + + /** + * 'Atom' variant + */ + public class Atom : SignedTransactionProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SignedTransactionProjectionOfSelectorMarker.Atom = + try { + Atom() + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.SignedTransactionProjectionOfSelectorMarker.Atom, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.SignedTransactionProjectionOfSelectorMarker.Atom, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".SignedTransactionProjectionOfSelectorMarker.Atom".hashCode() + } + } + + /** + * 'Hash' variant + */ + public data class Hash( + public val transactionHashProjectionOfSelectorMarker: TransactionHashProjectionOfSelectorMarker, + ) : SignedTransactionProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SignedTransactionProjectionOfSelectorMarker.Hash = + try { + Hash( + TransactionHashProjectionOfSelectorMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.SignedTransactionProjectionOfSelectorMarker.Hash, + ): Unit = + try { + TransactionHashProjectionOfSelectorMarker.write(writer, instance.transactionHashProjectionOfSelectorMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Authority' variant + */ + public data class Authority( + public val accountIdProjectionOfSelectorMarker: AccountIdProjectionOfSelectorMarker, + ) : SignedTransactionProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 2 + + override fun read( + reader: ScaleCodecReader, + ): jp.co.soramitsu.iroha2.generated.SignedTransactionProjectionOfSelectorMarker.Authority = + try { + Authority( + AccountIdProjectionOfSelectorMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.SignedTransactionProjectionOfSelectorMarker.Authority, + ): Unit = + try { + AccountIdProjectionOfSelectorMarker.write(writer, instance.accountIdProjectionOfSelectorMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): SignedTransactionProjectionOfSelectorMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Hash.read(reader) + 2 -> Authority.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: SignedTransactionProjectionOfSelectorMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Hash.write(writer, instance as Hash) + 2 -> Authority.write(writer, instance as Authority) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedTransactionV1.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedTransactionV1.kt index b34eb9e7b..60e4578ae 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedTransactionV1.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SignedTransactionV1.kt @@ -20,20 +20,25 @@ public data class SignedTransactionV1( public val payload: TransactionPayload, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): SignedTransactionV1 = try { - SignedTransactionV1( - TransactionSignature.read(reader), - TransactionPayload.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): SignedTransactionV1 = + try { + SignedTransactionV1( + TransactionSignature.read(reader), + TransactionPayload.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: SignedTransactionV1): Unit = try { - TransactionSignature.write(writer, instance.signature) - TransactionPayload.write(writer, instance.payload) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: SignedTransactionV1, + ): Unit = + try { + TransactionSignature.write(writer, instance.signature) + TransactionPayload.write(writer, instance.payload) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SingularQueryBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SingularQueryBox.kt index ec13110e5..bfa5f3e5e 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SingularQueryBox.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SingularQueryBox.kt @@ -24,71 +24,35 @@ public sealed class SingularQueryBox : ModelEnum { public abstract fun discriminant(): Int /** - * 'FindAssetQuantityById' variant + * 'FindExecutorDataModel' variant */ - public data class FindAssetQuantityById( - public val findAssetQuantityById: jp.co.soramitsu.iroha2.generated.FindAssetQuantityById, + public data class FindExecutorDataModel( + public val findExecutorDataModel: jp.co.soramitsu.iroha2.generated.FindExecutorDataModel, ) : SingularQueryBox() { override fun discriminant(): Int = DISCRIMINANT public companion object : - ScaleReader, - ScaleWriter { + ScaleReader, + ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SingularQueryBox.FindAssetQuantityById = try { - FindAssetQuantityById( - jp.co.soramitsu.iroha2.generated.FindAssetQuantityById.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.SingularQueryBox.FindAssetQuantityById, - ): Unit = + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SingularQueryBox.FindExecutorDataModel = try { - jp.co.soramitsu.iroha2.generated.FindAssetQuantityById.write( - writer, - instance.findAssetQuantityById, + FindExecutorDataModel( + jp.co.soramitsu.iroha2.generated.FindExecutorDataModel + .read(reader), ) } catch (ex: Exception) { throw wrapException(ex) } - } - } - - /** - * 'FindExecutorDataModel' variant - */ - public data class FindExecutorDataModel( - public val findExecutorDataModel: jp.co.soramitsu.iroha2.generated.FindExecutorDataModel, - ) : SingularQueryBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 1 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SingularQueryBox.FindExecutorDataModel = try { - FindExecutorDataModel( - jp.co.soramitsu.iroha2.generated.FindExecutorDataModel.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.SingularQueryBox.FindExecutorDataModel, ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindExecutorDataModel.write( - writer, - instance.findExecutorDataModel, - ) + jp.co.soramitsu.iroha2.generated.FindExecutorDataModel + .write(writer, instance.findExecutorDataModel) } catch (ex: Exception) { throw wrapException(ex) } @@ -106,230 +70,49 @@ public sealed class SingularQueryBox : ModelEnum { public companion object : ScaleReader, ScaleWriter { - public const val DISCRIMINANT: Int = 2 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SingularQueryBox.FindParameters = try { - FindParameters( - jp.co.soramitsu.iroha2.generated.FindParameters.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.SingularQueryBox.FindParameters, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindParameters.write(writer, instance.findParameters) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'FindDomainMetadata' variant - */ - public data class FindDomainMetadata( - public val findDomainMetadata: jp.co.soramitsu.iroha2.generated.FindDomainMetadata, - ) : SingularQueryBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 3 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SingularQueryBox.FindDomainMetadata = try { - FindDomainMetadata( - jp.co.soramitsu.iroha2.generated.FindDomainMetadata.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + public const val DISCRIMINANT: Int = 1 - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.SingularQueryBox.FindDomainMetadata, - ): Unit = + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SingularQueryBox.FindParameters = try { - jp.co.soramitsu.iroha2.generated.FindDomainMetadata.write( - writer, - instance.findDomainMetadata, + FindParameters( + jp.co.soramitsu.iroha2.generated.FindParameters + .read(reader), ) } catch (ex: Exception) { throw wrapException(ex) } - } - } - - /** - * 'FindAccountMetadata' variant - */ - public data class FindAccountMetadata( - public val findAccountMetadata: jp.co.soramitsu.iroha2.generated.FindAccountMetadata, - ) : SingularQueryBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 4 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SingularQueryBox.FindAccountMetadata = try { - FindAccountMetadata( - jp.co.soramitsu.iroha2.generated.FindAccountMetadata.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } override fun write( writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.SingularQueryBox.FindAccountMetadata, + instance: jp.co.soramitsu.iroha2.generated.SingularQueryBox.FindParameters, ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindAccountMetadata.write( - writer, - instance.findAccountMetadata, - ) + jp.co.soramitsu.iroha2.generated.FindParameters + .write(writer, instance.findParameters) } catch (ex: Exception) { throw wrapException(ex) } } } - /** - * 'FindAssetMetadata' variant - */ - public data class FindAssetMetadata( - public val findAssetMetadata: jp.co.soramitsu.iroha2.generated.FindAssetMetadata, - ) : SingularQueryBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 5 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SingularQueryBox.FindAssetMetadata = try { - FindAssetMetadata( - jp.co.soramitsu.iroha2.generated.FindAssetMetadata.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.SingularQueryBox.FindAssetMetadata, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindAssetMetadata.write(writer, instance.findAssetMetadata) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'FindAssetDefinitionMetadata' variant - */ - public data class FindAssetDefinitionMetadata( - public val findAssetDefinitionMetadata: - jp.co.soramitsu.iroha2.generated.FindAssetDefinitionMetadata, - ) : SingularQueryBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 6 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SingularQueryBox.FindAssetDefinitionMetadata = try { - FindAssetDefinitionMetadata( - jp.co.soramitsu.iroha2.generated.FindAssetDefinitionMetadata.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.SingularQueryBox.FindAssetDefinitionMetadata, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.FindAssetDefinitionMetadata.write( - writer, - instance.findAssetDefinitionMetadata, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'FindTriggerMetadata' variant - */ - public data class FindTriggerMetadata( - public val findTriggerMetadata: jp.co.soramitsu.iroha2.generated.FindTriggerMetadata, - ) : SingularQueryBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 7 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SingularQueryBox.FindTriggerMetadata = try { - FindTriggerMetadata( - jp.co.soramitsu.iroha2.generated.FindTriggerMetadata.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): SingularQueryBox = + when (val discriminant = reader.readUByte()) { + 0 -> FindExecutorDataModel.read(reader) + 1 -> FindParameters.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.SingularQueryBox.FindTriggerMetadata, - ): Unit = - try { - jp.co.soramitsu.iroha2.generated.FindTriggerMetadata.write( - writer, - instance.findTriggerMetadata, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): SingularQueryBox = when ( - val discriminant = - reader.readUByte() + override fun write( + writer: ScaleCodecWriter, + instance: SingularQueryBox, ) { - 0 -> FindAssetQuantityById.read(reader) - 1 -> FindExecutorDataModel.read(reader) - 2 -> FindParameters.read(reader) - 3 -> FindDomainMetadata.read(reader) - 4 -> FindAccountMetadata.read(reader) - 5 -> FindAssetMetadata.read(reader) - 6 -> FindAssetDefinitionMetadata.read(reader) - 7 -> FindTriggerMetadata.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: SingularQueryBox) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { - 0 -> FindAssetQuantityById.write(writer, instance as FindAssetQuantityById) - 1 -> FindExecutorDataModel.write(writer, instance as FindExecutorDataModel) - 2 -> FindParameters.write(writer, instance as FindParameters) - 3 -> FindDomainMetadata.write(writer, instance as FindDomainMetadata) - 4 -> FindAccountMetadata.write(writer, instance as FindAccountMetadata) - 5 -> FindAssetMetadata.write(writer, instance as FindAssetMetadata) - 6 -> FindAssetDefinitionMetadata.write(writer, instance as FindAssetDefinitionMetadata) - 7 -> FindTriggerMetadata.write(writer, instance as FindTriggerMetadata) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + 0 -> FindExecutorDataModel.write(writer, instance as FindExecutorDataModel) + 1 -> FindParameters.write(writer, instance as FindParameters) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SingularQueryOutputBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SingularQueryOutputBox.kt index 8e21942a4..cc2117e78 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SingularQueryOutputBox.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SingularQueryOutputBox.kt @@ -10,7 +10,6 @@ import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter import jp.co.soramitsu.iroha2.wrapException import kotlin.Int -import kotlin.String import kotlin.Unit /** @@ -24,38 +23,6 @@ public sealed class SingularQueryOutputBox : ModelEnum { */ public abstract fun discriminant(): Int - /** - * 'Numeric' variant - */ - public data class Numeric( - public val numeric: jp.co.soramitsu.iroha2.generated.Numeric, - ) : SingularQueryOutputBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 0 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SingularQueryOutputBox.Numeric = try { - Numeric( - jp.co.soramitsu.iroha2.generated.Numeric.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.SingularQueryOutputBox.Numeric, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.Numeric.write(writer, instance.numeric) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - /** * 'ExecutorDataModel' variant */ @@ -67,88 +34,28 @@ public sealed class SingularQueryOutputBox : ModelEnum { public companion object : ScaleReader, ScaleWriter { - public const val DISCRIMINANT: Int = 1 + public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SingularQueryOutputBox.ExecutorDataModel = try { - ExecutorDataModel( - jp.co.soramitsu.iroha2.generated.ExecutorDataModel.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SingularQueryOutputBox.ExecutorDataModel = + try { + ExecutorDataModel( + jp.co.soramitsu.iroha2.generated.ExecutorDataModel + .read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.SingularQueryOutputBox.ExecutorDataModel, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.ExecutorDataModel.write(writer, instance.executorDataModel) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'JsonString' variant - */ - public data class JsonString( - public val string: String, - ) : SingularQueryOutputBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 2 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SingularQueryOutputBox.JsonString = try { - JsonString( - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.SingularQueryOutputBox.JsonString, - ): Unit = try { - writer.writeAsList(instance.string.toByteArray(Charsets.UTF_8)) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Trigger' variant - */ - public data class Trigger( - public val trigger: jp.co.soramitsu.iroha2.generated.Trigger, - ) : SingularQueryOutputBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 3 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SingularQueryOutputBox.Trigger = try { - Trigger( - jp.co.soramitsu.iroha2.generated.Trigger.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.SingularQueryOutputBox.Trigger, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.Trigger.write(writer, instance.trigger) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + jp.co.soramitsu.iroha2.generated.ExecutorDataModel + .write(writer, instance.executorDataModel) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -163,116 +70,51 @@ public sealed class SingularQueryOutputBox : ModelEnum { public companion object : ScaleReader, ScaleWriter { - public const val DISCRIMINANT: Int = 4 + public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SingularQueryOutputBox.Parameters = try { - Parameters( - jp.co.soramitsu.iroha2.generated.Parameters.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SingularQueryOutputBox.Parameters = + try { + Parameters( + jp.co.soramitsu.iroha2.generated.Parameters + .read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.SingularQueryOutputBox.Parameters, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.Parameters.write(writer, instance.parameters) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + jp.co.soramitsu.iroha2.generated.Parameters + .write(writer, instance.parameters) + } catch (ex: Exception) { + throw wrapException(ex) + } } } - /** - * 'Transaction' variant - */ - public data class Transaction( - public val transactionQueryOutput: TransactionQueryOutput, - ) : SingularQueryOutputBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 5 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SingularQueryOutputBox.Transaction = try { - Transaction( - TransactionQueryOutput.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): SingularQueryOutputBox = + when (val discriminant = reader.readUByte()) { + 0 -> ExecutorDataModel.read(reader) + 1 -> Parameters.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.SingularQueryOutputBox.Transaction, - ): Unit = try { - TransactionQueryOutput.write(writer, instance.transactionQueryOutput) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'BlockHeader' variant - */ - public data class BlockHeader( - public val blockHeader: jp.co.soramitsu.iroha2.generated.BlockHeader, - ) : SingularQueryOutputBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 6 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SingularQueryOutputBox.BlockHeader = try { - BlockHeader( - jp.co.soramitsu.iroha2.generated.BlockHeader.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.SingularQueryOutputBox.BlockHeader, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.BlockHeader.write(writer, instance.blockHeader) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): SingularQueryOutputBox = when ( - val discriminant = - reader.readUByte() + override fun write( + writer: ScaleCodecWriter, + instance: SingularQueryOutputBox, ) { - 0 -> Numeric.read(reader) - 1 -> ExecutorDataModel.read(reader) - 2 -> JsonString.read(reader) - 3 -> Trigger.read(reader) - 4 -> Parameters.read(reader) - 5 -> Transaction.read(reader) - 6 -> BlockHeader.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: SingularQueryOutputBox) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { - 0 -> Numeric.write(writer, instance as Numeric) - 1 -> ExecutorDataModel.write(writer, instance as ExecutorDataModel) - 2 -> JsonString.write(writer, instance as JsonString) - 3 -> Trigger.write(writer, instance as Trigger) - 4 -> Parameters.write(writer, instance as Parameters) - 5 -> Transaction.write(writer, instance as Transaction) - 6 -> BlockHeader.write(writer, instance as BlockHeader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + 0 -> ExecutorDataModel.write(writer, instance as ExecutorDataModel) + 1 -> Parameters.write(writer, instance as Parameters) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SmartContractParameter.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SmartContractParameter.kt index afc27ff0d..dd4d1f722 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SmartContractParameter.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SmartContractParameter.kt @@ -36,22 +36,24 @@ public sealed class SmartContractParameter : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SmartContractParameter.Fuel = try { - Fuel( - NonZeroOfu64.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SmartContractParameter.Fuel = + try { + Fuel( + NonZeroOfu64.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.SmartContractParameter.Fuel, - ): Unit = try { - NonZeroOfu64.write(writer, instance.nonZeroOfu64) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + NonZeroOfu64.write(writer, instance.nonZeroOfu64) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -68,40 +70,47 @@ public sealed class SmartContractParameter : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SmartContractParameter.Memory = try { - Memory( - NonZeroOfu64.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SmartContractParameter.Memory = + try { + Memory( + NonZeroOfu64.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.SmartContractParameter.Memory, - ): Unit = try { - NonZeroOfu64.write(writer, instance.nonZeroOfu64) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + NonZeroOfu64.write(writer, instance.nonZeroOfu64) + } catch (ex: Exception) { + throw wrapException(ex) + } } } - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): SmartContractParameter = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Fuel.read(reader) - 1 -> Memory.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): SmartContractParameter = + when (val discriminant = reader.readUByte()) { + 0 -> Fuel.read(reader) + 1 -> Memory.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: SmartContractParameter) { + override fun write( + writer: ScaleCodecWriter, + instance: SmartContractParameter, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Fuel.write(writer, instance as Fuel) 1 -> Memory.write(writer, instance as Memory) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SmartContractParameters.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SmartContractParameters.kt index a3e22b873..e84f5973a 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SmartContractParameters.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SmartContractParameters.kt @@ -22,20 +22,25 @@ public data class SmartContractParameters( public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): SmartContractParameters = try { - SmartContractParameters( - NonZeroOfu64.read(reader), - NonZeroOfu64.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): SmartContractParameters = + try { + SmartContractParameters( + NonZeroOfu64.read(reader), + NonZeroOfu64.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: SmartContractParameters): Unit = try { - NonZeroOfu64.write(writer, instance.fuel) - NonZeroOfu64.write(writer, instance.memory) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: SmartContractParameters, + ): Unit = + try { + NonZeroOfu64.write(writer, instance.fuel) + NonZeroOfu64.write(writer, instance.memory) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SocketAddr.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SocketAddr.kt index 5c6705f11..8818835a1 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SocketAddr.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SocketAddr.kt @@ -36,22 +36,24 @@ public sealed class SocketAddr : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SocketAddr.Ipv4 = try { - Ipv4( - SocketAddrV4.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SocketAddr.Ipv4 = + try { + Ipv4( + SocketAddrV4.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.SocketAddr.Ipv4, - ): Unit = try { - SocketAddrV4.write(writer, instance.socketAddrV4) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + SocketAddrV4.write(writer, instance.socketAddrV4) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -68,22 +70,24 @@ public sealed class SocketAddr : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SocketAddr.Ipv6 = try { - Ipv6( - SocketAddrV6.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SocketAddr.Ipv6 = + try { + Ipv6( + SocketAddrV6.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.SocketAddr.Ipv6, - ): Unit = try { - SocketAddrV6.write(writer, instance.socketAddrV6) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + SocketAddrV6.write(writer, instance.socketAddrV6) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -100,42 +104,47 @@ public sealed class SocketAddr : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 2 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SocketAddr.Host = try { - Host( - SocketAddrHost.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SocketAddr.Host = + try { + Host( + SocketAddrHost.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.SocketAddr.Host, - ): Unit = try { - SocketAddrHost.write(writer, instance.socketAddrHost) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + SocketAddrHost.write(writer, instance.socketAddrHost) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): SocketAddr = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Ipv4.read(reader) - 1 -> Ipv6.read(reader) - 2 -> Host.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + override fun read(reader: ScaleCodecReader): SocketAddr = + when (val discriminant = reader.readUByte()) { + 0 -> Ipv4.read(reader) + 1 -> Ipv6.read(reader) + 2 -> Host.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: SocketAddr) { + override fun write( + writer: ScaleCodecWriter, + instance: SocketAddr, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Ipv4.write(writer, instance as Ipv4) 1 -> Ipv6.write(writer, instance as Ipv6) 2 -> Host.write(writer, instance as Host) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SocketAddrHost.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SocketAddrHost.kt index 6102cb384..359c909fd 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SocketAddrHost.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SocketAddrHost.kt @@ -22,20 +22,25 @@ public data class SocketAddrHost( public val port: Int, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): SocketAddrHost = try { - SocketAddrHost( - reader.readString(), - reader.readUint16(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): SocketAddrHost = + try { + SocketAddrHost( + reader.readString(), + reader.readUint16(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: SocketAddrHost): Unit = try { - writer.writeAsList(instance.host.toByteArray(Charsets.UTF_8)) - writer.writeUint16(instance.port) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: SocketAddrHost, + ): Unit = + try { + writer.writeAsList(instance.host.toByteArray(Charsets.UTF_8)) + writer.writeUint16(instance.port) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SocketAddrV4.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SocketAddrV4.kt index 5a07bb203..8c4aa1eb4 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SocketAddrV4.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SocketAddrV4.kt @@ -21,20 +21,25 @@ public data class SocketAddrV4( public val port: Int, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): SocketAddrV4 = try { - SocketAddrV4( - Ipv4Addr.read(reader), - reader.readUint16(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): SocketAddrV4 = + try { + SocketAddrV4( + Ipv4Addr.read(reader), + reader.readUint16(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: SocketAddrV4): Unit = try { - Ipv4Addr.write(writer, instance.ip) - writer.writeUint16(instance.port) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: SocketAddrV4, + ): Unit = + try { + Ipv4Addr.write(writer, instance.ip) + writer.writeUint16(instance.port) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SocketAddrV6.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SocketAddrV6.kt index 75fd00e68..a3888fab4 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SocketAddrV6.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SocketAddrV6.kt @@ -21,20 +21,25 @@ public data class SocketAddrV6( public val port: Int, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): SocketAddrV6 = try { - SocketAddrV6( - Ipv6Addr.read(reader), - reader.readUint16(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): SocketAddrV6 = + try { + SocketAddrV6( + Ipv6Addr.read(reader), + reader.readUint16(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: SocketAddrV6): Unit = try { - Ipv6Addr.write(writer, instance.ip) - writer.writeUint16(instance.port) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: SocketAddrV6, + ): Unit = + try { + Ipv6Addr.write(writer, instance.ip) + writer.writeUint16(instance.port) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Sorting.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Sorting.kt index 288ecf551..c792af65e 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Sorting.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Sorting.kt @@ -19,18 +19,23 @@ public data class Sorting( public val sortByMetadataKey: Name? = null, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): Sorting = try { - Sorting( - reader.readNullable(Name) as Name?, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): Sorting = + try { + Sorting( + reader.readNullable(Name) as Name?, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: Sorting): Unit = try { - writer.writeNullable(Name, instance.sortByMetadataKey) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: Sorting, + ): Unit = + try { + writer.writeNullable(Name, instance.sortByMetadataKey) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/StringPredicate.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/StringPredicate.kt deleted file mode 100644 index ffa690dd9..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/StringPredicate.kt +++ /dev/null @@ -1,176 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.ModelEnum -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Int -import kotlin.String -import kotlin.Unit - -/** - * StringPredicate - * - * Generated from 'StringPredicate' enum - */ -public sealed class StringPredicate : ModelEnum { - /** - * @return Discriminator of variant in enum - */ - public abstract fun discriminant(): Int - - /** - * 'Contains' variant - */ - public data class Contains( - public val string: String, - ) : StringPredicate() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 0 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.StringPredicate.Contains = try { - Contains( - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.StringPredicate.Contains, - ): Unit = try { - writer.writeAsList(instance.string.toByteArray(Charsets.UTF_8)) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'StartsWith' variant - */ - public data class StartsWith( - public val string: String, - ) : StringPredicate() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 1 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.StringPredicate.StartsWith = try { - StartsWith( - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.StringPredicate.StartsWith, - ): Unit = try { - writer.writeAsList(instance.string.toByteArray(Charsets.UTF_8)) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'EndsWith' variant - */ - public data class EndsWith( - public val string: String, - ) : StringPredicate() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 2 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.StringPredicate.EndsWith = try { - EndsWith( - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.StringPredicate.EndsWith, - ): Unit = try { - writer.writeAsList(instance.string.toByteArray(Charsets.UTF_8)) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Is' variant - */ - public data class Is( - public val string: String, - ) : StringPredicate() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 3 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.StringPredicate.Is = try { - Is( - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.StringPredicate.Is, - ): Unit = try { - writer.writeAsList(instance.string.toByteArray(Charsets.UTF_8)) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): StringPredicate = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Contains.read(reader) - 1 -> StartsWith.read(reader) - 2 -> EndsWith.read(reader) - 3 -> Is.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: StringPredicate) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 0 -> Contains.write(writer, instance as Contains) - 1 -> StartsWith.write(writer, instance as StartsWith) - 2 -> EndsWith.write(writer, instance as EndsWith) - 3 -> Is.write(writer, instance as Is) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/StringPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/StringPredicateAtom.kt similarity index 52% rename from modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/StringPredicateBox.kt rename to modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/StringPredicateAtom.kt index d2e8c6820..e827fe75a 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/StringPredicateBox.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/StringPredicateAtom.kt @@ -14,11 +14,11 @@ import kotlin.String import kotlin.Unit /** - * StringPredicateBox + * StringPredicateAtom * - * Generated from 'StringPredicateBox' enum + * Generated from 'StringPredicateAtom' enum */ -public sealed class StringPredicateBox : ModelEnum { +public sealed class StringPredicateAtom : ModelEnum { /** * @return Discriminator of variant in enum */ @@ -29,30 +29,32 @@ public sealed class StringPredicateBox : ModelEnum { */ public data class Equals( public val string: String, - ) : StringPredicateBox() { + ) : StringPredicateAtom() { override fun discriminant(): Int = DISCRIMINANT public companion object : - ScaleReader, - ScaleWriter { + ScaleReader, + ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.StringPredicateBox.Equals = try { - Equals( - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.StringPredicateAtom.Equals = + try { + Equals( + reader.readString(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.StringPredicateBox.Equals, - ): Unit = try { - writer.writeAsList(instance.string.toByteArray(Charsets.UTF_8)) - } catch (ex: Exception) { - throw wrapException(ex) - } + instance: jp.co.soramitsu.iroha2.generated.StringPredicateAtom.Equals, + ): Unit = + try { + writer.writeAsList(instance.string.toByteArray(Charsets.UTF_8)) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -61,30 +63,32 @@ public sealed class StringPredicateBox : ModelEnum { */ public data class Contains( public val string: String, - ) : StringPredicateBox() { + ) : StringPredicateAtom() { override fun discriminant(): Int = DISCRIMINANT public companion object : - ScaleReader, - ScaleWriter { + ScaleReader, + ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.StringPredicateBox.Contains = try { - Contains( - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.StringPredicateAtom.Contains = + try { + Contains( + reader.readString(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.StringPredicateBox.Contains, - ): Unit = try { - writer.writeAsList(instance.string.toByteArray(Charsets.UTF_8)) - } catch (ex: Exception) { - throw wrapException(ex) - } + instance: jp.co.soramitsu.iroha2.generated.StringPredicateAtom.Contains, + ): Unit = + try { + writer.writeAsList(instance.string.toByteArray(Charsets.UTF_8)) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -93,30 +97,32 @@ public sealed class StringPredicateBox : ModelEnum { */ public data class StartsWith( public val string: String, - ) : StringPredicateBox() { + ) : StringPredicateAtom() { override fun discriminant(): Int = DISCRIMINANT public companion object : - ScaleReader, - ScaleWriter { + ScaleReader, + ScaleWriter { public const val DISCRIMINANT: Int = 2 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.StringPredicateBox.StartsWith = try { - StartsWith( - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.StringPredicateAtom.StartsWith = + try { + StartsWith( + reader.readString(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.StringPredicateBox.StartsWith, - ): Unit = try { - writer.writeAsList(instance.string.toByteArray(Charsets.UTF_8)) - } catch (ex: Exception) { - throw wrapException(ex) - } + instance: jp.co.soramitsu.iroha2.generated.StringPredicateAtom.StartsWith, + ): Unit = + try { + writer.writeAsList(instance.string.toByteArray(Charsets.UTF_8)) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -125,52 +131,57 @@ public sealed class StringPredicateBox : ModelEnum { */ public data class EndsWith( public val string: String, - ) : StringPredicateBox() { + ) : StringPredicateAtom() { override fun discriminant(): Int = DISCRIMINANT public companion object : - ScaleReader, - ScaleWriter { + ScaleReader, + ScaleWriter { public const val DISCRIMINANT: Int = 3 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.StringPredicateBox.EndsWith = try { - EndsWith( - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.StringPredicateAtom.EndsWith = + try { + EndsWith( + reader.readString(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.StringPredicateBox.EndsWith, - ): Unit = try { - writer.writeAsList(instance.string.toByteArray(Charsets.UTF_8)) - } catch (ex: Exception) { - throw wrapException(ex) - } + instance: jp.co.soramitsu.iroha2.generated.StringPredicateAtom.EndsWith, + ): Unit = + try { + writer.writeAsList(instance.string.toByteArray(Charsets.UTF_8)) + } catch (ex: Exception) { + throw wrapException(ex) + } } } - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): StringPredicateBox = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Equals.read(reader) - 1 -> Contains.read(reader) - 2 -> StartsWith.read(reader) - 3 -> EndsWith.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): StringPredicateAtom = + when (val discriminant = reader.readUByte()) { + 0 -> Equals.read(reader) + 1 -> Contains.read(reader) + 2 -> StartsWith.read(reader) + 3 -> EndsWith.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: StringPredicateBox) { + override fun write( + writer: ScaleCodecWriter, + instance: StringPredicateAtom, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Equals.write(writer, instance as Equals) 1 -> Contains.write(writer, instance as Contains) 2 -> StartsWith.write(writer, instance as StartsWith) 3 -> EndsWith.write(writer, instance as EndsWith) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SumeragiParameter.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SumeragiParameter.kt index a5dd27fc9..53d7aa2c8 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SumeragiParameter.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SumeragiParameter.kt @@ -37,22 +37,24 @@ public sealed class SumeragiParameter : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SumeragiParameter.BlockTimeMs = try { - BlockTimeMs( - reader.readUint64(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SumeragiParameter.BlockTimeMs = + try { + BlockTimeMs( + reader.readUint64(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.SumeragiParameter.BlockTimeMs, - ): Unit = try { - writer.writeUint64(instance.u64) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + writer.writeUint64(instance.u64) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -69,22 +71,24 @@ public sealed class SumeragiParameter : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SumeragiParameter.CommitTimeMs = try { - CommitTimeMs( - reader.readUint64(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SumeragiParameter.CommitTimeMs = + try { + CommitTimeMs( + reader.readUint64(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.SumeragiParameter.CommitTimeMs, - ): Unit = try { - writer.writeUint64(instance.u64) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + writer.writeUint64(instance.u64) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -101,42 +105,47 @@ public sealed class SumeragiParameter : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 2 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SumeragiParameter.MaxClockDriftMs = try { - MaxClockDriftMs( - reader.readUint64(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.SumeragiParameter.MaxClockDriftMs = + try { + MaxClockDriftMs( + reader.readUint64(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.SumeragiParameter.MaxClockDriftMs, - ): Unit = try { - writer.writeUint64(instance.u64) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + writer.writeUint64(instance.u64) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): SumeragiParameter = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> BlockTimeMs.read(reader) - 1 -> CommitTimeMs.read(reader) - 2 -> MaxClockDriftMs.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + override fun read(reader: ScaleCodecReader): SumeragiParameter = + when (val discriminant = reader.readUByte()) { + 0 -> BlockTimeMs.read(reader) + 1 -> CommitTimeMs.read(reader) + 2 -> MaxClockDriftMs.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: SumeragiParameter) { + override fun write( + writer: ScaleCodecWriter, + instance: SumeragiParameter, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> BlockTimeMs.write(writer, instance as BlockTimeMs) 1 -> CommitTimeMs.write(writer, instance as CommitTimeMs) 2 -> MaxClockDriftMs.write(writer, instance as MaxClockDriftMs) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SumeragiParameters.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SumeragiParameters.kt index 3ef3f285f..546f225b9 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SumeragiParameters.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/SumeragiParameters.kt @@ -22,22 +22,27 @@ public data class SumeragiParameters( public val maxClockDriftMs: BigInteger, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): SumeragiParameters = try { - SumeragiParameters( - reader.readUint64(), - reader.readUint64(), - reader.readUint64(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): SumeragiParameters = + try { + SumeragiParameters( + reader.readUint64(), + reader.readUint64(), + reader.readUint64(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: SumeragiParameters): Unit = try { - writer.writeUint64(instance.blockTimeMs) - writer.writeUint64(instance.commitTimeMs) - writer.writeUint64(instance.maxClockDriftMs) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: SumeragiParameters, + ): Unit = + try { + writer.writeUint64(instance.blockTimeMs) + writer.writeUint64(instance.commitTimeMs) + writer.writeUint64(instance.maxClockDriftMs) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TimeEvent.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TimeEvent.kt index a8120157d..ac4010ecc 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TimeEvent.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TimeEvent.kt @@ -16,24 +16,26 @@ import kotlin.Unit * Generated from 'TimeEvent' regular structure */ public data class TimeEvent( - public val prevInterval: TimeInterval? = null, public val interval: TimeInterval, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): TimeEvent = try { - TimeEvent( - reader.readNullable(TimeInterval) as TimeInterval?, - TimeInterval.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): TimeEvent = + try { + TimeEvent( + TimeInterval.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: TimeEvent): Unit = try { - writer.writeNullable(TimeInterval, instance.prevInterval) - TimeInterval.write(writer, instance.interval) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: TimeEvent, + ): Unit = + try { + TimeInterval.write(writer, instance.interval) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TimeEventFilter.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TimeEventFilter.kt index 453338f48..bb5df0482 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TimeEventFilter.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TimeEventFilter.kt @@ -19,18 +19,23 @@ public data class TimeEventFilter( public val executionTime: ExecutionTime, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): TimeEventFilter = try { - TimeEventFilter( - ExecutionTime.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): TimeEventFilter = + try { + TimeEventFilter( + ExecutionTime.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: TimeEventFilter): Unit = try { - ExecutionTime.write(writer, instance.executionTime) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: TimeEventFilter, + ): Unit = + try { + ExecutionTime.write(writer, instance.executionTime) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TimeInterval.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TimeInterval.kt index a40d795a9..33abf74f8 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TimeInterval.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TimeInterval.kt @@ -21,20 +21,25 @@ public data class TimeInterval( public val lengthMs: BigInteger, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): TimeInterval = try { - TimeInterval( - reader.readUint64(), - reader.readUint64(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): TimeInterval = + try { + TimeInterval( + reader.readUint64(), + reader.readUint64(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: TimeInterval): Unit = try { - writer.writeUint64(instance.sinceMs) - writer.writeUint64(instance.lengthMs) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: TimeInterval, + ): Unit = + try { + writer.writeUint64(instance.sinceMs) + writer.writeUint64(instance.lengthMs) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionErrorPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionErrorPredicateAtom.kt similarity index 54% rename from modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionErrorPredicateBox.kt rename to modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionErrorPredicateAtom.kt index dba72f60f..4a379aeff 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionErrorPredicateBox.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionErrorPredicateAtom.kt @@ -15,44 +15,49 @@ import kotlin.Int import kotlin.Unit /** - * TransactionErrorPredicateBox + * TransactionErrorPredicateAtom * - * Generated from 'TransactionErrorPredicateBox' enum + * Generated from 'TransactionErrorPredicateAtom' enum */ -public sealed class TransactionErrorPredicateBox : ModelEnum { +public sealed class TransactionErrorPredicateAtom : ModelEnum { /** * @return Discriminator of variant in enum */ public abstract fun discriminant(): Int - override fun equals(other: Any?): Boolean = when (this) { - is IsSome -> IsSome.equals(this, other) - else -> super.equals(other) } + override fun equals(other: Any?): Boolean = + when (this) { + is IsSome -> IsSome.equals(this, other) + else -> super.equals(other) + } - override fun hashCode(): Int = when (this) { - is IsSome -> IsSome.hashCode() - else -> super.hashCode() } + override fun hashCode(): Int = + when (this) { + is IsSome -> IsSome.hashCode() + else -> super.hashCode() + } /** * 'IsSome' variant */ - public class IsSome : TransactionErrorPredicateBox() { + public class IsSome : TransactionErrorPredicateAtom() { override fun discriminant(): Int = DISCRIMINANT public companion object : - ScaleReader, - ScaleWriter { + ScaleReader, + ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TransactionErrorPredicateBox.IsSome = try { - IsSome() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TransactionErrorPredicateAtom.IsSome = + try { + IsSome() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.TransactionErrorPredicateBox.IsSome, + instance: jp.co.soramitsu.iroha2.generated.TransactionErrorPredicateAtom.IsSome, ): Unit = try { } catch (ex: Exception) { @@ -60,32 +65,36 @@ public sealed class TransactionErrorPredicateBox : ModelEnum { } public fun equals( - o1: jp.co.soramitsu.iroha2.generated.TransactionErrorPredicateBox.IsSome, + o1: jp.co.soramitsu.iroha2.generated.TransactionErrorPredicateAtom.IsSome, o2: Any?, - ): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } - override fun hashCode(): Int = ".TransactionErrorPredicateBox.IsSome".hashCode() + override fun hashCode(): Int = ".TransactionErrorPredicateAtom.IsSome".hashCode() } } public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): TransactionErrorPredicateBox = when ( - val - discriminant = reader.readUByte() - ) { - 0 -> IsSome.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): TransactionErrorPredicateAtom = + when (val discriminant = reader.readUByte()) { + 0 -> IsSome.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: TransactionErrorPredicateBox) { + override fun write( + writer: ScaleCodecWriter, + instance: TransactionErrorPredicateAtom, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> IsSome.write(writer, instance as IsSome) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionErrorProjectionOfPredicateMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionErrorProjectionOfPredicateMarker.kt new file mode 100644 index 000000000..25a87f33d --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionErrorProjectionOfPredicateMarker.kt @@ -0,0 +1,80 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit + +/** + * TransactionErrorProjectionOfPredicateMarker + * + * Generated from 'TransactionErrorProjectionOfPredicateMarker' enum + */ +public sealed class TransactionErrorProjectionOfPredicateMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val transactionErrorPredicateAtom: TransactionErrorPredicateAtom, + ) : TransactionErrorProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TransactionErrorProjectionOfPredicateMarker.Atom = + try { + Atom( + TransactionErrorPredicateAtom.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.TransactionErrorProjectionOfPredicateMarker.Atom, + ): Unit = + try { + TransactionErrorPredicateAtom.write(writer, instance.transactionErrorPredicateAtom) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): TransactionErrorProjectionOfPredicateMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: TransactionErrorProjectionOfPredicateMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionErrorProjectionOfSelectorMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionErrorProjectionOfSelectorMarker.kt new file mode 100644 index 000000000..d6950d433 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionErrorProjectionOfSelectorMarker.kt @@ -0,0 +1,100 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Any +import kotlin.Boolean +import kotlin.Int +import kotlin.Unit + +/** + * TransactionErrorProjectionOfSelectorMarker + * + * Generated from 'TransactionErrorProjectionOfSelectorMarker' enum + */ +public sealed class TransactionErrorProjectionOfSelectorMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + override fun equals(other: Any?): Boolean = + when (this) { + is Atom -> Atom.equals(this, other) + else -> super.equals(other) + } + + override fun hashCode(): Int = + when (this) { + is Atom -> Atom.hashCode() + else -> super.hashCode() + } + + /** + * 'Atom' variant + */ + public class Atom : TransactionErrorProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TransactionErrorProjectionOfSelectorMarker.Atom = + try { + Atom() + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.TransactionErrorProjectionOfSelectorMarker.Atom, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.TransactionErrorProjectionOfSelectorMarker.Atom, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".TransactionErrorProjectionOfSelectorMarker.Atom".hashCode() + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): TransactionErrorProjectionOfSelectorMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: TransactionErrorProjectionOfSelectorMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionEvent.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionEvent.kt index 7983c2327..524f30ae0 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionEvent.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionEvent.kt @@ -21,22 +21,27 @@ public data class TransactionEvent( public val status: TransactionStatus, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): TransactionEvent = try { - TransactionEvent( - HashOf.read(reader) as HashOf, - reader.readNullable(NonZeroOfu64) as NonZeroOfu64?, - TransactionStatus.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): TransactionEvent = + try { + TransactionEvent( + HashOf.read(reader) as HashOf, + reader.readNullable(NonZeroOfu64) as NonZeroOfu64?, + TransactionStatus.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: TransactionEvent): Unit = try { - HashOf.write(writer, instance.hash) - writer.writeNullable(NonZeroOfu64, instance.blockHeight) - TransactionStatus.write(writer, instance.status) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: TransactionEvent, + ): Unit = + try { + HashOf.write(writer, instance.hash) + writer.writeNullable(NonZeroOfu64, instance.blockHeight) + TransactionStatus.write(writer, instance.status) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionEventFilter.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionEventFilter.kt index 43bb4990f..6c5a087e7 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionEventFilter.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionEventFilter.kt @@ -20,23 +20,30 @@ public data class TransactionEventFilter( public val blockHeight: NonZeroOfu64? = null, public val status: TransactionStatus? = null, ) { - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): TransactionEventFilter = try { - TransactionEventFilter( - reader.readNullable(HashOf) as HashOf?, - reader.readNullable(NonZeroOfu64) as NonZeroOfu64?, - reader.readNullable(TransactionStatus) as TransactionStatus?, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): TransactionEventFilter = + try { + TransactionEventFilter( + reader.readNullable(HashOf) as HashOf?, + reader.readNullable(NonZeroOfu64) as NonZeroOfu64?, + reader.readNullable(TransactionStatus) as TransactionStatus?, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: TransactionEventFilter): Unit = try { - writer.writeNullable(HashOf, instance.hash) - writer.writeNullable(NonZeroOfu64, instance.blockHeight) - writer.writeNullable(TransactionStatus, instance.status) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: TransactionEventFilter, + ): Unit = + try { + writer.writeNullable(HashOf, instance.hash) + writer.writeNullable(NonZeroOfu64, instance.blockHeight) + writer.writeNullable(TransactionStatus, instance.status) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionHashPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionHashPredicateAtom.kt similarity index 54% rename from modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionHashPredicateBox.kt rename to modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionHashPredicateAtom.kt index 106954288..e83c2eb80 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionHashPredicateBox.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionHashPredicateAtom.kt @@ -13,11 +13,11 @@ import kotlin.Int import kotlin.Unit /** - * TransactionHashPredicateBox + * TransactionHashPredicateAtom * - * Generated from 'TransactionHashPredicateBox' enum + * Generated from 'TransactionHashPredicateAtom' enum */ -public sealed class TransactionHashPredicateBox : ModelEnum { +public sealed class TransactionHashPredicateAtom : ModelEnum { /** * @return Discriminator of variant in enum */ @@ -28,48 +28,53 @@ public sealed class TransactionHashPredicateBox : ModelEnum { */ public data class Equals( public val hashOf: HashOf, - ) : TransactionHashPredicateBox() { + ) : TransactionHashPredicateAtom() { override fun discriminant(): Int = DISCRIMINANT public companion object : - ScaleReader, - ScaleWriter { + ScaleReader, + ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TransactionHashPredicateBox.Equals = try { - Equals( - HashOf.read(reader) as HashOf, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TransactionHashPredicateAtom.Equals = + try { + Equals( + HashOf.read(reader) as HashOf, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.TransactionHashPredicateBox.Equals, - ): Unit = try { - HashOf.write(writer, instance.hashOf) - } catch (ex: Exception) { - throw wrapException(ex) - } + instance: jp.co.soramitsu.iroha2.generated.TransactionHashPredicateAtom.Equals, + ): Unit = + try { + HashOf.write(writer, instance.hashOf) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): TransactionHashPredicateBox = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Equals.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): TransactionHashPredicateAtom = + when (val discriminant = reader.readUByte()) { + 0 -> Equals.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: TransactionHashPredicateBox) { + override fun write( + writer: ScaleCodecWriter, + instance: TransactionHashPredicateAtom, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Equals.write(writer, instance as Equals) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionHashProjectionOfPredicateMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionHashProjectionOfPredicateMarker.kt new file mode 100644 index 000000000..17c8f274e --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionHashProjectionOfPredicateMarker.kt @@ -0,0 +1,80 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit + +/** + * TransactionHashProjectionOfPredicateMarker + * + * Generated from 'TransactionHashProjectionOfPredicateMarker' enum + */ +public sealed class TransactionHashProjectionOfPredicateMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val transactionHashPredicateAtom: TransactionHashPredicateAtom, + ) : TransactionHashProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TransactionHashProjectionOfPredicateMarker.Atom = + try { + Atom( + TransactionHashPredicateAtom.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.TransactionHashProjectionOfPredicateMarker.Atom, + ): Unit = + try { + TransactionHashPredicateAtom.write(writer, instance.transactionHashPredicateAtom) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): TransactionHashProjectionOfPredicateMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: TransactionHashProjectionOfPredicateMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionHashProjectionOfSelectorMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionHashProjectionOfSelectorMarker.kt new file mode 100644 index 000000000..734059614 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionHashProjectionOfSelectorMarker.kt @@ -0,0 +1,100 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Any +import kotlin.Boolean +import kotlin.Int +import kotlin.Unit + +/** + * TransactionHashProjectionOfSelectorMarker + * + * Generated from 'TransactionHashProjectionOfSelectorMarker' enum + */ +public sealed class TransactionHashProjectionOfSelectorMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + override fun equals(other: Any?): Boolean = + when (this) { + is Atom -> Atom.equals(this, other) + else -> super.equals(other) + } + + override fun hashCode(): Int = + when (this) { + is Atom -> Atom.hashCode() + else -> super.hashCode() + } + + /** + * 'Atom' variant + */ + public class Atom : TransactionHashProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TransactionHashProjectionOfSelectorMarker.Atom = + try { + Atom() + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.TransactionHashProjectionOfSelectorMarker.Atom, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.TransactionHashProjectionOfSelectorMarker.Atom, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".TransactionHashProjectionOfSelectorMarker.Atom".hashCode() + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): TransactionHashProjectionOfSelectorMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: TransactionHashProjectionOfSelectorMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionLimitError.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionLimitError.kt index 62d4d790e..f37ccded8 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionLimitError.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionLimitError.kt @@ -20,18 +20,23 @@ public data class TransactionLimitError( public val reason: String, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): TransactionLimitError = try { - TransactionLimitError( - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): TransactionLimitError = + try { + TransactionLimitError( + reader.readString(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: TransactionLimitError): Unit = try { - writer.writeAsList(instance.reason.toByteArray(Charsets.UTF_8)) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: TransactionLimitError, + ): Unit = + try { + writer.writeAsList(instance.reason.toByteArray(Charsets.UTF_8)) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionParameter.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionParameter.kt index 19acc0134..52bea2bd2 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionParameter.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionParameter.kt @@ -36,13 +36,14 @@ public sealed class TransactionParameter : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TransactionParameter.MaxInstructions = try { - MaxInstructions( - NonZeroOfu64.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TransactionParameter.MaxInstructions = + try { + MaxInstructions( + NonZeroOfu64.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, @@ -69,13 +70,14 @@ public sealed class TransactionParameter : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TransactionParameter.SmartContractSize = try { - SmartContractSize( - NonZeroOfu64.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TransactionParameter.SmartContractSize = + try { + SmartContractSize( + NonZeroOfu64.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, @@ -90,20 +92,23 @@ public sealed class TransactionParameter : ModelEnum { } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): TransactionParameter = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> MaxInstructions.read(reader) - 1 -> SmartContractSize.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + override fun read(reader: ScaleCodecReader): TransactionParameter = + when (val discriminant = reader.readUByte()) { + 0 -> MaxInstructions.read(reader) + 1 -> SmartContractSize.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: TransactionParameter) { + override fun write( + writer: ScaleCodecWriter, + instance: TransactionParameter, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> MaxInstructions.write(writer, instance as MaxInstructions) 1 -> SmartContractSize.write(writer, instance as SmartContractSize) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionParameters.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionParameters.kt index 08b4b85b0..16f8d2e5c 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionParameters.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionParameters.kt @@ -20,20 +20,25 @@ public data class TransactionParameters( public val smartContractSize: NonZeroOfu64, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): TransactionParameters = try { - TransactionParameters( - NonZeroOfu64.read(reader), - NonZeroOfu64.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): TransactionParameters = + try { + TransactionParameters( + NonZeroOfu64.read(reader), + NonZeroOfu64.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: TransactionParameters): Unit = try { - NonZeroOfu64.write(writer, instance.maxInstructions) - NonZeroOfu64.write(writer, instance.smartContractSize) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: TransactionParameters, + ): Unit = + try { + NonZeroOfu64.write(writer, instance.maxInstructions) + NonZeroOfu64.write(writer, instance.smartContractSize) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionPayload.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionPayload.kt index 5ec04fa3a..a4f53c540 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionPayload.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionPayload.kt @@ -26,30 +26,35 @@ public data class TransactionPayload( public val metadata: Metadata, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): TransactionPayload = try { - TransactionPayload( - ChainId.read(reader), - AccountId.read(reader), - reader.readUint64(), - Executable.read(reader), - reader.readNullable(NonZeroOfu64) as NonZeroOfu64?, - reader.readNullable(NonZeroOfu32) as NonZeroOfu32?, - Metadata.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): TransactionPayload = + try { + TransactionPayload( + ChainId.read(reader), + AccountId.read(reader), + reader.readUint64(), + Executable.read(reader), + reader.readNullable(NonZeroOfu64) as NonZeroOfu64?, + reader.readNullable(NonZeroOfu32) as NonZeroOfu32?, + Metadata.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: TransactionPayload): Unit = try { - ChainId.write(writer, instance.chain) - AccountId.write(writer, instance.authority) - writer.writeUint64(instance.creationTimeMs) - Executable.write(writer, instance.instructions) - writer.writeNullable(NonZeroOfu64, instance.timeToLiveMs) - writer.writeNullable(NonZeroOfu32, instance.nonce) - Metadata.write(writer, instance.metadata) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: TransactionPayload, + ): Unit = + try { + ChainId.write(writer, instance.chain) + AccountId.write(writer, instance.authority) + writer.writeUint64(instance.creationTimeMs) + Executable.write(writer, instance.instructions) + writer.writeNullable(NonZeroOfu64, instance.timeToLiveMs) + writer.writeNullable(NonZeroOfu32, instance.nonce) + Metadata.write(writer, instance.metadata) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionQueryOutput.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionQueryOutput.kt deleted file mode 100644 index 4e9d70bf6..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionQueryOutput.kt +++ /dev/null @@ -1,39 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Unit - -/** - * TransactionQueryOutput - * - * Generated from 'TransactionQueryOutput' regular structure - */ -public data class TransactionQueryOutput( - public val blockHash: HashOf, - public val transaction: CommittedTransaction, -) { - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): TransactionQueryOutput = try { - TransactionQueryOutput( - HashOf.read(reader) as HashOf, - CommittedTransaction.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write(writer: ScaleCodecWriter, instance: TransactionQueryOutput): Unit = try { - HashOf.write(writer, instance.blockHash) - CommittedTransaction.write(writer, instance.transaction) - } catch (ex: Exception) { - throw wrapException(ex) - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionQueryOutputPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionQueryOutputPredicateBox.kt deleted file mode 100644 index 759a9f58c..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionQueryOutputPredicateBox.kt +++ /dev/null @@ -1,109 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.ModelEnum -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Int -import kotlin.Unit - -/** - * TransactionQueryOutputPredicateBox - * - * Generated from 'TransactionQueryOutputPredicateBox' enum - */ -public sealed class TransactionQueryOutputPredicateBox : ModelEnum { - /** - * @return Discriminator of variant in enum - */ - public abstract fun discriminant(): Int - - /** - * 'Transaction' variant - */ - public data class Transaction( - public val committedTransactionPredicateBox: CommittedTransactionPredicateBox, - ) : TransactionQueryOutputPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 0 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TransactionQueryOutputPredicateBox.Transaction = try { - Transaction( - CommittedTransactionPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.TransactionQueryOutputPredicateBox.Transaction, - ): Unit = try { - CommittedTransactionPredicateBox.write(writer, instance.committedTransactionPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'BlockHash' variant - */ - public data class BlockHash( - public val blockHashPredicateBox: BlockHashPredicateBox, - ) : TransactionQueryOutputPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 1 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TransactionQueryOutputPredicateBox.BlockHash = try { - BlockHash( - BlockHashPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.TransactionQueryOutputPredicateBox.BlockHash, - ): Unit = try { - BlockHashPredicateBox.write(writer, instance.blockHashPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : - ScaleReader, - ScaleWriter { - override fun read(reader: ScaleCodecReader): TransactionQueryOutputPredicateBox = when ( - val - discriminant = reader.readUByte() - ) { - 0 -> Transaction.read(reader) - 1 -> BlockHash.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: TransactionQueryOutputPredicateBox) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 0 -> Transaction.write(writer, instance as Transaction) - 1 -> BlockHash.write(writer, instance as BlockHash) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionRejectionReason.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionRejectionReason.kt index 3d0165528..64bdab406 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionRejectionReason.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionRejectionReason.kt @@ -36,22 +36,24 @@ public sealed class TransactionRejectionReason : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TransactionRejectionReason.AccountDoesNotExist = try { - AccountDoesNotExist( - FindError.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TransactionRejectionReason.AccountDoesNotExist = + try { + AccountDoesNotExist( + FindError.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.TransactionRejectionReason.AccountDoesNotExist, - ): Unit = try { - FindError.write(writer, instance.findError) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + FindError.write(writer, instance.findError) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -68,13 +70,14 @@ public sealed class TransactionRejectionReason : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TransactionRejectionReason.LimitCheck = try { - LimitCheck( - TransactionLimitError.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TransactionRejectionReason.LimitCheck = + try { + LimitCheck( + TransactionLimitError.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, @@ -101,13 +104,14 @@ public sealed class TransactionRejectionReason : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 2 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TransactionRejectionReason.Validation = try { - Validation( - ValidationFail.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TransactionRejectionReason.Validation = + try { + Validation( + ValidationFail.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, @@ -134,22 +138,24 @@ public sealed class TransactionRejectionReason : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 3 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TransactionRejectionReason.InstructionExecution = try { - InstructionExecution( - InstructionExecutionFail.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TransactionRejectionReason.InstructionExecution = + try { + InstructionExecution( + InstructionExecutionFail.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.TransactionRejectionReason.InstructionExecution, - ): Unit = try { - InstructionExecutionFail.write(writer, instance.instructionExecutionFail) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + InstructionExecutionFail.write(writer, instance.instructionExecutionFail) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -166,40 +172,44 @@ public sealed class TransactionRejectionReason : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 4 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TransactionRejectionReason.WasmExecution = try { - WasmExecution( - WasmExecutionFail.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TransactionRejectionReason.WasmExecution = + try { + WasmExecution( + WasmExecutionFail.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.TransactionRejectionReason.WasmExecution, - ): Unit = try { - WasmExecutionFail.write(writer, instance.wasmExecutionFail) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + WasmExecutionFail.write(writer, instance.wasmExecutionFail) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): TransactionRejectionReason = when ( - val discriminant = - reader.readUByte() + override fun read(reader: ScaleCodecReader): TransactionRejectionReason = + when (val discriminant = reader.readUByte()) { + 0 -> AccountDoesNotExist.read(reader) + 1 -> LimitCheck.read(reader) + 2 -> Validation.read(reader) + 3 -> InstructionExecution.read(reader) + 4 -> WasmExecution.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: TransactionRejectionReason, ) { - 0 -> AccountDoesNotExist.read(reader) - 1 -> LimitCheck.read(reader) - 2 -> Validation.read(reader) - 3 -> InstructionExecution.read(reader) - 4 -> WasmExecution.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: TransactionRejectionReason) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> AccountDoesNotExist.write(writer, instance as AccountDoesNotExist) @@ -207,7 +217,8 @@ public sealed class TransactionRejectionReason : ModelEnum { 2 -> Validation.write(writer, instance as Validation) 3 -> InstructionExecution.write(writer, instance as InstructionExecution) 4 -> WasmExecution.write(writer, instance as WasmExecution) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionSignature.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionSignature.kt index 3b0641777..abb092780 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionSignature.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionSignature.kt @@ -19,18 +19,23 @@ public data class TransactionSignature( public val signatureOfOfTransactionPayload: SignatureOf, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): TransactionSignature = try { - TransactionSignature( - SignatureOf.read(reader) as SignatureOf, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): TransactionSignature = + try { + TransactionSignature( + SignatureOf.read(reader) as SignatureOf, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: TransactionSignature): Unit = try { - SignatureOf.write(writer, instance.signatureOfOfTransactionPayload) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: TransactionSignature, + ): Unit = + try { + SignatureOf.write(writer, instance.signatureOfOfTransactionPayload) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionStatus.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionStatus.kt index edbf679b6..0c821f2b7 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionStatus.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransactionStatus.kt @@ -25,17 +25,21 @@ public sealed class TransactionStatus : ModelEnum { */ public abstract fun discriminant(): Int - override fun equals(other: Any?): Boolean = when (this) { - is Queued -> Queued.equals(this, other) - is Expired -> Expired.equals(this, other) - is Approved -> Approved.equals(this, other) - else -> super.equals(other) } - - override fun hashCode(): Int = when (this) { - is Queued -> Queued.hashCode() - is Expired -> Expired.hashCode() - is Approved -> Approved.hashCode() - else -> super.hashCode() } + override fun equals(other: Any?): Boolean = + when (this) { + is Queued -> Queued.equals(this, other) + is Expired -> Expired.equals(this, other) + is Approved -> Approved.equals(this, other) + else -> super.equals(other) + } + + override fun hashCode(): Int = + when (this) { + is Queued -> Queued.hashCode() + is Expired -> Expired.hashCode() + is Approved -> Approved.hashCode() + else -> super.hashCode() + } /** * 'Queued' variant @@ -48,24 +52,30 @@ public sealed class TransactionStatus : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TransactionStatus.Queued = try { - Queued() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TransactionStatus.Queued = + try { + Queued() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.TransactionStatus.Queued, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } - - public fun equals(o1: jp.co.soramitsu.iroha2.generated.TransactionStatus.Queued, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.TransactionStatus.Queued, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".TransactionStatus.Queued".hashCode() } @@ -82,24 +92,30 @@ public sealed class TransactionStatus : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TransactionStatus.Expired = try { - Expired() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TransactionStatus.Expired = + try { + Expired() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.TransactionStatus.Expired, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } - - public fun equals(o1: jp.co.soramitsu.iroha2.generated.TransactionStatus.Expired, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.TransactionStatus.Expired, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".TransactionStatus.Expired".hashCode() } @@ -116,24 +132,30 @@ public sealed class TransactionStatus : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 2 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TransactionStatus.Approved = try { - Approved() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TransactionStatus.Approved = + try { + Approved() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.TransactionStatus.Approved, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } - - public fun equals(o1: jp.co.soramitsu.iroha2.generated.TransactionStatus.Approved, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.TransactionStatus.Approved, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".TransactionStatus.Approved".hashCode() } @@ -152,44 +174,49 @@ public sealed class TransactionStatus : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 3 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TransactionStatus.Rejected = try { - Rejected( - TransactionRejectionReason.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TransactionStatus.Rejected = + try { + Rejected( + TransactionRejectionReason.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.TransactionStatus.Rejected, - ): Unit = try { - TransactionRejectionReason.write(writer, instance.transactionRejectionReason) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + TransactionRejectionReason.write(writer, instance.transactionRejectionReason) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): TransactionStatus = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Queued.read(reader) - 1 -> Expired.read(reader) - 2 -> Approved.read(reader) - 3 -> Rejected.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + override fun read(reader: ScaleCodecReader): TransactionStatus = + when (val discriminant = reader.readUByte()) { + 0 -> Queued.read(reader) + 1 -> Expired.read(reader) + 2 -> Approved.read(reader) + 3 -> Rejected.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: TransactionStatus) { + override fun write( + writer: ScaleCodecWriter, + instance: TransactionStatus, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Queued.write(writer, instance as Queued) 1 -> Expired.write(writer, instance as Expired) 2 -> Approved.write(writer, instance as Approved) 3 -> Rejected.write(writer, instance as Rejected) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransferBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransferBox.kt index c5ffdca08..a608c4110 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransferBox.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransferBox.kt @@ -36,25 +36,24 @@ public sealed class TransferBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TransferBox.Domain = try { - Domain( - TransferOfAccountAndDomainIdAndAccount.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TransferBox.Domain = + try { + Domain( + TransferOfAccountAndDomainIdAndAccount.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.TransferBox.Domain, - ): Unit = try { - TransferOfAccountAndDomainIdAndAccount.write( - writer, - instance.transferOfAccountAndDomainIdAndAccount, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + TransferOfAccountAndDomainIdAndAccount.write(writer, instance.transferOfAccountAndDomainIdAndAccount) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -62,8 +61,7 @@ public sealed class TransferBox : ModelEnum { * 'AssetDefinition' variant */ public data class AssetDefinition( - public val transferOfAccountAndAssetDefinitionIdAndAccount: - TransferOfAccountAndAssetDefinitionIdAndAccount, + public val transferOfAccountAndAssetDefinitionIdAndAccount: TransferOfAccountAndAssetDefinitionIdAndAccount, ) : TransferBox() { override fun discriminant(): Int = DISCRIMINANT @@ -72,25 +70,24 @@ public sealed class TransferBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TransferBox.AssetDefinition = try { - AssetDefinition( - TransferOfAccountAndAssetDefinitionIdAndAccount.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TransferBox.AssetDefinition = + try { + AssetDefinition( + TransferOfAccountAndAssetDefinitionIdAndAccount.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.TransferBox.AssetDefinition, - ): Unit = try { - TransferOfAccountAndAssetDefinitionIdAndAccount.write( - writer, - instance.transferOfAccountAndAssetDefinitionIdAndAccount, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + TransferOfAccountAndAssetDefinitionIdAndAccount.write(writer, instance.transferOfAccountAndAssetDefinitionIdAndAccount) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -107,42 +104,47 @@ public sealed class TransferBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 2 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TransferBox.Asset = try { - Asset( - AssetTransferBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TransferBox.Asset = + try { + Asset( + AssetTransferBox.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.TransferBox.Asset, - ): Unit = try { - AssetTransferBox.write(writer, instance.assetTransferBox) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + AssetTransferBox.write(writer, instance.assetTransferBox) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): TransferBox = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Domain.read(reader) - 1 -> AssetDefinition.read(reader) - 2 -> Asset.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + override fun read(reader: ScaleCodecReader): TransferBox = + when (val discriminant = reader.readUByte()) { + 0 -> Domain.read(reader) + 1 -> AssetDefinition.read(reader) + 2 -> Asset.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: TransferBox) { + override fun write( + writer: ScaleCodecWriter, + instance: TransferBox, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Domain.write(writer, instance as Domain) 1 -> AssetDefinition.write(writer, instance as AssetDefinition) 2 -> Asset.write(writer, instance as Asset) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransferOfAccountAndAssetDefinitionIdAndAccount.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransferOfAccountAndAssetDefinitionIdAndAccount.kt index cc718549b..478b00073 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransferOfAccountAndAssetDefinitionIdAndAccount.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransferOfAccountAndAssetDefinitionIdAndAccount.kt @@ -3,10 +3,13 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException import kotlin.Unit @@ -19,7 +22,9 @@ public data class TransferOfAccountAndAssetDefinitionIdAndAccount( public val source: AccountId, public val `object`: AssetDefinitionId, public val destination: AccountId, -) { +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { @@ -37,12 +42,13 @@ public data class TransferOfAccountAndAssetDefinitionIdAndAccount( override fun write( writer: ScaleCodecWriter, instance: TransferOfAccountAndAssetDefinitionIdAndAccount, - ): Unit = try { - AccountId.write(writer, instance.source) - AssetDefinitionId.write(writer, instance.`object`) - AccountId.write(writer, instance.destination) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + AccountId.write(writer, instance.source) + AssetDefinitionId.write(writer, instance.`object`) + AccountId.write(writer, instance.destination) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransferOfAccountAndDomainIdAndAccount.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransferOfAccountAndDomainIdAndAccount.kt index 6161fa14c..56ecc3806 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransferOfAccountAndDomainIdAndAccount.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransferOfAccountAndDomainIdAndAccount.kt @@ -3,10 +3,13 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException import kotlin.Unit @@ -19,26 +22,33 @@ public data class TransferOfAccountAndDomainIdAndAccount( public val source: AccountId, public val `object`: DomainId, public val destination: AccountId, -) { +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): TransferOfAccountAndDomainIdAndAccount = try { - TransferOfAccountAndDomainIdAndAccount( - AccountId.read(reader), - DomainId.read(reader), - AccountId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): TransferOfAccountAndDomainIdAndAccount = + try { + TransferOfAccountAndDomainIdAndAccount( + AccountId.read(reader), + DomainId.read(reader), + AccountId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: TransferOfAccountAndDomainIdAndAccount): Unit = try { - AccountId.write(writer, instance.source) - DomainId.write(writer, instance.`object`) - AccountId.write(writer, instance.destination) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: TransferOfAccountAndDomainIdAndAccount, + ): Unit = + try { + AccountId.write(writer, instance.source) + DomainId.write(writer, instance.`object`) + AccountId.write(writer, instance.destination) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransferOfAssetAndMetadataAndAccount.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransferOfAssetAndMetadataAndAccount.kt index da8e344a0..028a069cc 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransferOfAssetAndMetadataAndAccount.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransferOfAssetAndMetadataAndAccount.kt @@ -3,10 +3,13 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException import kotlin.Unit @@ -19,26 +22,33 @@ public data class TransferOfAssetAndMetadataAndAccount( public val source: AssetId, public val `object`: Metadata, public val destination: AccountId, -) { +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): TransferOfAssetAndMetadataAndAccount = try { - TransferOfAssetAndMetadataAndAccount( - AssetId.read(reader), - Metadata.read(reader), - AccountId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): TransferOfAssetAndMetadataAndAccount = + try { + TransferOfAssetAndMetadataAndAccount( + AssetId.read(reader), + Metadata.read(reader), + AccountId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: TransferOfAssetAndMetadataAndAccount): Unit = try { - AssetId.write(writer, instance.source) - Metadata.write(writer, instance.`object`) - AccountId.write(writer, instance.destination) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: TransferOfAssetAndMetadataAndAccount, + ): Unit = + try { + AssetId.write(writer, instance.source) + Metadata.write(writer, instance.`object`) + AccountId.write(writer, instance.destination) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransferOfAssetAndNumericAndAccount.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransferOfAssetAndNumericAndAccount.kt index 2612f94f4..b19aeb791 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransferOfAssetAndNumericAndAccount.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TransferOfAssetAndNumericAndAccount.kt @@ -3,10 +3,13 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException import kotlin.Unit @@ -19,26 +22,33 @@ public data class TransferOfAssetAndNumericAndAccount( public val source: AssetId, public val `object`: Numeric, public val destination: AccountId, -) { +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): TransferOfAssetAndNumericAndAccount = try { - TransferOfAssetAndNumericAndAccount( - AssetId.read(reader), - Numeric.read(reader), - AccountId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): TransferOfAssetAndNumericAndAccount = + try { + TransferOfAssetAndNumericAndAccount( + AssetId.read(reader), + Numeric.read(reader), + AccountId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: TransferOfAssetAndNumericAndAccount): Unit = try { - AssetId.write(writer, instance.source) - Numeric.write(writer, instance.`object`) - AccountId.write(writer, instance.destination) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: TransferOfAssetAndNumericAndAccount, + ): Unit = + try { + AssetId.write(writer, instance.source) + Numeric.write(writer, instance.`object`) + AccountId.write(writer, instance.destination) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Trigger.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Trigger.kt index 309e54abf..07e26884f 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Trigger.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Trigger.kt @@ -20,20 +20,25 @@ public data class Trigger( public val action: Action, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): Trigger = try { - Trigger( - TriggerId.read(reader), - Action.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): Trigger = + try { + Trigger( + TriggerId.read(reader), + Action.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: Trigger): Unit = try { - TriggerId.write(writer, instance.id) - Action.write(writer, instance.action) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: Trigger, + ): Unit = + try { + TriggerId.write(writer, instance.id) + Action.write(writer, instance.action) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerCompletedEvent.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerCompletedEvent.kt index d741a20d7..b86a3620a 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerCompletedEvent.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerCompletedEvent.kt @@ -20,20 +20,25 @@ public data class TriggerCompletedEvent( public val outcome: TriggerCompletedOutcome, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): TriggerCompletedEvent = try { - TriggerCompletedEvent( - TriggerId.read(reader), - TriggerCompletedOutcome.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): TriggerCompletedEvent = + try { + TriggerCompletedEvent( + TriggerId.read(reader), + TriggerCompletedOutcome.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: TriggerCompletedEvent): Unit = try { - TriggerId.write(writer, instance.triggerId) - TriggerCompletedOutcome.write(writer, instance.outcome) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: TriggerCompletedEvent, + ): Unit = + try { + TriggerId.write(writer, instance.triggerId) + TriggerCompletedOutcome.write(writer, instance.outcome) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerCompletedEventFilter.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerCompletedEventFilter.kt index e6d935711..82ef08c88 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerCompletedEventFilter.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerCompletedEventFilter.kt @@ -22,20 +22,25 @@ public data class TriggerCompletedEventFilter( public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): TriggerCompletedEventFilter = try { - TriggerCompletedEventFilter( - reader.readNullable(TriggerId) as TriggerId?, - reader.readNullable(TriggerCompletedOutcomeType) as TriggerCompletedOutcomeType?, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): TriggerCompletedEventFilter = + try { + TriggerCompletedEventFilter( + reader.readNullable(TriggerId) as TriggerId?, + reader.readNullable(TriggerCompletedOutcomeType) as TriggerCompletedOutcomeType?, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: TriggerCompletedEventFilter): Unit = try { - writer.writeNullable(TriggerId, instance.triggerId) - writer.writeNullable(TriggerCompletedOutcomeType, instance.outcomeType) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: TriggerCompletedEventFilter, + ): Unit = + try { + writer.writeNullable(TriggerId, instance.triggerId) + writer.writeNullable(TriggerCompletedOutcomeType, instance.outcomeType) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerCompletedOutcome.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerCompletedOutcome.kt index ff963e5bf..f7bc160ac 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerCompletedOutcome.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerCompletedOutcome.kt @@ -26,13 +26,17 @@ public sealed class TriggerCompletedOutcome : ModelEnum { */ public abstract fun discriminant(): Int - override fun equals(other: Any?): Boolean = when (this) { - is Success -> Success.equals(this, other) - else -> super.equals(other) } + override fun equals(other: Any?): Boolean = + when (this) { + is Success -> Success.equals(this, other) + else -> super.equals(other) + } - override fun hashCode(): Int = when (this) { - is Success -> Success.hashCode() - else -> super.hashCode() } + override fun hashCode(): Int = + when (this) { + is Success -> Success.hashCode() + else -> super.hashCode() + } /** * 'Success' variant @@ -45,27 +49,30 @@ public sealed class TriggerCompletedOutcome : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TriggerCompletedOutcome.Success = try { - Success() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TriggerCompletedOutcome.Success = + try { + Success() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.TriggerCompletedOutcome.Success, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } public fun equals( o1: jp.co.soramitsu.iroha2.generated.TriggerCompletedOutcome.Success, o2: Any?, - ): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".TriggerCompletedOutcome.Success".hashCode() } @@ -84,42 +91,47 @@ public sealed class TriggerCompletedOutcome : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TriggerCompletedOutcome.Failure = try { - Failure( - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TriggerCompletedOutcome.Failure = + try { + Failure( + reader.readString(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.TriggerCompletedOutcome.Failure, - ): Unit = try { - writer.writeAsList(instance.string.toByteArray(Charsets.UTF_8)) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + writer.writeAsList(instance.string.toByteArray(Charsets.UTF_8)) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): TriggerCompletedOutcome = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Success.read(reader) - 1 -> Failure.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + override fun read(reader: ScaleCodecReader): TriggerCompletedOutcome = + when (val discriminant = reader.readUByte()) { + 0 -> Success.read(reader) + 1 -> Failure.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: TriggerCompletedOutcome) { + override fun write( + writer: ScaleCodecWriter, + instance: TriggerCompletedOutcome, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Success.write(writer, instance as Success) 1 -> Failure.write(writer, instance as Failure) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerCompletedOutcomeType.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerCompletedOutcomeType.kt index 2e1dbff1a..c673a02e0 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerCompletedOutcomeType.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerCompletedOutcomeType.kt @@ -25,15 +25,19 @@ public sealed class TriggerCompletedOutcomeType : ModelEnum { */ public abstract fun discriminant(): Int - override fun equals(other: Any?): Boolean = when (this) { - is Success -> Success.equals(this, other) - is Failure -> Failure.equals(this, other) - else -> super.equals(other) } + override fun equals(other: Any?): Boolean = + when (this) { + is Success -> Success.equals(this, other) + is Failure -> Failure.equals(this, other) + else -> super.equals(other) + } - override fun hashCode(): Int = when (this) { - is Success -> Success.hashCode() - is Failure -> Failure.hashCode() - else -> super.hashCode() } + override fun hashCode(): Int = + when (this) { + is Success -> Success.hashCode() + is Failure -> Failure.hashCode() + else -> super.hashCode() + } /** * 'Success' variant @@ -46,11 +50,12 @@ public sealed class TriggerCompletedOutcomeType : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TriggerCompletedOutcomeType.Success = try { - Success() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TriggerCompletedOutcomeType.Success = + try { + Success() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, @@ -64,10 +69,11 @@ public sealed class TriggerCompletedOutcomeType : ModelEnum { public fun equals( o1: jp.co.soramitsu.iroha2.generated.TriggerCompletedOutcomeType.Success, o2: Any?, - ): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".TriggerCompletedOutcomeType.Success".hashCode() } @@ -84,11 +90,12 @@ public sealed class TriggerCompletedOutcomeType : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TriggerCompletedOutcomeType.Failure = try { - Failure() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TriggerCompletedOutcomeType.Failure = + try { + Failure() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, @@ -102,10 +109,11 @@ public sealed class TriggerCompletedOutcomeType : ModelEnum { public fun equals( o1: jp.co.soramitsu.iroha2.generated.TriggerCompletedOutcomeType.Failure, o2: Any?, - ): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".TriggerCompletedOutcomeType.Failure".hashCode() } @@ -114,20 +122,23 @@ public sealed class TriggerCompletedOutcomeType : ModelEnum { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): TriggerCompletedOutcomeType = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Success.read(reader) - 1 -> Failure.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + override fun read(reader: ScaleCodecReader): TriggerCompletedOutcomeType = + when (val discriminant = reader.readUByte()) { + 0 -> Success.read(reader) + 1 -> Failure.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: TriggerCompletedOutcomeType) { + override fun write( + writer: ScaleCodecWriter, + instance: TriggerCompletedOutcomeType, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Success.write(writer, instance as Success) 1 -> Failure.write(writer, instance as Failure) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerEvent.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerEvent.kt index 842418358..22aca3df7 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerEvent.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerEvent.kt @@ -36,22 +36,24 @@ public sealed class TriggerEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TriggerEvent.Created = try { - Created( - TriggerId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TriggerEvent.Created = + try { + Created( + TriggerId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.TriggerEvent.Created, - ): Unit = try { - TriggerId.write(writer, instance.triggerId) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + TriggerId.write(writer, instance.triggerId) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -68,22 +70,24 @@ public sealed class TriggerEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TriggerEvent.Deleted = try { - Deleted( - TriggerId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TriggerEvent.Deleted = + try { + Deleted( + TriggerId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.TriggerEvent.Deleted, - ): Unit = try { - TriggerId.write(writer, instance.triggerId) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + TriggerId.write(writer, instance.triggerId) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -100,22 +104,24 @@ public sealed class TriggerEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 2 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TriggerEvent.Extended = try { - Extended( - TriggerNumberOfExecutionsChanged.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TriggerEvent.Extended = + try { + Extended( + TriggerNumberOfExecutionsChanged.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.TriggerEvent.Extended, - ): Unit = try { - TriggerNumberOfExecutionsChanged.write(writer, instance.triggerNumberOfExecutionsChanged) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + TriggerNumberOfExecutionsChanged.write(writer, instance.triggerNumberOfExecutionsChanged) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -132,22 +138,24 @@ public sealed class TriggerEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 3 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TriggerEvent.Shortened = try { - Shortened( - TriggerNumberOfExecutionsChanged.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TriggerEvent.Shortened = + try { + Shortened( + TriggerNumberOfExecutionsChanged.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.TriggerEvent.Shortened, - ): Unit = try { - TriggerNumberOfExecutionsChanged.write(writer, instance.triggerNumberOfExecutionsChanged) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + TriggerNumberOfExecutionsChanged.write(writer, instance.triggerNumberOfExecutionsChanged) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -164,22 +172,24 @@ public sealed class TriggerEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 4 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TriggerEvent.MetadataInserted = try { - MetadataInserted( - MetadataChangedOfTriggerId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TriggerEvent.MetadataInserted = + try { + MetadataInserted( + MetadataChangedOfTriggerId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.TriggerEvent.MetadataInserted, - ): Unit = try { - MetadataChangedOfTriggerId.write(writer, instance.metadataChangedOfTriggerId) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + MetadataChangedOfTriggerId.write(writer, instance.metadataChangedOfTriggerId) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -196,39 +206,43 @@ public sealed class TriggerEvent : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 5 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TriggerEvent.MetadataRemoved = try { - MetadataRemoved( - MetadataChangedOfTriggerId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TriggerEvent.MetadataRemoved = + try { + MetadataRemoved( + MetadataChangedOfTriggerId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.TriggerEvent.MetadataRemoved, - ): Unit = try { - MetadataChangedOfTriggerId.write(writer, instance.metadataChangedOfTriggerId) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + MetadataChangedOfTriggerId.write(writer, instance.metadataChangedOfTriggerId) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): TriggerEvent = when ( - val discriminant = - reader.readUByte() + override fun read(reader: ScaleCodecReader): TriggerEvent = + when (val discriminant = reader.readUByte()) { + 0 -> Created.read(reader) + 1 -> Deleted.read(reader) + 2 -> Extended.read(reader) + 3 -> Shortened.read(reader) + 4 -> MetadataInserted.read(reader) + 5 -> MetadataRemoved.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: TriggerEvent, ) { - 0 -> Created.read(reader) - 1 -> Deleted.read(reader) - 2 -> Extended.read(reader) - 3 -> Shortened.read(reader) - 4 -> MetadataInserted.read(reader) - 5 -> MetadataRemoved.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: TriggerEvent) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Created.write(writer, instance as Created) @@ -237,7 +251,8 @@ public sealed class TriggerEvent : ModelEnum { 3 -> Shortened.write(writer, instance as Shortened) 4 -> MetadataInserted.write(writer, instance as MetadataInserted) 5 -> MetadataRemoved.write(writer, instance as MetadataRemoved) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerEventFilter.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerEventFilter.kt index 239257a3e..e8cb5586e 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerEventFilter.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerEventFilter.kt @@ -21,20 +21,25 @@ public data class TriggerEventFilter( public val eventSet: Long, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): TriggerEventFilter = try { - TriggerEventFilter( - reader.readNullable(TriggerId) as TriggerId?, - reader.readUint32(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): TriggerEventFilter = + try { + TriggerEventFilter( + reader.readNullable(TriggerId) as TriggerId?, + reader.readUint32(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: TriggerEventFilter): Unit = try { - writer.writeNullable(TriggerId, instance.idMatcher) - writer.writeUint32(instance.eventSet) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: TriggerEventFilter, + ): Unit = + try { + writer.writeNullable(TriggerId, instance.idMatcher) + writer.writeUint32(instance.eventSet) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerId.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerId.kt index f023fd8f9..6b307087c 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerId.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerId.kt @@ -19,18 +19,23 @@ public data class TriggerId( public val name: Name, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): TriggerId = try { - TriggerId( - Name.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): TriggerId = + try { + TriggerId( + Name.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: TriggerId): Unit = try { - Name.write(writer, instance.name) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: TriggerId, + ): Unit = + try { + Name.write(writer, instance.name) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerIdPredicateAtom.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerIdPredicateAtom.kt new file mode 100644 index 000000000..875e697f5 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerIdPredicateAtom.kt @@ -0,0 +1,80 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit + +/** + * TriggerIdPredicateAtom + * + * Generated from 'TriggerIdPredicateAtom' enum + */ +public sealed class TriggerIdPredicateAtom : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Equals' variant + */ + public data class Equals( + public val triggerId: TriggerId, + ) : TriggerIdPredicateAtom() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TriggerIdPredicateAtom.Equals = + try { + Equals( + TriggerId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.TriggerIdPredicateAtom.Equals, + ): Unit = + try { + TriggerId.write(writer, instance.triggerId) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): TriggerIdPredicateAtom = + when (val discriminant = reader.readUByte()) { + 0 -> Equals.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: TriggerIdPredicateAtom, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Equals.write(writer, instance as Equals) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerIdPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerIdPredicateBox.kt deleted file mode 100644 index 103be10a3..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerIdPredicateBox.kt +++ /dev/null @@ -1,107 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.ModelEnum -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Int -import kotlin.Unit - -/** - * TriggerIdPredicateBox - * - * Generated from 'TriggerIdPredicateBox' enum - */ -public sealed class TriggerIdPredicateBox : ModelEnum { - /** - * @return Discriminator of variant in enum - */ - public abstract fun discriminant(): Int - - /** - * 'Equals' variant - */ - public data class Equals( - public val triggerId: TriggerId, - ) : TriggerIdPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 0 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TriggerIdPredicateBox.Equals = try { - Equals( - TriggerId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.TriggerIdPredicateBox.Equals, - ): Unit = try { - TriggerId.write(writer, instance.triggerId) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - /** - * 'Name' variant - */ - public data class Name( - public val stringPredicateBox: StringPredicateBox, - ) : TriggerIdPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 1 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TriggerIdPredicateBox.Name = try { - Name( - StringPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.TriggerIdPredicateBox.Name, - ): Unit = try { - StringPredicateBox.write(writer, instance.stringPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): TriggerIdPredicateBox = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Equals.read(reader) - 1 -> Name.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: TriggerIdPredicateBox) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 0 -> Equals.write(writer, instance as Equals) - 1 -> Name.write(writer, instance as Name) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerIdProjectionOfPredicateMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerIdProjectionOfPredicateMarker.kt new file mode 100644 index 000000000..dcac2d74c --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerIdProjectionOfPredicateMarker.kt @@ -0,0 +1,116 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit + +/** + * TriggerIdProjectionOfPredicateMarker + * + * Generated from 'TriggerIdProjectionOfPredicateMarker' enum + */ +public sealed class TriggerIdProjectionOfPredicateMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val triggerIdPredicateAtom: TriggerIdPredicateAtom, + ) : TriggerIdProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TriggerIdProjectionOfPredicateMarker.Atom = + try { + Atom( + TriggerIdPredicateAtom.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.TriggerIdProjectionOfPredicateMarker.Atom, + ): Unit = + try { + TriggerIdPredicateAtom.write(writer, instance.triggerIdPredicateAtom) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Name' variant + */ + public data class Name( + public val nameProjectionOfPredicateMarker: NameProjectionOfPredicateMarker, + ) : TriggerIdProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TriggerIdProjectionOfPredicateMarker.Name = + try { + Name( + NameProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.TriggerIdProjectionOfPredicateMarker.Name, + ): Unit = + try { + NameProjectionOfPredicateMarker.write(writer, instance.nameProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): TriggerIdProjectionOfPredicateMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Name.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: TriggerIdProjectionOfPredicateMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Name.write(writer, instance as Name) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerIdProjectionOfSelectorMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerIdProjectionOfSelectorMarker.kt new file mode 100644 index 000000000..bcda79ac4 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerIdProjectionOfSelectorMarker.kt @@ -0,0 +1,136 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Any +import kotlin.Boolean +import kotlin.Int +import kotlin.Unit + +/** + * TriggerIdProjectionOfSelectorMarker + * + * Generated from 'TriggerIdProjectionOfSelectorMarker' enum + */ +public sealed class TriggerIdProjectionOfSelectorMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + override fun equals(other: Any?): Boolean = + when (this) { + is Atom -> Atom.equals(this, other) + else -> super.equals(other) + } + + override fun hashCode(): Int = + when (this) { + is Atom -> Atom.hashCode() + else -> super.hashCode() + } + + /** + * 'Atom' variant + */ + public class Atom : TriggerIdProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TriggerIdProjectionOfSelectorMarker.Atom = + try { + Atom() + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.TriggerIdProjectionOfSelectorMarker.Atom, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.TriggerIdProjectionOfSelectorMarker.Atom, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".TriggerIdProjectionOfSelectorMarker.Atom".hashCode() + } + } + + /** + * 'Name' variant + */ + public data class Name( + public val nameProjectionOfSelectorMarker: NameProjectionOfSelectorMarker, + ) : TriggerIdProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TriggerIdProjectionOfSelectorMarker.Name = + try { + Name( + NameProjectionOfSelectorMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.TriggerIdProjectionOfSelectorMarker.Name, + ): Unit = + try { + NameProjectionOfSelectorMarker.write(writer, instance.nameProjectionOfSelectorMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): TriggerIdProjectionOfSelectorMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Name.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: TriggerIdProjectionOfSelectorMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Name.write(writer, instance as Name) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerNumberOfExecutionsChanged.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerNumberOfExecutionsChanged.kt index f63765280..6ea75f66b 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerNumberOfExecutionsChanged.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerNumberOfExecutionsChanged.kt @@ -23,16 +23,20 @@ public data class TriggerNumberOfExecutionsChanged( public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): TriggerNumberOfExecutionsChanged = try { - TriggerNumberOfExecutionsChanged( - TriggerId.read(reader), - reader.readUint32(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): TriggerNumberOfExecutionsChanged = + try { + TriggerNumberOfExecutionsChanged( + TriggerId.read(reader), + reader.readUint32(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: TriggerNumberOfExecutionsChanged): Unit = + override fun write( + writer: ScaleCodecWriter, + instance: TriggerNumberOfExecutionsChanged, + ): Unit = try { TriggerId.write(writer, instance.trigger) writer.writeUint32(instance.`by`) diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerPredicateAtom.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerPredicateAtom.kt new file mode 100644 index 000000000..4b8dc061f --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerPredicateAtom.kt @@ -0,0 +1,40 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import kotlin.Int + +/** + * TriggerPredicateAtom + * + * Generated from 'TriggerPredicateAtom' enum + */ +public sealed class TriggerPredicateAtom : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + public companion object : ScaleReader, ScaleWriter { + override fun read(reader: ScaleCodecReader): TriggerPredicateAtom = + when (val discriminant = reader.readUByte()) { + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: TriggerPredicateAtom, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerPredicateBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerPredicateBox.kt deleted file mode 100644 index 018dfee8b..000000000 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerPredicateBox.kt +++ /dev/null @@ -1,73 +0,0 @@ -// -// Auto-generated file. DO NOT EDIT! -// -package jp.co.soramitsu.iroha2.generated - -import jp.co.soramitsu.iroha2.ModelEnum -import jp.co.soramitsu.iroha2.codec.ScaleCodecReader -import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter -import jp.co.soramitsu.iroha2.codec.ScaleReader -import jp.co.soramitsu.iroha2.codec.ScaleWriter -import jp.co.soramitsu.iroha2.wrapException -import kotlin.Int -import kotlin.Unit - -/** - * TriggerPredicateBox - * - * Generated from 'TriggerPredicateBox' enum - */ -public sealed class TriggerPredicateBox : ModelEnum { - /** - * @return Discriminator of variant in enum - */ - public abstract fun discriminant(): Int - - /** - * 'Id' variant - */ - public data class Id( - public val triggerIdPredicateBox: TriggerIdPredicateBox, - ) : TriggerPredicateBox() { - override fun discriminant(): Int = DISCRIMINANT - - public companion object : - ScaleReader, - ScaleWriter { - public const val DISCRIMINANT: Int = 0 - - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TriggerPredicateBox.Id = try { - Id( - TriggerIdPredicateBox.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } - - override fun write( - writer: ScaleCodecWriter, - instance: jp.co.soramitsu.iroha2.generated.TriggerPredicateBox.Id, - ): Unit = try { - TriggerIdPredicateBox.write(writer, instance.triggerIdPredicateBox) - } catch (ex: Exception) { - throw wrapException(ex) - } - } - } - - public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): TriggerPredicateBox = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> Id.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: TriggerPredicateBox) { - writer.directWrite(instance.discriminant()) - when (val discriminant = instance.discriminant()) { - 0 -> Id.write(writer, instance as Id) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - } - } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerProjectionOfPredicateMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerProjectionOfPredicateMarker.kt new file mode 100644 index 000000000..f68e390f5 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerProjectionOfPredicateMarker.kt @@ -0,0 +1,152 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Int +import kotlin.Unit + +/** + * TriggerProjectionOfPredicateMarker + * + * Generated from 'TriggerProjectionOfPredicateMarker' enum + */ +public sealed class TriggerProjectionOfPredicateMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + /** + * 'Atom' variant + */ + public data class Atom( + public val triggerPredicateAtom: TriggerPredicateAtom, + ) : TriggerProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TriggerProjectionOfPredicateMarker.Atom = + try { + Atom( + TriggerPredicateAtom.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.TriggerProjectionOfPredicateMarker.Atom, + ): Unit = + try { + TriggerPredicateAtom.write(writer, instance.triggerPredicateAtom) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Id' variant + */ + public data class Id( + public val triggerIdProjectionOfPredicateMarker: TriggerIdProjectionOfPredicateMarker, + ) : TriggerProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TriggerProjectionOfPredicateMarker.Id = + try { + Id( + TriggerIdProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.TriggerProjectionOfPredicateMarker.Id, + ): Unit = + try { + TriggerIdProjectionOfPredicateMarker.write(writer, instance.triggerIdProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Action' variant + */ + public data class Action( + public val actionProjectionOfPredicateMarker: ActionProjectionOfPredicateMarker, + ) : TriggerProjectionOfPredicateMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 2 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TriggerProjectionOfPredicateMarker.Action = + try { + Action( + ActionProjectionOfPredicateMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.TriggerProjectionOfPredicateMarker.Action, + ): Unit = + try { + ActionProjectionOfPredicateMarker.write(writer, instance.actionProjectionOfPredicateMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): TriggerProjectionOfPredicateMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Id.read(reader) + 2 -> Action.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: TriggerProjectionOfPredicateMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Id.write(writer, instance as Id) + 2 -> Action.write(writer, instance as Action) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerProjectionOfSelectorMarker.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerProjectionOfSelectorMarker.kt new file mode 100644 index 000000000..3daf69ae1 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TriggerProjectionOfSelectorMarker.kt @@ -0,0 +1,172 @@ +// +// Auto-generated file. DO NOT EDIT! +// +package jp.co.soramitsu.iroha2.generated + +import jp.co.soramitsu.iroha2.ModelEnum +import jp.co.soramitsu.iroha2.codec.ScaleCodecReader +import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter +import jp.co.soramitsu.iroha2.codec.ScaleReader +import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.wrapException +import kotlin.Any +import kotlin.Boolean +import kotlin.Int +import kotlin.Unit + +/** + * TriggerProjectionOfSelectorMarker + * + * Generated from 'TriggerProjectionOfSelectorMarker' enum + */ +public sealed class TriggerProjectionOfSelectorMarker : ModelEnum { + /** + * @return Discriminator of variant in enum + */ + public abstract fun discriminant(): Int + + override fun equals(other: Any?): Boolean = + when (this) { + is Atom -> Atom.equals(this, other) + else -> super.equals(other) + } + + override fun hashCode(): Int = + when (this) { + is Atom -> Atom.hashCode() + else -> super.hashCode() + } + + /** + * 'Atom' variant + */ + public class Atom : TriggerProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 0 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TriggerProjectionOfSelectorMarker.Atom = + try { + Atom() + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.TriggerProjectionOfSelectorMarker.Atom, + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } + + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.TriggerProjectionOfSelectorMarker.Atom, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } + + override fun hashCode(): Int = ".TriggerProjectionOfSelectorMarker.Atom".hashCode() + } + } + + /** + * 'Id' variant + */ + public data class Id( + public val triggerIdProjectionOfSelectorMarker: TriggerIdProjectionOfSelectorMarker, + ) : TriggerProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 1 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TriggerProjectionOfSelectorMarker.Id = + try { + Id( + TriggerIdProjectionOfSelectorMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.TriggerProjectionOfSelectorMarker.Id, + ): Unit = + try { + TriggerIdProjectionOfSelectorMarker.write(writer, instance.triggerIdProjectionOfSelectorMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + /** + * 'Action' variant + */ + public data class Action( + public val actionProjectionOfSelectorMarker: ActionProjectionOfSelectorMarker, + ) : TriggerProjectionOfSelectorMarker() { + override fun discriminant(): Int = DISCRIMINANT + + public companion object : + ScaleReader, + ScaleWriter { + public const val DISCRIMINANT: Int = 2 + + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TriggerProjectionOfSelectorMarker.Action = + try { + Action( + ActionProjectionOfSelectorMarker.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } + + override fun write( + writer: ScaleCodecWriter, + instance: jp.co.soramitsu.iroha2.generated.TriggerProjectionOfSelectorMarker.Action, + ): Unit = + try { + ActionProjectionOfSelectorMarker.write(writer, instance.actionProjectionOfSelectorMarker) + } catch (ex: Exception) { + throw wrapException(ex) + } + } + } + + public companion object : + ScaleReader, + ScaleWriter { + override fun read(reader: ScaleCodecReader): TriggerProjectionOfSelectorMarker = + when (val discriminant = reader.readUByte()) { + 0 -> Atom.read(reader) + 1 -> Id.read(reader) + 2 -> Action.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: TriggerProjectionOfSelectorMarker, + ) { + writer.directWrite(instance.discriminant()) + when (val discriminant = instance.discriminant()) { + 0 -> Atom.write(writer, instance as Atom) + 1 -> Id.write(writer, instance as Id) + 2 -> Action.write(writer, instance as Action) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + } + } +} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TypeError.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TypeError.kt index ff5c5b8b2..66891e32e 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TypeError.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/TypeError.kt @@ -36,22 +36,24 @@ public sealed class TypeError : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TypeError.AssetType = try { - AssetType( - Mismatch.read(reader) as Mismatch, - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TypeError.AssetType = + try { + AssetType( + Mismatch.read(reader) as Mismatch, + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.TypeError.AssetType, - ): Unit = try { - Mismatch.write(writer, instance.mismatch) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + Mismatch.write(writer, instance.mismatch) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -68,40 +70,47 @@ public sealed class TypeError : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TypeError.NumericAssetTypeExpected = try { - NumericAssetTypeExpected( - jp.co.soramitsu.iroha2.generated.AssetType.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.TypeError.NumericAssetTypeExpected = + try { + NumericAssetTypeExpected( + jp.co.soramitsu.iroha2.generated.AssetType + .read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.TypeError.NumericAssetTypeExpected, - ): Unit = try { - jp.co.soramitsu.iroha2.generated.AssetType.write(writer, instance.assetType) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + jp.co.soramitsu.iroha2.generated.AssetType + .write(writer, instance.assetType) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): TypeError = when ( - val discriminant = - reader.readUByte() - ) { - 0 -> AssetType.read(reader) - 1 -> NumericAssetTypeExpected.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + override fun read(reader: ScaleCodecReader): TypeError = + when (val discriminant = reader.readUByte()) { + 0 -> AssetType.read(reader) + 1 -> NumericAssetTypeExpected.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } - override fun write(writer: ScaleCodecWriter, instance: TypeError) { + override fun write( + writer: ScaleCodecWriter, + instance: TypeError, + ) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> AssetType.write(writer, instance as AssetType) 1 -> NumericAssetTypeExpected.write(writer, instance as NumericAssetTypeExpected) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/UnregisterBox.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/UnregisterBox.kt index f173e1122..f872d5718 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/UnregisterBox.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/UnregisterBox.kt @@ -36,22 +36,24 @@ public sealed class UnregisterBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.UnregisterBox.Peer = try { - Peer( - UnregisterOfPeer.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.UnregisterBox.Peer = + try { + Peer( + UnregisterOfPeer.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.UnregisterBox.Peer, - ): Unit = try { - UnregisterOfPeer.write(writer, instance.unregisterOfPeer) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + UnregisterOfPeer.write(writer, instance.unregisterOfPeer) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -68,22 +70,24 @@ public sealed class UnregisterBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.UnregisterBox.Domain = try { - Domain( - UnregisterOfDomain.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.UnregisterBox.Domain = + try { + Domain( + UnregisterOfDomain.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.UnregisterBox.Domain, - ): Unit = try { - UnregisterOfDomain.write(writer, instance.unregisterOfDomain) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + UnregisterOfDomain.write(writer, instance.unregisterOfDomain) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -100,22 +104,24 @@ public sealed class UnregisterBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 2 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.UnregisterBox.Account = try { - Account( - UnregisterOfAccount.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.UnregisterBox.Account = + try { + Account( + UnregisterOfAccount.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.UnregisterBox.Account, - ): Unit = try { - UnregisterOfAccount.write(writer, instance.unregisterOfAccount) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + UnregisterOfAccount.write(writer, instance.unregisterOfAccount) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -132,22 +138,24 @@ public sealed class UnregisterBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 3 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.UnregisterBox.AssetDefinition = try { - AssetDefinition( - UnregisterOfAssetDefinition.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.UnregisterBox.AssetDefinition = + try { + AssetDefinition( + UnregisterOfAssetDefinition.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.UnregisterBox.AssetDefinition, - ): Unit = try { - UnregisterOfAssetDefinition.write(writer, instance.unregisterOfAssetDefinition) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + UnregisterOfAssetDefinition.write(writer, instance.unregisterOfAssetDefinition) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -164,22 +172,24 @@ public sealed class UnregisterBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 4 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.UnregisterBox.Asset = try { - Asset( - UnregisterOfAsset.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.UnregisterBox.Asset = + try { + Asset( + UnregisterOfAsset.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.UnregisterBox.Asset, - ): Unit = try { - UnregisterOfAsset.write(writer, instance.unregisterOfAsset) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + UnregisterOfAsset.write(writer, instance.unregisterOfAsset) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -196,22 +206,24 @@ public sealed class UnregisterBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 5 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.UnregisterBox.Role = try { - Role( - UnregisterOfRole.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.UnregisterBox.Role = + try { + Role( + UnregisterOfRole.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.UnregisterBox.Role, - ): Unit = try { - UnregisterOfRole.write(writer, instance.unregisterOfRole) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + UnregisterOfRole.write(writer, instance.unregisterOfRole) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -228,40 +240,44 @@ public sealed class UnregisterBox : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 6 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.UnregisterBox.Trigger = try { - Trigger( - UnregisterOfTrigger.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.UnregisterBox.Trigger = + try { + Trigger( + UnregisterOfTrigger.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.UnregisterBox.Trigger, - ): Unit = try { - UnregisterOfTrigger.write(writer, instance.unregisterOfTrigger) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + UnregisterOfTrigger.write(writer, instance.unregisterOfTrigger) + } catch (ex: Exception) { + throw wrapException(ex) + } } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): UnregisterBox = when ( - val discriminant = - reader.readUByte() + override fun read(reader: ScaleCodecReader): UnregisterBox = + when (val discriminant = reader.readUByte()) { + 0 -> Peer.read(reader) + 1 -> Domain.read(reader) + 2 -> Account.read(reader) + 3 -> AssetDefinition.read(reader) + 4 -> Asset.read(reader) + 5 -> Role.read(reader) + 6 -> Trigger.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: UnregisterBox, ) { - 0 -> Peer.read(reader) - 1 -> Domain.read(reader) - 2 -> Account.read(reader) - 3 -> AssetDefinition.read(reader) - 4 -> Asset.read(reader) - 5 -> Role.read(reader) - 6 -> Trigger.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: UnregisterBox) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> Peer.write(writer, instance as Peer) @@ -271,7 +287,8 @@ public sealed class UnregisterBox : ModelEnum { 4 -> Asset.write(writer, instance as Asset) 5 -> Role.write(writer, instance as Role) 6 -> Trigger.write(writer, instance as Trigger) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/UnregisterOfAccount.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/UnregisterOfAccount.kt index 689a7d1fb..40d80429c 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/UnregisterOfAccount.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/UnregisterOfAccount.kt @@ -3,10 +3,13 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException import kotlin.Unit @@ -17,20 +20,27 @@ import kotlin.Unit */ public data class UnregisterOfAccount( public val `object`: AccountId, -) { +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): UnregisterOfAccount = try { - UnregisterOfAccount( - AccountId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): UnregisterOfAccount = + try { + UnregisterOfAccount( + AccountId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: UnregisterOfAccount): Unit = try { - AccountId.write(writer, instance.`object`) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: UnregisterOfAccount, + ): Unit = + try { + AccountId.write(writer, instance.`object`) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/UnregisterOfAsset.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/UnregisterOfAsset.kt index 3a96a92c2..f9a3baefb 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/UnregisterOfAsset.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/UnregisterOfAsset.kt @@ -3,10 +3,13 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException import kotlin.Unit @@ -17,20 +20,27 @@ import kotlin.Unit */ public data class UnregisterOfAsset( public val `object`: AssetId, -) { +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): UnregisterOfAsset = try { - UnregisterOfAsset( - AssetId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): UnregisterOfAsset = + try { + UnregisterOfAsset( + AssetId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: UnregisterOfAsset): Unit = try { - AssetId.write(writer, instance.`object`) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: UnregisterOfAsset, + ): Unit = + try { + AssetId.write(writer, instance.`object`) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/UnregisterOfAssetDefinition.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/UnregisterOfAssetDefinition.kt index 1dec40c59..b12c4b9ac 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/UnregisterOfAssetDefinition.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/UnregisterOfAssetDefinition.kt @@ -3,10 +3,13 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException import kotlin.Unit @@ -17,22 +20,29 @@ import kotlin.Unit */ public data class UnregisterOfAssetDefinition( public val `object`: AssetDefinitionId, -) { +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): UnregisterOfAssetDefinition = try { - UnregisterOfAssetDefinition( - AssetDefinitionId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): UnregisterOfAssetDefinition = + try { + UnregisterOfAssetDefinition( + AssetDefinitionId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: UnregisterOfAssetDefinition): Unit = try { - AssetDefinitionId.write(writer, instance.`object`) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: UnregisterOfAssetDefinition, + ): Unit = + try { + AssetDefinitionId.write(writer, instance.`object`) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/UnregisterOfDomain.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/UnregisterOfDomain.kt index a4f9ecb75..3bdec70a1 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/UnregisterOfDomain.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/UnregisterOfDomain.kt @@ -3,10 +3,13 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException import kotlin.Unit @@ -17,20 +20,27 @@ import kotlin.Unit */ public data class UnregisterOfDomain( public val `object`: DomainId, -) { +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): UnregisterOfDomain = try { - UnregisterOfDomain( - DomainId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): UnregisterOfDomain = + try { + UnregisterOfDomain( + DomainId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: UnregisterOfDomain): Unit = try { - DomainId.write(writer, instance.`object`) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: UnregisterOfDomain, + ): Unit = + try { + DomainId.write(writer, instance.`object`) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/UnregisterOfPeer.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/UnregisterOfPeer.kt index 712774fe1..78df8a367 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/UnregisterOfPeer.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/UnregisterOfPeer.kt @@ -3,10 +3,13 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException import kotlin.Unit @@ -17,20 +20,27 @@ import kotlin.Unit */ public data class UnregisterOfPeer( public val `object`: PeerId, -) { +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): UnregisterOfPeer = try { - UnregisterOfPeer( - PeerId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): UnregisterOfPeer = + try { + UnregisterOfPeer( + PeerId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: UnregisterOfPeer): Unit = try { - PeerId.write(writer, instance.`object`) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: UnregisterOfPeer, + ): Unit = + try { + PeerId.write(writer, instance.`object`) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/UnregisterOfRole.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/UnregisterOfRole.kt index 72c9846b7..b680da72b 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/UnregisterOfRole.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/UnregisterOfRole.kt @@ -3,10 +3,13 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException import kotlin.Unit @@ -17,20 +20,27 @@ import kotlin.Unit */ public data class UnregisterOfRole( public val `object`: RoleId, -) { +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): UnregisterOfRole = try { - UnregisterOfRole( - RoleId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): UnregisterOfRole = + try { + UnregisterOfRole( + RoleId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: UnregisterOfRole): Unit = try { - RoleId.write(writer, instance.`object`) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: UnregisterOfRole, + ): Unit = + try { + RoleId.write(writer, instance.`object`) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/UnregisterOfTrigger.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/UnregisterOfTrigger.kt index 690a7fc84..ab0453266 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/UnregisterOfTrigger.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/UnregisterOfTrigger.kt @@ -3,10 +3,13 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException import kotlin.Unit @@ -17,20 +20,27 @@ import kotlin.Unit */ public data class UnregisterOfTrigger( public val `object`: TriggerId, -) { +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): UnregisterOfTrigger = try { - UnregisterOfTrigger( - TriggerId.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): UnregisterOfTrigger = + try { + UnregisterOfTrigger( + TriggerId.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: UnregisterOfTrigger): Unit = try { - TriggerId.write(writer, instance.`object`) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: UnregisterOfTrigger, + ): Unit = + try { + TriggerId.write(writer, instance.`object`) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Upgrade.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Upgrade.kt index ebc064f02..d934a6f4e 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Upgrade.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/Upgrade.kt @@ -3,10 +3,13 @@ // package jp.co.soramitsu.iroha2.generated +import jp.co.soramitsu.iroha2.asInstructionBoxExt import jp.co.soramitsu.iroha2.codec.ScaleCodecReader import jp.co.soramitsu.iroha2.codec.ScaleCodecWriter import jp.co.soramitsu.iroha2.codec.ScaleReader import jp.co.soramitsu.iroha2.codec.ScaleWriter +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.wrapException import kotlin.Unit @@ -17,20 +20,27 @@ import kotlin.Unit */ public data class Upgrade( public val executor: Executor, -) { +) : Instruction { + override fun asInstructionBox(): InstructionBox = asInstructionBoxExt() + public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): Upgrade = try { - Upgrade( - Executor.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): Upgrade = + try { + Upgrade( + Executor.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: Upgrade): Unit = try { - Executor.write(writer, instance.executor) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: Upgrade, + ): Unit = + try { + Executor.write(writer, instance.executor) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ValidationFail.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ValidationFail.kt index 0934322db..9a0cc7e12 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ValidationFail.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/ValidationFail.kt @@ -26,15 +26,19 @@ public sealed class ValidationFail : ModelEnum { */ public abstract fun discriminant(): Int - override fun equals(other: Any?): Boolean = when (this) { - is TooComplex -> TooComplex.equals(this, other) - is InternalError -> InternalError.equals(this, other) - else -> super.equals(other) } + override fun equals(other: Any?): Boolean = + when (this) { + is TooComplex -> TooComplex.equals(this, other) + is InternalError -> InternalError.equals(this, other) + else -> super.equals(other) + } - override fun hashCode(): Int = when (this) { - is TooComplex -> TooComplex.hashCode() - is InternalError -> InternalError.hashCode() - else -> super.hashCode() } + override fun hashCode(): Int = + when (this) { + is TooComplex -> TooComplex.hashCode() + is InternalError -> InternalError.hashCode() + else -> super.hashCode() + } /** * 'NotPermitted' variant @@ -49,22 +53,24 @@ public sealed class ValidationFail : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 0 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.ValidationFail.NotPermitted = try { - NotPermitted( - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.ValidationFail.NotPermitted = + try { + NotPermitted( + reader.readString(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.ValidationFail.NotPermitted, - ): Unit = try { - writer.writeAsList(instance.string.toByteArray(Charsets.UTF_8)) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + writer.writeAsList(instance.string.toByteArray(Charsets.UTF_8)) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -81,22 +87,24 @@ public sealed class ValidationFail : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 1 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.ValidationFail.InstructionFailed = try { - InstructionFailed( - InstructionExecutionError.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.ValidationFail.InstructionFailed = + try { + InstructionFailed( + InstructionExecutionError.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.ValidationFail.InstructionFailed, - ): Unit = try { - InstructionExecutionError.write(writer, instance.instructionExecutionError) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + InstructionExecutionError.write(writer, instance.instructionExecutionError) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -113,22 +121,24 @@ public sealed class ValidationFail : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 2 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.ValidationFail.QueryFailed = try { - QueryFailed( - QueryExecutionFail.read(reader), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.ValidationFail.QueryFailed = + try { + QueryFailed( + QueryExecutionFail.read(reader), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.ValidationFail.QueryFailed, - ): Unit = try { - QueryExecutionFail.write(writer, instance.queryExecutionFail) - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + QueryExecutionFail.write(writer, instance.queryExecutionFail) + } catch (ex: Exception) { + throw wrapException(ex) + } } } @@ -143,24 +153,30 @@ public sealed class ValidationFail : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 3 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.ValidationFail.TooComplex = try { - TooComplex() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.ValidationFail.TooComplex = + try { + TooComplex() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.ValidationFail.TooComplex, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } - public fun equals(o1: jp.co.soramitsu.iroha2.generated.ValidationFail.TooComplex, o2: Any?): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + public fun equals( + o1: jp.co.soramitsu.iroha2.generated.ValidationFail.TooComplex, + o2: Any?, + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".ValidationFail.TooComplex".hashCode() } @@ -177,45 +193,50 @@ public sealed class ValidationFail : ModelEnum { ScaleWriter { public const val DISCRIMINANT: Int = 4 - override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.ValidationFail.InternalError = try { - InternalError() - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): jp.co.soramitsu.iroha2.generated.ValidationFail.InternalError = + try { + InternalError() + } catch (ex: Exception) { + throw wrapException(ex) + } override fun write( writer: ScaleCodecWriter, instance: jp.co.soramitsu.iroha2.generated.ValidationFail.InternalError, - ): Unit = try { - } catch (ex: Exception) { - throw wrapException(ex) - } + ): Unit = + try { + } catch (ex: Exception) { + throw wrapException(ex) + } public fun equals( o1: jp.co.soramitsu.iroha2.generated.ValidationFail.InternalError, o2: Any?, - ): Boolean = when (o2) { - null -> false - else -> o2::class == o1::class - } + ): Boolean = + when (o2) { + null -> false + else -> o2::class == o1::class + } override fun hashCode(): Int = ".ValidationFail.InternalError".hashCode() } } public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): ValidationFail = when ( - val discriminant = - reader.readUByte() + override fun read(reader: ScaleCodecReader): ValidationFail = + when (val discriminant = reader.readUByte()) { + 0 -> NotPermitted.read(reader) + 1 -> InstructionFailed.read(reader) + 2 -> QueryFailed.read(reader) + 3 -> TooComplex.read(reader) + 4 -> InternalError.read(reader) + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } + + override fun write( + writer: ScaleCodecWriter, + instance: ValidationFail, ) { - 0 -> NotPermitted.read(reader) - 1 -> InstructionFailed.read(reader) - 2 -> QueryFailed.read(reader) - 3 -> TooComplex.read(reader) - 4 -> InternalError.read(reader) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } - - override fun write(writer: ScaleCodecWriter, instance: ValidationFail) { writer.directWrite(instance.discriminant()) when (val discriminant = instance.discriminant()) { 0 -> NotPermitted.write(writer, instance as NotPermitted) @@ -223,7 +244,8 @@ public sealed class ValidationFail : ModelEnum { 2 -> QueryFailed.write(writer, instance as QueryFailed) 3 -> TooComplex.write(writer, instance as TooComplex) 4 -> InternalError.write(writer, instance as InternalError) - else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") } + else -> throw RuntimeException("Unresolved discriminant of the enum variant: $discriminant") + } } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/WasmExecutionFail.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/WasmExecutionFail.kt index 564d512f9..1af4b4c76 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/WasmExecutionFail.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/WasmExecutionFail.kt @@ -20,18 +20,23 @@ public data class WasmExecutionFail( public val reason: String, ) { public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): WasmExecutionFail = try { - WasmExecutionFail( - reader.readString(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): WasmExecutionFail = + try { + WasmExecutionFail( + reader.readString(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: WasmExecutionFail): Unit = try { - writer.writeAsList(instance.reason.toByteArray(Charsets.UTF_8)) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: WasmExecutionFail, + ): Unit = + try { + writer.writeAsList(instance.reason.toByteArray(Charsets.UTF_8)) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/WasmSmartContract.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/WasmSmartContract.kt index d9bde4975..95da2fcd4 100644 --- a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/WasmSmartContract.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/generated/WasmSmartContract.kt @@ -32,18 +32,23 @@ public data class WasmSmartContract( override fun hashCode(): Int = vecOfU8.contentHashCode() public companion object : ScaleReader, ScaleWriter { - override fun read(reader: ScaleCodecReader): WasmSmartContract = try { - WasmSmartContract( - reader.readByteArray(), - ) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun read(reader: ScaleCodecReader): WasmSmartContract = + try { + WasmSmartContract( + reader.readByteArray(), + ) + } catch (ex: Exception) { + throw wrapException(ex) + } - override fun write(writer: ScaleCodecWriter, instance: WasmSmartContract): Unit = try { - writer.writeAsList(instance.vecOfU8) - } catch (ex: Exception) { - throw wrapException(ex) - } + override fun write( + writer: ScaleCodecWriter, + instance: WasmSmartContract, + ): Unit = + try { + writer.writeAsList(instance.vecOfU8) + } catch (ex: Exception) { + throw wrapException(ex) + } } } diff --git a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/transaction/Filters.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/transaction/Filters.kt similarity index 76% rename from modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/transaction/Filters.kt rename to modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/transaction/Filters.kt index 83c4bc129..1af07191c 100644 --- a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/transaction/Filters.kt +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/transaction/Filters.kt @@ -13,17 +13,13 @@ import jp.co.soramitsu.iroha2.generated.DomainId import jp.co.soramitsu.iroha2.generated.EventFilterBox import jp.co.soramitsu.iroha2.generated.ExecuteTriggerEventFilter import jp.co.soramitsu.iroha2.generated.ExecutionTime -import jp.co.soramitsu.iroha2.generated.GenericPredicateBox -import jp.co.soramitsu.iroha2.generated.NonTrivial import jp.co.soramitsu.iroha2.generated.NonZeroOfu64 import jp.co.soramitsu.iroha2.generated.PeerEventFilter import jp.co.soramitsu.iroha2.generated.PeerId import jp.co.soramitsu.iroha2.generated.PipelineEventFilterBox -import jp.co.soramitsu.iroha2.generated.QueryOutputPredicate import jp.co.soramitsu.iroha2.generated.RoleEventFilter import jp.co.soramitsu.iroha2.generated.RoleId import jp.co.soramitsu.iroha2.generated.Schedule -import jp.co.soramitsu.iroha2.generated.StringPredicate import jp.co.soramitsu.iroha2.generated.TimeEventFilter import jp.co.soramitsu.iroha2.generated.TransactionEventFilter import jp.co.soramitsu.iroha2.generated.TransactionStatus @@ -36,13 +32,13 @@ import java.math.BigInteger */ @Suppress("unused") object Filters { - /** * Create a data filter */ - fun data(entityFilter: DataEventFilter) = EventFilterBox.Data( - entityFilter, - ) + fun data(entityFilter: DataEventFilter) = + EventFilterBox.Data( + entityFilter, + ) /** * Create a [time based event filter][TimeEventFilter] @@ -85,7 +81,6 @@ object Filters { * and either return all matching events or additionally apply another filter to them. */ object EntityFilters { - /** * Match events associated with asset definition and apply another filter referenced by * its [id][OriginFilterOfAssetDefinitionEvent] or [event type][AssetDefinitionEventFilter] @@ -168,7 +163,6 @@ object EntityFilters { * Timed filters */ object EventFilters { - /** * Create a filter with a timed execution */ @@ -182,53 +176,3 @@ object EventFilters { */ fun timeEventFilter() = TimeEventFilter(ExecutionTime.PreCommit()) } - -/** - * Query filters - */ -object QueryFilters { - - /** - * Starts with filter - */ - fun startsWith(prefix: String) = GenericPredicateBox.Raw( - QueryOutputPredicate.Identifiable(StringPredicate.StartsWith(prefix)), - ) - - /** - * Ends with filter - */ - fun endsWith(suffix: String) = GenericPredicateBox.Raw( - QueryOutputPredicate.Identifiable(StringPredicate.EndsWith(suffix)), - ) - - /** - * Contains filter - */ - fun contains(value: String) = GenericPredicateBox.Raw( - QueryOutputPredicate.Identifiable(StringPredicate.Contains(value)), - ) - - /** - * Is filter - */ - fun `is`(value: String) = GenericPredicateBox.Raw( - QueryOutputPredicate.Identifiable(StringPredicate.Is(value)), - ) - - /** - * Filter for multiple matches (OR) - */ - fun or(vararg predicates: StringPredicate) = predicates - .map { GenericPredicateBox.Raw(QueryOutputPredicate.Identifiable(it)) }.toList() - .let { NonTrivial>(it) } - .let { GenericPredicateBox.Or(it) } - - /** - * Filter for multiple matches (AND) - */ - fun and(vararg predicates: StringPredicate) = predicates - .map { GenericPredicateBox.Raw(QueryOutputPredicate.Identifiable(it)) }.toList() - .let { NonTrivial>(it) } - .let { GenericPredicateBox.And(it) } -} diff --git a/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/transaction/Instructions.kt b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/transaction/Instructions.kt new file mode 100644 index 000000000..a497cf9c7 --- /dev/null +++ b/modules/model/src/main/kotlin/jp/co/soramitsu/iroha2/transaction/Instructions.kt @@ -0,0 +1,509 @@ +package jp.co.soramitsu.iroha2.transaction + +import jp.co.soramitsu.iroha2.ModelParameter +import jp.co.soramitsu.iroha2.ModelPermission +import jp.co.soramitsu.iroha2.TriggerArgs +import jp.co.soramitsu.iroha2.asNumeric +import jp.co.soramitsu.iroha2.generated.AccountId +import jp.co.soramitsu.iroha2.generated.Action +import jp.co.soramitsu.iroha2.generated.Asset +import jp.co.soramitsu.iroha2.generated.AssetDefinitionId +import jp.co.soramitsu.iroha2.generated.AssetId +import jp.co.soramitsu.iroha2.generated.AssetType +import jp.co.soramitsu.iroha2.generated.AssetValue +import jp.co.soramitsu.iroha2.generated.BlockParameter +import jp.co.soramitsu.iroha2.generated.BurnOfNumericAndAsset +import jp.co.soramitsu.iroha2.generated.BurnOfu32AndTrigger +import jp.co.soramitsu.iroha2.generated.CustomParameter +import jp.co.soramitsu.iroha2.generated.CustomParameterId +import jp.co.soramitsu.iroha2.generated.DomainId +import jp.co.soramitsu.iroha2.generated.EventFilterBox +import jp.co.soramitsu.iroha2.generated.Executable +import jp.co.soramitsu.iroha2.generated.ExecuteTrigger +import jp.co.soramitsu.iroha2.generated.Executor +import jp.co.soramitsu.iroha2.generated.GrantOfPermissionAndAccount +import jp.co.soramitsu.iroha2.generated.GrantOfPermissionAndRole +import jp.co.soramitsu.iroha2.generated.GrantOfRoleIdAndAccount +import jp.co.soramitsu.iroha2.generated.HashOf +import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.generated.IpfsPath +import jp.co.soramitsu.iroha2.generated.Json +import jp.co.soramitsu.iroha2.generated.Metadata +import jp.co.soramitsu.iroha2.generated.MintOfNumericAndAsset +import jp.co.soramitsu.iroha2.generated.MintOfu32AndTrigger +import jp.co.soramitsu.iroha2.generated.Mintable +import jp.co.soramitsu.iroha2.generated.MultisigApprove +import jp.co.soramitsu.iroha2.generated.MultisigPropose +import jp.co.soramitsu.iroha2.generated.MultisigRegister +import jp.co.soramitsu.iroha2.generated.MultisigSpec +import jp.co.soramitsu.iroha2.generated.Name +import jp.co.soramitsu.iroha2.generated.NewAccount +import jp.co.soramitsu.iroha2.generated.NewAssetDefinition +import jp.co.soramitsu.iroha2.generated.NewDomain +import jp.co.soramitsu.iroha2.generated.NewRole +import jp.co.soramitsu.iroha2.generated.NonZeroOfu64 +import jp.co.soramitsu.iroha2.generated.Parameter +import jp.co.soramitsu.iroha2.generated.PeerId +import jp.co.soramitsu.iroha2.generated.RegisterOfAccount +import jp.co.soramitsu.iroha2.generated.RegisterOfAsset +import jp.co.soramitsu.iroha2.generated.RegisterOfAssetDefinition +import jp.co.soramitsu.iroha2.generated.RegisterOfDomain +import jp.co.soramitsu.iroha2.generated.RegisterOfPeer +import jp.co.soramitsu.iroha2.generated.RegisterOfRole +import jp.co.soramitsu.iroha2.generated.RegisterOfTrigger +import jp.co.soramitsu.iroha2.generated.RemoveKeyValueOfAccount +import jp.co.soramitsu.iroha2.generated.RemoveKeyValueOfAsset +import jp.co.soramitsu.iroha2.generated.RemoveKeyValueOfAssetDefinition +import jp.co.soramitsu.iroha2.generated.RemoveKeyValueOfDomain +import jp.co.soramitsu.iroha2.generated.RemoveKeyValueOfTrigger +import jp.co.soramitsu.iroha2.generated.Repeats +import jp.co.soramitsu.iroha2.generated.RevokeOfPermissionAndAccount +import jp.co.soramitsu.iroha2.generated.RevokeOfPermissionAndRole +import jp.co.soramitsu.iroha2.generated.RevokeOfRoleIdAndAccount +import jp.co.soramitsu.iroha2.generated.Role +import jp.co.soramitsu.iroha2.generated.RoleId +import jp.co.soramitsu.iroha2.generated.SetKeyValueOfAccount +import jp.co.soramitsu.iroha2.generated.SetKeyValueOfAsset +import jp.co.soramitsu.iroha2.generated.SetKeyValueOfAssetDefinition +import jp.co.soramitsu.iroha2.generated.SetKeyValueOfDomain +import jp.co.soramitsu.iroha2.generated.SetKeyValueOfTrigger +import jp.co.soramitsu.iroha2.generated.SetParameter +import jp.co.soramitsu.iroha2.generated.SmartContractParameter +import jp.co.soramitsu.iroha2.generated.SumeragiParameter +import jp.co.soramitsu.iroha2.generated.TransactionParameter +import jp.co.soramitsu.iroha2.generated.TransferOfAccountAndAssetDefinitionIdAndAccount +import jp.co.soramitsu.iroha2.generated.TransferOfAccountAndDomainIdAndAccount +import jp.co.soramitsu.iroha2.generated.TransferOfAssetAndMetadataAndAccount +import jp.co.soramitsu.iroha2.generated.TransferOfAssetAndNumericAndAccount +import jp.co.soramitsu.iroha2.generated.Trigger +import jp.co.soramitsu.iroha2.generated.TriggerId +import jp.co.soramitsu.iroha2.generated.UnregisterOfAccount +import jp.co.soramitsu.iroha2.generated.UnregisterOfAsset +import jp.co.soramitsu.iroha2.generated.UnregisterOfAssetDefinition +import jp.co.soramitsu.iroha2.generated.UnregisterOfDomain +import jp.co.soramitsu.iroha2.generated.UnregisterOfPeer +import jp.co.soramitsu.iroha2.generated.UnregisterOfRole +import jp.co.soramitsu.iroha2.generated.UnregisterOfTrigger +import jp.co.soramitsu.iroha2.generated.Upgrade +import jp.co.soramitsu.iroha2.generated.WasmSmartContract +import jp.co.soramitsu.iroha2.writeValue +import java.math.BigDecimal + +interface Instruction { + fun asInstructionBox(): InstructionBox +} + +class Register { + companion object { + /** + * Register a peer + */ + fun peer(peerId: PeerId) = RegisterOfPeer(peerId) + + /** + * Register a domain + */ + fun domain( + domainId: DomainId, + metadata: Map = mapOf(), + logo: IpfsPath? = null, + ) = RegisterOfDomain(NewDomain(domainId, logo, Metadata(metadata))) + + /** + * Register an asset + */ + fun assetDefinition( + id: AssetDefinitionId, + assetType: AssetType, + mintable: Mintable = Mintable.Infinitely(), + logo: IpfsPath? = null, + metadata: Metadata = Metadata(mapOf()), + ) = RegisterOfAssetDefinition(NewAssetDefinition(id, assetType, mintable, logo, metadata)) + + /** + * Register an account + */ + fun account( + id: AccountId, + metadata: Metadata = Metadata(mapOf()), + ) = RegisterOfAccount(NewAccount(id, metadata)) + + /** + * Register an asset + */ + fun asset( + id: AssetId, + assetValue: AssetValue, + ) = RegisterOfAsset(Asset(id, assetValue)) + + /** + * Register a role that has the specified permissions + */ + fun role( + grantTo: AccountId, + roleId: RoleId, + vararg tokens: ModelPermission, + ) = RegisterOfRole(NewRole(Role(roleId, tokens.map { it.asRaw() }), grantTo)) + + /** + * Register a trigger + */ + fun trigger( + triggerId: TriggerId, + isi: List, + repeats: Repeats, + accountId: AccountId, + filter: EventFilterBox, + metadata: Metadata = Metadata(mapOf()), + ) = RegisterOfTrigger( + Trigger( + triggerId, + Action(Executable.Instructions(isi.map { it.asInstructionBox() }), repeats, accountId, filter, metadata), + ), + ) + + /** + * Register a WASM trigger + */ + fun trigger( + triggerId: TriggerId, + wasm: ByteArray, + repeats: Repeats, + accountId: AccountId, + filter: EventFilterBox, + metadata: Metadata = Metadata(mapOf()), + ) = RegisterOfTrigger( + Trigger( + triggerId, + Action(Executable.Wasm(WasmSmartContract(wasm)), repeats, accountId, filter, metadata), + ), + ) + } +} + +class Unregister { + companion object { + /** + * Unregister a peer + */ + fun peer(peerId: PeerId) = UnregisterOfPeer(peerId) + + /** + * Unregister a domain + */ + fun domain(id: DomainId) = UnregisterOfDomain(id) + + /** + * Unregister an asset definition + */ + fun assetDefinition(id: AssetDefinitionId) = UnregisterOfAssetDefinition(id) + + /** + * Unregister an account + */ + fun account(id: AccountId) = UnregisterOfAccount(id) + + /** + * Unregister an asset + */ + fun asset(id: AssetId) = UnregisterOfAsset(id) + + /** + * Unregister a role + */ + fun role(id: RoleId) = UnregisterOfRole(id) + + /** + * Unregister a trigger + */ + fun trigger(id: TriggerId) = UnregisterOfTrigger(id) + } +} + +class SetKeyValue { + companion object { + /** + * Set key/value in the metadata of a given domain + */ + fun domain( + domainId: DomainId, + key: Name, + value: V, + ) = SetKeyValueOfDomain(domainId, key, Json.writeValue(value)) + + /** + * Set key/value for a given asset definition + */ + fun assetDefinition( + definitionId: AssetDefinitionId, + key: Name, + value: V, + ) = SetKeyValueOfAssetDefinition(definitionId, key, Json.writeValue(value)) + + /** + * Set key/value in the metadata of a given account + */ + fun account( + accountId: AccountId, + key: Name, + value: V, + ) = SetKeyValueOfAccount(accountId, key, Json.writeValue(value)) + + /** + * Set key/value for a given asset + */ + fun asset( + assetId: AssetId, + key: Name, + value: V, + ) = SetKeyValueOfAsset(assetId, key, Json.writeValue(value)) + + /** + * Set key/value for a given trigger + */ + fun trigger( + triggerId: TriggerId, + key: Name, + value: V, + ) = SetKeyValueOfTrigger(triggerId, key, Json.writeValue(value)) + } +} + +class RemoveKeyValue { + companion object { + /** + * Remove key/value from a given domain + */ + fun domain( + domainId: DomainId, + key: Name, + ) = RemoveKeyValueOfDomain(domainId, key) + + /** + * Remove key/value from a given asset definition + */ + fun assetDefinition( + assetDefinitionId: AssetDefinitionId, + key: Name, + ) = RemoveKeyValueOfAssetDefinition(assetDefinitionId, key) + + /** + * Remove key/value from a given account + */ + fun account( + accountId: AccountId, + key: Name, + ) = RemoveKeyValueOfAccount(accountId, key) + + /** + * Remove key/value from a given asset + */ + fun asset( + assetId: AssetId, + key: Name, + ) = RemoveKeyValueOfAsset(assetId, key) + + /** + * Remove key/value from a given trigger + */ + fun trigger( + triggerId: TriggerId, + key: Name, + ) = RemoveKeyValueOfTrigger(triggerId, key) + } +} + +class Mint { + companion object { + /** + * Increase a numeric asset by the given amount + */ + fun asset( + assetId: AssetId, + quantity: BigDecimal, + ) = MintOfNumericAndAsset(quantity.asNumeric(), assetId) + + /** + * Increase number of trigger repetitions + */ + fun trigger( + triggerId: TriggerId, + quantity: Long, + ) = MintOfu32AndTrigger(quantity, triggerId) + } +} + +class Burn { + companion object { + /** + * Decrease a numeric asset by the given amount + */ + fun asset( + assetId: AssetId, + value: BigDecimal, + ) = BurnOfNumericAndAsset(value.asNumeric(), assetId) + + /** + * Decrease number of trigger repetitions + */ + fun trigger( + triggerId: TriggerId, + quantity: Long, + ) = BurnOfu32AndTrigger(quantity, triggerId) + } +} + +class Transfer { + companion object { + /** + * Transfer domain ownership. + */ + fun domain( + sourceId: AccountId, + domainId: DomainId, + destinationId: AccountId, + ) = TransferOfAccountAndDomainIdAndAccount(sourceId, domainId, destinationId) + + /** + * Transfer asset definition ownership + */ + fun assetDefinition( + sourceId: AccountId, + value: AssetDefinitionId, + destinationId: AccountId, + ) = TransferOfAccountAndAssetDefinitionIdAndAccount(sourceId, value, destinationId) + + /** + * Transfer a numeric asset + */ + fun asset( + sourceId: AssetId, + value: Metadata, + destinationId: AccountId, + ) = TransferOfAssetAndMetadataAndAccount(sourceId, value, destinationId) + + /** + * Transfer a store asset + */ + fun asset( + sourceId: AssetId, + value: BigDecimal, + destinationId: AccountId, + ) = TransferOfAssetAndNumericAndAccount(sourceId, value.asNumeric(), destinationId) + } +} + +class Grant { + companion object { + /** + * Grant permission to the given account + */ + fun

JaJPbj-%sY;*d#-@lcTJg<9SdJ&sky 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�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 E0n^jJ1^@s6 diff --git a/modules/client/build.gradle b/modules/client/build.gradle index f34788b39..2d65e44a7 100644 --- a/modules/client/build.gradle +++ b/modules/client/build.gradle @@ -5,31 +5,22 @@ plugins { dependencies { api project(":model") - implementation('com.google.code.gson:gson:2.8.9') - - implementation("com.github.docker-java:docker-java:3.3.0") - - // kotlin support - implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVer" - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVer" - implementation "org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:$coroutinesVer" - - // crypto - api "org.bouncycastle:bcprov-jdk15on:$bouncyCastleVer" - api "net.i2p.crypto:eddsa:$i2pCryptoEddsa" - api "com.github.multiformats:java-multihash:$multihashVersion" + testImplementation project(":admin-client") + testImplementation project(":block") // http client - api "io.ktor:ktor-client-core:$ktorVer" - api "io.ktor:ktor-client-cio:$ktorVer" - api "io.ktor:ktor-client-websockets:$ktorVer" - api "io.ktor:ktor-client-logging:$ktorVer" - api "io.ktor:ktor-client-jackson:$ktorVer" - api "io.ktor:ktor-client-content-negotiation:$ktorVer" - api "io.ktor:ktor-serialization-jackson:$ktorVer" - api "io.ktor:ktor-client-auth:$ktorVer" + implementation "io.ktor:ktor-client-cio:$ktorVer" + implementation "io.ktor:ktor-client-websockets:$ktorVer" + implementation "io.ktor:ktor-client-logging:$ktorVer" + implementation "io.ktor:ktor-client-content-negotiation:$ktorVer" + implementation "io.ktor:ktor-serialization-jackson:$ktorVer" + implementation "io.ktor:ktor-client-auth:$ktorVer" testApi project(":test-tools") + testImplementation "org.jetbrains.kotlin:kotlin-test-junit5:$kotlinVer" + testImplementation("com.github.docker-java:docker-java:3.4.0") + testImplementation("io.qameta.allure:allure-testng:2.29.0") + testImplementation "org.testcontainers:testcontainers:$testContainersVer" } jacocoTestReport { diff --git a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/Enums.kt b/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/Enums.kt deleted file mode 100644 index b30ad3963..000000000 --- a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/Enums.kt +++ /dev/null @@ -1,48 +0,0 @@ -package jp.co.soramitsu.iroha2 - -enum class Permissions(val type: String) { - CanBurnUserTrigger("CanBurnUserTrigger"), - CanUnregisterAccount("CanUnregisterAccount"), - CanMintUserPublicKeys("CanMintUserPublicKeys"), - CanBurnUserPublicKeys("CanBurnUserPublicKeys"), - CanMintUserSignatureCheckConditions("CanMintUserSignatureCheckConditions"), - CanSetKeyValueInAccount("CanSetKeyValueInAccount"), - CanRemoveKeyValueInAccount("CanRemoveKeyValueInAccount"), - CanRegisterAssetsWithDefinition("CanRegisterAssetsWithDefinition"), - CanUnregisterAssetsWithDefinition("CanUnregisterAssetsWithDefinition"), - CanUnregisterUserAsset("CanUnregisterUserAsset"), - CanBurnAssetWithDefinition("CanBurnAssetWithDefinition"), - CanBurnUserAssetToken("CanBurnUserAsset"), - CanMintAssetWithDefinition("CanMintAssetWithDefinition"), - CanTransferAssetWithDefinition("CanTransferAssetWithDefinition"), - CanTransferUserAssetsToken("CanTransferUserAsset"), - CanSetKeyValueInUserAsset("CanSetKeyValueInUserAsset"), - CanRemoveKeyValueInUserAsset("CanRemoveKeyValueInUserAsset"), - CanUnregisterAssetDefinition("CanUnregisterAssetDefinition"), - CanSetKeyValueInAssetDefinition("CanSetKeyValueInAssetDefinition"), - CanRemoveKeyValueInAssetDefinition("CanRemoveKeyValueInAssetDefinition"), - CanUnregisterDomain("CanUnregisterDomain"), - CanSetKeyValueInDomain("CanSetKeyValueInDomain"), - CanRemoveKeyValueInDomain("CanRemoveKeyValueInDomain"), - CanGrantPermissionToCreateParameters("CanGrantPermissionToCreateParameters"), - CanRevokePermissionToCreateParameters("CanRevokePermissionToCreateParameters"), - CanCreateParameters("CanCreateParameters"), - CanGrantPermissionToSetParameters("CanGrantPermissionToSetParameters"), - CanRevokePermissionToSetParameters("CanRevokePermissionToSetParameters"), - CanSetParameters("CanSetParameters"), - CanUnregisterAnyPeer("CanUnregisterAnyPeer"), - CanUnregisterAnyRole("CanUnregisterAnyRole"), - CanExecuteUserTrigger("CanExecuteUserTrigger"), - CanUnregisterUserTrigger("CanUnregisterUserTrigger"), - CanMintUserTrigger("CanMintUserTrigger"), - CanUpgradeExecutor("CanUpgradeExecutor"), - CanRemoveKeyValueInTrigger("CanRemoveKeyValueInTrigger"), - CanSetKeyValueInTrigger("CanSetKeyValueInTrigger"), -} - -enum class IdKey(val type: String) { - AccountId("account"), - AssetId("asset"), - AssetDefinitionId("asset_definition"), - DomainId("domain"), -} diff --git a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/Exceptions.kt b/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/Exceptions.kt index 37c66baa6..37d15a22c 100644 --- a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/Exceptions.kt +++ b/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/Exceptions.kt @@ -5,13 +5,18 @@ import io.ktor.http.HttpStatusCode /** * Throw if query payload can not be extracted */ -class QueryPayloadExtractionException(message: String? = null, cause: Throwable? = null) : - IrohaSdkException(message, cause) +class QueryPayloadExtractionException( + message: String? = null, + cause: Throwable? = null, +) : IrohaSdkException(message, cause) /** * Throw if there is an unexpected state during WebSocket interaction */ -class WebSocketProtocolException(message: String? = null, cause: Throwable? = null) : IrohaSdkException(message, cause) +class WebSocketProtocolException( + message: String? = null, + cause: Throwable? = null, +) : IrohaSdkException(message, cause) /** * Throw if a peer is not available or status code not 2xx @@ -25,15 +30,7 @@ class IrohaClientException( /** * Throw if a transaction was rejected by a peer */ -class TransactionRejectedException(message: String? = null, cause: Throwable? = null) : - IrohaSdkException(message, cause) - -/** - * Throw if there is an exception related to cryptography - */ -class CryptoException(message: String? = null, cause: Throwable? = null) : IrohaSdkException(message, cause) - -/** - * Throw if there is an exception during hex encoding/decoding - */ -class HexCodecException(message: String? = null, cause: Throwable? = null) : IrohaSdkException(message, cause) +class TransactionRejectedException( + message: String? = null, + cause: Throwable? = null, +) : IrohaSdkException(message, cause) diff --git a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/Extensions.kt b/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/Extensions.kt deleted file mode 100644 index 947874311..000000000 --- a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/Extensions.kt +++ /dev/null @@ -1,390 +0,0 @@ -package jp.co.soramitsu.iroha2 - -import com.fasterxml.jackson.databind.JsonNode -import com.fasterxml.jackson.databind.node.NullNode -import com.fasterxml.jackson.databind.node.TextNode -import com.google.gson.GsonBuilder -import io.ktor.websocket.Frame -import jp.co.soramitsu.iroha2.generated.* // ktlint-disable no-wildcard-imports -import jp.co.soramitsu.iroha2.transaction.TransactionBuilder -import net.i2p.crypto.eddsa.EdDSAEngine -import org.bouncycastle.jcajce.provider.digest.Blake2b -import org.bouncycastle.util.encoders.Hex -import java.math.BigDecimal -import java.math.BigInteger -import java.security.MessageDigest -import java.security.PrivateKey -import java.security.PublicKey -import java.util.Locale -import java.util.StringTokenizer -import kotlin.experimental.or -import jp.co.soramitsu.iroha2.generated.PublicKey as IrohaPublicKey - -fun BlockSubscriptionRequest.Companion.of(from: Long) = BlockSubscriptionRequest(NonZeroOfu64(BigInteger.valueOf(from))) - -fun Signature.asSignatureOf() = SignatureOf(this) - -fun String.asAccountId() = this.split(ACCOUNT_ID_DELIMITER).takeIf { - it.size == 2 -}?.let { parts -> - AccountId(parts[1].asDomainId(), publicKeyFromHex(parts[0]).toIrohaPublicKey()) -} ?: throw IllegalArgumentException("Incorrect account ID: $this") - -fun String.asAssetDefinitionId() = this.split(ASSET_ID_DELIMITER).takeIf { - it.size == 2 -}?.let { parts -> - AssetDefinitionId(parts[1].asDomainId(), parts[0].asName()) -} ?: throw IllegalArgumentException("Incorrect asset definition ID: $this") - -fun String.asAssetId() = this.split(ASSET_ID_DELIMITER).takeIf { - it.size == 3 -}?.let { parts -> - parts[2].asAccountId().let { accountId -> - val domainId = parts[1].takeIf { it.isNotBlank() }?.asDomainId() - - AssetId( - accountId, - AssetDefinitionId( - domainId ?: accountId.domain, - parts[0].asName(), - ), - ) - } -} ?: throw IllegalArgumentException("Incorrect asset ID: $this") - -fun String.asDomainId() = DomainId(Name(this)) - -fun String.asRoleId() = RoleId(Name(this)) - -fun String.asName() = Name(this) - -fun ByteArray.toFrame(fin: Boolean = true) = Frame.Binary(fin, this) - -fun ByteArray.toHex(withPrefix: Boolean = false): String = try { - val prefix = when (withPrefix) { - true -> "ed0120" - false -> "" - } - "${prefix}${Hex.toHexString(this)}" -} catch (ex: Exception) { - throw HexCodecException("Cannot encode to hex string", ex) -} - -fun String.fromHex(): ByteArray = try { - Hex.decode(this) -} catch (ex: Exception) { - throw HexCodecException("Cannot decode from hex string `$this`", ex) -} - -/** - * Convert a public key to an Iroha public key - */ -fun PublicKey.toIrohaPublicKey(): IrohaPublicKey { - return IrohaPublicKey(Algorithm.Ed25519(), this.bytes()) -} - -/** - * Sign the [message] using the given private key - * - * Note: the message must not be prehashed - */ -fun PrivateKey.sign(message: ByteArray): ByteArray = try { - val sgr = EdDSAEngine(MessageDigest.getInstance(DEFAULT_SPEC.hashAlgorithm)) - sgr.initSign(this) - sgr.update(message.hash()) - sgr.sign() -} catch (ex: Exception) { - throw CryptoException("Cannot sign message", ex) -} - -/** - * Verify the [signature] against the [message] and the given public key - * - * Note: the message must not be prehashed - */ -fun PublicKey.verify(signature: ByteArray, message: ByteArray): Boolean = try { - val sgr = EdDSAEngine(MessageDigest.getInstance(DEFAULT_SPEC.hashAlgorithm)) - sgr.initVerify(this) - sgr.update(message.hash()) - sgr.verify(signature) -} catch (ex: Exception) { - throw CryptoException("Cannot verify message", ex) -} - -fun ByteArray.toIrohaHash(): Hash { - if (this.size != 32) throw IrohaSdkException("Hash byte array size must be 32") - - this[31] = this[31] or 1 - return Hash(this) -} - -fun ByteArray.asHashOf() = HashOf(this.toIrohaHash()) - -fun ByteArray.hash(): ByteArray { - val bytes = Blake2b.Blake2b256().digest(this) - bytes[bytes.size - 1] = bytes[bytes.size - 1] or 1 - return bytes -} - -/** - * Hash the given versioned transaction. Maintains only `VersionedTransaction.V1` - */ -fun SignedTransaction.hash() = SignedTransaction.encode(this).hash() - -/** - * Cast to another type - */ -inline fun Any.cast(): B { - return this as? B - ?: throw ClassCastException("Could not cast `${this::class.qualifiedName}` to `${B::class.qualifiedName}`") -} - -fun AssetId.asString(withPrefix: Boolean = true) = this.definition.asString() + ASSET_ID_DELIMITER + this.account.asString(withPrefix) - -fun AssetId.asJsonString(withPrefix: Boolean = true) = "{\"asset\": " + - "\"${this.definition.asString() + ASSET_ID_DELIMITER + this.account.asString(withPrefix)}\"}" - -fun AssetDefinitionId.asString() = this.name.string + ASSET_ID_DELIMITER + this.domain.name.string - -fun AssetDefinitionId.asJsonString() = "{\"asset_definition\": " + - "\"${this.name.string + ASSET_ID_DELIMITER + this.domain.name.string}\"}" - -fun AccountId.asString(withPrefix: Boolean = true) = this.signatory.payload.toHex(withPrefix) + - ACCOUNT_ID_DELIMITER + this.domain.name.string - -fun AccountId.asJsonString(withPrefix: Boolean = true) = "{\"account\": \"${this.signatory.payload.toHex(withPrefix) + ACCOUNT_ID_DELIMITER + this.domain.name.string}\"}" - -fun DomainId.asString() = this.name.string - -fun DomainId.asJsonString() = "{\"domain\": \"${this.name.string}\"}" - -fun RoleId.asString() = this.name.string - -fun RoleId.asJsonString() = "{\"role\": \"${this.name.string}\"}" - -fun String.fromJsonString() = when { - this.startsWith("\"") && this.endsWith("\"") -> this.drop(1).dropLast(1) - else -> this -} - -fun SocketAddr.asString() = when (this) { - is SocketAddr.Host -> this.socketAddrHost.let { "${it.host}:${it.port}" } - is SocketAddr.Ipv4 -> this.socketAddrV4.let { "${it.ip}:${it.port}" } - is SocketAddr.Ipv6 -> this.socketAddrV6.let { "${it.ip}:${it.port}" } -} - -fun TriggerId.asString() = this.name.string - -fun Metadata.merge(extra: Metadata) = Metadata( - this.sortedMapOfName.toMutableMap().also { it.putAll(extra.sortedMapOfName) }, -) - -fun InstructionBox.Register.extractBox() = when (this.registerBox.discriminant()) { - 0 -> this.registerBox.cast() as RegisterBox - 1 -> this.registerBox.cast() as RegisterBox - 2 -> this.registerBox.cast() as RegisterBox - 3 -> this.registerBox.cast() as RegisterBox - 4 -> this.registerBox.cast() as RegisterBox - 5 -> this.registerBox.cast() as RegisterBox - 6 -> this.registerBox.cast() as RegisterBox - else -> null -} - -fun Iterable.extractRegisterBoxes() = this.asSequence() - .filterIsInstance() - .map { it.registerBox } - -fun IdBox.extractId(): Any = when (this) { - is IdBox.RoleId -> this.roleId - is IdBox.AccountId -> this.accountId - is IdBox.AssetId -> this.assetId - is IdBox.AssetDefinitionId -> this.assetDefinitionId - is IdBox.DomainId -> this.domainId - is IdBox.TriggerId -> this.triggerId - is IdBox.PeerId -> this.peerId - is IdBox.CustomParameterId -> this.customParameterId - is IdBox.Permission -> this.permission -} - -fun InstructionBox.extractAccount() = this - .cast() - .registerBox - .cast() - .registerOfAccount.`object` - -fun InstructionBox.Register.extractAccount() = this - .registerBox - .cast() - .registerOfAccount.`object` - -fun InstructionBox.Register.extractDomain() = this - .cast() - .registerBox - .cast() - .registerOfDomain.`object` - -fun InstructionBox.Register.extractAssetDefinition() = this - .cast() - .registerBox - .cast() - .registerOfAssetDefinition.`object` - -inline fun SignedTransaction.extractInstruction(): I = this - .cast() - .extractInstruction() - -inline fun SignedTransaction.V1.extractInstruction() = this - .extractInstructionVec() - .first().cast() - -inline fun SignedTransaction.V1.extractInstructions() = this - .extractInstructionVec() - .cast>() - -inline fun SignedTransaction.V1.extractInstructionVec() = this - .signedTransactionV1.payload.instructions - .cast() - .vec.filterIsInstance() - -fun InstructionBox.SetKeyValue.extractDomainId() = this - .cast() - .setKeyValueBox - .cast() - .setKeyValueOfDomain - .`object` - -fun InstructionBox.Grant.extractValuePermissionToken() = this - .cast() - .grantBox - .cast() - .grantOfPermissionAndAccount - .`object` - -fun EventFilterBox.extractSchedule() = this - .cast() - .timeEventFilter.executionTime - .cast().schedule - -fun BlockMessage.extractBlock() = this.signedBlock.cast().signedBlockV1.payload - -fun BlockPayload.height() = this.header.height - -fun Asset.metadata() = this.value.cast().metadata.sortedMapOfName - -fun TransactionBuilder.merge(other: TransactionBuilder) = this.instructions.value.addAll(other.instructions.value) - -fun String.toSocketAddr() = this.split(":").let { parts -> - if (parts.size != 2) throw IrohaSdkException("Incorrect address") - - SocketAddr.Host(SocketAddrHost(parts.first(), parts.last().toInt())) -} - -fun String.replace(oldValue: String) = this.replace(oldValue, "") - -fun String.replace(regex: Regex) = this.replace(regex, "") - -fun FindError.extract() = when (this) { - is FindError.Account -> this.accountId.asString() - is FindError.Asset -> this.assetId.asString() - is FindError.AssetDefinition -> this.assetDefinitionId.asString() - is FindError.Domain -> this.domainId.asString() - is FindError.Role -> this.roleId.asString() - is FindError.Block -> this.hashOf.hash.arrayOfU8.toHex() - is FindError.MetadataKey -> this.name.string - is FindError.Peer -> this.peerId.address.toString() - is FindError.Permission -> this.permission.name - is FindError.PublicKey -> this.publicKey.payload.toString() - is FindError.Trigger -> this.triggerId.asString() - is FindError.Transaction -> this.hashOf.hash.arrayOfU8.toHex() -} - -fun String.toCamelCase(name: String): String { - val tokenizer = StringTokenizer(name, "_") - return if (tokenizer.hasMoreTokens()) { - val resultBuilder = StringBuilder(tokenizer.nextToken()) - for (token in tokenizer) { - resultBuilder.append((token as String).replaceFirstChar(Char::uppercase)) - } - resultBuilder.toString() - } else { - name - } -} - -fun String.toCamelCase() = this.lowercase(Locale.getDefault()) - .split(" ", "_") - .withIndex() - .joinToString("") { value -> - when (value.index) { - 0 -> value.value - else -> value.value.replaceFirstChar { - when (it.isLowerCase()) { - true -> it.titlecase(Locale.getDefault()) - else -> it.toString() - } - } - } - } - -fun String.toSnakeCase() = this - .split("(?<=.)(?=\\p{Lu})|\\s".toRegex()) - .joinToString("_") - .lowercase(Locale.getDefault()) - -fun Number.asNumeric() = when (this) { - is Int -> this.asNumeric() - is Long -> this.asNumeric() - is BigInteger -> this.asNumeric() - is Double -> this.asNumeric() - is BigDecimal -> this.asNumeric() - else -> throw IrohaSdkException("Unexpected type to extract numeric ${this::class}") -} - -fun String.asNumeric() = Numeric(mantissa = this.toBigInteger(), scale = 0) - -fun Int.asNumeric() = Numeric(mantissa = this.toBigInteger(), scale = 0) - -fun Long.asNumeric() = Numeric(mantissa = this.toBigInteger(), scale = 0) - -fun BigInteger.asNumeric() = Numeric(mantissa = this, scale = 0) - -fun Double.asNumeric() = this.toBigDecimal().asNumeric() - -fun BigDecimal.asNumeric() = Numeric(mantissa = this.unscaledValue(), scale = this.scale().toLong()) - -fun Numeric.asInt() = this.mantissa.toInt() - -fun Numeric.asLong() = this.mantissa.toLong() - -fun Numeric.asBigInteger() = this.mantissa - -fun Numeric.asBigDecimal() = BigDecimal.valueOf(this.mantissa.toLong(), this.scale.toInt()) - -fun Numeric.asNumber() = when (this.scale) { - 0L -> this.mantissa - else -> this.asBigDecimal() -} - -fun Numeric.asString() = this.asNumber().toString() - -fun AssetType.Companion.numeric(scale: Long? = null) = AssetType.Numeric(NumericSpec(scale)) - -fun Metadata.getStringValue(key: String) = this.sortedMapOfName[key.asName()] - -fun Metadata.getBooleanValue(key: String) = this.sortedMapOfName[key.asName()] - -fun Metadata.getNameValue(key: String) = this.sortedMapOfName[key.asName()] - -fun Metadata.getFixedValue(key: String) = this.sortedMapOfName[key.asName()] - -fun JsonNode.asStringOrNull() = when (this) { - is NullNode -> null - is TextNode -> this.asText() - else -> this.toString() -} - -fun String.asPrettyJson(): String { - val gson = GsonBuilder().setPrettyPrinting().create() - val jsonElement = com.google.gson.JsonParser.parseString(this) - return gson.toJson(jsonElement) -} diff --git a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/Extractors.kt b/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/Extractors.kt index 4c8781319..fc7bce962 100644 --- a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/Extractors.kt +++ b/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/Extractors.kt @@ -3,20 +3,16 @@ package jp.co.soramitsu.iroha2 import jp.co.soramitsu.iroha2.generated.Account import jp.co.soramitsu.iroha2.generated.Asset import jp.co.soramitsu.iroha2.generated.AssetDefinition -import jp.co.soramitsu.iroha2.generated.BatchedResponse import jp.co.soramitsu.iroha2.generated.BlockHeader +import jp.co.soramitsu.iroha2.generated.CommittedTransaction import jp.co.soramitsu.iroha2.generated.Domain -import jp.co.soramitsu.iroha2.generated.ExecutorDataModel -import jp.co.soramitsu.iroha2.generated.IdBox -import jp.co.soramitsu.iroha2.generated.IdentifiableBox -import jp.co.soramitsu.iroha2.generated.Numeric -import jp.co.soramitsu.iroha2.generated.Peer +import jp.co.soramitsu.iroha2.generated.PeerId import jp.co.soramitsu.iroha2.generated.Permission -import jp.co.soramitsu.iroha2.generated.QueryOutputBox +import jp.co.soramitsu.iroha2.generated.QueryOutputBatchBox +import jp.co.soramitsu.iroha2.generated.QueryResponse import jp.co.soramitsu.iroha2.generated.Role import jp.co.soramitsu.iroha2.generated.RoleId import jp.co.soramitsu.iroha2.generated.SignedBlock -import jp.co.soramitsu.iroha2.generated.TransactionQueryOutput import jp.co.soramitsu.iroha2.generated.Trigger import jp.co.soramitsu.iroha2.generated.TriggerId @@ -24,301 +20,275 @@ import jp.co.soramitsu.iroha2.generated.TriggerId * Extractors are used by [QueryBuilder] to extract data from query results */ interface ResultExtractor { - fun extract(result: BatchedResponse): T + fun extract(result: QueryResponse): T } /** - * @return the query result as it is + * Extract a list of accounts from a [QueryResponse] */ -object AsIs : ResultExtractor> { - override fun extract(result: BatchedResponse): BatchedResponse = result +object AccountsExtractor : ResultExtractor> { + override fun extract(result: QueryResponse): List = + extract( + result + .cast() + .queryOutput.batch.tuple + .takeIf { it.size == 1 }!! + .first(), + ) } /** - * Extract an asset from a query [result] + * Extract an account from a [QueryResponse] */ -object AssetExtractor : ResultExtractor { - override fun extract(result: BatchedResponse): Asset { - return extractIdentifiable(result.cast().batchedResponseV1.batch, IdentifiableBox.Asset::asset) - } +object AccountExtractor : ResultExtractor { + override fun extract(result: QueryResponse): Account = AccountsExtractor.extract(result).first() } /** - * Extract an asset definition from a query [result] + * Extract an account from a [QueryResponse] */ -object AssetDefinitionExtractor : ResultExtractor { - override fun extract(result: BatchedResponse): AssetDefinition { - return extractIdentifiable(result.cast().batchedResponseV1.batch, IdentifiableBox.AssetDefinition::assetDefinition) - } +object AccountOrNullExtractor : ResultExtractor { + override fun extract(result: QueryResponse): Account? = AccountsExtractor.extract(result).firstOrNull() } /** - * Extract an account from a query [result] + * Extract a list of assets from a [QueryResponse] */ -object AccountExtractor : ResultExtractor { - override fun extract(result: BatchedResponse): Account { - return extractIdentifiable(result.cast().batchedResponseV1.batch, IdentifiableBox.Account::account) - } +object AssetsExtractor : ResultExtractor> { + override fun extract(result: QueryResponse): List = + extract( + result + .cast() + .queryOutput.batch.tuple + .takeIf { it.size == 1 }!! + .first(), + ) } /** - * Extract a list of accounts from a query [result] + * Extract an asset from a [QueryResponse] */ -object AccountsExtractor : ResultExtractor> { - override fun extract(result: BatchedResponse): List { - return extractVec(result.cast().batchedResponseV1.batch) { - extractIdentifiable(it, IdentifiableBox.Account::account) - } - } +object AssetExtractor : ResultExtractor { + override fun extract(result: QueryResponse): Asset = AssetsExtractor.extract(result).first() } /** - * Extract a numeric from a query + * Extract an asset from a [QueryResponse] */ -object NumericExtractor : ResultExtractor { - override fun extract(result: BatchedResponse): Numeric { - return result.cast().batchedResponseV1.batch.cast().numeric - } +object AssetOrNullExtractor : ResultExtractor { + override fun extract(result: QueryResponse): Asset? = AssetsExtractor.extract(result).firstOrNull() } /** - * Extract a list of assets from a query [result] + * Extract a list of asset definitions from a [QueryResponse] */ -object AssetsExtractor : ResultExtractor> { - override fun extract(result: BatchedResponse): List { - return extractVec(result.cast().batchedResponseV1.batch) { - extractIdentifiable(it, IdentifiableBox.Asset::asset) - } - } +object AssetDefinitionsExtractor : ResultExtractor> { + override fun extract(result: QueryResponse): List = + extract( + result + .cast() + .queryOutput.batch.tuple + .takeIf { it.size == 1 }!! + .first(), + ) } /** - * Extract a list of asset definitions from a query [result] + * Extract an asset definition from a [QueryResponse] */ -object AssetDefinitionsExtractor : ResultExtractor> { - override fun extract(result: BatchedResponse): List { - return extractVec(result.cast().batchedResponseV1.batch) { - extractIdentifiable(it, IdentifiableBox.AssetDefinition::assetDefinition) - } - } +object AssetDefinitionExtractor : ResultExtractor { + override fun extract(result: QueryResponse): AssetDefinition = AssetDefinitionsExtractor.extract(result).first() } /** - * Extract a domain from a query [result] + * Extract an asset definition from a [QueryResponse] */ -object DomainExtractor : ResultExtractor { - override fun extract(result: BatchedResponse): Domain { - return extractIdentifiable(result.cast().batchedResponseV1.batch, IdentifiableBox.Domain::domain) - } +object AssetDefinitionOrNullExtractor : ResultExtractor { + override fun extract(result: QueryResponse): AssetDefinition? = AssetDefinitionsExtractor.extract(result).firstOrNull() } /** - * Extract a list of domains from a query [result] + * Extract a list of domains from a [QueryResponse] */ object DomainsExtractor : ResultExtractor> { - override fun extract(result: BatchedResponse): List { - return extractVec(result.cast().batchedResponseV1.batch) { - extractIdentifiable(it, IdentifiableBox.Domain::domain) - } - } + override fun extract(result: QueryResponse): List = + extract( + result + .cast() + .queryOutput.batch.tuple + .takeIf { it.size == 1 }!! + .first(), + ) } /** - * Extract a lost of peers from a query [result] + * Extract a domain from a [QueryResponse] */ -object PeersExtractor : ResultExtractor> { - override fun extract(result: BatchedResponse): List { - return extractVec(result.cast().batchedResponseV1.batch) { - extractIdentifiable(it, IdentifiableBox.Peer::peer) - } - } +object DomainExtractor : ResultExtractor { + override fun extract(result: QueryResponse): Domain = DomainsExtractor.extract(result).first() +} + +/** + * Extract a domain from a [QueryResponse] + */ +object DomainOrNullExtractor : ResultExtractor { + override fun extract(result: QueryResponse): Domain? = DomainsExtractor.extract(result).firstOrNull() } /** - * Extract a trigger from a query [result] + * Extract a lost of peers from a [QueryResponse] */ -object TriggerBoxExtractor : ResultExtractor { - override fun extract(result: BatchedResponse): Trigger { - return extractIdentifiable( - result.cast().batchedResponseV1.batch, - IdentifiableBox.Trigger::trigger, +object PeersExtractor : ResultExtractor> { + override fun extract(result: QueryResponse): List = + extract( + result + .cast() + .queryOutput.batch.tuple + .takeIf { it.size == 1 }!! + .first(), ) - } } /** - * Extract a list of triggers from a query [result] + * Extract a trigger from a [QueryResponse] */ -object TriggerBoxesExtractor : ResultExtractor> { - override fun extract(result: BatchedResponse): List { - return extractVec(result.cast().batchedResponseV1.batch) { - extractIdentifiable(it, IdentifiableBox.Trigger::trigger) - } - } +object TriggerExtractor : ResultExtractor { + override fun extract(result: QueryResponse): Trigger = TriggersExtractor.extract(result).first() } /** - * Extract a list of trigger IDs from a query [result] + * Extract a trigger from a [QueryResponse] */ -object TriggerIdsExtractor : ResultExtractor> { - override fun extract(result: BatchedResponse): List { - return extractVec(result.cast().batchedResponseV1.batch) { - extractValue(it, QueryOutputBox.Id::idBox).cast().triggerId - } - } +object TriggerOrNullExtractor : ResultExtractor { + override fun extract(result: QueryResponse): Trigger? = TriggersExtractor.extract(result).firstOrNull() } /** - * Extract a list of permission tokens from a query [result] + * Extract a list of triggers from a [QueryResponse] */ -object PermissionTokensExtractor : ResultExtractor> { - override fun extract(result: BatchedResponse): List { - return extractVec(result.cast().batchedResponseV1.batch) { - extractValue(it, QueryOutputBox.Permission::permission) - } - } +object TriggersExtractor : ResultExtractor> { + override fun extract(result: QueryResponse): List = + extract( + result + .cast() + .queryOutput.batch.tuple + .takeIf { it.size == 1 }!! + .first(), + ) } /** - * Extract a permission token schema from a query [result] + * Extract a list of trigger IDs from a [QueryResponse] */ -object ExecutorDataModelExtractor : ResultExtractor { - override fun extract(result: BatchedResponse): ExecutorDataModel { - return extractValue(result.cast().batchedResponseV1.batch, QueryOutputBox.ExecutorDataModel::executorDataModel) - } +object TriggerIdsExtractor : ResultExtractor> { + override fun extract(result: QueryResponse): List = + extract( + result + .cast() + .queryOutput.batch.tuple + .takeIf { it.size == 1 }!! + .first(), + ) } /** -* Extract a list of transaction values from a query [result] -*/ -object TransactionValuesExtractor : ResultExtractor> { - override fun extract(result: BatchedResponse): List { - return extractVec(result.cast().batchedResponseV1.batch) { - extractValue(it, QueryOutputBox.Transaction::transactionQueryOutput) - } - } + * Extract a list of permission tokens from a [QueryResponse] + */ +object PermissionTokensExtractor : ResultExtractor> { + override fun extract(result: QueryResponse): List = + extract( + result + .cast() + .queryOutput.batch.tuple + .takeIf { it.size == 1 }!! + .first(), + ) } /** -* Extract a transaction value from a query [result] -*/ -object TransactionValueExtractor : ResultExtractor { - override fun extract(result: BatchedResponse): TransactionQueryOutput { - return extractValue(result.cast().batchedResponseV1.batch, QueryOutputBox.Transaction::transactionQueryOutput) - } + * Extract a list of commited transactions from a [QueryResponse] + */ +object TransactionsExtractor : ResultExtractor> { + override fun extract(result: QueryResponse): List = + extract( + result + .cast() + .queryOutput.batch.tuple + .takeIf { it.size == 1 }!! + .first(), + ) } object BlocksValueExtractor : ResultExtractor> { - override fun extract(result: BatchedResponse): List { - return extractVec(result.cast().batchedResponseV1.batch) { - extractValue(it, QueryOutputBox.Block::signedBlock) - } - } + override fun extract(result: QueryResponse): List = + extract( + result + .cast() + .queryOutput.batch.tuple + .takeIf { it.size == 1 }!! + .first(), + ) } object BlockHeadersExtractor : ResultExtractor> { - override fun extract(result: BatchedResponse): List { - return extractVec(result.cast().batchedResponseV1.batch) { - extractValue(it, QueryOutputBox.BlockHeader::blockHeader) - } - } -} - -object BlockHeaderExtractor : ResultExtractor { - override fun extract(result: BatchedResponse): BlockHeader { - return extractValue(result.cast().batchedResponseV1.batch, QueryOutputBox.BlockHeader::blockHeader) - } -} - -/** - * Extract `String` from a query [result] - */ -object StringExtractor : ResultExtractor { - override fun extract(result: BatchedResponse): String { - return result.cast().batchedResponseV1.batch - .cast().string - .fromJsonString() - } + override fun extract(result: QueryResponse): List = + extract( + result + .cast() + .queryOutput.batch.tuple + .takeIf { it.size == 1 }!! + .first(), + ) } /** - * Extract a list of roles from a query [result] + * Extract a list of roles from a [QueryResponse] */ object RolesExtractor : ResultExtractor> { - override fun extract(result: BatchedResponse): List { - return extractVec(result.cast().batchedResponseV1.batch) { - extractIdentifiable(it, IdentifiableBox.Role::role) - } - } -} - -/** - * Extract a role from a query [result] - */ -object RoleExtractor : ResultExtractor { - override fun extract(result: BatchedResponse): Role { - return extractIdentifiable(result.cast().batchedResponseV1.batch, IdentifiableBox.Role::role) - } + override fun extract(result: QueryResponse): List = + extract( + result + .cast() + .queryOutput.batch.tuple + .takeIf { it.size == 1 }!! + .first(), + ) } /** - * Extract a list of role IDs from a query [result] + * Extract a list of role IDs from a [QueryResponse] */ object RoleIdsExtractor : ResultExtractor> { - override fun extract(result: BatchedResponse): List { - return extractVec(result.cast().batchedResponseV1.batch) { - extractValue(it, QueryOutputBox.Id::idBox).cast().roleId - } - } -} - -/** - * Extract one of the [IdentifiableBox] objects from value - * - * @param downstream Type to extract - */ -inline fun extractIdentifiable(value: QueryOutputBox, downstream: (I) -> R): R { - return when (value) { - is QueryOutputBox.Identifiable -> when (val box = value.identifiableBox) { - is I -> downstream(box) - else -> throw QueryPayloadExtractionException( - "Expected `${I::class.qualifiedName}`, but got `${box::class.qualifiedName}`", - ) - } - - else -> throw QueryPayloadExtractionException( - "Expected `${QueryOutputBox.Identifiable::class.qualifiedName}`, but got `${value::class.qualifiedName}`", + override fun extract(result: QueryResponse): List = + extract( + result + .cast() + .queryOutput.batch.tuple + .takeIf { it.size == 1 }!! + .first(), ) - } } /** * Extract collection from `Value.Vec` - * - * @param downstream Type to extract */ -inline fun extractVec(value: QueryOutputBox, downstream: (QueryOutputBox) -> R): List { +inline fun extract(value: QueryOutputBatchBox): List = when (value) { - is QueryOutputBox.Vec -> { - return value.vec.map { downstream(it) } - } - - else -> throw QueryPayloadExtractionException( - "Expected `${QueryOutputBox.Vec::class.qualifiedName}`, but got `${value::class.qualifiedName}`", - ) - } -} + is QueryOutputBatchBox.Asset -> value.vec.cast>() + is QueryOutputBatchBox.AssetDefinition -> value.vec.cast>() + is QueryOutputBatchBox.Account -> value.vec.cast>() + is QueryOutputBatchBox.Domain -> value.vec.cast>() + is QueryOutputBatchBox.Peer -> value.vec.cast>() + is QueryOutputBatchBox.Permission -> value.vec.cast>() + is QueryOutputBatchBox.Block -> value.vec.cast>() + is QueryOutputBatchBox.BlockHeader -> value.vec.cast>() + is QueryOutputBatchBox.Trigger -> value.vec.cast>() + is QueryOutputBatchBox.Role -> value.vec.cast>() + is QueryOutputBatchBox.RoleId -> value.vec.cast>() + is QueryOutputBatchBox.TriggerId -> value.vec.cast>() + is QueryOutputBatchBox.CommittedTransaction -> value.vec.cast>() -/** - * Extract value - * - * @param downstream Type to extract - */ -inline fun extractValue(value: QueryOutputBox, downstream: (V) -> R): R { - return when (value) { - is V -> downstream(value) else -> throw QueryPayloadExtractionException( - "Expected `${V::class.qualifiedName}`, but got `${value::class.qualifiedName}`", + "Unexpected type `${value::class.qualifiedName}`", ) } -} diff --git a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/SingletonHolder.kt b/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/SingletonHolder.kt index af8ee427b..7078ad4a4 100644 --- a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/SingletonHolder.kt +++ b/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/SingletonHolder.kt @@ -1,7 +1,8 @@ package jp.co.soramitsu.iroha2 -open class SingletonHolder(private val creator: (A) -> T) { - +open class SingletonHolder( + private val creator: (A) -> T, +) { @Volatile private var instance: T? = null diff --git a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/client/Iroha2AsyncClient.kt b/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/client/Iroha2AsyncClient.kt index a3893fc0c..cb64d4fa6 100644 --- a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/client/Iroha2AsyncClient.kt +++ b/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/client/Iroha2AsyncClient.kt @@ -1,61 +1,48 @@ package jp.co.soramitsu.iroha2.client import io.ktor.client.plugins.logging.LogLevel +import jp.co.soramitsu.iroha2.generated.AccountId import jp.co.soramitsu.iroha2.generated.SignedTransaction -import jp.co.soramitsu.iroha2.model.IrohaUrls import jp.co.soramitsu.iroha2.query.QueryAndExtractor import kotlinx.coroutines.future.asCompletableFuture import kotlinx.coroutines.future.future import kotlinx.coroutines.runBlocking +import java.net.URL +import java.security.KeyPair +import java.util.UUID import java.util.concurrent.CompletableFuture +import java.util.concurrent.Future /** * Extension of [Iroha2Client] for Java */ @Suppress("unused") -class Iroha2AsyncClient @JvmOverloads constructor( - urls: List, - httpLogLevel: LogLevel = LogLevel.NONE, - credentials: String? = null, - eventReadTimeoutInMills: Long = 250, - eventReadMaxAttempts: Int = 10, -) : Iroha2Client(urls, httpLogLevel, credentials, eventReadTimeoutInMills, eventReadMaxAttempts) { +class Iroha2AsyncClient + @JvmOverloads + constructor( + override val apiURL: List, + override val chain: UUID, + override val authority: AccountId, + override val keyPair: KeyPair, + httpLogLevel: LogLevel = LogLevel.NONE, + credentials: String? = null, + eventReadTimeoutInMills: Long = 250, + eventReadMaxAttempts: Int = 10, + ) : Iroha2Client(apiURL, chain, authority, keyPair, credentials, httpLogLevel, eventReadTimeoutInMills, eventReadMaxAttempts) { + /** + * Send a request to Iroha2 and extract payload. + * {@see Extractors} + */ + fun sendQueryAsync(queryAndExtractor: QueryAndExtractor): CompletableFuture = + future { + submit(queryAndExtractor) + } - /** - * Send a request to Iroha2 and extract payload. - * {@see Extractors} - */ - fun sendQueryAsync( - queryAndExtractor: QueryAndExtractor, - ): CompletableFuture = future { - sendQuery(queryAndExtractor) + /** + * Send a transaction to an Iroha peer and wait until it is committed or rejected. + */ + fun sendTransactionAsync(transaction: SignedTransaction): Future = + runBlocking { + submit(transaction).asCompletableFuture() + } } - - /** - * Send a transaction to an Iroha peer and wait until it is committed or rejected. - */ - fun sendTransactionAsync( - transaction: SignedTransaction, - ): CompletableFuture = runBlocking { - sendTransaction { transaction }.asCompletableFuture() - } - - /** - * Send a transaction to an Iroha peer without waiting for the final transaction status (committed or rejected). - * - * With this method, the state of the transaction is not tracked after the peer responses with 2xx status code, - * which means that the peer accepted the transaction and the transaction passed the stateless validation. - */ - fun fireAndForgetAsync( - transaction: SignedTransaction, - ): CompletableFuture = future { - fireAndForget { transaction } - } - - /** - * Subscribe to track the transaction status - */ - fun subscribeToTransactionStatusAsync( - hash: ByteArray, - ) = subscribeToTransactionStatus(hash).asCompletableFuture() -} diff --git a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/client/Iroha2Client.kt b/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/client/Iroha2Client.kt index a438acd5e..84f36be8a 100644 --- a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/client/Iroha2Client.kt +++ b/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/client/Iroha2Client.kt @@ -1,5 +1,3 @@ -@file:Suppress("UNCHECKED_CAST") - package jp.co.soramitsu.iroha2.client import com.fasterxml.jackson.core.JsonParser @@ -31,6 +29,7 @@ import io.ktor.websocket.readBytes import jp.co.soramitsu.iroha2.IrohaClientException import jp.co.soramitsu.iroha2.TransactionRejectedException import jp.co.soramitsu.iroha2.WebSocketProtocolException +import jp.co.soramitsu.iroha2.asHashOf import jp.co.soramitsu.iroha2.cast import jp.co.soramitsu.iroha2.client.balancing.RoundRobinStrategy import jp.co.soramitsu.iroha2.client.blockstream.BlockStreamContext @@ -38,29 +37,33 @@ import jp.co.soramitsu.iroha2.client.blockstream.BlockStreamStorage import jp.co.soramitsu.iroha2.client.blockstream.BlockStreamSubscription import jp.co.soramitsu.iroha2.extract import jp.co.soramitsu.iroha2.extractBlock -import jp.co.soramitsu.iroha2.generated.BatchedResponse -import jp.co.soramitsu.iroha2.generated.BatchedResponseV1 +import jp.co.soramitsu.iroha2.generated.AccountId +import jp.co.soramitsu.iroha2.generated.BlockEventFilter import jp.co.soramitsu.iroha2.generated.BlockMessage +import jp.co.soramitsu.iroha2.generated.BlockStatus import jp.co.soramitsu.iroha2.generated.EventBox +import jp.co.soramitsu.iroha2.generated.EventFilterBox import jp.co.soramitsu.iroha2.generated.EventMessage import jp.co.soramitsu.iroha2.generated.EventSubscriptionRequest import jp.co.soramitsu.iroha2.generated.ForwardCursor import jp.co.soramitsu.iroha2.generated.PipelineEventBox -import jp.co.soramitsu.iroha2.generated.QueryOutputBox +import jp.co.soramitsu.iroha2.generated.PipelineEventFilterBox +import jp.co.soramitsu.iroha2.generated.QueryResponse import jp.co.soramitsu.iroha2.generated.SignedQuery import jp.co.soramitsu.iroha2.generated.SignedTransaction +import jp.co.soramitsu.iroha2.generated.TransactionEventFilter import jp.co.soramitsu.iroha2.generated.TransactionRejectionReason import jp.co.soramitsu.iroha2.generated.TransactionStatus import jp.co.soramitsu.iroha2.hash import jp.co.soramitsu.iroha2.height -import jp.co.soramitsu.iroha2.model.IrohaUrls import jp.co.soramitsu.iroha2.query.QueryAndExtractor -import jp.co.soramitsu.iroha2.toFrame +import jp.co.soramitsu.iroha2.query.QueryBuilder import jp.co.soramitsu.iroha2.toHex -import jp.co.soramitsu.iroha2.transaction.Filters +import jp.co.soramitsu.iroha2.transaction.Instruction import jp.co.soramitsu.iroha2.transaction.TransactionBuilder import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Deferred import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.coroutineScope @@ -71,7 +74,9 @@ import org.slf4j.Logger import org.slf4j.LoggerFactory import java.math.BigInteger import java.net.URL +import java.security.KeyPair import java.time.Duration +import java.util.UUID import kotlin.coroutines.CoroutineContext /** @@ -79,63 +84,27 @@ import kotlin.coroutines.CoroutineContext * * @param credentials : */ -@Suppress("unused") open class Iroha2Client( - open val urls: List, - open val httpLogLevel: LogLevel = LogLevel.NONE, + open val apiURL: List, + open val chain: UUID, + open val authority: AccountId, + open val keyPair: KeyPair, open val credentials: String? = null, + open val httpLogLevel: LogLevel = LogLevel.NONE, open val eventReadTimeoutInMills: Long = 250, open val eventReadMaxAttempts: Int = 10, override val coroutineContext: CoroutineContext = Dispatchers.IO + SupervisorJob(), -) : AutoCloseable, CoroutineScope, RoundRobinStrategy(urls) { - - constructor( - url: IrohaUrls, - httpLogLevel: LogLevel = LogLevel.NONE, - credentials: String? = null, - eventReadTimeoutInMills: Long = 250, - eventReadMaxAttempts: Int = 10, - ) : this(mutableListOf(url), httpLogLevel, credentials, eventReadTimeoutInMills, eventReadMaxAttempts) - - constructor( - apiUrl: URL, - peerUrl: URL, - httpLogLevel: LogLevel = LogLevel.NONE, - credentials: String? = null, - eventReadTimeoutInMills: Long = 250, - eventReadMaxAttempts: Int = 10, - ) : this( - IrohaUrls(apiUrl, peerUrl), - httpLogLevel, - credentials, - eventReadTimeoutInMills, - eventReadMaxAttempts, - ) - - constructor( - apiUrl: String, - peerUrl: String, - httpLogLevel: LogLevel = LogLevel.NONE, - credentials: String? = null, - eventReadTimeoutInMills: Long = 250, - eventReadMaxAttempts: Int = 10, - ) : this( - URL(apiUrl), - URL(peerUrl), - httpLogLevel, - credentials, - eventReadTimeoutInMills, - eventReadMaxAttempts, - ) - +) : RoundRobinStrategy(apiURL), + AutoCloseable, + CoroutineScope { companion object { const val TRANSACTION_ENDPOINT = "/transaction" - const val PENDING_TRANSACTIONS_ENDPOINT = "/pending_transactions" const val QUERY_ENDPOINT = "/query" const val WS_ENDPOINT = "/events" const val WS_ENDPOINT_BLOCK_STREAM = "/block/stream" const val HEALTH_ENDPOINT = "/health" const val STATUS_ENDPOINT = "/status" + const val PEERS_ENDPOINT = "/peers" const val SCHEMA_ENDPOINT = "/schema" const val METRICS_ENDPOINT = "/metrics" const val CONFIGURATION_ENDPOINT = "/configuration" @@ -181,30 +150,40 @@ open class Iroha2Client( } } + suspend fun submit(vararg instructions: Instruction): Deferred = + coroutineScope { + submit(TransactionBuilder(chain).addInstructions(*instructions).signAs(authority, keyPair)) + } + + suspend fun submit(signedTransaction: SignedTransaction): Deferred = + coroutineScope { + val lock = Mutex(locked = true) + subscribeToTransactionStatus(signedTransaction.hash()) { + lock.unlock() // 2. unlock after subscription + }.also { + lock.lock() // 1. waiting for unlock + fireAndForget(signedTransaction) + } + } + + /** + * Send a request to Iroha2 and extract paginated payload + */ + suspend fun submit(query: QueryBuilder): R = submit(query.signAs(authority, keyPair)) + /** * Send a request to Iroha2 and extract paginated payload */ - suspend fun sendQuery( + suspend fun submit( queryAndExtractor: QueryAndExtractor, cursor: ForwardCursor? = null, ): T { logger.debug("Sending query") - val responseDecoded = sendQueryRequest(queryAndExtractor, cursor) - val decodedCursor = responseDecoded.cast().batchedResponseV1.cursor - val finalResult = when (decodedCursor.cursor) { - null -> responseDecoded.let { queryAndExtractor.resultExtractor.extract(it) } - else -> { - val resultList = getQueryResultWithCursor(queryAndExtractor, decodedCursor) - resultList.addAll( - responseDecoded.cast() - .batchedResponseV1.batch.cast().vec, - ) - BatchedResponse.V1( - BatchedResponseV1(QueryOutputBox.Vec(resultList), ForwardCursor()), - ).let { queryAndExtractor.resultExtractor.extract(it) } - } - } - return finalResult + val query = queryAndExtractor.query + val extractor = queryAndExtractor.extractor + + val responseDecoded = sendQueryRequest(query, cursor) + return responseDecoded.let { extractor.extract(it) } } /** @@ -213,147 +192,52 @@ open class Iroha2Client( * With this method, the state of the transaction is not tracked after the peer responses with 2xx status code, * which means that the peer accepted the transaction and the transaction passed the stateless validation. */ - suspend fun fireAndForget(transaction: TransactionBuilder.() -> SignedTransaction): ByteArray { - val signedTransaction = transaction(TransactionBuilder.builder()) + private suspend fun fireAndForget(signedTransaction: SignedTransaction): ByteArray { val hash = signedTransaction.hash() logger.debug("Sending transaction with hash {}", hash.toHex()) - val response: HttpResponse = client.post("${getApiUrl()}$TRANSACTION_ENDPOINT") { - setBody(SignedTransaction.encode(signedTransaction)) - } + val response: HttpResponse = + client.post("${getApiURL()}${TRANSACTION_ENDPOINT}") { + setBody(SignedTransaction.encode(signedTransaction)) + } response.body() return hash } /** - * Send a transaction to an Iroha peer and wait until it is committed or rejected. + * Read the message from the frame */ - suspend fun sendTransaction( - transaction: TransactionBuilder.() -> SignedTransaction, - ): CompletableDeferred = coroutineScope { - val signedTransaction = transaction(TransactionBuilder()) + private fun readMessage(frame: Frame): EventMessage = + when (frame) { + is Frame.Binary -> { + frame.readBytes().let { + EventMessage.decode(it) + } + } - val lock = Mutex(locked = true) - subscribeToTransactionStatus(signedTransaction.hash()) { - lock.unlock() // 2. unlock after subscription - }.also { - lock.lock() // 1. waiting for unlock - fireAndForget { signedTransaction } + else -> throw WebSocketProtocolException( + "Expected server will `${Frame.Binary::class.qualifiedName}` frame, but was `${frame::class.qualifiedName}`", + ) } - } - - /** - * @see subscribeToBlockStream below - */ - @JvmOverloads - fun subscribeToBlockStream( - from: Long = 1, - count: Long, - autoStart: Boolean = true, - ): Pair, BlockStreamSubscription> = subscribeToBlockStream( - from, - onBlock = { block -> block }, - cancelIf = { block -> block.extractBlock().height().u64 == BigInteger.valueOf(from + count - 1) }, - autoStart = autoStart, - ) - /** - * Subscribe to block streaming. Returns null if the subscription has already been received - * - * @param from - block number to start from - * @param onBlock - the code that will be invoked after a new block received - * @param onFailure - the code that will be invoked on exception throwing - * @param cancelIf - if the condition returns true then the channel will be closed - * @param onClose - the code that will be invoked right before closing - */ - @JvmOverloads - fun subscribeToBlockStream( - from: Long = 1, - onBlock: (block: BlockMessage) -> Any, - onFailure: suspend (t: Throwable) -> Unit = { throwable -> - logger.error("Block stream was closed with an exception: {}", throwable.message) - }, - cancelIf: suspend (block: BlockMessage) -> Boolean = { false }, - onClose: () -> Unit = { logger.info("Block stream subscription execution was finished") }, - autoStart: Boolean = true, - ): Pair, BlockStreamSubscription> = subscribeToBlockStream( - from, - listOf( - BlockStreamStorage( - onBlock, - cancelIf, - onFailure, + private fun eventSubscriberMessageOf(hash: ByteArray) = + EventSubscriptionRequest( + listOf( + EventFilterBox.Pipeline(PipelineEventFilterBox.Transaction(TransactionEventFilter(hash.asHashOf()))), + EventFilterBox.Pipeline(PipelineEventFilterBox.Block(BlockEventFilter(status = BlockStatus.Applied()))), ), - ), - onClose, - autoStart, - ) - - /** - * Subscribe to block streaming. Returns null if the subscription has already been received - * - * @param from - block number to start from - * @param blockStreamStorages - wrapper for the code blocks that represent logic - * of a block received processing, cancellation condition and error processing - * @param onClose - the code that will be invoked right before closing - * @param autoStart - whether websocket is going to be receiving blocks immediately, - * otherwise calling 'start' method required - */ - @JvmOverloads - fun subscribeToBlockStream( - from: Long = 1, - blockStreamStorages: Iterable, - onClose: () -> Unit = { logger.info("Block stream subscription execution was finished") }, - autoStart: Boolean = true, - ): Pair, BlockStreamSubscription> { - val context = BlockStreamContext( - getApiUrl(), - client, - from, - blockStreamStorages, - onClose, ) - return blockStreamStorages to BlockStreamSubscription.getInstance(context) - .apply { if (autoStart) start() } - } /** - * Subscribe to track the transaction status + * Extract the rejection reason */ - fun subscribeToTransactionStatus(hash: ByteArray) = subscribeToTransactionStatus(hash, null) - - private suspend fun sendQueryRequest( - queryAndExtractor: QueryAndExtractor, - cursor: ForwardCursor? = null, - ): BatchedResponse { - val response: HttpResponse = client.post("${getApiUrl()}$QUERY_ENDPOINT") { - if (cursor != null) { - parameter("query", cursor.query) - parameter("cursor", cursor.cursor?.u64) - } else { - setBody(SignedQuery.encode(queryAndExtractor.query)) - } + private fun TransactionRejectionReason.message(): String = + when (this) { + is TransactionRejectionReason.InstructionExecution -> this.instructionExecutionFail.reason + is TransactionRejectionReason.WasmExecution -> this.wasmExecutionFail.reason + is TransactionRejectionReason.LimitCheck -> this.transactionLimitError.reason + is TransactionRejectionReason.AccountDoesNotExist -> this.findError.extract() + is TransactionRejectionReason.Validation -> this.validationFail.toString() } - return response.body().let { BatchedResponse.decode(it) }.cast>() - } - - private suspend fun getQueryResultWithCursor( - queryAndExtractor: QueryAndExtractor, - queryCursor: ForwardCursor? = null, - ): MutableList { - val resultList = mutableListOf() - val responseDecoded = sendQueryRequest(queryAndExtractor, queryCursor) - resultList.addAll( - responseDecoded.cast().batchedResponseV1.batch.cast().vec, - ) - val cursor = responseDecoded.cast().batchedResponseV1.cursor - return when (cursor.cursor) { - null -> resultList - else -> { - resultList.addAll(getQueryResultWithCursor(queryAndExtractor, cursor)) - resultList - } - } - } /** * @param hash - Signed transaction hash @@ -362,125 +246,184 @@ open class Iroha2Client( private fun subscribeToTransactionStatus( hash: ByteArray, afterSubscription: (() -> Unit)? = null, - ): CompletableDeferred { + ): Deferred { val hexHash = hash.toHex() logger.debug("Creating subscription to transaction status: {}", hexHash) val subscriptionRequest = eventSubscriberMessageOf(hash) val payload = EventSubscriptionRequest.encode(subscriptionRequest) val result: CompletableDeferred = CompletableDeferred() - val apiUrl = getApiUrl() + val currApiURL = getApiURL() launch { client.webSocket( - host = apiUrl.host, - port = apiUrl.port, + host = currApiURL.host, + port = currApiURL.port, path = WS_ENDPOINT, ) { logger.debug("WebSocket opened") - send(payload.toFrame()) + send(Frame.Binary(true, payload)) afterSubscription?.invoke() logger.debug("Subscription was accepted by peer") + var blockHeight: BigInteger? = null for (i in 1..eventReadMaxAttempts) { try { - val income = readMessage(incoming.receive()) - val processed = pipelineEventProcess(income, hash, hexHash) - if (processed != null) { - result.complete(processed) - break + val event = (readMessage(incoming.receive()).eventBox as EventBox.Pipeline).pipelineEventBox + + if (event is PipelineEventBox.Block) { + if (event.blockEvent.status is BlockStatus.Applied && blockHeight == event.blockEvent.header.height.u64) { + logger.debug("Transaction {} applied", hexHash) + result.complete(hash) + break + } + } else if (event is PipelineEventBox.Transaction) { + when (val status = event.transactionEvent.status) { + is TransactionStatus.Queued -> logger.debug("Transaction {} is queued", hexHash) + + is TransactionStatus.Rejected -> { + val reason = status.transactionRejectionReason.message() + logger.error("Transaction {} was rejected by reason: `{}`", hexHash, reason) + throw TransactionRejectedException("$hexHash: $reason") + } + + is TransactionStatus.Approved -> { + if (hash.contentEquals(event.transactionEvent.hash.hash.arrayOfU8)) { + blockHeight = event.transactionEvent.blockHeight!!.u64 + logger.debug("Transaction {} approved", hexHash) + } + } + + is TransactionStatus.Expired -> throw TransactionRejectedException("Transaction expired") + } } } catch (e: TransactionRejectedException) { result.completeExceptionally(e) break } + delay(eventReadTimeoutInMills) } } } - return result - } - - private fun pipelineEventProcess( - eventPublisherMessage: EventMessage, - hash: ByteArray, - hexHash: String, - ): ByteArray? { - when (val event = eventPublisherMessage.eventBox) { - is EventBox.Pipeline -> { - val eventBox = event.pipelineEventBox - if (eventBox is PipelineEventBox.Transaction && hash.contentEquals(eventBox.transactionEvent.hash.hash.arrayOfU8)) { - when (val status = eventBox.transactionEvent.status) { - is TransactionStatus.Approved -> { - logger.debug("Transaction {} approved", hexHash) - return hash - } - - is TransactionStatus.Rejected -> { - val reason = status.transactionRejectionReason.message() - logger.error("Transaction {} was rejected by reason: `{}`", hexHash, reason) - throw TransactionRejectedException("Transaction rejected with reason '$reason'") - } - - is TransactionStatus.Expired -> logger.debug("Transaction {} is expired", hexHash) - is TransactionStatus.Queued -> logger.debug("Transaction {} is queued", hexHash) - } - } - return null - } - else -> throw WebSocketProtocolException( - "Expected message with type ${EventBox.Pipeline::class.qualifiedName}, " + - "but was ${event::class.qualifiedName}", - ) - } + return result } /** - * Extract the rejection reason + * @see blocks below */ - private fun TransactionRejectionReason.message(): String = when (this) { - is TransactionRejectionReason.InstructionExecution -> this.instructionExecutionFail.reason - is TransactionRejectionReason.WasmExecution -> this.wasmExecutionFail.reason - is TransactionRejectionReason.LimitCheck -> this.transactionLimitError.reason - is TransactionRejectionReason.AccountDoesNotExist -> this.findError.extract() - is TransactionRejectionReason.Validation -> this.validationFail.toString() - } + @JvmOverloads + fun blocks( + from: Long = 1, + count: Long, + autoStart: Boolean = true, + ): Pair, BlockStreamSubscription> = + blocks( + from, + onBlock = { block -> block }, + cancelIf = { block -> block.extractBlock().height().u64 == BigInteger.valueOf(from + count - 1) }, + autoStart = autoStart, + ) /** - * Read the message from the frame + * Subscribe to block streaming. Returns null if the subscription has already been received + * + * @param from - block number to start from + * @param onBlock - the code that will be invoked after a new block received + * @param onFailure - the code that will be invoked on exception throwing + * @param cancelIf - if the condition returns true then the channel will be closed + * @param onClose - the code that will be invoked right before closing */ - private fun readMessage(frame: Frame): EventMessage = when (frame) { - is Frame.Binary -> { - frame.readBytes().let { - EventMessage.decode(it) - } - } - - else -> throw WebSocketProtocolException( - "Expected server will `${Frame.Binary::class.qualifiedName}` frame, but was `${frame::class.qualifiedName}`", + @JvmOverloads + fun blocks( + from: Long = 1, + onBlock: (block: BlockMessage) -> Any, + onFailure: suspend (t: Throwable) -> Unit = { throwable -> + logger.error("Block stream was closed with an exception: {}", throwable.message) + }, + cancelIf: suspend (block: BlockMessage) -> Boolean = { false }, + onClose: () -> Unit = { logger.info("Block stream subscription execution was finished") }, + autoStart: Boolean = true, + ): Pair, BlockStreamSubscription> = + blocks( + from, + listOf( + BlockStreamStorage( + onBlock, + cancelIf, + onFailure, + ), + ), + onClose, + autoStart, ) + + /** + * Subscribe to block streaming. Returns null if the subscription has already been received + * + * @param from - block number to start from + * @param blockStreamStorages - wrapper for the code blocks that represent logic + * of a block received processing, cancellation condition and error processing + * @param onClose - the code that will be invoked right before closing + * @param autoStart - whether websocket is going to be receiving blocks immediately, + * otherwise calling 'start' method required + */ + @JvmOverloads + fun blocks( + from: Long = 1, + blockStreamStorages: Iterable, + onClose: () -> Unit = { logger.info("Block stream subscription execution was finished") }, + autoStart: Boolean = true, + ): Pair, BlockStreamSubscription> { + val context = + BlockStreamContext( + getApiURL(), + client, + from, + blockStreamStorages, + onClose, + ) + return blockStreamStorages to + BlockStreamSubscription + .getInstance(context) + .apply { if (autoStart) start() } } - private fun eventSubscriberMessageOf( - hash: ByteArray, - ) = EventSubscriptionRequest( - listOf(Filters.pipelineTransaction(hash)), - ) + private suspend fun sendQueryRequest( + query: SignedQuery, + cursor: ForwardCursor? = null, + ): QueryResponse { + val response: HttpResponse = + client.post("${getApiURL()}$QUERY_ENDPOINT") { + if (cursor != null) { + parameter("query", cursor.query) + parameter("cursor", cursor.cursor.u64) + } else { + setBody(SignedQuery.encode(query)) + } + } + return response.body().let { QueryResponse.decode(it) }.cast() + } - object DurationDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext): Duration { + private object DurationDeserializer : JsonDeserializer() { + override fun deserialize( + p: JsonParser, + ctxt: DeserializationContext, + ): Duration { val pairs: Map = p.readValueAs(object : TypeReference>() {}) - val seconds = pairs["secs"] ?: throw JsonMappingException.from( - p, - "Expected `secs` item for duration deserialization", - ) - val nanos = pairs["nanos"] ?: throw JsonMappingException.from( - p, - "Expected `nanos` item for duration deserialization", - ) + val seconds = + pairs["secs"] ?: throw JsonMappingException.from( + p, + "Expected `secs` item for duration deserialization", + ) + val nanos = + pairs["nanos"] ?: throw JsonMappingException.from( + p, + "Expected `nanos` item for duration deserialization", + ) return Duration.ofSeconds(seconds, nanos) } } diff --git a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/client/balancing/BalancingStrategy.kt b/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/client/balancing/BalancingStrategy.kt index ee7748371..af4b2fd95 100644 --- a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/client/balancing/BalancingStrategy.kt +++ b/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/client/balancing/BalancingStrategy.kt @@ -3,7 +3,5 @@ package jp.co.soramitsu.iroha2.client.balancing import java.net.URL interface BalancingStrategy { - fun getApiUrl(): URL - - fun getPeerUrl(): URL + fun getApiURL(): URL } diff --git a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/client/balancing/RoundRobinStrategy.kt b/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/client/balancing/RoundRobinStrategy.kt index 323a27e66..8ed2bf5ab 100644 --- a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/client/balancing/RoundRobinStrategy.kt +++ b/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/client/balancing/RoundRobinStrategy.kt @@ -1,27 +1,27 @@ package jp.co.soramitsu.iroha2.client.balancing -import jp.co.soramitsu.iroha2.model.IrohaUrls import java.net.URL /** * Round-robin load balancing strategy */ -open class RoundRobinStrategy(private val urls: List) : BalancingStrategy { - +open class RoundRobinStrategy( + private val urls: List, +) : BalancingStrategy { private var lastRequestedPeerIdx: Int? = null - override fun getApiUrl(): URL = getUrls().apiUrl - - override fun getPeerUrl(): URL = getUrls().peerUrl + override fun getApiURL(): URL = getUrls() - private fun getUrls() = when (lastRequestedPeerIdx) { - null -> urls.first().also { lastRequestedPeerIdx = 0 } - else -> { - lastRequestedPeerIdx = when (lastRequestedPeerIdx) { - urls.size - 1 -> 0 - else -> lastRequestedPeerIdx!! + 1 + private fun getUrls() = + when (lastRequestedPeerIdx) { + null -> urls.first().also { lastRequestedPeerIdx = 0 } + else -> { + lastRequestedPeerIdx = + when (lastRequestedPeerIdx) { + urls.size - 1 -> 0 + else -> lastRequestedPeerIdx!! + 1 + } + urls[lastRequestedPeerIdx!!] } - urls[lastRequestedPeerIdx!!] } - } } diff --git a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/client/balancing/WithoutBalancingStrategy.kt b/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/client/balancing/WithoutBalancingStrategy.kt index 4edb430d0..b3675b79f 100644 --- a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/client/balancing/WithoutBalancingStrategy.kt +++ b/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/client/balancing/WithoutBalancingStrategy.kt @@ -3,8 +3,8 @@ package jp.co.soramitsu.iroha2.client.balancing import jp.co.soramitsu.iroha2.model.IrohaUrls import java.net.URL -open class WithoutBalancingStrategy(private val urls: List) : BalancingStrategy { - override fun getApiUrl(): URL = urls.first().apiUrl - - override fun getPeerUrl(): URL = urls.first().peerUrl +open class WithoutBalancingStrategy( + private val urls: List, +) : BalancingStrategy { + override fun getApiURL(): URL = urls.first().apiUrl } diff --git a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/client/blockstream/BlockStreamSubscription.kt b/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/client/blockstream/BlockStreamSubscription.kt index 314143344..d08f4112c 100644 --- a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/client/blockstream/BlockStreamSubscription.kt +++ b/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/client/blockstream/BlockStreamSubscription.kt @@ -2,6 +2,7 @@ package jp.co.soramitsu.iroha2.client.blockstream import io.ktor.client.plugins.websocket.webSocket import io.ktor.http.HttpMethod +import io.ktor.websocket.Frame import io.ktor.websocket.close import io.ktor.websocket.readBytes import jp.co.soramitsu.iroha2.IrohaSdkException @@ -11,7 +12,6 @@ import jp.co.soramitsu.iroha2.client.Iroha2Client import jp.co.soramitsu.iroha2.generated.BlockMessage import jp.co.soramitsu.iroha2.generated.BlockSubscriptionRequest import jp.co.soramitsu.iroha2.generated.NonZeroOfu64 -import jp.co.soramitsu.iroha2.toFrame import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.DelicateCoroutinesApi @@ -37,8 +37,8 @@ import kotlin.coroutines.CoroutineContext open class BlockStreamSubscription private constructor( private val context: BlockStreamContext, -) : CoroutineScope, AutoCloseable { - +) : CoroutineScope, + AutoCloseable { override val coroutineContext: CoroutineContext = Dispatchers.IO open val logger: Logger = LoggerFactory.getLogger(javaClass) @@ -72,12 +72,18 @@ open class BlockStreamSubscription private constructor( logger.debug("Block stream subscription has been expanded. Updated number of channels is ${source.size}") } - fun subscribeAndReceive(storage: BlockStreamStorage, collector: FlowCollector) { + fun subscribeAndReceive( + storage: BlockStreamStorage, + collector: FlowCollector, + ) { subscribe(storage) receive(storage.id, collector) } - fun receive(actionId: UUID, collector: FlowCollector) = launch { + fun receive( + actionId: UUID, + collector: FlowCollector, + ) = launch { receive(actionId).collect(collector) } @@ -88,74 +94,77 @@ open class BlockStreamSubscription private constructor( } } - suspend fun stop() = withContext(NonCancellable) { - if (!stopped.getAndSet(true)) { - runJob.cancelAndJoin() - destroy() // singleton instance of subscription - logger.info("Unsubscribed from block streaming") + suspend fun stop() = + withContext(NonCancellable) { + if (!stopped.getAndSet(true)) { + runJob.cancelAndJoin() + destroy() // singleton instance of subscription + logger.info("Unsubscribed from block streaming") + } + logger.warn("Block streaming is already closed") } - logger.warn("Block streaming is already closed") - } override fun close() = runBlocking { stop() } @OptIn(DelicateCoroutinesApi::class) - private fun run() = launch { - val request = BlockSubscriptionRequest( - NonZeroOfu64( - BigInteger.valueOf(context.from), - ), - ) - context.client.webSocket( - host = context.apiUrl.host, - port = context.apiUrl.port, - path = Iroha2Client.WS_ENDPOINT_BLOCK_STREAM, - method = HttpMethod.Get, - ) { - try { - logger.debug("WebSocket opened") - send(BlockSubscriptionRequest.encode(request).toFrame()) - val idsToRemove = mutableListOf() - - for (frame in incoming) { - logger.debug("Received frame: {}", frame) - - val block = BlockMessage.decode(frame.readBytes()) - source.forEach { (id, storage) -> - logger.debug("Executing {} action", id) - val result = storage.onBlock(block) - logger.debug("{} action result: {}", id, result) - - val channel = storage.channel.value - when (channel.isClosedForSend) { - true -> logger.warn("Block stream channel#{} is already closed, not sending the action result", id) - false -> channel.send(result) + private fun run() = + launch { + val request = + BlockSubscriptionRequest( + NonZeroOfu64( + BigInteger.valueOf(context.from), + ), + ) + context.client.webSocket( + host = context.apiUrl.host, + port = context.apiUrl.port, + path = Iroha2Client.WS_ENDPOINT_BLOCK_STREAM, + method = HttpMethod.Get, + ) { + try { + logger.debug("WebSocket opened") + send(Frame.Binary(true, BlockSubscriptionRequest.encode(request))) + val idsToRemove = mutableListOf() + + for (frame in incoming) { + logger.debug("Received frame: {}", frame) + + val block = BlockMessage.decode(frame.readBytes()) + source.forEach { (id, storage) -> + logger.debug("Executing {} action", id) + val result = storage.onBlock(block) + logger.debug("{} action result: {}", id, result) + + val channel = storage.channel.value + when (channel.isClosedForSend) { + true -> logger.warn("Block stream channel#{} is already closed, not sending the action result", id) + false -> channel.send(result) + } + if (storage.cancelIf?.let { it(block) } == true) { + // idempotent + channel.close() + idsToRemove.add(id) + logger.info("Block stream channel#{} is closed and scheduled for removal", id) + } } - if (storage.cancelIf?.let { it(block) } == true) { - // idempotent - channel.close() - idsToRemove.add(id) - logger.info("Block stream channel#{} is closed and scheduled for removal", id) + if (idsToRemove.isNotEmpty()) { + idsToRemove.forEach { + source.remove(it) + logger.info("Block stream channel#{} is removed", it) + } + idsToRemove.clear() } } - if (idsToRemove.isNotEmpty()) { - idsToRemove.forEach { - source.remove(it) - logger.info("Block stream channel#{} is removed", it) - } - idsToRemove.clear() - } + } catch (e: CancellationException) { + logger.info("Closing subscription WS") + this.close() + source.values.forEach { it.channel.value.close() } + return@webSocket + } finally { + context.onClose() } - } catch (e: CancellationException) { - logger.info("Closing subscription WS") - this.close() - source.values.forEach { it.channel.value.close() } - return@webSocket - } finally { - context.onClose() } } - } companion object : SingletonHolder(::BlockStreamSubscription) } diff --git a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/model/IrohaUrls.kt b/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/model/IrohaUrls.kt index 1f89cd0bc..92dfbcda0 100644 --- a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/model/IrohaUrls.kt +++ b/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/model/IrohaUrls.kt @@ -1,10 +1,14 @@ package jp.co.soramitsu.iroha2.model +import java.net.URI import java.net.URL -data class IrohaUrls(val apiUrl: URL, val peerUrl: URL) { +data class IrohaUrls( + val apiUrl: URL, + val peerUrl: URL, +) { constructor( apiUrl: String, peerUrl: String, - ) : this(URL(apiUrl), URL(peerUrl)) + ) : this(URI(apiUrl).toURL(), URI(peerUrl).toURL()) } diff --git a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/model/Page.kt b/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/model/Page.kt index 43b783bc9..78cf2139e 100644 --- a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/model/Page.kt +++ b/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/model/Page.kt @@ -5,4 +5,7 @@ import java.math.BigInteger /** * Pages contain query results with extracted [data]. */ -data class Page(val data: T, val total: BigInteger) +data class Page( + val data: T, + val total: BigInteger, +) diff --git a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/query/Queries.kt b/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/query/Queries.kt index 4535ee41f..22dadf7b6 100644 --- a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/query/Queries.kt +++ b/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/query/Queries.kt @@ -1,318 +1,265 @@ package jp.co.soramitsu.iroha2.query import jp.co.soramitsu.iroha2.generated.AccountId +import jp.co.soramitsu.iroha2.generated.AccountProjectionOfSelectorMarker import jp.co.soramitsu.iroha2.generated.AssetDefinitionId -import jp.co.soramitsu.iroha2.generated.AssetId -import jp.co.soramitsu.iroha2.generated.DomainId -import jp.co.soramitsu.iroha2.generated.FindAccountById -import jp.co.soramitsu.iroha2.generated.FindAccountKeyValueByIdAndKey -import jp.co.soramitsu.iroha2.generated.FindAccountsByDomainId +import jp.co.soramitsu.iroha2.generated.AssetDefinitionProjectionOfSelectorMarker +import jp.co.soramitsu.iroha2.generated.AssetProjectionOfSelectorMarker +import jp.co.soramitsu.iroha2.generated.CommittedTransactionProjectionOfSelectorMarker +import jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAccount +import jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAsset +import jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAssetDefinition +import jp.co.soramitsu.iroha2.generated.CompoundPredicateOfCommittedTransaction +import jp.co.soramitsu.iroha2.generated.CompoundPredicateOfDomain +import jp.co.soramitsu.iroha2.generated.CompoundPredicateOfPeerId +import jp.co.soramitsu.iroha2.generated.CompoundPredicateOfPermission +import jp.co.soramitsu.iroha2.generated.CompoundPredicateOfRole +import jp.co.soramitsu.iroha2.generated.CompoundPredicateOfRoleId +import jp.co.soramitsu.iroha2.generated.CompoundPredicateOfSignedBlock +import jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTrigger +import jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTriggerId +import jp.co.soramitsu.iroha2.generated.DomainProjectionOfSelectorMarker +import jp.co.soramitsu.iroha2.generated.FindAccounts import jp.co.soramitsu.iroha2.generated.FindAccountsWithAsset -import jp.co.soramitsu.iroha2.generated.FindAllAccounts -import jp.co.soramitsu.iroha2.generated.FindAllActiveTriggerIds -import jp.co.soramitsu.iroha2.generated.FindAllAssets -import jp.co.soramitsu.iroha2.generated.FindAllAssetsDefinitions -import jp.co.soramitsu.iroha2.generated.FindAllBlockHeaders -import jp.co.soramitsu.iroha2.generated.FindAllBlocks -import jp.co.soramitsu.iroha2.generated.FindAllDomains -import jp.co.soramitsu.iroha2.generated.FindAllParameters -import jp.co.soramitsu.iroha2.generated.FindAllPeers -import jp.co.soramitsu.iroha2.generated.FindAllRoleIds -import jp.co.soramitsu.iroha2.generated.FindAllRoles -import jp.co.soramitsu.iroha2.generated.FindAllTransactions -import jp.co.soramitsu.iroha2.generated.FindAssetById -import jp.co.soramitsu.iroha2.generated.FindAssetDefinitionById -import jp.co.soramitsu.iroha2.generated.FindAssetDefinitionKeyValueByIdAndKey -import jp.co.soramitsu.iroha2.generated.FindAssetKeyValueByIdAndKey -import jp.co.soramitsu.iroha2.generated.FindAssetQuantityById -import jp.co.soramitsu.iroha2.generated.FindAssetsByAccountId -import jp.co.soramitsu.iroha2.generated.FindAssetsByAssetDefinitionId -import jp.co.soramitsu.iroha2.generated.FindAssetsByDomainId -import jp.co.soramitsu.iroha2.generated.FindAssetsByDomainIdAndAssetDefinitionId -import jp.co.soramitsu.iroha2.generated.FindAssetsByName -import jp.co.soramitsu.iroha2.generated.FindBlockHeaderByHash -import jp.co.soramitsu.iroha2.generated.FindDomainById -import jp.co.soramitsu.iroha2.generated.FindDomainKeyValueByIdAndKey +import jp.co.soramitsu.iroha2.generated.FindActiveTriggerIds +import jp.co.soramitsu.iroha2.generated.FindAssets +import jp.co.soramitsu.iroha2.generated.FindAssetsDefinitions +import jp.co.soramitsu.iroha2.generated.FindBlocks +import jp.co.soramitsu.iroha2.generated.FindDomains import jp.co.soramitsu.iroha2.generated.FindExecutorDataModel +import jp.co.soramitsu.iroha2.generated.FindParameters +import jp.co.soramitsu.iroha2.generated.FindPeers import jp.co.soramitsu.iroha2.generated.FindPermissionsByAccountId -import jp.co.soramitsu.iroha2.generated.FindRoleByRoleId +import jp.co.soramitsu.iroha2.generated.FindRoles import jp.co.soramitsu.iroha2.generated.FindRolesByAccountId -import jp.co.soramitsu.iroha2.generated.FindTotalAssetQuantityByAssetDefinitionId -import jp.co.soramitsu.iroha2.generated.FindTransactionByHash -import jp.co.soramitsu.iroha2.generated.FindTransactionsByAccountId -import jp.co.soramitsu.iroha2.generated.FindTriggerById -import jp.co.soramitsu.iroha2.generated.FindTriggerKeyValueByIdAndKey -import jp.co.soramitsu.iroha2.generated.FindTriggersByAuthorityDomainId -import jp.co.soramitsu.iroha2.generated.FindTriggersByAuthorityId -import jp.co.soramitsu.iroha2.generated.Hash -import jp.co.soramitsu.iroha2.generated.HashOf -import jp.co.soramitsu.iroha2.generated.Name +import jp.co.soramitsu.iroha2.generated.FindTransactions +import jp.co.soramitsu.iroha2.generated.FindTriggers +import jp.co.soramitsu.iroha2.generated.PeerIdProjectionOfSelectorMarker +import jp.co.soramitsu.iroha2.generated.PermissionProjectionOfSelectorMarker import jp.co.soramitsu.iroha2.generated.QueryBox -import jp.co.soramitsu.iroha2.generated.RoleId -import jp.co.soramitsu.iroha2.generated.SignedTransaction -import jp.co.soramitsu.iroha2.generated.TriggerId +import jp.co.soramitsu.iroha2.generated.QueryWithFilterOfFindAccounts +import jp.co.soramitsu.iroha2.generated.QueryWithFilterOfFindAccountsWithAsset +import jp.co.soramitsu.iroha2.generated.QueryWithFilterOfFindActiveTriggerIds +import jp.co.soramitsu.iroha2.generated.QueryWithFilterOfFindAssets +import jp.co.soramitsu.iroha2.generated.QueryWithFilterOfFindAssetsDefinitions +import jp.co.soramitsu.iroha2.generated.QueryWithFilterOfFindBlocks +import jp.co.soramitsu.iroha2.generated.QueryWithFilterOfFindDomains +import jp.co.soramitsu.iroha2.generated.QueryWithFilterOfFindPeers +import jp.co.soramitsu.iroha2.generated.QueryWithFilterOfFindPermissionsByAccountId +import jp.co.soramitsu.iroha2.generated.QueryWithFilterOfFindRoles +import jp.co.soramitsu.iroha2.generated.QueryWithFilterOfFindRolesByAccountId +import jp.co.soramitsu.iroha2.generated.QueryWithFilterOfFindTransactions +import jp.co.soramitsu.iroha2.generated.QueryWithFilterOfFindTriggers +import jp.co.soramitsu.iroha2.generated.RoleIdProjectionOfSelectorMarker +import jp.co.soramitsu.iroha2.generated.RoleProjectionOfSelectorMarker +import jp.co.soramitsu.iroha2.generated.SelectorTupleOfAccount +import jp.co.soramitsu.iroha2.generated.SelectorTupleOfAsset +import jp.co.soramitsu.iroha2.generated.SelectorTupleOfAssetDefinition +import jp.co.soramitsu.iroha2.generated.SelectorTupleOfCommittedTransaction +import jp.co.soramitsu.iroha2.generated.SelectorTupleOfDomain +import jp.co.soramitsu.iroha2.generated.SelectorTupleOfPeerId +import jp.co.soramitsu.iroha2.generated.SelectorTupleOfPermission +import jp.co.soramitsu.iroha2.generated.SelectorTupleOfRole +import jp.co.soramitsu.iroha2.generated.SelectorTupleOfRoleId +import jp.co.soramitsu.iroha2.generated.SelectorTupleOfSignedBlock +import jp.co.soramitsu.iroha2.generated.SelectorTupleOfTrigger +import jp.co.soramitsu.iroha2.generated.SelectorTupleOfTriggerId +import jp.co.soramitsu.iroha2.generated.SignedBlockProjectionOfSelectorMarker +import jp.co.soramitsu.iroha2.generated.SingularQueryBox +import jp.co.soramitsu.iroha2.generated.TriggerIdProjectionOfSelectorMarker +import jp.co.soramitsu.iroha2.generated.TriggerProjectionOfSelectorMarker /** * Queries are sent to an Iroha peer and prompt a response with details from the current world state view. */ object Queries { - - /** - * Find all accounts registered globally in the blockchain - */ - fun findAllAccounts() = QueryBox.FindAllAccounts(FindAllAccounts()) - /** - * Return the full account information corresponding to the given [AccountId] + * Return all peers (peers are identified by their public key) */ - fun findAccountById(accountId: AccountId) = QueryBox.FindAccountById(FindAccountById(accountId)) + fun findPeers(predicate: CompoundPredicateOfPeerId? = null) = + QueryBox.FindPeers( + QueryWithFilterOfFindPeers( + FindPeers(), + predicate ?: CompoundPredicateOfPeerId.And(emptyList()), + SelectorTupleOfPeerId( + listOf( + PeerIdProjectionOfSelectorMarker.Atom(), + ), + ), + ), + ) /** - * Return the value keyed by the provided [Name] for the given [AccountId] + * Return all domains */ - fun findAccountKeyValueByIdAndKey(accountId: AccountId, key: Name) = QueryBox.FindAccountKeyValueByIdAndKey( - FindAccountKeyValueByIdAndKey(accountId, key), - ) - - /** - * Return all the accounts that belong to a specific domain [DomainId] - */ - fun findAccountsByDomainId(domainId: DomainId) = QueryBox.FindAccountsByDomainId( - FindAccountsByDomainId(domainId), - ) - - /** - * Return all the accounts that belong to a specific asset definition [AssetDefinitionId] - */ - fun findAccountsWithAsset(definitionId: AssetDefinitionId) = QueryBox.FindAccountsWithAsset( - FindAccountsWithAsset(definitionId), - ) - - /** - * Return the values of all known assets - */ - fun findAllAssets() = QueryBox.FindAllAssets(FindAllAssets()) - - /** - * Return the aggregated data about the [AssetId] usage across the network - */ - fun findAssetById(assetId: AssetId) = QueryBox.FindAssetById(FindAssetById(assetId)) - - /** - * Return all the assets that are registered in the given domain [DomainId] - */ - fun findAssetsByDomainId(domainId: DomainId) = QueryBox.FindAssetsByDomainId( - FindAssetsByDomainId(domainId), - ) - - /** - * Search the network for all assets that match the given [Name] - */ - fun findAssetsByName(name: Name) = QueryBox.FindAssetsByName(FindAssetsByName(name)) - - /** - * Return all the assets that belong to a given [AccountId] - */ - fun findAssetsByAccountId(accountId: AccountId) = QueryBox.FindAssetsByAccountId( - FindAssetsByAccountId(accountId), - ) - - /** - * Search for all the assets that have the given [AssetDefinitionId] - */ - fun findAssetsByAssetDefinitionId(assetDefinition: AssetDefinitionId) = QueryBox.FindAssetsByAssetDefinitionId( - FindAssetsByAssetDefinitionId(assetDefinition), - ) - - /** - * Search the domain with the [DomainId] for assets that have the given [AssetDefinitionId] - */ - fun findAssetsByDomainIdAndAssetDefinitionId( - domainId: DomainId, - assetDefinition: AssetDefinitionId, - ) = QueryBox.FindAssetsByDomainIdAndAssetDefinitionId( - FindAssetsByDomainIdAndAssetDefinitionId( - domainId, - assetDefinition, - ), - ) + fun findDomains(predicate: CompoundPredicateOfDomain? = null) = + QueryBox.FindDomains( + QueryWithFilterOfFindDomains( + FindDomains(), + predicate ?: CompoundPredicateOfDomain.And(emptyList()), + SelectorTupleOfDomain(listOf(DomainProjectionOfSelectorMarker.Atom())), + ), + ) /** * Return the values of all known asset definitions */ - fun findAllAssetsDefinitions() = QueryBox.FindAllAssetsDefinitions(FindAllAssetsDefinitions()) + fun findAssetsDefinitions(predicate: CompoundPredicateOfAssetDefinition? = null) = + QueryBox.FindAssetsDefinitions( + QueryWithFilterOfFindAssetsDefinitions( + FindAssetsDefinitions(), + predicate ?: CompoundPredicateOfAssetDefinition.And(emptyList()), + SelectorTupleOfAssetDefinition(listOf(AssetDefinitionProjectionOfSelectorMarker.Atom())), + ), + ) /** - * Return the asset quantity for the given asset with [AssetId] + * Return all accounts */ - fun findAssetQuantityById(assetId: AssetId) = QueryBox.FindAssetQuantityById( - FindAssetQuantityById(assetId), - ) + fun findAccounts(predicate: CompoundPredicateOfAccount? = null) = + QueryBox.FindAccounts( + QueryWithFilterOfFindAccounts( + FindAccounts(), + predicate ?: CompoundPredicateOfAccount.And(emptyList()), + SelectorTupleOfAccount(listOf(AccountProjectionOfSelectorMarker.Atom())), + ), + ) /** - * Return the asset quantity for the given asset with [AssetDefinitionId] + * Return all accounts that contain an asset of the given definition */ - fun findTotalAssetQuantityByAssetDefinitionId( + fun findAccountsWithAsset( definitionId: AssetDefinitionId, - ) = QueryBox.FindTotalAssetQuantityByAssetDefinitionId( - FindTotalAssetQuantityByAssetDefinitionId(definitionId), - ) - - /** - * Return the value keyed by the given [Name] in the metadata of the asset corresponding to the given [AssetId] - */ - fun findAssetKeyValueByIdAndKey(assetId: AssetId, key: Name) = QueryBox.FindAssetKeyValueByIdAndKey( - FindAssetKeyValueByIdAndKey(assetId, key), - ) - - /** - * Return the value keyed by the given [Name] - * in the metadata of the asset definition corresponding to the given [AssetDefinitionId] - */ - fun findAssetDefinitionKeyValueByIdAndKey( - assetDefinition: AssetDefinitionId, - key: Name, - ) = QueryBox.FindAssetDefinitionKeyValueByIdAndKey( - FindAssetDefinitionKeyValueByIdAndKey( - assetDefinition, - key, + predicate: CompoundPredicateOfAccount? = null, + ) = QueryBox.FindAccountsWithAsset( + QueryWithFilterOfFindAccountsWithAsset( + FindAccountsWithAsset(definitionId), + predicate ?: CompoundPredicateOfAccount.And(emptyList()), + SelectorTupleOfAccount(listOf(AccountProjectionOfSelectorMarker.Atom())), ), ) /** - * Return the asset definition corresponding to the given [AssetDefinitionId] - */ - fun findAssetDefinitionById(definitionId: AssetDefinitionId) = QueryBox.FindAssetDefinitionById( - FindAssetDefinitionById(definitionId), - ) - - /** - * Return all known registered domains + * Return the all assets */ - fun findAllDomains() = QueryBox.FindAllDomains(FindAllDomains()) - - /** - * Return the domain corresponding to the given [DomainId] - */ - fun findDomainById(domainId: DomainId) = QueryBox.FindDomainById(FindDomainById(domainId)) - - /** - * Return all known peers identified by their key and accompanied by the address of their API endpoint - */ - fun findAllPeers() = QueryBox.FindAllPeers(FindAllPeers()) - - /** - * Return the full set of transactions that an account with [AccountId] has submitted throughout the existence of the blockchain - */ - fun findTransactionsByAccountId(accountId: AccountId) = QueryBox.FindTransactionsByAccountId( - FindTransactionsByAccountId(accountId), - ) + fun findAssets(predicate: CompoundPredicateOfAsset? = null) = + QueryBox.FindAssets( + QueryWithFilterOfFindAssets( + FindAssets(), + predicate ?: CompoundPredicateOfAsset.And(emptyList()), + SelectorTupleOfAsset(listOf(AssetProjectionOfSelectorMarker.Atom())), + ), + ) /** * Return all the permission tokens granted to the specified [AccountId] */ - fun findPermissionsByAccountId(accountId: AccountId) = QueryBox.FindPermissionsByAccountId( - FindPermissionsByAccountId(accountId), - ) - - /** - * Return executor data model - */ - fun findExecutorDataModel() = QueryBox.FindExecutorDataModel( - FindExecutorDataModel(), + fun findPermissionsByAccountId( + accountId: AccountId, + predicate: CompoundPredicateOfPermission? = null, + ) = QueryBox.FindPermissionsByAccountId( + QueryWithFilterOfFindPermissionsByAccountId( + FindPermissionsByAccountId(accountId), + predicate ?: CompoundPredicateOfPermission.And(emptyList()), + SelectorTupleOfPermission( + listOf( + PermissionProjectionOfSelectorMarker.Atom(), + ), + ), + ), ) /** - * Return the transaction by [Hash] + * Return the full set of roles */ - fun findTransactionByHash(hash: Hash) = QueryBox.FindTransactionByHash( - FindTransactionByHash(HashOf(hash)), - ) + fun findRoles(predicate: CompoundPredicateOfRole? = null) = + QueryBox.FindRoles( + QueryWithFilterOfFindRoles( + FindRoles(), + predicate ?: CompoundPredicateOfRole.And(emptyList()), + SelectorTupleOfRole(listOf(RoleProjectionOfSelectorMarker.Atom())), + ), + ) /** * Return all the role IDs that are attached to the given [AccountId] */ - fun findRolesByAccountId(accountId: AccountId) = QueryBox.FindRolesByAccountId( - FindRolesByAccountId(accountId), - ) - - /** - * Return all roles - */ - fun findAllRoles() = QueryBox.FindAllRoles(FindAllRoles()) - - /** - * Return the role by [RoleId] - */ - fun findRoleByRoleId(roleId: RoleId) = QueryBox.FindRoleByRoleId(FindRoleByRoleId(roleId)) - - /** - * Return all role IDs - */ - fun findAllRoleIds() = QueryBox.FindAllRoleIds(FindAllRoleIds()) - - /** - * Return the value keyed by the given [Name] in the domain corresponding to the given [DomainId] - */ - fun findDomainKeyValueByIdAndKey(id: DomainId, key: Name) = QueryBox.FindDomainKeyValueByIdAndKey( - FindDomainKeyValueByIdAndKey(id, key), - ) - - /** - * Return the value corresponding to the given key [Name] in the metadata of the trigger with the given [TriggerId] - */ - fun findTriggerKeyValueByIdAndKey(id: TriggerId, key: Name) = QueryBox.FindTriggerKeyValueByIdAndKey( - FindTriggerKeyValueByIdAndKey(id, key), + fun findRolesByAccountId( + accountId: AccountId, + predicate: CompoundPredicateOfRoleId? = null, + ) = QueryBox.FindRolesByAccountId( + QueryWithFilterOfFindRolesByAccountId( + FindRolesByAccountId(accountId), + predicate ?: CompoundPredicateOfRoleId.And(emptyList()), + SelectorTupleOfRoleId(listOf(RoleIdProjectionOfSelectorMarker.Atom())), + ), ) /** - * Return the trigger with the given [TriggerId] + * Return all currently triggers */ - fun findTriggerById(id: TriggerId) = QueryBox.FindTriggerById(FindTriggerById(id)) + fun findTriggers(predicate: CompoundPredicateOfTrigger? = null) = + QueryBox.FindTriggers( + QueryWithFilterOfFindTriggers( + FindTriggers(), + predicate ?: CompoundPredicateOfTrigger.And(emptyList()), + SelectorTupleOfTrigger(listOf(TriggerProjectionOfSelectorMarker.Atom())), + ), + ) /** - * Return all currently active triggers, that have not expired at the time of the query + * Return all active trigger IDs */ - fun findAllActiveTriggerIds() = QueryBox.FindAllActiveTriggerIds(FindAllActiveTriggerIds()) + fun findActiveTriggerIds(predicate: CompoundPredicateOfTriggerId? = null) = + QueryBox.FindActiveTriggerIds( + QueryWithFilterOfFindActiveTriggerIds( + FindActiveTriggerIds(), + predicate ?: CompoundPredicateOfTriggerId.And(emptyList()), + SelectorTupleOfTriggerId(listOf(TriggerIdProjectionOfSelectorMarker.Atom())), + ), + ) /** - * Return a trigger with the given [AccountId] + * Return the full set of transactions */ - fun findTriggersByAuthorityId(id: AccountId) = QueryBox.FindTriggersByAuthorityId( - FindTriggersByAuthorityId(id), - ) - - /** - * Return all currently triggers with the given [DomainId] - */ - fun findTriggersByAuthorityDomainId(domainId: DomainId) = QueryBox.FindTriggersByAuthorityDomainId( - FindTriggersByAuthorityDomainId(domainId), - ) + fun findTransactions(predicate: CompoundPredicateOfCommittedTransaction? = null) = + QueryBox.FindTransactions( + QueryWithFilterOfFindTransactions( + FindTransactions(), + predicate ?: CompoundPredicateOfCommittedTransaction.And(emptyList()), + SelectorTupleOfCommittedTransaction( + listOf( + CommittedTransactionProjectionOfSelectorMarker.Atom(), + ), + ), + ), + ) /** * Return all blocks */ - fun findAllBlocks() = QueryBox.FindAllBlocks(FindAllBlocks()) - - /** - * Return all block headers - */ - fun findAllBlockHeaders() = QueryBox.FindAllBlockHeaders(FindAllBlockHeaders()) - - /** - * Return the block header corresponding to the given [Hash] - */ - fun findBlockHeaderByHash(hash: Hash) = QueryBox.FindBlockHeaderByHash( - FindBlockHeaderByHash(HashOf(hash)), - ) + fun findBlocks(predicate: CompoundPredicateOfSignedBlock? = null) = + QueryBox.FindBlocks( + QueryWithFilterOfFindBlocks( + FindBlocks(), + predicate ?: CompoundPredicateOfSignedBlock.And(emptyList()), + SelectorTupleOfSignedBlock(listOf(SignedBlockProjectionOfSelectorMarker.Atom())), + ), + ) /** - * Return all transactions + * Return current executor data model */ - fun findAllTransactions() = QueryBox.FindAllTransactions(FindAllTransactions()) + fun findExecutorDataModel() = + SingularQueryBox.FindExecutorDataModel( + FindExecutorDataModel(), + ) /** - * Return all parameters + * Return current parameter values (including custom) */ - fun findAllParameters() = QueryBox.FindAllParameters(FindAllParameters()) + fun findParameters() = + SingularQueryBox.FindParameters( + FindParameters(), + ) } diff --git a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/query/QueryBuilder.kt b/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/query/QueryBuilder.kt index a3a471647..cebb2c055 100644 --- a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/query/QueryBuilder.kt +++ b/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/query/QueryBuilder.kt @@ -1,448 +1,345 @@ package jp.co.soramitsu.iroha2.query -import jp.co.soramitsu.iroha2.AccountExtractor +import jp.co.soramitsu.iroha2.AccountOrNullExtractor import jp.co.soramitsu.iroha2.AccountsExtractor -import jp.co.soramitsu.iroha2.AssetDefinitionExtractor +import jp.co.soramitsu.iroha2.AssetDefinitionOrNullExtractor import jp.co.soramitsu.iroha2.AssetDefinitionsExtractor -import jp.co.soramitsu.iroha2.AssetExtractor +import jp.co.soramitsu.iroha2.AssetOrNullExtractor import jp.co.soramitsu.iroha2.AssetsExtractor -import jp.co.soramitsu.iroha2.BlockHeaderExtractor -import jp.co.soramitsu.iroha2.BlockHeadersExtractor import jp.co.soramitsu.iroha2.BlocksValueExtractor -import jp.co.soramitsu.iroha2.DomainExtractor +import jp.co.soramitsu.iroha2.DomainOrNullExtractor import jp.co.soramitsu.iroha2.DomainsExtractor -import jp.co.soramitsu.iroha2.ExecutorDataModelExtractor -import jp.co.soramitsu.iroha2.NumericExtractor import jp.co.soramitsu.iroha2.PeersExtractor import jp.co.soramitsu.iroha2.PermissionTokensExtractor import jp.co.soramitsu.iroha2.ResultExtractor -import jp.co.soramitsu.iroha2.RoleExtractor import jp.co.soramitsu.iroha2.RoleIdsExtractor import jp.co.soramitsu.iroha2.RolesExtractor -import jp.co.soramitsu.iroha2.StringExtractor -import jp.co.soramitsu.iroha2.TransactionValueExtractor -import jp.co.soramitsu.iroha2.TransactionValuesExtractor -import jp.co.soramitsu.iroha2.TriggerBoxExtractor -import jp.co.soramitsu.iroha2.TriggerBoxesExtractor +import jp.co.soramitsu.iroha2.TransactionsExtractor import jp.co.soramitsu.iroha2.TriggerIdsExtractor +import jp.co.soramitsu.iroha2.TriggerOrNullExtractor +import jp.co.soramitsu.iroha2.TriggersExtractor import jp.co.soramitsu.iroha2.asName import jp.co.soramitsu.iroha2.asSignatureOf -import jp.co.soramitsu.iroha2.fromHex +import jp.co.soramitsu.iroha2.generated.Account import jp.co.soramitsu.iroha2.generated.AccountId +import jp.co.soramitsu.iroha2.generated.AccountIdPredicateAtom +import jp.co.soramitsu.iroha2.generated.AccountIdProjectionOfPredicateMarker +import jp.co.soramitsu.iroha2.generated.AccountProjectionOfPredicateMarker +import jp.co.soramitsu.iroha2.generated.Asset +import jp.co.soramitsu.iroha2.generated.AssetDefinition import jp.co.soramitsu.iroha2.generated.AssetDefinitionId +import jp.co.soramitsu.iroha2.generated.AssetDefinitionIdPredicateAtom +import jp.co.soramitsu.iroha2.generated.AssetDefinitionIdProjectionOfPredicateMarker +import jp.co.soramitsu.iroha2.generated.AssetDefinitionProjectionOfPredicateMarker import jp.co.soramitsu.iroha2.generated.AssetId -import jp.co.soramitsu.iroha2.generated.ClientQueryPayload +import jp.co.soramitsu.iroha2.generated.AssetIdPredicateAtom +import jp.co.soramitsu.iroha2.generated.AssetIdProjectionOfPredicateMarker +import jp.co.soramitsu.iroha2.generated.AssetProjectionOfPredicateMarker +import jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAccount +import jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAsset +import jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAssetDefinition +import jp.co.soramitsu.iroha2.generated.CompoundPredicateOfCommittedTransaction +import jp.co.soramitsu.iroha2.generated.CompoundPredicateOfDomain +import jp.co.soramitsu.iroha2.generated.CompoundPredicateOfPeerId +import jp.co.soramitsu.iroha2.generated.CompoundPredicateOfPermission +import jp.co.soramitsu.iroha2.generated.CompoundPredicateOfRole +import jp.co.soramitsu.iroha2.generated.CompoundPredicateOfRoleId +import jp.co.soramitsu.iroha2.generated.CompoundPredicateOfSignedBlock +import jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTrigger +import jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTriggerId +import jp.co.soramitsu.iroha2.generated.Domain import jp.co.soramitsu.iroha2.generated.DomainId +import jp.co.soramitsu.iroha2.generated.DomainIdPredicateAtom +import jp.co.soramitsu.iroha2.generated.DomainIdProjectionOfPredicateMarker +import jp.co.soramitsu.iroha2.generated.DomainProjectionOfPredicateMarker import jp.co.soramitsu.iroha2.generated.FetchSize -import jp.co.soramitsu.iroha2.generated.GenericPredicateBox -import jp.co.soramitsu.iroha2.generated.Hash import jp.co.soramitsu.iroha2.generated.Name -import jp.co.soramitsu.iroha2.generated.NonZeroOfu32 import jp.co.soramitsu.iroha2.generated.NonZeroOfu64 import jp.co.soramitsu.iroha2.generated.Pagination -import jp.co.soramitsu.iroha2.generated.PublicKey import jp.co.soramitsu.iroha2.generated.QueryBox -import jp.co.soramitsu.iroha2.generated.QueryOutputPredicate +import jp.co.soramitsu.iroha2.generated.QueryParams +import jp.co.soramitsu.iroha2.generated.QueryRequest +import jp.co.soramitsu.iroha2.generated.QueryRequestWithAuthority import jp.co.soramitsu.iroha2.generated.QuerySignature -import jp.co.soramitsu.iroha2.generated.RoleId +import jp.co.soramitsu.iroha2.generated.QueryWithParams import jp.co.soramitsu.iroha2.generated.Signature import jp.co.soramitsu.iroha2.generated.SignedQuery import jp.co.soramitsu.iroha2.generated.SignedQueryV1 import jp.co.soramitsu.iroha2.generated.Sorting +import jp.co.soramitsu.iroha2.generated.Trigger import jp.co.soramitsu.iroha2.generated.TriggerId -import jp.co.soramitsu.iroha2.hash -import jp.co.soramitsu.iroha2.sign -import jp.co.soramitsu.iroha2.toIrohaHash +import jp.co.soramitsu.iroha2.generated.TriggerIdPredicateAtom +import jp.co.soramitsu.iroha2.generated.TriggerIdProjectionOfPredicateMarker +import jp.co.soramitsu.iroha2.generated.TriggerProjectionOfPredicateMarker +import jp.co.soramitsu.iroha2.signAs import java.math.BigInteger import java.security.KeyPair class QueryBuilder( - private val query: QueryBox, - private val resultExtractor: ResultExtractor, - private val queryFilter: GenericPredicateBox? = null, + val query: QueryBox, + val extractor: ResultExtractor, ) { - private var accountId: AccountId? = null private var sorting: Sorting? = null private var pagination: Pagination? = null private var fetchSize: FetchSize? = null - fun account(accountId: AccountId) = this.apply { this.accountId = accountId } - - fun account(signatory: PublicKey, domainId: DomainId) = this.account(AccountId(domainId, signatory)) - - fun sorting(key: String) = this.apply { - this.sorting = Sorting(key.asName()) + fun sorting(key: String) = + this.apply { + this.sorting = Sorting(key.asName()) + } + + fun sorting(key: Name) = + this.apply { + this.sorting = Sorting(key) + } + + fun pagination( + limit: BigInteger? = null, + offset: BigInteger? = null, + ) = this.apply { + this.pagination = Pagination(limit?.let { NonZeroOfu64(limit) }, offset ?: BigInteger.ZERO) } - fun sorting(key: Name) = this.apply { - this.sorting = Sorting(key) - } - - fun pagination(limit: Long? = null, start: BigInteger? = null) = this.apply { - this.pagination = Pagination(limit?.let { NonZeroOfu32(limit) }, start?.let { NonZeroOfu64(start) }) - } - - fun fetchSize(value: Long) = this.apply { - this.fetchSize = FetchSize(NonZeroOfu32(value)) - } - - fun buildSigned(keyPair: KeyPair): QueryAndExtractor { - val filter = queryFilter ?: GenericPredicateBox.Raw(QueryOutputPredicate.Pass()) - val payload = ClientQueryPayload( - checkNotNull(accountId) { "Account ID of the sender is mandatory" }, - query, - filter, - sorting ?: Sorting(null), - this.pagination ?: Pagination(null, null), - this.fetchSize ?: FetchSize(null), - ) - val encodedPayload = ClientQueryPayload.encode(payload) - val signature = QuerySignature(Signature(keyPair.private.sign(encodedPayload)).asSignatureOf()) + fun fetchSize(value: BigInteger) = + this.apply { + this.fetchSize = FetchSize(NonZeroOfu64(value)) + } + + fun signAs( + accountId: AccountId, + keyPair: KeyPair, + ): QueryAndExtractor { + val request = + QueryRequest.Start( + QueryWithParams( + query, + QueryParams( + this.pagination ?: Pagination(null, BigInteger.ZERO), + this.sorting ?: Sorting(null), + this.fetchSize ?: FetchSize(null), + ), + ), + ) + val payload = + QueryRequestWithAuthority( + accountId, + request, + ) + val encodedPayload = QueryRequestWithAuthority.encode(payload) + val signature = QuerySignature(Signature(keyPair.private.signAs(encodedPayload)).asSignatureOf()) val query = SignedQuery.V1(SignedQueryV1(signature, payload)) - return QueryAndExtractor(query, resultExtractor) + return QueryAndExtractor(query, extractor) } companion object { @JvmStatic - @JvmOverloads - fun findAllAccounts(queryFilter: GenericPredicateBox? = null) = QueryBuilder( - Queries.findAllAccounts(), - AccountsExtractor, - queryFilter, - ) - - @JvmStatic - fun findAccountKeyValueByIdAndKey(accountId: AccountId, key: Name) = QueryBuilder( - Queries.findAccountKeyValueByIdAndKey(accountId, key), - StringExtractor, - ) - - @JvmStatic - fun findAccountKeyValueByIdAndKey( - accountId: AccountId, - key: String, - ) = findAccountKeyValueByIdAndKey(accountId, key.asName()) - - @JvmStatic - @JvmOverloads - fun findAccountsByDomainId( - domainId: DomainId, - queryFilter: GenericPredicateBox? = null, - ) = QueryBuilder(Queries.findAccountsByDomainId(domainId), AccountsExtractor, queryFilter) - - @JvmStatic - @JvmOverloads - fun findAccountsWithAsset( - definitionId: AssetDefinitionId, - queryFilter: GenericPredicateBox? = null, - ) = QueryBuilder(Queries.findAccountsWithAsset(definitionId), AccountsExtractor, queryFilter) - - @JvmStatic - @JvmOverloads - fun findAllAssets(queryFilter: GenericPredicateBox? = null) = QueryBuilder( - Queries.findAllAssets(), - AssetsExtractor, - queryFilter, - ) - - @JvmStatic - @JvmOverloads - fun findAllAssetsDefinitions( - queryFilter: GenericPredicateBox? = null, - ) = QueryBuilder( - Queries.findAllAssetsDefinitions(), - AssetDefinitionsExtractor, - queryFilter, - ) - - @JvmStatic - @JvmOverloads - fun findAssetsByName( - name: Name, - queryFilter: GenericPredicateBox? = null, - ) = QueryBuilder( - Queries.findAssetsByName(name), - AssetsExtractor, - queryFilter, - ) - - @JvmStatic - @JvmOverloads - fun findAssetsByAccountId( - accountId: AccountId, - queryFilter: GenericPredicateBox? = null, - ) = QueryBuilder( - Queries.findAssetsByAccountId(accountId), - AssetsExtractor, - queryFilter, - ) + fun findPeers(predicate: CompoundPredicateOfPeerId? = null) = + QueryBuilder( + Queries.findPeers(predicate), + PeersExtractor, + ) + /** + * Return all domains + */ @JvmStatic - fun findAccountById(accountId: AccountId) = QueryBuilder(Queries.findAccountById(accountId), AccountExtractor) + fun findDomains(predicate: CompoundPredicateOfDomain? = null) = + QueryBuilder( + Queries.findDomains( + predicate, + ), + DomainsExtractor, + ) - @JvmStatic - fun findAssetById(assetId: AssetId) = QueryBuilder(Queries.findAssetById(assetId), AssetExtractor) + /** + * Return domain with the given id + */ + @JvmStatic + fun findDomainById(domainId: DomainId): QueryBuilder { + val byDomainIdFilter = + CompoundPredicateOfDomain.Atom( + DomainProjectionOfPredicateMarker.Id( + DomainIdProjectionOfPredicateMarker.Atom( + DomainIdPredicateAtom.Equals(domainId), + ), + ), + ) + return QueryBuilder( + Queries.findDomains(byDomainIdFilter), + DomainOrNullExtractor, + ) + } @JvmStatic - @JvmOverloads - fun findAssetsByDomainId( - domainId: DomainId, - queryFilter: GenericPredicateBox? = null, - ) = QueryBuilder( - Queries.findAssetsByDomainId(domainId), - AssetsExtractor, - queryFilter, - ) + fun findAssetsDefinitions(predicate: CompoundPredicateOfAssetDefinition? = null) = + QueryBuilder( + Queries.findAssetsDefinitions(predicate), + AssetDefinitionsExtractor, + ) @JvmStatic - fun findAssetsByAssetDefinitionId(assetDefinition: AssetDefinitionId) = QueryBuilder( - Queries.findAssetsByAssetDefinitionId(assetDefinition), - AssetsExtractor, - ) + fun findAssetDefinitionById(assetDefinitionId: AssetDefinitionId): QueryBuilder { + val byAssetDefinitionIdFilter = + CompoundPredicateOfAssetDefinition.Atom( + AssetDefinitionProjectionOfPredicateMarker.Id( + AssetDefinitionIdProjectionOfPredicateMarker.Atom( + AssetDefinitionIdPredicateAtom.Equals(assetDefinitionId), + ), + ), + ) + return QueryBuilder( + Queries.findAssetsDefinitions(byAssetDefinitionIdFilter), + AssetDefinitionOrNullExtractor, + ) + } + /** + * Return the values of all known accounts + */ @JvmStatic - @JvmOverloads - fun findAllAssetsDefinitions( - assetDefinition: AssetDefinitionId, - queryFilter: GenericPredicateBox? = null, - ) = QueryBuilder( - Queries.findAssetsByAssetDefinitionId(assetDefinition), - AssetDefinitionsExtractor, - queryFilter, - ) + fun findAccounts(predicate: CompoundPredicateOfAccount? = null) = + QueryBuilder( + Queries.findAccounts(predicate), + AccountsExtractor, + ) @JvmStatic - @JvmOverloads - fun findAssetsByDomainIdAndAssetDefinitionId( - domainId: DomainId, - assetDefinition: AssetDefinitionId, - queryFilter: GenericPredicateBox? = null, + fun findAccountsWithAsset( + definitionId: AssetDefinitionId, + predicate: CompoundPredicateOfAccount? = null, ) = QueryBuilder( - Queries.findAssetsByDomainIdAndAssetDefinitionId(domainId, assetDefinition), - AssetsExtractor, - queryFilter, - ) - - @JvmStatic - fun findAssetQuantityById(assetId: AssetId) = QueryBuilder( - Queries.findAssetQuantityById(assetId), - NumericExtractor, - ) - - @JvmStatic - fun findTotalAssetQuantityByAssetDefinitionId(definitionId: AssetDefinitionId) = QueryBuilder( - Queries.findTotalAssetQuantityByAssetDefinitionId(definitionId), - NumericExtractor, - ) - - @JvmStatic - fun findAssetKeyValueByIdAndKey(assetId: AssetId, key: Name) = QueryBuilder( - Queries.findAssetKeyValueByIdAndKey(assetId, key), - StringExtractor, - ) - - @JvmStatic - fun findAssetKeyValueByIdAndKey( - assetId: AssetId, - key: String, - ) = findAssetKeyValueByIdAndKey(assetId, key.asName()) - - @JvmStatic - fun findAssetDefinitionKeyValueByIdAndKey(id: AssetDefinitionId, key: Name) = QueryBuilder( - Queries.findAssetDefinitionKeyValueByIdAndKey(id, key), - StringExtractor, + Queries.findAccountsWithAsset( + definitionId, + predicate, + ), + AccountsExtractor, ) @JvmStatic - fun findAssetDefinitionKeyValueByIdAndKey( - id: AssetDefinitionId, - key: String, - ) = findAssetDefinitionKeyValueByIdAndKey(id, key.asName()) + fun findAccountById(accountId: AccountId): QueryBuilder { + val byAccountIdFilter = + CompoundPredicateOfAccount.Atom( + AccountProjectionOfPredicateMarker.Id( + AccountIdProjectionOfPredicateMarker.Atom( + AccountIdPredicateAtom.Equals(accountId), + ), + ), + ) - @JvmStatic - fun findDomainKeyValueByIdAndKey(id: DomainId, key: String) = findDomainKeyValueByIdAndKey(id, key.asName()) + return QueryBuilder(Queries.findAccounts(byAccountIdFilter), AccountOrNullExtractor) + } @JvmStatic - fun findDomainKeyValueByIdAndKey(id: DomainId, key: Name) = QueryBuilder( - Queries.findDomainKeyValueByIdAndKey(id, key), - StringExtractor, - ) - - @JvmStatic - @JvmOverloads - fun findAllDomains( - queryFilter: GenericPredicateBox? = null, - ) = QueryBuilder(Queries.findAllDomains(), DomainsExtractor, queryFilter) - - @JvmStatic - fun findDomainById(domainId: DomainId) = QueryBuilder(Queries.findDomainById(domainId), DomainExtractor) + fun findAssets(predicate: CompoundPredicateOfAsset? = null) = + QueryBuilder( + Queries.findAssets(predicate), + AssetsExtractor, + ) @JvmStatic - @JvmOverloads - fun findAllPeers(queryFilter: GenericPredicateBox? = null) = - QueryBuilder(Queries.findAllPeers(), PeersExtractor, queryFilter) + fun findAssetById(assetId: AssetId): QueryBuilder { + val byAssetIdFilter = + CompoundPredicateOfAsset.Atom( + AssetProjectionOfPredicateMarker.Id( + AssetIdProjectionOfPredicateMarker.Atom( + AssetIdPredicateAtom.Equals(assetId), + ), + ), + ) - @JvmStatic - fun findTransactionsByAccountId( - accountId: AccountId, - queryFilter: GenericPredicateBox? = null, - ) = QueryBuilder( - Queries.findTransactionsByAccountId(accountId), - TransactionValuesExtractor, - queryFilter, - ) + return QueryBuilder(Queries.findAssets(byAssetIdFilter), AssetOrNullExtractor) + } @JvmStatic - @JvmOverloads fun findPermissionsByAccountId( accountId: AccountId, - queryFilter: GenericPredicateBox? = null, + predicate: CompoundPredicateOfPermission? = null, ) = QueryBuilder( - Queries.findPermissionsByAccountId(accountId), + Queries.findPermissionsByAccountId( + accountId, + predicate, + ), PermissionTokensExtractor, - queryFilter, ) @JvmStatic - fun findExecutorDataModel( - queryFilter: GenericPredicateBox? = null, - ) = QueryBuilder( - Queries.findExecutorDataModel(), - ExecutorDataModelExtractor, - queryFilter, - ) + fun findRoles(predicate: CompoundPredicateOfRole? = null) = + QueryBuilder( + Queries.findRoles(predicate ?: CompoundPredicateOfRole.And(emptyList())), + RolesExtractor, + ) @JvmStatic - @JvmOverloads - fun findRolesByAccountId(accountId: AccountId, queryFilter: GenericPredicateBox? = null) = + fun findRoleById(predicate: CompoundPredicateOfRole? = null) = QueryBuilder( - Queries.findRolesByAccountId(accountId), + Queries.findRoles(predicate ?: CompoundPredicateOfRole.And(emptyList())), RoleIdsExtractor, - queryFilter, ) @JvmStatic - @JvmOverloads - fun findAllRoleIds(queryFilter: GenericPredicateBox? = null) = QueryBuilder( - Queries.findAllRoleIds(), + fun findRolesByAccountId( + accountId: AccountId, + predicate: CompoundPredicateOfRoleId? = null, + ) = QueryBuilder( + Queries.findRolesByAccountId( + accountId, + predicate, + ), RoleIdsExtractor, - queryFilter, ) @JvmStatic - @JvmOverloads - fun findAllRoles(queryFilter: GenericPredicateBox? = null) = QueryBuilder( - Queries.findAllRoles(), - RolesExtractor, - queryFilter, - ) - - @JvmStatic - @JvmOverloads - fun findRoleByRoleId(roleId: RoleId, queryFilter: GenericPredicateBox? = null) = + fun findTriggers(predicate: CompoundPredicateOfTrigger? = null) = QueryBuilder( - Queries.findRoleByRoleId(roleId), - RoleExtractor, - queryFilter, + Queries.findTriggers( + predicate, + ), + TriggersExtractor, ) @JvmStatic - fun findTransactionByHash(hash: Hash) = QueryBuilder( - Queries.findTransactionByHash(hash), - TransactionValueExtractor, - ) - - @JvmStatic - fun findTransactionByHash(bytes: ByteArray) = findTransactionByHash(bytes.toIrohaHash()) - - @JvmStatic - fun findTransactionByHash(hex: String) = findTransactionByHash(hex.fromHex().hash().toIrohaHash()) - - @JvmStatic - fun findAllTransactions(queryFilter: GenericPredicateBox? = null) = QueryBuilder( - Queries.findAllTransactions(), - TransactionValuesExtractor, - queryFilter, - ) - - @JvmStatic - @JvmOverloads - fun findAllBlocks(queryFilter: GenericPredicateBox? = null) = QueryBuilder( - Queries.findAllBlocks(), - BlocksValueExtractor, - queryFilter, - ) - - @JvmStatic - @JvmOverloads - fun findAllBlockHeaders(queryFilter: GenericPredicateBox? = null) = QueryBuilder( - Queries.findAllBlockHeaders(), - BlockHeadersExtractor, - queryFilter, - ) - - @JvmStatic - fun findBlockHeaderByHash(hash: Hash) = QueryBuilder( - Queries.findBlockHeaderByHash(hash), - BlockHeaderExtractor, - ) - - @JvmStatic - fun findAssetDefinitionById(definitionId: AssetDefinitionId) = QueryBuilder( - Queries.findAssetDefinitionById(definitionId), - AssetDefinitionExtractor, - ) - - @JvmStatic - fun findTriggerById(id: TriggerId) = QueryBuilder( - Queries.findTriggerById(id), - TriggerBoxExtractor, - ) - - @JvmStatic - fun findTriggerKeyValueByIdAndKey(id: TriggerId, key: Name) = QueryBuilder( - Queries.findTriggerKeyValueByIdAndKey(id, key), - StringExtractor, - ) - - @JvmStatic - @JvmOverloads - fun findAllActiveTriggerIds(queryFilter: GenericPredicateBox? = null) = QueryBuilder( - Queries.findAllActiveTriggerIds(), - TriggerIdsExtractor, - queryFilter, - ) + fun findTriggerById(triggerId: TriggerId): QueryBuilder { + val byTriggerIdFilter = + CompoundPredicateOfTrigger.Atom( + TriggerProjectionOfPredicateMarker.Id( + TriggerIdProjectionOfPredicateMarker.Atom( + TriggerIdPredicateAtom.Equals(triggerId), + ), + ), + ) + return QueryBuilder( + Queries.findTriggers(byTriggerIdFilter), + TriggerOrNullExtractor, + ) + } @JvmStatic - @JvmOverloads - fun findTriggersByAuthorityId( - id: AccountId, - queryFilter: GenericPredicateBox? = null, - ) = QueryBuilder( - Queries.findTriggersByAuthorityId(id), - TriggerBoxExtractor, - queryFilter, - ) + fun findActiveTriggerIds(predicate: CompoundPredicateOfTriggerId? = null) = + QueryBuilder( + Queries.findActiveTriggerIds( + predicate, + ), + TriggerIdsExtractor, + ) @JvmStatic - @JvmOverloads - fun findTriggersByAuthorityDomainId( - domainId: DomainId, - queryFilter: GenericPredicateBox? = null, - ) = QueryBuilder( - Queries.findTriggersByAuthorityDomainId(domainId), - TriggerBoxesExtractor, - queryFilter, - ) + fun findTransactions(predicate: CompoundPredicateOfCommittedTransaction? = null) = + QueryBuilder( + Queries.findTransactions( + predicate, + ), + TransactionsExtractor, + ) @JvmStatic - @JvmOverloads - fun findAllParameters(queryFilter: GenericPredicateBox? = null) = QueryBuilder( - Queries.findAllParameters(), - StringExtractor, - queryFilter, - ) + fun findBlocks(predicate: CompoundPredicateOfSignedBlock? = null) = + QueryBuilder( + Queries.findBlocks( + predicate, + ), + BlocksValueExtractor, + ) } } @@ -451,4 +348,7 @@ class QueryBuilder( * * [R] is a type of extracted value as a result of query execution */ -class QueryAndExtractor(val query: SignedQuery, val resultExtractor: ResultExtractor) +class QueryAndExtractor( + val query: SignedQuery, + val extractor: ResultExtractor, +) diff --git a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/transaction/Instructions.kt b/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/transaction/Instructions.kt deleted file mode 100644 index 7b6134f4b..000000000 --- a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/transaction/Instructions.kt +++ /dev/null @@ -1,412 +0,0 @@ -package jp.co.soramitsu.iroha2.transaction - -import jp.co.soramitsu.iroha2.Permissions -import jp.co.soramitsu.iroha2.asJsonString -import jp.co.soramitsu.iroha2.asName -import jp.co.soramitsu.iroha2.asNumeric -import jp.co.soramitsu.iroha2.generated.* // ktlint-disable no-wildcard-imports -import java.math.BigDecimal - -/** - * Iroha Special Instructions cover all possible actions within a blockchain - * @see [Iroha2 Tutorial on Iroha Special Instructions](https://hyperledger.github.io/iroha-2-docs/guide/advanced/isi.html) - */ -object Instructions { - - /** - * Register a role that has the specified permissions - */ - fun registerRole( - roleId: RoleId, - vararg tokens: Permission, - ) = InstructionBox.Register( - RegisterBox.Role(RegisterOfRole(Role(roleId, tokens.toList()))), - ) - - /** - * Register an account - */ - @JvmOverloads - fun registerAccount( - id: AccountId, - metadata: Metadata = Metadata(mapOf()), - ) = InstructionBox.Register( - RegisterBox.Account(RegisterOfAccount(NewAccount(id, metadata))), - ) - - /** - * Register a WASM trigger - */ - fun registerTrigger( - triggerId: TriggerId, - wasm: ByteArray, - repeats: Repeats, - accountId: AccountId, - metadata: Metadata, - filter: EventFilterBox, - ) = InstructionBox.Register( - RegisterBox.Trigger( - RegisterOfTrigger( - Trigger( - triggerId, - Action(Executable.Wasm(WasmSmartContract(wasm)), repeats, accountId, filter, metadata), - ), - ), - ), - ) - - /** - * Register a instructions trigger to run after every transaction - */ - fun registerTrigger( - triggerId: TriggerId, - isi: List, - repeats: Repeats, - accountId: AccountId, - metadata: Metadata, - filter: TimeEventFilter, - ) = registerTrigger( - triggerId, - isi, - repeats, - accountId, - metadata, - EventFilterBox.Time(TimeEventFilter(filter.executionTime)), - ) - - /** - * Register a instructions trigger to run after every transaction - */ - fun registerTrigger( - triggerId: TriggerId, - isi: List, - repeats: Repeats, - accountId: AccountId, - metadata: Metadata, - filter: EventFilterBox = EventFilterBox.ExecuteTrigger( - ExecuteTriggerEventFilter(triggerId, accountId), - ), - ) = InstructionBox.Register( - RegisterBox.Trigger( - RegisterOfTrigger( - Trigger( - triggerId, - Action(Executable.Instructions(isi), repeats, accountId, filter, metadata), - ), - ), - ), - ) - - /** - * Unregister a trigger - */ - fun unregisterTrigger(id: TriggerId) = InstructionBox.Unregister( - UnregisterBox.Trigger(UnregisterOfTrigger(id)), - ) - - /** - * Unregister a trigger - */ - fun unregisterTrigger( - triggerName: String, - domainId: DomainId? = null, - ) = unregisterTrigger(TriggerId(triggerName.asName())) - - /** - * Unregister an asset - */ - fun unregisterAsset(id: AssetId) = InstructionBox.Unregister(UnregisterBox.Asset(UnregisterOfAsset(id))) - - /** - * Unregister an asset definition - */ - fun unregisterAssetDefinition(id: AssetDefinitionId) = InstructionBox.Unregister( - UnregisterBox.AssetDefinition( - UnregisterOfAssetDefinition(id), - ), - ) - - /** - * Unregister an account - */ - fun unregisterAccount(id: AccountId) = InstructionBox.Unregister(UnregisterBox.Account(UnregisterOfAccount(id))) - - /** - * Unregister a domain - */ - fun unregisterDomain(id: DomainId) = InstructionBox.Unregister(UnregisterBox.Domain(UnregisterOfDomain(id))) - - /** - * Unregister a role - */ - fun unregisterRole(id: RoleId) = InstructionBox.Unregister(UnregisterBox.Role(UnregisterOfRole(id))) - - /** - * Register an asset - */ - @JvmOverloads - fun registerAssetDefinition( - id: AssetDefinitionId, - assetType: AssetType, - metadata: Metadata = Metadata(mapOf()), - mintable: Mintable = Mintable.Infinitely(), - logo: IpfsPath? = null, - ) = InstructionBox.Register( - RegisterBox.AssetDefinition( - RegisterOfAssetDefinition( - NewAssetDefinition(id, assetType, mintable, logo, metadata), - ), - ), - ) - - /** - * Register an asset - */ - fun registerAsset(id: AssetId, assetValue: AssetValue) = InstructionBox.Register( - RegisterBox.Asset(RegisterOfAsset(Asset(id, assetValue))), - ) - - /** - * Register a domain - */ - @JvmOverloads - fun registerDomain( - domainId: DomainId, - metadata: Map = mapOf(), - logo: IpfsPath? = null, - ) = InstructionBox.Register( - RegisterBox.Domain(RegisterOfDomain(NewDomain(domainId, logo, Metadata(metadata)))), - ) - - /** - * Register a peer - */ - fun registerPeer( - peerId: PeerId, - ) = InstructionBox.Register( - RegisterBox.Peer(RegisterOfPeer(Peer(peerId))), - ) - - /** - * Unregister a peer - */ - fun unregisterPeer(peerId: PeerId) = InstructionBox.Unregister( - UnregisterBox.Peer(UnregisterOfPeer(peerId)), - ) - - /** - * Set key/value for a given asset - */ - fun setKeyValue( - assetId: AssetId, - key: Name, - value: String, - ) = InstructionBox.SetKeyValue( - SetKeyValueBox.Asset( - SetKeyValueOfAsset(assetId, key, value), - ), - ) - - /** - * Set key/value for a given trigger - */ - fun setKeyValue( - triggerId: TriggerId, - key: Name, - value: String, - ) = InstructionBox.SetKeyValue( - SetKeyValueBox.Trigger( - SetKeyValueOfTrigger(triggerId, key, value), - ), - ) - - /** - * Set key/value for a given asset definition - */ - fun setKeyValue( - definitionId: AssetDefinitionId, - key: Name, - value: String, - ) = InstructionBox.SetKeyValue( - SetKeyValueBox.AssetDefinition( - SetKeyValueOfAssetDefinition(definitionId, key, value), - ), - ) - - /** - * Set key/value in the metadata of a given domain - */ - fun setKeyValue( - domainId: DomainId, - key: Name, - value: String, - ) = InstructionBox.SetKeyValue( - SetKeyValueBox.Domain(SetKeyValueOfDomain(domainId, key, value)), - ) - - /** - * Set key/value in the metadata of a given account - */ - fun setKeyValue( - accountId: AccountId, - key: Name, - value: String, - ) = InstructionBox.SetKeyValue( - SetKeyValueBox.Account(SetKeyValueOfAccount(accountId, key, value)), - ) - - /** - * Remove key/value from a given asset - */ - fun removeKeyValue(assetId: AssetId, key: Name) = InstructionBox.RemoveKeyValue( - RemoveKeyValueBox.Asset(RemoveKeyValueOfAsset(assetId, key)), - ) - - /** - * Execute a trigger - */ - fun executeTrigger(triggerId: TriggerId) = InstructionBox.ExecuteTrigger(ExecuteTrigger(triggerId)) - - /** - * Mint an asset of the [AssetType.Quantity] asset value type - */ - fun mintAsset(assetId: AssetId, quantity: Int) = InstructionBox.Mint( - MintBox.Asset(MintOfNumericAndAsset(quantity.asNumeric(), assetId)), - ) - - /** - * Mint an asset of the [AssetType.Fixed] asset value type - */ - fun mintAsset(assetId: AssetId, quantity: BigDecimal) = InstructionBox.Mint( - MintBox.Asset(MintOfNumericAndAsset(quantity.asNumeric(), assetId)), - ) - - /** - * Burn an asset of the [AssetType.Quantity] asset value type - */ - fun burnAsset(assetId: AssetId, value: Int) = InstructionBox.Burn( - BurnBox.Asset(BurnOfNumericAndAsset(value.asNumeric(), assetId)), - ) - - /** - * Burn an asset of the [AssetType.Fixed] asset value type - */ - fun burnAsset(assetId: AssetId, value: BigDecimal) = InstructionBox.Burn( - BurnBox.Asset(BurnOfNumericAndAsset(value.asNumeric(), assetId)), - ) - - /** - * Grant an account the custom permission - */ - fun grantPermissionToken( - permission: Permissions, - payload: String = "null", - destinationId: AccountId, - ) = InstructionBox.Grant( - GrantBox.Permission( - GrantOfPermissionAndAccount( - Permission(permission.type, payload), - destinationId, - ), - ), - ) - - /** - * Grant an account a given role. - */ - fun grantRole(roleId: RoleId, destinationId: AccountId) = InstructionBox.Grant( - GrantBox.Role(GrantOfRoleIdAndAccount(roleId, destinationId)), - ) - - /** - * Transfer an asset from the identifiable source. - */ - fun transferAsset(sourceId: AssetId, value: Int, destinationId: AccountId) = InstructionBox.Transfer( - TransferBox.Asset( - AssetTransferBox.Numeric( - TransferOfAssetAndNumericAndAccount(sourceId, value.asNumeric(), destinationId), - ), - ), - ) - - /** - * Transfer domain ownership. - */ - fun transferDomainOwnership(sourceId: AccountId, domainId: DomainId, destinationId: AccountId) = - InstructionBox.Transfer( - TransferBox.Domain( - TransferOfAccountAndDomainIdAndAccount(sourceId, domainId, destinationId), - ), - ) - - /** - * Revoke an account the [Permissions.CanSetKeyValueInUserAsset] permission - */ - fun revokeSetKeyValueAsset(assetId: AssetId, target: AccountId): InstructionBox { - return revokeSome(target) { - Permission( - name = Permissions.CanSetKeyValueInUserAsset.type, - payload = assetId.asJsonString(), - ) - } - } - - /** - * Revoke an account the [Permissions.CanSetKeyValueInAccount] permission - */ - fun revokeSetKeyValueAccount(accountId: AccountId, target: AccountId): InstructionBox { - return revokeSome(target) { - Permission( - name = Permissions.CanSetKeyValueInAccount.type, - payload = accountId.asJsonString(), - ) - } - } - - /** - * Revoke an account the [Permissions.CanSetKeyValueInDomain] permission - */ - fun grantSetKeyValueDomain(domainId: DomainId, target: AccountId): InstructionBox { - return InstructionBox.Grant( - GrantBox.Permission( - GrantOfPermissionAndAccount( - Permission( - name = Permissions.CanSetKeyValueInDomain.type, - payload = domainId.asJsonString(), - ), - target, - ), - ), - ) - } - - /** - * Revoke an account the [Permissions.CanSetKeyValueInDomain] permission - */ - fun revokeSetKeyValueDomain(domainId: DomainId, target: AccountId): InstructionBox { - return revokeSome(target) { - Permission( - name = Permissions.CanSetKeyValueInDomain.type, - payload = domainId.asJsonString(), - ) - } - } - - /** - * Revoke an account a given role. - */ - fun revokeRole(roleId: RoleId, accountId: AccountId): InstructionBox { - return InstructionBox.Revoke( - RevokeBox.Role(RevokeOfRoleIdAndAccount(roleId, accountId)), - ) - } - - private inline fun revokeSome( - accountId: AccountId, - permission: () -> Permission, - ) = InstructionBox.Revoke( - RevokeBox.Permission( - RevokeOfPermissionAndAccount(permission(), accountId), - ), - ) -} diff --git a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/transaction/TransactionBuilder.kt b/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/transaction/TransactionBuilder.kt deleted file mode 100644 index 26a8f4c15..000000000 --- a/modules/client/src/main/kotlin/jp/co/soramitsu/iroha2/transaction/TransactionBuilder.kt +++ /dev/null @@ -1,390 +0,0 @@ -package jp.co.soramitsu.iroha2.transaction - -import jp.co.soramitsu.iroha2.IrohaClientException -import jp.co.soramitsu.iroha2.Permissions -import jp.co.soramitsu.iroha2.U32_MAX_VALUE -import jp.co.soramitsu.iroha2.asName -import jp.co.soramitsu.iroha2.asSignatureOf -import jp.co.soramitsu.iroha2.generated.* // ktlint-disable no-wildcard-imports -import jp.co.soramitsu.iroha2.sign -import java.math.BigDecimal -import java.math.BigInteger -import java.security.KeyPair -import java.time.Duration -import java.time.Instant -import java.util.UUID -import kotlin.random.Random -import kotlin.random.nextLong - -class TransactionBuilder(builder: TransactionBuilder.() -> Unit = {}) { - - var chainId: ChainId? - var accountId: AccountId? - val instructions: Lazy> - var creationTimeMillis: BigInteger? - var timeToLiveMillis: BigInteger? - var nonce: Long? - var metadata: Lazy> - - init { - chainId = ChainId("00000000-0000-0000-0000-000000000000") - accountId = null - instructions = lazy { ArrayList() } - creationTimeMillis = null - timeToLiveMillis = null - nonce = Random.nextLong(0..U32_MAX_VALUE) // UInt32 max value - metadata = lazy { HashMap() } - builder(this) - } - - fun chainId(uuid: UUID) = this.apply { chainId = ChainId(uuid.toString()) } - - fun account(accountId: AccountId) = this.apply { this.accountId = accountId } - - fun account(signatory: PublicKey, domainId: DomainId) = this.account(AccountId(domainId, signatory)) - - fun instructions(vararg instructions: InstructionBox) = this.apply { this.instructions.value.addAll(instructions) } - - fun instructions(instructions: Iterable) = - this.apply { this.instructions.value.addAll(instructions) } - - fun instruction(instruction: InstructionBox) = this.apply { this.instructions.value.add(instruction) } - - fun creationTime(creationTimeMillis: BigInteger) = this.apply { this.creationTimeMillis = creationTimeMillis } - - fun creationTime(creationTime: Instant) = this.apply { this.creationTime(creationTime.toEpochMilli()) } - - fun creationTime(creationTimeMillis: Long) = this.apply { this.creationTime(creationTimeMillis.toBigInteger()) } - - fun timeToLive(ttlMillis: BigInteger) = this.apply { this.timeToLiveMillis = ttlMillis } - - fun timeToLive(ttl: Duration) = this.apply { this.timeToLive(ttl.toMillis()) } - - fun timeToLive(ttlMillis: Long) = this.apply { this.timeToLive(ttlMillis.toBigInteger()) } - - fun buildSigned(keyPair: KeyPair): SignedTransaction { - val payload = TransactionPayload( - checkNotNull(chainId) { "Chain ID is required" }, - checkNotNull(accountId) { "Account Id is required" }, - creationTimeMillis ?: fallbackCreationTime(), - Executable.Instructions(instructions.value), - NonZeroOfu64(timeToLiveMillis ?: DURATION_OF_24_HOURS_IN_MILLIS), - NonZeroOfu32(nonce ?: throw IrohaClientException("Nonce must not be null")), - Metadata(metadata.value), - ) - val encodedPayload = TransactionPayload.encode(payload) - val signature = Signature(keyPair.private.sign(encodedPayload)).asSignatureOf() - - return SignedTransaction.V1( - SignedTransactionV1(TransactionSignature(signature), payload), - ) - } - - @JvmOverloads - fun registerTimeTrigger( - triggerId: TriggerId, - isi: List, - repeats: Repeats, - accountId: AccountId, - filter: TimeEventFilter, - metadata: Metadata = Metadata(mapOf()), - ) = this.apply { - instructions.value.add( - Instructions.registerTrigger( - triggerId, - isi, - repeats, - accountId, - metadata, - filter, - ), - ) - } - - @JvmOverloads - fun registerExecutableTrigger( - triggerId: TriggerId, - isi: List, - repeats: Repeats, - accountId: AccountId, - metadata: Metadata = Metadata(mapOf()), - ) = this.apply { - instructions.value.add( - Instructions.registerTrigger( - triggerId, - isi, - repeats, - accountId, - metadata, - ), - ) - } - - @JvmOverloads - fun registerEventTrigger( - triggerId: TriggerId, - isi: List, - repeats: Repeats, - accountId: AccountId, - metadata: Metadata = Metadata(mapOf()), - filter: EventFilterBox, - ) = this.apply { - instructions.value.add( - Instructions.registerTrigger( - triggerId, - isi, - repeats, - accountId, - metadata, - filter, - ), - ) - } - - @JvmOverloads - fun registerWasmTrigger( - triggerId: TriggerId, - wasm: ByteArray, - repeats: Repeats, - accountId: AccountId, - metadata: Metadata = Metadata(mapOf()), - filter: EventFilterBox, - ) = this.apply { - instructions.value.add( - Instructions.registerTrigger( - triggerId, - wasm, - repeats, - accountId, - metadata, - filter, - ), - ) - } - - @JvmOverloads - fun registerPreCommitTrigger( - triggerId: TriggerId, - isi: List, - repeats: Repeats, - accountId: AccountId, - metadata: Metadata = Metadata(mapOf()), - filter: EventFilterBox = EventFilterBox.Time(TimeEventFilter(ExecutionTime.PreCommit())), - ) = this.apply { - instructions.value.add( - Instructions.registerTrigger( - triggerId, - isi, - repeats, - accountId, - metadata, - filter, - ), - ) - } - - fun unregisterAsset(id: AssetId) = this.apply { - instructions.value.add(Instructions.unregisterAsset(id)) - } - - fun unregisterAssetDefinition(id: AssetDefinitionId) = this.apply { - instructions.value.add(Instructions.unregisterAssetDefinition(id)) - } - - fun unregisterTrigger(id: TriggerId) = this.apply { - instructions.value.add( - Instructions.unregisterTrigger(id), - ) - } - - fun unregisterTrigger(triggerName: String, domainId: DomainId? = null) = this.apply { - instructions.value.add( - Instructions.unregisterTrigger(triggerName, domainId), - ) - } - - fun unregisterAccount(id: AccountId) = this.apply { - instructions.value.add( - Instructions.unregisterAccount(id), - ) - } - - fun unregisterDomain(id: DomainId) = this.apply { - instructions.value.add( - Instructions.unregisterDomain(id), - ) - } - - fun grantRole( - roleId: RoleId, - accountId: AccountId, - ) = this.apply { instructions.value.add(Instructions.grantRole(roleId, accountId)) } - - fun registerRole( - id: RoleId, - vararg tokens: Permission, - ) = this.apply { instructions.value.add(Instructions.registerRole(id, *tokens)) } - - fun unregisterRole( - id: RoleId, - ) = this.apply { instructions.value.add(Instructions.unregisterRole(id)) } - - @JvmOverloads - fun registerAccount( - id: AccountId, - metadata: Metadata = Metadata(mapOf()), - ) = this.apply { instructions.value.add(Instructions.registerAccount(id, metadata)) } - - @JvmOverloads - fun registerAssetDefinition( - id: AssetDefinitionId, - assetValueType: AssetType, - metadata: Metadata = Metadata(mapOf()), - mintable: Mintable = Mintable.Infinitely(), - ) = this.apply { - instructions.value.add( - Instructions.registerAssetDefinition(id, assetValueType, metadata, mintable), - ) - } - - @JvmOverloads - fun registerAssetDefinition( - name: Name, - domainId: DomainId, - assetValueType: AssetType, - metadata: Metadata = Metadata(mapOf()), - mintable: Mintable = Mintable.Infinitely(), - ) = this.apply { - instructions.value.add( - Instructions.registerAssetDefinition(AssetDefinitionId(domainId, name), assetValueType, metadata, mintable), - ) - } - - fun registerAsset( - id: AssetId, - assetValue: AssetValue, - ) = this.apply { instructions.value.add(Instructions.registerAsset(id, assetValue)) } - - fun setKeyValue( - assetId: AssetId, - key: String, - value: String, - ) = this.apply { instructions.value.add(Instructions.setKeyValue(assetId, key.asName(), value)) } - - fun setKeyValue( - assetId: AssetId, - key: Name, - value: String, - ) = this.apply { instructions.value.add(Instructions.setKeyValue(assetId, key, value)) } - - fun setKeyValue( - accountId: AccountId, - key: Name, - value: String, - ) = this.apply { instructions.value.add(Instructions.setKeyValue(accountId, key, value)) } - - fun setKeyValue( - definitionId: AssetDefinitionId, - key: Name, - value: String, - ) = this.apply { instructions.value.add(Instructions.setKeyValue(definitionId, key, value)) } - - fun setKeyValue( - triggerId: TriggerId, - key: Name, - value: String, - ) = this.apply { instructions.value.add(Instructions.setKeyValue(triggerId, key, value)) } - - fun setKeyValue( - domainId: DomainId, - key: Name, - value: String, - ) = this.apply { instructions.value.add(Instructions.setKeyValue(domainId, key, value)) } - - fun removeKeyValue( - assetId: AssetId, - key: Name, - ) = this.apply { instructions.value.add(Instructions.removeKeyValue(assetId, key)) } - - fun removeKeyValue( - assetId: AssetId, - key: String, - ) = removeKeyValue(assetId, key.asName()) - - fun executeTrigger( - triggerId: TriggerId, - ) = this.apply { instructions.value.add(Instructions.executeTrigger(triggerId)) } - - fun mintAsset( - assetId: AssetId, - quantity: Int, - ) = this.apply { instructions.value.add(Instructions.mintAsset(assetId, quantity)) } - - fun mintAsset( - assetId: AssetId, - quantity: BigDecimal, - ) = this.apply { instructions.value.add(Instructions.mintAsset(assetId, quantity)) } - - @JvmOverloads - fun registerDomain( - domainId: DomainId, - metadata: Map = mapOf(), - logo: IpfsPath? = null, - ) = this.apply { - instructions.value.add( - Instructions.registerDomain( - domainId, - metadata, - logo, - ), - ) - } - - fun registerPeer(peerId: PeerId) = this.apply { instructions.value.add(Instructions.registerPeer(peerId)) } - - fun unregisterPeer( - peerId: PeerId, - ) = this.apply { instructions.value.add(Instructions.unregisterPeer(peerId)) } - - fun grantPermissionToken(permission: Permissions, payload: String, target: AccountId) = this.apply { - instructions.value.add(Instructions.grantPermissionToken(permission, payload, target)) - } - - fun burnAsset(assetId: AssetId, value: Int) = this.apply { - instructions.value.add(Instructions.burnAsset(assetId, value)) - } - - fun burnAsset(assetId: AssetId, value: BigDecimal) = this.apply { - instructions.value.add(Instructions.burnAsset(assetId, value)) - } - - fun transferAsset(sourceId: AssetId, value: Int, destinationId: AccountId) = this.apply { - instructions.value.add(Instructions.transferAsset(sourceId, value, destinationId)) - } - - fun transferDomainOwnership(sourceId: AccountId, value: DomainId, destinationId: AccountId) = this.apply { - instructions.value.add(Instructions.transferDomainOwnership(sourceId, value, destinationId)) - } - - fun revokeSetKeyValueAsset(assetId: AssetId, target: AccountId) = - this.apply { instructions.value.add(Instructions.revokeSetKeyValueAsset(assetId, target)) } - - fun revokeSetKeyValueAccount(accountId: AccountId, target: AccountId) = - this.apply { instructions.value.add(Instructions.revokeSetKeyValueAccount(accountId, target)) } - - fun revokeSetKeyValueDomain(domainId: DomainId, target: AccountId) = - this.apply { instructions.value.add(Instructions.revokeSetKeyValueDomain(domainId, target)) } - - fun revokeRole( - roleId: RoleId, - accountId: AccountId, - ) = this.apply { instructions.value.add(Instructions.revokeRole(roleId, accountId)) } - - private fun fallbackCreationTime() = System.currentTimeMillis().toBigInteger() - - companion object { - fun builder() = TransactionBuilder() - - val DURATION_OF_24_HOURS_IN_MILLIS = Duration.ofHours(24).toMillis().toBigInteger() - } -} diff --git a/modules/client/src/test/java/jp/co/soramitsu/iroha2/JavaTest.java b/modules/client/src/test/java/jp/co/soramitsu/iroha2/JavaTest.java index 870a46071..add54a4be 100644 --- a/modules/client/src/test/java/jp/co/soramitsu/iroha2/JavaTest.java +++ b/modules/client/src/test/java/jp/co/soramitsu/iroha2/JavaTest.java @@ -1,210 +1,210 @@ -package jp.co.soramitsu.iroha2; - -import java.security.*; -import java.time.*; -import java.util.*; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; -import static jp.co.soramitsu.iroha2.CryptoUtils.generateKeyPair; -import static jp.co.soramitsu.iroha2.ExtensionsKt.toIrohaPublicKey; -import jp.co.soramitsu.iroha2.client.Iroha2AsyncClient; -import jp.co.soramitsu.iroha2.client.blockstream.*; -import jp.co.soramitsu.iroha2.generated.*; -import jp.co.soramitsu.iroha2.generated.Metadata; -import jp.co.soramitsu.iroha2.query.QueryAndExtractor; -import jp.co.soramitsu.iroha2.query.QueryBuilder; -import jp.co.soramitsu.iroha2.testengine.DefaultGenesis; -import jp.co.soramitsu.iroha2.testengine.IrohaTest; -import jp.co.soramitsu.iroha2.testengine.WithIroha; -import jp.co.soramitsu.iroha2.transaction.TransactionBuilder; -import kotlin.*; -import kotlin.Pair; -import kotlin.coroutines.*; -import kotlinx.coroutines.flow.*; -import org.jetbrains.annotations.*; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import static jp.co.soramitsu.iroha2.testengine.TestConstsKt.ALICE_ACCOUNT_ID; -import static jp.co.soramitsu.iroha2.testengine.TestConstsKt.ALICE_KEYPAIR; -import static jp.co.soramitsu.iroha2.testengine.TestConstsKt.DEFAULT_ASSET_DEFINITION_ID; -import static jp.co.soramitsu.iroha2.testengine.TestConstsKt.DEFAULT_ASSET_ID; -import static jp.co.soramitsu.iroha2.testengine.TestConstsKt.DEFAULT_DOMAIN_ID; -import org.junit.jupiter.api.parallel.*; -import static org.testcontainers.shaded.org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; - -public class JavaTest extends IrohaTest { - - @Test - @WithIroha(sources = DefaultGenesis.class) - public void registerDomain() throws ExecutionException, InterruptedException, TimeoutException { - final DomainId domainId = new DomainId(new Name("new_domain_name")); - final SignedTransaction transaction = TransactionBuilder.Companion.builder() - .account(ALICE_ACCOUNT_ID) - .registerDomain(domainId) - .buildSigned(ALICE_KEYPAIR); - client.sendTransactionAsync(transaction).get(getTxTimeout().getSeconds(), TimeUnit.SECONDS); - - final QueryAndExtractor query = QueryBuilder.findDomainById(domainId) - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR); - final CompletableFuture future = client.sendQueryAsync(query); - final Domain domain = future.get(getTxTimeout().getSeconds(), TimeUnit.SECONDS); - Assertions.assertEquals(domain.getId(), domainId); - } - - @Test - @WithIroha(sources = DefaultGenesis.class) - public void registerAccount() throws Exception { - final KeyPair keyPair = generateKeyPair(); - final AccountId accountId = new AccountId(DEFAULT_DOMAIN_ID, toIrohaPublicKey(keyPair.getPublic())); - final SignedTransaction transaction = TransactionBuilder.Companion.builder() - .account(ALICE_ACCOUNT_ID) - .registerAccount(accountId, new Metadata(Collections.emptyMap())) - .buildSigned(ALICE_KEYPAIR); - client.sendTransactionAsync(transaction).get(getTxTimeout().getSeconds(), TimeUnit.SECONDS); - - final QueryAndExtractor query = QueryBuilder.findAccountById(accountId) - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR); - final CompletableFuture future = client.sendQueryAsync(query); - final Account account = future.get(getTxTimeout().getSeconds(), TimeUnit.SECONDS); - Assertions.assertEquals(account.getId(), accountId); - } - - @Test - @WithIroha(sources = DefaultGenesis.class) - public void mintAsset() throws Exception { - final SignedTransaction registerAssetTx = TransactionBuilder.Companion.builder() - .account(ALICE_ACCOUNT_ID) - .registerAssetDefinition(DEFAULT_ASSET_DEFINITION_ID, new AssetType.Numeric(new NumericSpec())) - .buildSigned(ALICE_KEYPAIR); - client.sendTransactionAsync(registerAssetTx).get(getTxTimeout().getSeconds(), TimeUnit.SECONDS); - - final SignedTransaction mintAssetTx = TransactionBuilder.Companion.builder() - .account(ALICE_ACCOUNT_ID) - .mintAsset(DEFAULT_ASSET_ID, 5) - .buildSigned(ALICE_KEYPAIR); - client.sendTransactionAsync(mintAssetTx).get(getTxTimeout().getSeconds(), TimeUnit.SECONDS); - - final QueryAndExtractor> query = QueryBuilder.findAssetsByAccountId(ALICE_ACCOUNT_ID) - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR); - final CompletableFuture> future = client.sendQueryAsync(query); - final List assets = future.get(getTxTimeout().getSeconds(), TimeUnit.SECONDS); - Assertions.assertEquals(5, ((AssetValue.Numeric) assets.stream().findFirst().get().getValue()).getNumeric().getMantissa().intValue()); - } - - @Test - @WithIroha(sources = DefaultGenesis.class) - public void updateKeyValue() throws Exception { - final Name assetMetadataKey = new Name("asset_metadata_key"); - final String assetMetadataValue = "some string value"; - final String assetMetadataValue2 = "some string value 2"; - final Metadata metadata = new Metadata(new HashMap() {{ - put(assetMetadataKey, assetMetadataValue); - }}); - - final SignedTransaction registerAssetTx = TransactionBuilder.Companion.builder() - .account(ALICE_ACCOUNT_ID) - .registerAssetDefinition(DEFAULT_ASSET_DEFINITION_ID, new AssetType.Store(), metadata, new Mintable.Infinitely()) - .buildSigned(ALICE_KEYPAIR); - client.sendTransactionAsync(registerAssetTx).get(getTxTimeout().getSeconds(), TimeUnit.SECONDS); - - final AssetId assetId = new AssetId(ALICE_ACCOUNT_ID, DEFAULT_ASSET_DEFINITION_ID); - final SignedTransaction keyValueTx = TransactionBuilder.Companion.builder() - .account(ALICE_ACCOUNT_ID) - .setKeyValue(assetId, assetMetadataKey, assetMetadataValue2) - .buildSigned(ALICE_KEYPAIR); - client.sendTransactionAsync(keyValueTx).get(30, TimeUnit.SECONDS); - - final QueryAndExtractor assetDefinitionValueQuery = QueryBuilder - .findAssetKeyValueByIdAndKey(assetId, assetMetadataKey) - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR); - final CompletableFuture future = client.sendQueryAsync(assetDefinitionValueQuery); - - final String value = future.get(30, TimeUnit.SECONDS); - Assertions.assertEquals(value, assetMetadataValue2); - } - - @Test - @WithIroha(sources = DefaultGenesis.class) - public void setKeyValue() throws Exception { - final String assetValue = "some string value"; - final Name assetKey = new Name("asset_metadata_key"); - - final SignedTransaction registerAssetTx = TransactionBuilder.Companion.builder() - .account(ALICE_ACCOUNT_ID) - .registerAssetDefinition(DEFAULT_ASSET_DEFINITION_ID, new AssetType.Store()) - .buildSigned(ALICE_KEYPAIR); - client.sendTransactionAsync(registerAssetTx).get(getTxTimeout().getSeconds(), TimeUnit.SECONDS); - - final SignedTransaction keyValueTx = TransactionBuilder.Companion.builder() - .account(ALICE_ACCOUNT_ID) - .setKeyValue(DEFAULT_ASSET_DEFINITION_ID, assetKey, assetValue) - .buildSigned(ALICE_KEYPAIR); - client.sendTransactionAsync(keyValueTx).get(10, TimeUnit.SECONDS); - - final QueryAndExtractor assetDefinitionValueQuery = QueryBuilder - .findAssetDefinitionKeyValueByIdAndKey(DEFAULT_ASSET_DEFINITION_ID, assetKey) - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR); - final CompletableFuture future = client.sendQueryAsync(assetDefinitionValueQuery); - - final String value = future.get(10, TimeUnit.SECONDS); - Assertions.assertEquals(value, assetValue); - } - - @Test - @WithIroha(sources = DefaultGenesis.class) - @ResourceLock("blockStream") - public void blockStreaming() throws ExecutionException, InterruptedException { - int count = 5; - Pair, BlockStreamSubscription> idToSubscription = - client.subscribeToBlockStream(1, count); - UUID actionId = idToSubscription.component1().iterator().next().getId(); - BlockStreamSubscription subscription = idToSubscription.component2(); - - List blocks = new ArrayList<>(); - subscription.receive(actionId, new BlockMessageCollector(blocks)); - - for (int i = 0; i <= count + 1; i++) { - final SignedTransaction transaction = TransactionBuilder.Companion.builder() - .account(ALICE_ACCOUNT_ID) - .setKeyValue(ALICE_ACCOUNT_ID, new Name(randomAlphabetic(10)), new String(randomAlphabetic(10))) - .buildSigned(ALICE_KEYPAIR); - client.sendTransactionAsync(transaction); - } - - QueryAndExtractor> query = QueryBuilder.findAllBlocks() - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR); - Integer blocksSize = client.sendQueryAsync(query).get().size(); - - Assertions.assertEquals(blocksSize, blocks.size()); - - subscription.close(); - } - - static class BlockMessageCollector implements FlowCollector { - - List blocks; - - public BlockMessageCollector(List blocks) { - this.blocks = blocks; - } - - @Nullable - @Override - public Object emit( - BlockMessage blockMessage, - @NotNull Continuation continuation - ) { - blocks.add(blockMessage); - return null; - } - } -} +//package jp.co.soramitsu.iroha2; +// +//import java.security.*; +//import java.time.*; +//import java.util.*; +//import java.util.concurrent.CompletableFuture; +//import java.util.concurrent.ExecutionException; +//import java.util.concurrent.TimeUnit; +//import java.util.concurrent.TimeoutException; +//import static jp.co.soramitsu.iroha2.CryptoUtils.generateKeyPair; +//import static jp.co.soramitsu.iroha2.ExtensionsKt.toIrohaPublicKey; +//import jp.co.soramitsu.iroha2.client.Iroha2AsyncClient; +//import jp.co.soramitsu.iroha2.client.blockstream.*; +//import jp.co.soramitsu.iroha2.generated.*; +//import jp.co.soramitsu.iroha2.generated.Metadata; +//import jp.co.soramitsu.iroha2.query.QueryAndExtractor; +//import jp.co.soramitsu.iroha2.query.QueryBuilder; +//import jp.co.soramitsu.iroha2.testengine.DefaultGenesis; +//import jp.co.soramitsu.iroha2.testengine.IrohaTest; +//import jp.co.soramitsu.iroha2.testengine.WithIroha; +//import jp.co.soramitsu.iroha2.transaction.TransactionBuilder; +//import kotlin.*; +//import kotlin.Pair; +//import kotlin.coroutines.*; +//import kotlinx.coroutines.flow.*; +//import org.jetbrains.annotations.*; +//import org.junit.jupiter.api.Assertions; +//import org.junit.jupiter.api.Test; +// +//import static jp.co.soramitsu.iroha2.testengine.TestConstsKt.ALICE_ACCOUNT_ID; +//import static jp.co.soramitsu.iroha2.testengine.TestConstsKt.ALICE_KEYPAIR; +//import static jp.co.soramitsu.iroha2.testengine.TestConstsKt.DEFAULT_ASSET_DEFINITION_ID; +//import static jp.co.soramitsu.iroha2.testengine.TestConstsKt.DEFAULT_ASSET_ID; +//import static jp.co.soramitsu.iroha2.testengine.TestConstsKt.DEFAULT_DOMAIN_ID; +//import org.junit.jupiter.api.parallel.*; +//import static org.testcontainers.shaded.org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; +// +//public class JavaTest extends IrohaTest { +// +// @Test +// @WithIroha(sources = DefaultGenesis.class) +// public void registerDomain() throws ExecutionException, InterruptedException, TimeoutException { +// final DomainId domainId = new DomainId(new Name("new_domain_name")); +// final SignedTransaction transaction = TransactionBuilder.Companion.builder() +// .account(ALICE_ACCOUNT_ID) +// .registerDomain(domainId) +// .buildSigned(ALICE_KEYPAIR); +// client.sendTransactionAsync(transaction).get(getTxTimeout().getSeconds(), TimeUnit.SECONDS); +// +// final QueryAndExtractor query = QueryBuilder.findDomainById(domainId) +// .account(ALICE_ACCOUNT_ID) +// .buildSigned(ALICE_KEYPAIR); +// final CompletableFuture future = client.sendQueryAsync(query); +// final Domain domain = future.get(getTxTimeout().getSeconds(), TimeUnit.SECONDS); +// Assertions.assertEquals(domain.getId(), domainId); +// } +// +// @Test +// @WithIroha(sources = DefaultGenesis.class) +// public void registerAccount() throws Exception { +// final KeyPair keyPair = generateKeyPair(); +// final AccountId accountId = new AccountId(DEFAULT_DOMAIN_ID, toIrohaPublicKey(keyPair.getPublic())); +// final SignedTransaction transaction = TransactionBuilder.Companion.builder() +// .account(ALICE_ACCOUNT_ID) +// .registerAccount(accountId, new Metadata(Collections.emptyMap())) +// .buildSigned(ALICE_KEYPAIR); +// client.sendTransactionAsync(transaction).get(getTxTimeout().getSeconds(), TimeUnit.SECONDS); +// +// final QueryAndExtractor query = QueryBuilder.findAccountById(accountId) +// .account(ALICE_ACCOUNT_ID) +// .buildSigned(ALICE_KEYPAIR); +// final CompletableFuture future = client.sendQueryAsync(query); +// final Account account = future.get(getTxTimeout().getSeconds(), TimeUnit.SECONDS); +// Assertions.assertEquals(account.getId(), accountId); +// } +// +// @Test +// @WithIroha(sources = DefaultGenesis.class) +// public void mintAsset() throws Exception { +// final SignedTransaction registerAssetTx = TransactionBuilder.Companion.builder() +// .account(ALICE_ACCOUNT_ID) +// .registerAssetDefinition(DEFAULT_ASSET_DEFINITION_ID, new AssetType.Numeric(new NumericSpec())) +// .buildSigned(ALICE_KEYPAIR); +// client.sendTransactionAsync(registerAssetTx).get(getTxTimeout().getSeconds(), TimeUnit.SECONDS); +// +// final SignedTransaction mintAssetTx = TransactionBuilder.Companion.builder() +// .account(ALICE_ACCOUNT_ID) +// .mintAsset(DEFAULT_ASSET_ID, 5) +// .buildSigned(ALICE_KEYPAIR); +// client.sendTransactionAsync(mintAssetTx).get(getTxTimeout().getSeconds(), TimeUnit.SECONDS); +// +// final QueryAndExtractor> query = QueryBuilder.findAssetsByAccountId(ALICE_ACCOUNT_ID) +// .account(ALICE_ACCOUNT_ID) +// .buildSigned(ALICE_KEYPAIR); +// final CompletableFuture> future = client.sendQueryAsync(query); +// final List assets = future.get(getTxTimeout().getSeconds(), TimeUnit.SECONDS); +// Assertions.assertEquals(5, ((AssetValue.Numeric) assets.stream().findFirst().get().getValue()).getNumeric().getMantissa().intValue()); +// } +// +// @Test +// @WithIroha(sources = DefaultGenesis.class) +// public void updateKeyValue() throws Exception { +// final Name assetMetadataKey = new Name("asset_metadata_key"); +// final String assetMetadataValue = "some string value"; +// final String assetMetadataValue2 = "some string value 2"; +// final Metadata metadata = new Metadata(new HashMap() {{ +// put(assetMetadataKey, assetMetadataValue); +// }}); +// +// final SignedTransaction registerAssetTx = TransactionBuilder.Companion.builder() +// .account(ALICE_ACCOUNT_ID) +// .registerAssetDefinition(DEFAULT_ASSET_DEFINITION_ID, new AssetType.Store(), metadata, new Mintable.Infinitely()) +// .buildSigned(ALICE_KEYPAIR); +// client.sendTransactionAsync(registerAssetTx).get(getTxTimeout().getSeconds(), TimeUnit.SECONDS); +// +// final AssetId assetId = new AssetId(ALICE_ACCOUNT_ID, DEFAULT_ASSET_DEFINITION_ID); +// final SignedTransaction keyValueTx = TransactionBuilder.Companion.builder() +// .account(ALICE_ACCOUNT_ID) +// .setKeyValue(assetId, assetMetadataKey, assetMetadataValue2) +// .buildSigned(ALICE_KEYPAIR); +// client.sendTransactionAsync(keyValueTx).get(30, TimeUnit.SECONDS); +// +// final QueryAndExtractor assetDefinitionValueQuery = QueryBuilder +// .findAssetKeyValueByIdAndKey(assetId, assetMetadataKey) +// .account(ALICE_ACCOUNT_ID) +// .buildSigned(ALICE_KEYPAIR); +// final CompletableFuture future = client.sendQueryAsync(assetDefinitionValueQuery); +// +// final String value = future.get(30, TimeUnit.SECONDS); +// Assertions.assertEquals(value, assetMetadataValue2); +// } +// +// @Test +// @WithIroha(sources = DefaultGenesis.class) +// public void setKeyValue() throws Exception { +// final String assetValue = "some string value"; +// final Name assetKey = new Name("asset_metadata_key"); +// +// final SignedTransaction registerAssetTx = TransactionBuilder.Companion.builder() +// .account(ALICE_ACCOUNT_ID) +// .registerAssetDefinition(DEFAULT_ASSET_DEFINITION_ID, new AssetType.Store()) +// .buildSigned(ALICE_KEYPAIR); +// client.sendTransactionAsync(registerAssetTx).get(getTxTimeout().getSeconds(), TimeUnit.SECONDS); +// +// final SignedTransaction keyValueTx = TransactionBuilder.Companion.builder() +// .account(ALICE_ACCOUNT_ID) +// .setKeyValue(DEFAULT_ASSET_DEFINITION_ID, assetKey, assetValue) +// .buildSigned(ALICE_KEYPAIR); +// client.sendTransactionAsync(keyValueTx).get(10, TimeUnit.SECONDS); +// +// final QueryAndExtractor assetDefinitionValueQuery = QueryBuilder +// .findAssetDefinitionKeyValueByIdAndKey(DEFAULT_ASSET_DEFINITION_ID, assetKey) +// .account(ALICE_ACCOUNT_ID) +// .buildSigned(ALICE_KEYPAIR); +// final CompletableFuture future = client.sendQueryAsync(assetDefinitionValueQuery); +// +// final String value = future.get(10, TimeUnit.SECONDS); +// Assertions.assertEquals(value, assetValue); +// } +// +// @Test +// @WithIroha(sources = DefaultGenesis.class) +// @ResourceLock("blockStream") +// public void blockStreaming() throws ExecutionException, InterruptedException { +// int count = 5; +// Pair, BlockStreamSubscription> idToSubscription = +// client.subscribeToBlockStream(1, count); +// UUID actionId = idToSubscription.component1().iterator().next().getId(); +// BlockStreamSubscription subscription = idToSubscription.component2(); +// +// List blocks = new ArrayList<>(); +// subscription.receive(actionId, new BlockMessageCollector(blocks)); +// +// for (int i = 0; i <= count + 1; i++) { +// final SignedTransaction transaction = TransactionBuilder.Companion.builder() +// .account(ALICE_ACCOUNT_ID) +// .setKeyValue(ALICE_ACCOUNT_ID, new Name(randomAlphabetic(10)), new String(randomAlphabetic(10))) +// .buildSigned(ALICE_KEYPAIR); +// client.sendTransactionAsync(transaction); +// } +// +// QueryAndExtractor> query = QueryBuilder.findAllBlocks() +// .account(ALICE_ACCOUNT_ID) +// .buildSigned(ALICE_KEYPAIR); +// Integer blocksSize = client.sendQueryAsync(query).get().size(); +// +// Assertions.assertEquals(blocksSize, blocks.size()); +// +// subscription.close(); +// } +// +// static class BlockMessageCollector implements FlowCollector { +// +// List blocks; +// +// public BlockMessageCollector(List blocks) { +// this.blocks = blocks; +// } +// +// @Nullable +// @Override +// public Object emit( +// BlockMessage blockMessage, +// @NotNull Continuation continuation +// ) { +// blocks.add(blockMessage); +// return null; +// } +// } +//} diff --git a/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/BlockStreamTest.kt b/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/BlockStreamTest.kt index 8f0d0bca2..cc24a3758 100644 --- a/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/BlockStreamTest.kt +++ b/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/BlockStreamTest.kt @@ -7,6 +7,7 @@ import io.qameta.allure.Story import jp.co.soramitsu.iroha2.annotations.Sdk import jp.co.soramitsu.iroha2.annotations.SdkTestId import jp.co.soramitsu.iroha2.client.blockstream.BlockStreamStorage +import jp.co.soramitsu.iroha2.generated.AssetDefinitionId import jp.co.soramitsu.iroha2.generated.AssetType import jp.co.soramitsu.iroha2.generated.BlockMessage import jp.co.soramitsu.iroha2.generated.BlockPayload @@ -27,7 +28,11 @@ import jp.co.soramitsu.iroha2.testengine.GENESIS_DOMAIN import jp.co.soramitsu.iroha2.testengine.IrohaTest import jp.co.soramitsu.iroha2.testengine.NewAccountWithMetadata import jp.co.soramitsu.iroha2.testengine.WithIroha +import jp.co.soramitsu.iroha2.transaction.Register +import jp.co.soramitsu.iroha2.transaction.SetKeyValue +import jp.co.soramitsu.iroha2.transaction.Transfer import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.time.withTimeout import org.junit.jupiter.api.Test import org.junit.jupiter.api.parallel.ResourceLock import org.testcontainers.shaded.org.apache.commons.lang3.RandomStringUtils.randomAlphabetic @@ -40,97 +45,125 @@ import kotlin.test.assertTrue @Sdk("Java/Kotlin") @Feature("Block Streaming") class BlockStreamTest : IrohaTest() { - @Test @WithIroha([NewAccountWithMetadata::class]) @Story("Successful subscription to block stream") @SdkTestId("subscription_to_block_stream") @Issue("https://app.zenhub.com/workspaces/iroha-v2-60ddb820813b9100181fc060/issues/gh/hyperledger/iroha-java/361") @ResourceLock("blockStream") - fun `subscription to block stream`(): Unit = runBlocking { - val idToSubscription = client.subscribeToBlockStream(from = 1, count = 3) - val actionId = idToSubscription.first.first().id - val subscription = idToSubscription.second - val newAssetName = "rox" - - client.tx { - transferDomainOwnership(ALICE_ACCOUNT_ID, DEFAULT_DOMAIN_ID, BOB_ACCOUNT_ID) - } - client.tx(BOB_ACCOUNT_ID, BOB_KEYPAIR) { - registerAssetDefinition(newAssetName.asName(), DEFAULT_DOMAIN_ID, AssetType.Store()) + fun `subscription to block stream`(): Unit = + runBlocking { + val idToSubscription = client.blocks(count = 3) + val actionId = idToSubscription.first.first().id + val subscription = idToSubscription.second + val newAssetName = "rox" + + client.submit(Transfer.domain(ALICE_ACCOUNT_ID, DEFAULT_DOMAIN_ID, BOB_ACCOUNT_ID)).also { d -> + withTimeout(txTimeout) { d.await() } + } + client + .submitAs( + BOB_ACCOUNT_ID, + BOB_KEYPAIR, + Register.assetDefinition(AssetDefinitionId(DEFAULT_DOMAIN_ID, newAssetName.asName()), AssetType.Store()), + ).also { d -> + withTimeout(txTimeout) { d.await() } + } + + val blocks = mutableListOf() + subscription.receive(actionId).collect { block -> blocks.add(block) } + + // upgrade executor + set parameters + isi + set topology + val expectedSize = NewAccountWithMetadata().transaction.instructions.count() + 12 + var isi = blocks[0].validate(1, GENESIS_DOMAIN, GENESIS_ADDRESS, expectedSize) + val registerDomain = + isi[1] + .cast() + .extractDomain() + .id.name.string + + assertEquals(DEFAULT_DOMAIN_ID.asString(), registerDomain) + assertEquals(ALICE_ACCOUNT_ID, isi[2].extractAccount().id) + assertEquals(BOB_ACCOUNT_ID, isi[3].extractAccount().id) + assertEquals(NewAccountWithMetadata.ACCOUNT_ID, isi[4].extractAccount().id) + + isi = blocks[2].validate(3, DEFAULT_DOMAIN, BOB_PUBLIC_KEY.payload.toHex(true), 1) + val newAssetDefinition = isi[0].cast().extractAssetDefinition() + assertNotNull(newAssetDefinition) + assertEquals(newAssetName, newAssetDefinition.id.name.string) + assertEquals(DEFAULT_DOMAIN, newAssetDefinition.id.domain.asString()) + + subscription.stop() } - val blocks = mutableListOf() - subscription.receive(actionId).collect { block -> blocks.add(block) } - - val expectedSize = NewAccountWithMetadata().transaction.instructions.count() + 2 // + wasm + peer register - var isi = blocks[0].validate(1, GENESIS_DOMAIN, GENESIS_ADDRESS, expectedSize) - val registerDomain = isi[0].cast().extractDomain().id.name.string - - assertEquals(DEFAULT_DOMAIN_ID.asString(), registerDomain) - assertEquals(ALICE_ACCOUNT_ID, isi[1].extractAccount().id) - assertEquals(BOB_ACCOUNT_ID, isi[2].extractAccount().id) - assertEquals(NewAccountWithMetadata.ACCOUNT_ID, isi[3].extractAccount().id) - - isi = blocks[2].validate(3, DEFAULT_DOMAIN, BOB_PUBLIC_KEY.payload.toHex(true), 1) - val newAssetDefinition = isi[0].cast().extractAssetDefinition() - assertNotNull(newAssetDefinition) - assertEquals(newAssetName, newAssetDefinition.id.name.string) - assertEquals(DEFAULT_DOMAIN, newAssetDefinition.id.domain.asString()) - - subscription.stop() - } - @Test @WithIroha([NewAccountWithMetadata::class]) @Story("Successful subscription to endless block stream") @SdkTestId("subscription_to_endless_block_stream") @ResourceLock("blockStream") - fun `subscription to endless block stream`(): Unit = runBlocking { - val repeatTimes = 5 - val shift = 1 // to test not to take more than was ordered - val idToSubscription = client.subscribeToBlockStream( - onBlock = { block -> block.extractBlock().height() }, - cancelIf = { block -> block.extractBlock().height().u64 == BigInteger.valueOf(repeatTimes.toLong()) }, - ) - val initialActionId = idToSubscription.first.first().id - val subscription = idToSubscription.second - var heightSum = BigInteger.ZERO - - subscription.receive(initialActionId) { heightSum += it.u64 } - - repeat(repeatTimes + shift) { - client.tx { setKeyValue(ALICE_ACCOUNT_ID, randomAlphabetic(16).asName(), randomAlphabetic(16)) } + fun `subscription to endless block stream`(): Unit = + runBlocking { + val repeatTimes = 5 + val shift = 1 // to test not to take more than was ordered + val idToSubscription = + client.blocks( + onBlock = { block -> block.extractBlock().height() }, + cancelIf = { block -> block.extractBlock().height().u64 == BigInteger.valueOf(repeatTimes.toLong()) }, + ) + val initialActionId = idToSubscription.first.first().id + val subscription = idToSubscription.second + var heightSum = BigInteger.ZERO + + subscription.receive(initialActionId) { heightSum += it.u64 } + + repeat(repeatTimes + shift) { + client.submit(SetKeyValue.account(ALICE_ACCOUNT_ID, randomAlphabetic(16).asName(), randomAlphabetic(16))).also { d -> + withTimeout(txTimeout) { d.await() } + } + } + assertEquals((1..repeatTimes.toLong()).sum(), heightSum.toLong()) + + val isi = mutableListOf() + subscription.subscribeAndReceive( + BlockStreamStorage( + onBlock = { + it + .extractBlock() + .transactions + .first() + .extractInstruction() + }, + ), + collector = { isi.add(it) }, + ) + + lateinit var lastValue: String + repeat(repeatTimes * 2) { + lastValue = randomAlphabetic(16) + client.submit(SetKeyValue.account(ALICE_ACCOUNT_ID, randomAlphabetic(16).asName(), lastValue)).also { d -> + withTimeout(txTimeout) { d.await() } + } + } + Thread.sleep(5000) + val actual = + isi + .last() + .cast() + .setKeyValueBox + .cast() + .setKeyValueOfAccount.value + assertEquals(lastValue, actual.readValue()) + + subscription.stop() } - assertEquals((1..repeatTimes.toLong()).sum(), heightSum.toLong()) - - val isi = mutableListOf() - subscription.subscribeAndReceive( - BlockStreamStorage( - onBlock = { it.extractBlock().transactions.first().value.extractInstruction() }, - ), - collector = { isi.add(it) }, - ) - lateinit var lastValue: String - repeat(repeatTimes * 2) { - lastValue = randomAlphabetic(16) - client.tx { setKeyValue(ALICE_ACCOUNT_ID, randomAlphabetic(16).asName(), lastValue) } + private fun BlockPayload.payloads(): List = + this.transactions.map { tx -> + tx + .cast() + .signedTransactionV1 + .payload } - Thread.sleep(5000) - val actual = isi.last().cast().setKeyValueBox - .cast().setKeyValueOfAccount.value - assertEquals(lastValue, actual) - - subscription.stop() - } - - private fun BlockPayload.payloads(): List = this.transactions.map { tx -> - tx.value - .cast() - .signedTransactionV1 - .payload - } private fun BlockMessage.validate( expectedHeight: Long, @@ -139,19 +172,28 @@ class BlockStreamTest : IrohaTest() { expectedIsiSize: Int, ): List { val committedBlock = this.extractBlock() - assertEquals(expectedHeight, committedBlock.header.height.u64.toLong()) + assertEquals( + expectedHeight, + committedBlock.header.height.u64 + .toLong(), + ) val payloads = committedBlock.payloads() assertTrue { payloads.any { it.authority.domain.name.string == expectedDomain } } assertTrue { payloads.any { - it.authority.signatory.payload.toHex(true).lowercase() == expectedAccount.lowercase() + it.authority.signatory.payload + .toHex(true) + .lowercase() == expectedAccount.lowercase() } } - val instructions = payloads.reversed().map { - it.instructions.cast().vec - }.flatten() // wasm isi in the end + val instructions = + payloads + .reversed() + .map { + it.instructions.cast().vec + }.flatten() // wasm isi in the end assertEquals(expectedIsiSize, instructions.size) return instructions diff --git a/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/ExampleTest.kt b/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/ExampleTest.kt index 99233d001..e2801817c 100644 --- a/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/ExampleTest.kt +++ b/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/ExampleTest.kt @@ -1,46 +1,39 @@ package jp.co.soramitsu.iroha2 import jp.co.soramitsu.iroha2.client.Iroha2Client +import jp.co.soramitsu.iroha2.generated.AssetType import jp.co.soramitsu.iroha2.query.QueryBuilder import jp.co.soramitsu.iroha2.testengine.ALICE_ACCOUNT_ID import jp.co.soramitsu.iroha2.testengine.ALICE_KEYPAIR import jp.co.soramitsu.iroha2.testengine.DefaultGenesis import jp.co.soramitsu.iroha2.testengine.IrohaContainer +import jp.co.soramitsu.iroha2.transaction.Register import kotlinx.coroutines.runBlocking import kotlinx.coroutines.time.withTimeout -import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Test import java.time.Duration -import kotlin.test.assertEquals +import kotlin.test.assertNotNull -@Disabled class ExampleTest { - /** * Test with manual Iroha2Client initialization */ @Test - fun `register domain instruction committed`(): Unit = runBlocking { - val container = IrohaContainer { - this.alias = "iroha$DEFAULT_P2P_PORT" - this.genesis = DefaultGenesis() - }.also { it.start() } + fun `register asset definition instruction committed`(): Unit = + runBlocking { + val container = + IrohaContainer { + this.alias = "iroha$DEFAULT_P2P_PORT" + this.genesis = DefaultGenesis() + }.also { it.start() } - val client = Iroha2Client(container.getApiUrl(), container.getP2pUrl()) + val client = Iroha2Client(listOf(container.getApiUrl()), container.config.chain, ALICE_ACCOUNT_ID, ALICE_KEYPAIR) - val domainId = "new_domain_name".asDomainId() - client.sendTransaction { - account(ALICE_ACCOUNT_ID) - registerDomain(domainId) - buildSigned(ALICE_KEYPAIR) - }.also { d -> - withTimeout(Duration.ofSeconds(10)) { d.await() } - } + val newAssetDefinitionId = "new_asset_definition#wonderland".asAssetDefinitionId() + client.submit(Register.assetDefinition(newAssetDefinitionId, AssetType.Store())).also { d -> + withTimeout(Duration.ofSeconds(10)) { d.await() } + } - QueryBuilder.findDomainById(domainId) - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> client.sendQuery(query) } - .also { result -> assertEquals(result.id, domainId) } - } + assertNotNull(client.submit(QueryBuilder.findAssetDefinitionById(newAssetDefinitionId))) + } } diff --git a/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/GenesisTest.kt b/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/GenesisTest.kt index e42c3b2c8..2f83cc7de 100644 --- a/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/GenesisTest.kt +++ b/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/GenesisTest.kt @@ -13,8 +13,11 @@ import jp.co.soramitsu.iroha2.testengine.IROHA_CONFIG_DELIMITER import jp.co.soramitsu.iroha2.testengine.IrohaContainer import jp.co.soramitsu.iroha2.testengine.IrohaTest import jp.co.soramitsu.iroha2.testengine.WithIroha +import jp.co.soramitsu.iroha2.transaction.Register import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.time.withTimeout import org.junit.jupiter.api.Test +import java.time.Duration import kotlin.test.assertEquals class GenesisTest : IrohaTest() { @@ -23,40 +26,42 @@ class GenesisTest : IrohaTest() { @Test @WithIroha(source = "src/test/resources/genesis.json", configs = ["LOG_LEVEL${IROHA_CONFIG_DELIMITER}TRACE"]) - fun `register asset instruction committed`(): Unit = runBlocking { - client.checkAliceAndBobExists() - } + fun `register asset instruction committed`(): Unit = + runBlocking { + client.checkAliceAndBobExists() + } @Test - fun `manual IrohaContainer initialization`(): Unit = runBlocking { - val path = javaClass.getResource("../../genesis.json")!!.path - val container = IrohaContainer { - this.alias = "iroha$DEFAULT_P2P_PORT" - this.genesisPath = path - }.also { it.start() } - - val client = Iroha2Client(container.getApiUrl(), container.getP2pUrl()) - client.checkAliceAndBobExists() - } + fun `manual IrohaContainer initialization`(): Unit = + runBlocking { + val path = javaClass.getResource("../../genesis.json")!!.path + val container = + IrohaContainer { + this.alias = "iroha$DEFAULT_P2P_PORT" + this.genesisPath = path + }.also { it.start() } + + val client = Iroha2Client(listOf(container.getApiUrl()), container.config.chain, ALICE_ACCOUNT_ID, ALICE_KEYPAIR) + client.checkAliceAndBobExists() + } @Test @WithIroha([DefaultGenesis::class], executorSource = "src/test/resources/executor.wasm") - fun `custom executor path`(): Unit = runBlocking { - val definitionId = AssetDefinitionId(DEFAULT_DOMAIN_ID, "XSTUSD".asName()) - client.tx { registerAssetDefinition(definitionId, AssetType.numeric()) } - - QueryBuilder.findAssetDefinitionById(definitionId) - .account(super.account) - .buildSigned(super.keyPair) - .let { query -> client.sendQuery(query) } - .also { assetDefinition -> assertEquals(assetDefinition.id, definitionId) } - } + fun `custom executor path`(): Unit = + runBlocking { + val definitionId = AssetDefinitionId(DEFAULT_DOMAIN_ID, "XSTUSD".asName()) + client.submit(Register.assetDefinition(definitionId, AssetType.numeric())).also { d -> + withTimeout(Duration.ofSeconds(10)) { d.await() } + } + + client + .submit(QueryBuilder.findAssetsDefinitions()) + .first { it.id == definitionId } + .also { assetDefinition -> assertEquals(assetDefinition.id, definitionId) } + } private suspend fun Iroha2Client.checkAliceAndBobExists() { - QueryBuilder.findAllAccounts() - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> this.sendQuery(query) } + submit(QueryBuilder.findAccounts()) .also { accounts -> assert(accounts.any { it.id == ALICE_ACCOUNT_ID }) } .also { accounts -> assert(accounts.any { it.id == BOB_ACCOUNT_ID }) } } diff --git a/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/InstructionsTest.kt b/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/InstructionsTest.kt index 01d7623a5..bfc70a76d 100644 --- a/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/InstructionsTest.kt +++ b/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/InstructionsTest.kt @@ -8,12 +8,26 @@ import jp.co.soramitsu.iroha2.annotations.Sdk import jp.co.soramitsu.iroha2.annotations.SdkTestId import jp.co.soramitsu.iroha2.client.Iroha2Client import jp.co.soramitsu.iroha2.generated.AccountId +import jp.co.soramitsu.iroha2.generated.AccountIdPredicateAtom +import jp.co.soramitsu.iroha2.generated.AccountIdProjectionOfPredicateMarker import jp.co.soramitsu.iroha2.generated.Asset import jp.co.soramitsu.iroha2.generated.AssetDefinitionId +import jp.co.soramitsu.iroha2.generated.AssetDefinitionIdProjectionOfPredicateMarker import jp.co.soramitsu.iroha2.generated.AssetId +import jp.co.soramitsu.iroha2.generated.AssetIdProjectionOfPredicateMarker +import jp.co.soramitsu.iroha2.generated.AssetProjectionOfPredicateMarker import jp.co.soramitsu.iroha2.generated.AssetType import jp.co.soramitsu.iroha2.generated.AssetValue +import jp.co.soramitsu.iroha2.generated.CanBurnAssetWithDefinition +import jp.co.soramitsu.iroha2.generated.CanModifyAccountMetadata +import jp.co.soramitsu.iroha2.generated.CanModifyAssetMetadata +import jp.co.soramitsu.iroha2.generated.CanModifyDomainMetadata +import jp.co.soramitsu.iroha2.generated.CanTransferAsset +import jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAsset import jp.co.soramitsu.iroha2.generated.DomainId +import jp.co.soramitsu.iroha2.generated.DomainIdPredicateAtom +import jp.co.soramitsu.iroha2.generated.DomainIdProjectionOfPredicateMarker +import jp.co.soramitsu.iroha2.generated.Json import jp.co.soramitsu.iroha2.generated.Metadata import jp.co.soramitsu.iroha2.generated.RoleId import jp.co.soramitsu.iroha2.query.QueryBuilder @@ -21,12 +35,14 @@ import jp.co.soramitsu.iroha2.testengine.ALICE_ACCOUNT_ID import jp.co.soramitsu.iroha2.testengine.ALICE_KEYPAIR import jp.co.soramitsu.iroha2.testengine.AliceAndBobEachHave100Xor import jp.co.soramitsu.iroha2.testengine.AliceHas100XorAndPermissionToMintAndBurn +import jp.co.soramitsu.iroha2.testengine.AliceHasPermissionToRegisterDomain import jp.co.soramitsu.iroha2.testengine.AliceHasPermissionToUnregisterDomain import jp.co.soramitsu.iroha2.testengine.AliceHasRoleWithAccessToBobsMetadata import jp.co.soramitsu.iroha2.testengine.AliceWithTestAssets import jp.co.soramitsu.iroha2.testengine.BOB_ACCOUNT_ID import jp.co.soramitsu.iroha2.testengine.BOB_KEYPAIR -import jp.co.soramitsu.iroha2.testengine.BobCanUnregisterAnyRole +import jp.co.soramitsu.iroha2.testengine.BobCanManageRoles +import jp.co.soramitsu.iroha2.testengine.BobHasPermissionToRegisterDomain import jp.co.soramitsu.iroha2.testengine.DEFAULT_ASSET_DEFINITION_ID import jp.co.soramitsu.iroha2.testengine.DEFAULT_ASSET_ID import jp.co.soramitsu.iroha2.testengine.DEFAULT_DOMAIN_ID @@ -42,10 +58,18 @@ import jp.co.soramitsu.iroha2.testengine.WithDomainTransferredToBob import jp.co.soramitsu.iroha2.testengine.WithIroha import jp.co.soramitsu.iroha2.testengine.WithIrohaManual import jp.co.soramitsu.iroha2.testengine.XorAndValAssets +import jp.co.soramitsu.iroha2.transaction.Burn +import jp.co.soramitsu.iroha2.transaction.Grant +import jp.co.soramitsu.iroha2.transaction.Mint +import jp.co.soramitsu.iroha2.transaction.Register +import jp.co.soramitsu.iroha2.transaction.RemoveKeyValue +import jp.co.soramitsu.iroha2.transaction.Revoke +import jp.co.soramitsu.iroha2.transaction.SetKeyValue +import jp.co.soramitsu.iroha2.transaction.Transfer +import jp.co.soramitsu.iroha2.transaction.Unregister import kotlinx.coroutines.runBlocking import kotlinx.coroutines.time.withTimeout import org.apache.commons.lang3.RandomStringUtils.randomAlphabetic -import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows @@ -56,39 +80,34 @@ import java.security.SecureRandom import java.util.UUID import kotlin.test.assertEquals import kotlin.test.assertFailsWith -import kotlin.test.assertFalse +import kotlin.test.assertNotNull +import kotlin.test.assertNull import kotlin.test.assertTrue import kotlin.test.fail @Owner("akostyuchenko") @Sdk("Java/Kotlin") class InstructionsTest : IrohaTest() { - @Test @Disabled // EXAMPLE @WithIrohaManual( ["http://localhost:8080", "http://localhost:8081", "http://localhost:8082", "http://localhost:8083"], - ["http://localhost:1337", "http://localhost:1338", "http://localhost:1339", "http://localhost:1340"], account = "7233bfc89dcbd68c19fde6ce6158225298ec1131b6a130d1aeb454c1ab5183c0${ACCOUNT_ID_DELIMITER}wonderland", "7233bfc89dcbd68c19fde6ce6158225298ec1131b6a130d1aeb454c1ab5183c0", "9ac47abf59b356e0bd7dcbbbb4dec080e302156a48ca907e47cb6aea1d32719e", ) - fun `register domain with manual initialized Iroha`(): Unit = runBlocking { - val domainId = "new_domain_name".asDomainId() - client.sendTransaction { - account(super.account) - registerDomain(domainId) - buildSigned(super.keyPair) - }.also { d -> - withTimeout(txTimeout) { d.await() } - } + fun `register domain with manual initialized Iroha`(): Unit = + runBlocking { + val domainId = "new_domain_name".asDomainId() + + client.submit(Register.domain(domainId)).also { d -> + withTimeout(txTimeout) { d.await() } + } - QueryBuilder.findDomainById(domainId) - .account(super.account) - .buildSigned(super.keyPair) - .let { query -> client.sendQuery(query) } - .also { result -> assertEquals(result.id, domainId) } - } + client + .submit(QueryBuilder.findDomainById(domainId))!! + .also { result -> assertEquals(result.id, domainId) } + } @Test @Disabled // EXAMPLE @@ -98,50 +117,41 @@ class InstructionsTest : IrohaTest() { privateKey = "9ac47abf59b356e0bd7dcbbbb4dec080e302156a48ca907e47cb6aea1d32719e", dockerComposeFile = "../../docker-compose/docker-compose.yaml", ) - fun `register domain with manual initialized Iroha via docker-compose`(): Unit = runBlocking { - val domainId = "new_domain_name".asDomainId() - client.sendTransaction { - account(super.account) - registerDomain(domainId) - buildSigned(super.keyPair) - }.also { d -> - withTimeout(txTimeout) { d.await() } - } + fun `register domain with manual initialized Iroha via docker-compose`(): Unit = + runBlocking { + val domainId = "new_domain_name".asDomainId() - QueryBuilder.findDomainById(domainId) - .account(super.account) - .buildSigned(super.keyPair) - .let { query -> client.sendQuery(query) } - .also { result -> assertEquals(result.id, domainId) } - } + client.submit(Register.domain(domainId)).also { d -> + withTimeout(txTimeout) { d.await() } + } + + client + .submit(QueryBuilder.findDomainById(domainId))!! + .also { result -> assertEquals(result.id, domainId) } + } /** * Using for docs generation */ // #region java_register_domain @Test - @WithIroha([DefaultGenesis::class]) + @WithIroha([AliceHasPermissionToRegisterDomain::class]) @Feature("Domains") @Story("Account registers a domain") @Permission("no_permission_required") @SdkTestId("register_domain") - fun `register domain`(): Unit = runBlocking { - val domainId = "new_domain_name".asDomainId() - - client.sendTransaction { - account(super.account) - registerDomain(domainId) - buildSigned(super.keyPair) - }.also { d -> - withTimeout(txTimeout) { d.await() } - } + fun `register domain`(): Unit = + runBlocking { + val domainId = "new_domain_name".asDomainId() - QueryBuilder.findDomainById(domainId) - .account(super.account) - .buildSigned(super.keyPair) - .let { query -> client.sendQuery(query) } - .also { result -> assertEquals(result.id, domainId) } - } + client.submit(Register.domain(domainId)).also { d -> + withTimeout(txTimeout) { d.await() } + } + + client + .submit(QueryBuilder.findDomainById(domainId))!! + .also { result -> assertEquals(result.id, domainId) } + } // #endregion java_register_domain /** @@ -154,22 +164,18 @@ class InstructionsTest : IrohaTest() { @Story("Account registers an account") @Permission("no_permission_required") @SdkTestId("register_account") - fun `register account`(): Unit = runBlocking { - val newAccountId = AccountId(DEFAULT_DOMAIN_ID, generatePublicKey()) - client.sendTransaction { - account(super.account) - registerAccount(newAccountId) - buildSigned(super.keyPair) - }.also { d -> - withTimeout(txTimeout) { d.await() } - } + fun `register account`(): Unit = + runBlocking { + val accountId = AccountId(DEFAULT_DOMAIN_ID, generatePublicKey()) + + client.submit(Register.account(accountId)).also { d -> + withTimeout(txTimeout) { d.await() } + } - QueryBuilder.findAccountById(newAccountId) - .account(super.account) - .buildSigned(super.keyPair) - .let { query -> client.sendQuery(query) } - .also { account -> assertEquals(account.id, newAccountId) } - } + client + .submit(QueryBuilder.findAccountById(accountId))!! + .also { account -> assertEquals(account.id, accountId) } + } // #endregion java_register_account @Test @@ -180,34 +186,25 @@ class InstructionsTest : IrohaTest() { @Permission("no_permission_required") @SdkTestId("register_account") @SdkTestId("unregister_account") - fun `register and unregister account`(): Unit = runBlocking { - val joeKeyPair = generateKeyPair() - val joeId = AccountId(DEFAULT_DOMAIN_ID, joeKeyPair.public.toIrohaPublicKey()) - client.tx { registerAccount(joeId) } - - QueryBuilder.findAccountById(joeId) - .account(super.account) - .buildSigned(super.keyPair) - .let { query -> client.sendQuery(query) } - .also { account -> assertEquals(account.id, joeId) } - - client.tx(joeId, joeKeyPair) { - grantPermissionToken( - Permissions.CanUnregisterAccount, - joeId.asJsonString(true), - ALICE_ACCOUNT_ID, - ) - unregisterAccount(joeId) - } - assertThrows { - runBlocking { - QueryBuilder.findAccountById(joeId) - .account(super.account) - .buildSigned(super.keyPair) - .let { query -> client.sendQuery(query) } + fun `register and unregister account`(): Unit = + runBlocking { + val joeKeyPair = generateKeyPair() + val joeId = AccountId(DEFAULT_DOMAIN_ID, joeKeyPair.public.toIrohaPublicKey()) + client.submit(Register.account(joeId)).also { d -> + withTimeout(txTimeout) { d.await() } } + + client + .submit(QueryBuilder.findAccountById(joeId))!! + .also { account -> assertEquals(account.id, joeId) } + + client.submitAs(joeId, joeKeyPair, Unregister.account(joeId)).also { d -> + withTimeout(txTimeout) { d.await() } + } + client + .submit(QueryBuilder.findAccountById(joeId)) + .also { account -> assertNull(account) } } - } @Test @WithIroha([DefaultGenesis::class]) @@ -217,39 +214,45 @@ class InstructionsTest : IrohaTest() { @Permission("no_permission_required") @SdkTestId("register_asset_definition") @SdkTestId("unregister_asset_definition") - fun `register and unregister asset`(): Unit = runBlocking { - val definitionId = AssetDefinitionId(DEFAULT_DOMAIN_ID, "XSTUSD".asName()) - client.tx { registerAssetDefinition(definitionId, AssetType.numeric()) } - - val assetId = AssetId(ALICE_ACCOUNT_ID, definitionId) - client.tx { registerAsset(assetId, AssetValue.Numeric(0.asNumeric())) } - - QueryBuilder.findAssetById(assetId) - .account(super.account) - .buildSigned(super.keyPair) - .let { query -> client.sendQuery(query) } - .also { asset -> assertEquals(asset.id, assetId) } - - client.tx { unregisterAsset(assetId) } - assertThrows { - runBlocking { - QueryBuilder.findAssetById(assetId) - .account(super.account) - .buildSigned(super.keyPair) - .let { query -> client.sendQuery(query) } - } - } + fun `register and unregister asset`(): Unit = + runBlocking { + val assetDefinitionId = AssetDefinitionId(DEFAULT_DOMAIN_ID, "XSTUSD".asName()) + client + .submit(Register.assetDefinition(assetDefinitionId, AssetType.numeric())) + .also { d -> + withTimeout(txTimeout) { d.await() } + } - client.tx { unregisterAssetDefinition(definitionId) } - assertThrows { - runBlocking { - QueryBuilder.findAssetDefinitionById(definitionId) - .account(super.account) - .buildSigned(super.keyPair) - .let { query -> client.sendQuery(query) } - } + val assetId = AssetId(ALICE_ACCOUNT_ID, assetDefinitionId) + client + .submit(Register.asset(assetId, AssetValue.Numeric(0.asNumeric()))) + .also { d -> + withTimeout(txTimeout) { d.await() } + } + + client + .submit(QueryBuilder.findAssetById(assetId))!! + .also { asset -> assertEquals(asset.id, assetId) } + + client + .submit(Unregister.asset(assetId)) + .also { d -> + withTimeout(txTimeout) { d.await() } + } + client + .submit(QueryBuilder.findAssetById(assetId)) + .also { asset -> assertNull(asset) } + + client + .submit(Unregister.assetDefinition(assetDefinitionId)) + .also { d -> + withTimeout(txTimeout) { d.await() } + } + client + .submit( + QueryBuilder.findAssetDefinitionById(assetDefinitionId), + ).also { definition -> assertNull(definition) } } - } @Test @WithIroha([AliceHasPermissionToUnregisterDomain::class]) @@ -257,18 +260,18 @@ class InstructionsTest : IrohaTest() { @Story("Account unregisters a domain") @Permission("CanUnregisterDomain") @SdkTestId("unregister_domain") - fun `unregister domain`(): Unit = runBlocking { - client.tx { unregisterDomain(AliceHasPermissionToUnregisterDomain.NEW_DOMAIN_ID) } - - assertThrows { - runBlocking { - QueryBuilder.findDomainById(AliceHasPermissionToUnregisterDomain.NEW_DOMAIN_ID) - .account(super.account) - .buildSigned(super.keyPair) - .let { query -> client.sendQuery(query) } - } + fun `unregister domain`(): Unit = + runBlocking { + client + .submit(Unregister.domain(AliceHasPermissionToUnregisterDomain.NEW_DOMAIN_ID)) + .also { d -> + withTimeout(txTimeout) { d.await() } + } + client + .submit( + QueryBuilder.findDomainById(AliceHasPermissionToUnregisterDomain.NEW_DOMAIN_ID), + ).also { domain -> assertNull(domain) } } - } @Test @WithIroha([DefaultGenesis::class]) @@ -276,44 +279,43 @@ class InstructionsTest : IrohaTest() { @Story("Account registers an account") @Permission("no_permission_required") @SdkTestId("register_account_with_metadata") - fun `register account with metadata`(): Unit = runBlocking { - val addressKey = "address".asName() - val phoneKey = "phone".asName() - val emailKey = "email".asName() - val cityKey = "city".asName() - val addressValue = "address" - val phoneValue = "phone" - val emailValue = "email" - val cityValue = "city" - val metadata = Metadata( - mapOf( - Pair(addressKey, addressValue), - Pair(phoneKey, phoneValue), - Pair(emailKey, emailValue), - Pair(cityKey, cityValue), - ), - ) - val newAccountId = AccountId(DEFAULT_DOMAIN_ID, generatePublicKey()) - client.sendTransaction { - account(super.account) - registerAccount(newAccountId, metadata) - buildSigned(super.keyPair) - }.also { d -> - withTimeout(txTimeout) { d.await() } - } + fun `register account with metadata`(): Unit = + runBlocking { + val addressKey = "address".asName() + val phoneKey = "phone".asName() + val emailKey = "email".asName() + val cityKey = "city".asName() + val addressValue = "address" + val phoneValue = "phone" + val emailValue = "email" + val cityValue = "city" + val metadata = + Metadata( + mapOf( + Pair(addressKey, Json.writeValue(addressValue)), + Pair(phoneKey, Json.writeValue(phoneValue)), + Pair(emailKey, Json.writeValue(emailValue)), + Pair(cityKey, Json.writeValue(cityValue)), + ), + ) + val newAccountId = AccountId(DEFAULT_DOMAIN_ID, generatePublicKey()) + client.submit(Register.account(newAccountId, metadata)).also { d -> + withTimeout(txTimeout) { d.await() } + } - val accountMetadata = QueryBuilder.findAccountById(newAccountId) - .account(super.account) - .buildSigned(super.keyPair) - .let { query -> client.sendQuery(query) } - .also { account -> assertEquals(account.id, newAccountId) } - .metadata - assertEquals(4, accountMetadata.sortedMapOfName.size) - assertEquals(addressValue, accountMetadata.sortedMapOfName[addressKey]) - assertEquals(phoneValue, accountMetadata.sortedMapOfName[phoneKey]) - assertEquals(emailValue, accountMetadata.sortedMapOfName[emailKey]) - assertEquals(cityValue, accountMetadata.sortedMapOfName[cityKey]) - } + val accountMetadata = + client + .submit( + QueryBuilder.findAccountById(newAccountId), + )!! + .also { account -> assertEquals(account.id, newAccountId) } + .metadata + assertEquals(4, accountMetadata.sortedMapOfName.size) + assertEquals(addressValue, accountMetadata.sortedMapOfName[addressKey]!!.readValue()) + assertEquals(phoneValue, accountMetadata.sortedMapOfName[phoneKey]!!.readValue()) + assertEquals(emailValue, accountMetadata.sortedMapOfName[emailKey]!!.readValue()) + assertEquals(cityValue, accountMetadata.sortedMapOfName[cityKey]!!.readValue()) + } /** * Using for docs generation @@ -325,23 +327,21 @@ class InstructionsTest : IrohaTest() { @Story("Account registers an asset definition") @Permission("no_permission_required") @SdkTestId("DEPRECATE CANDIDATE") - fun `register asset`(): Unit = runBlocking { - client.sendTransaction { - account(super.account) - registerAssetDefinition(DEFAULT_ASSET_DEFINITION_ID, AssetType.numeric()) - buildSigned(super.keyPair) - }.also { d -> - withTimeout(txTimeout) { d.await() } + fun `register asset`(): Unit = + runBlocking { + client.submit(Register.assetDefinition(DEFAULT_ASSET_DEFINITION_ID, AssetType.numeric())).also { d -> + withTimeout(txTimeout) { d.await() } + } + val assetDefinitions = + client.submit( + QueryBuilder.findAssetsDefinitions(), + ) + + assetDefinitions.find { it.id == DEFAULT_ASSET_DEFINITION_ID } ?: fail( + "Expected query response contains assetDefinition $DEFAULT_ASSET_DEFINITION_ID, " + + "but it is not. Response was $assetDefinitions", + ) } - val assetDefinitions = QueryBuilder.findAllAssetsDefinitions() - .account(super.account) - .buildSigned(super.keyPair) - .let { q -> client.sendQuery(q) } - - assertFalse { assetDefinitions.isEmpty() } - assetDefinitions.find { it.id == DEFAULT_ASSET_DEFINITION_ID } - ?: fail("Expected query response contains assetDefinition $DEFAULT_ASSET_DEFINITION_ID, but it is not. Response was $assetDefinitions") - } // #endregion java_register_asset @Test @@ -350,43 +350,57 @@ class InstructionsTest : IrohaTest() { @Story("Account registers an asset definition") @Permission("no_permission_required") @SdkTestId("register_asset_definition_with_store_value_type") - fun `store asset`(): Unit = runBlocking { - val pair1 = "key1".asName() to "bar" - val pair2 = "key2".asName() to "true" - val pair3 = "key3".asName() to "12345" - - client.tx { - registerAssetDefinition(DEFAULT_ASSET_DEFINITION_ID, AssetType.Store()) - setKeyValue(DEFAULT_ASSET_ID, pair1.first, pair1.second) - setKeyValue(DEFAULT_ASSET_ID, pair2.first, pair2.second) - setKeyValue(DEFAULT_ASSET_ID, pair3.first, pair3.second) - } + fun `store asset`(): Unit = + runBlocking { + val pair1 = "key1".asName() to "bar" + val pair2 = "key2".asName() to true + val pair3 = "key3".asName() to 12345 + + client + .submit( + Register.assetDefinition(DEFAULT_ASSET_DEFINITION_ID, AssetType.Store()), + SetKeyValue.asset(DEFAULT_ASSET_ID, pair1.first, pair1.second), + SetKeyValue.asset(DEFAULT_ASSET_ID, pair2.first, pair2.second), + SetKeyValue.asset(DEFAULT_ASSET_ID, pair3.first, pair3.second), + ).also { d -> + withTimeout(txTimeout) { d.await() } + } + + val asset = + client.submit( + QueryBuilder.findAssetById(DEFAULT_ASSET_ID), + ) - val findAssetByIdQry = QueryBuilder.findAssetById(DEFAULT_ASSET_ID) - .account(super.account) - .buildSigned(super.keyPair) - val asset = client.sendQuery(findAssetByIdQry) + assertEquals(DEFAULT_ASSET_ID.definition.name, asset?.id?.definition?.name) + assertEquals(DEFAULT_ASSET_ID.definition.domain, asset?.id?.definition?.domain) + when (val value = asset?.value) { + is AssetValue.Store -> { + assertEquals(pair1.second, value.metadata.sortedMapOfName[pair1.first]!!.readValue()) + assertEquals(pair2.second, value.metadata.sortedMapOfName[pair2.first]!!.readValue()) + assertEquals(pair3.second, value.metadata.sortedMapOfName[pair3.first]!!.readValue()) + } - assertEquals(DEFAULT_ASSET_ID.definition.name, asset.id.definition.name) - assertEquals(DEFAULT_ASSET_ID.definition.domain, asset.id.definition.domain) - when (val value = asset.value) { - is AssetValue.Store -> { - assertEquals(pair1.second, value.metadata.sortedMapOfName[pair1.first]) - assertEquals(pair2.second, value.metadata.sortedMapOfName[pair2.first]) - assertEquals(pair3.second, value.metadata.sortedMapOfName[pair3.first]) + else -> fail("Expected result asset value has type `AssetValue.Store`, but it was `${asset!!.value::class.simpleName}`") } - else -> fail("Expected result asset value has type `AssetValue.Store`, but it was `${asset.value::class.simpleName}`") - } + // try to find saved assets by domain name + val domainPredicate = + CompoundPredicateOfAsset.Atom( + AssetProjectionOfPredicateMarker.Id( + AssetIdProjectionOfPredicateMarker.Definition( + AssetDefinitionIdProjectionOfPredicateMarker.Domain( + DomainIdProjectionOfPredicateMarker.Atom( + DomainIdPredicateAtom.Equals(DEFAULT_DOMAIN_ID), + ), + ), + ), + ), + ) - // try to find saved assets by domain name - val findAssetsByDomainNameQry = QueryBuilder.findAssetsByDomainId(DEFAULT_DOMAIN_ID) - .account(super.account) - .buildSigned(super.keyPair) - val assetsByDomainName = client.sendQuery(findAssetsByDomainNameQry) - assertEquals(1, assetsByDomainName.size) - assertEquals(asset.id, assetsByDomainName.first().id) - } + val assetsByDomainName = client.submit(QueryBuilder.findAssets(domainPredicate)) + assertEquals(1, assetsByDomainName.size) + assertEquals(asset.id, assetsByDomainName.first().id) + } @Test @WithIroha( @@ -397,78 +411,87 @@ class InstructionsTest : IrohaTest() { @Story("Account metadata limit adjustment") @Permission("no_permission_required") @SdkTestId("account_metadata_limit_increased") - fun `account metadata limit increased`(): Unit = runBlocking { - client.tx { + fun `account metadata limit increased`(): Unit = + runBlocking { + val key = "key".asName() + val value = randomAlphabetic(5000) + // 5000 characters string would be rejected by Iroha with default WSV_ACCOUNT_METADATA_LIMITS config - setKeyValue(ALICE_ACCOUNT_ID, "key".asName(), randomAlphabetic(5000)) + client + .submit(SetKeyValue.account(ALICE_ACCOUNT_ID, key, Json.writeValue(value))) + .also { d -> + withTimeout(txTimeout) { d.await() } + } } - } @Test @Feature("Accounts") @Story("Account sets key value pair") - @Permission("CanSetKeyValueInDomain") - @SdkTestId("set_key_value_pair_for_another_account_domain_defenition") - @WithIroha([DefaultGenesis::class]) - fun `domain metadata set key value with permissions`(): Unit = runBlocking { - val domainId = DomainId(randomAlphabetic(10).asName()) - client.tx(BOB_ACCOUNT_ID, BOB_KEYPAIR) { - registerDomain(domainId) - grantPermissionToken( - Permissions.CanSetKeyValueInDomain, - domainId.asJsonString(), - ALICE_ACCOUNT_ID, - ) - } + @Permission("CanModifyDomainMetadata") + @SdkTestId("modify_metadata_for_another_account_domain_definition") + @WithIroha([BobHasPermissionToRegisterDomain::class]) + fun `domain metadata set key value with permissions`(): Unit = + runBlocking { + val domainId = DomainId(randomAlphabetic(10).asName()) + + client + .submitAs( + BOB_ACCOUNT_ID, + BOB_KEYPAIR, + Register.domain(domainId), + Grant.accountPermission(CanModifyDomainMetadata(domainId), ALICE_ACCOUNT_ID), + ).also { d -> + withTimeout(txTimeout) { d.await() } + } - client.tx(ALICE_ACCOUNT_ID, ALICE_KEYPAIR) { - setKeyValue(domainId, randomAlphabetic(10).asName(), randomAlphabetic(10)) + client.submit(SetKeyValue.domain(domainId, randomAlphabetic(10).asName(), Json.writeValue(randomAlphabetic(10)))).also { d -> + withTimeout(txTimeout) { d.await() } + } } - } @Test @WithIroha([DefaultGenesis::class]) @Feature("Accounts") @Story("Account sets key value pair") - @Permission("CanSetKeyValueInUserAsset") - @SdkTestId("set_key_value_pair_for_another_account_asset_definition") - fun `grant access to asset key-value and then revoke`(): Unit = runBlocking { - val aliceAssetId = DEFAULT_ASSET_ID - - client.tx { - registerAssetDefinition(aliceAssetId.definition, AssetType.Store()) - // grant by Alice to Bob permissions to set key value in Asset.Store - grantPermissionToken( - Permissions.CanSetKeyValueInUserAsset, - aliceAssetId.asJsonString(true), - BOB_ACCOUNT_ID, - ) - } - client.tx(BOB_ACCOUNT_ID, BOB_KEYPAIR) { - setKeyValue(aliceAssetId, "foo".asName(), "bar") - } + @Permission("CanModifyAssetMetadata") + @SdkTestId("modify_metadata_for_another_account_asset_definition") + fun `grant access to asset key-value and then revoke`(): Unit = + runBlocking { + val aliceAssetId = DEFAULT_ASSET_ID + val permission = CanModifyAssetMetadata(aliceAssetId) + + client + .submit( + Register.assetDefinition(aliceAssetId.definition, AssetType.Store()), + // grant by Alice to Bob permissions to set key value in Asset.Store + Grant.accountPermission( + permission, + BOB_ACCOUNT_ID, + ), + ).also { d -> + withTimeout(txTimeout) { d.await() } + } + client.submitAs(BOB_ACCOUNT_ID, BOB_KEYPAIR, SetKeyValue.asset(aliceAssetId, "foo".asName(), "bar")).also { d -> + withTimeout(txTimeout) { d.await() } + } - val query = QueryBuilder.findAssetById(aliceAssetId) - .account(super.account) - .buildSigned(super.keyPair) - val asset = client.sendQuery(query) + val asset = client.submit(QueryBuilder.findAssetById(aliceAssetId)) - assertEquals(aliceAssetId.definition.name, asset.id.definition.name) - assertEquals(aliceAssetId.definition.domain, asset.id.definition.domain) - when (val value = asset.value) { - is AssetValue.Store -> assertEquals("bar", value.metadata.sortedMapOfName["foo".asName()]) - else -> fail("Expected result asset value has type `AssetValue.Store`, but it was `${asset.value::class.simpleName}`") - } + assertEquals(aliceAssetId.definition.name, asset?.id?.definition?.name) + assertEquals(aliceAssetId.definition.domain, asset?.id?.definition?.domain) + when (val value = asset?.value) { + is AssetValue.Store -> assertEquals("bar", value.metadata.sortedMapOfName["foo".asName()]!!.readValue()) + else -> fail("Expected result asset value has type `AssetValue.Store`, but it was `${asset!!.value::class.simpleName}`") + } - client.tx { - revokeSetKeyValueAsset(aliceAssetId, BOB_ACCOUNT_ID) + client.submit(Revoke.accountPermission(permission, BOB_ACCOUNT_ID)).also { d -> + withTimeout(txTimeout) { d.await() } + } + client + .submit( + QueryBuilder.findPermissionsByAccountId(BOB_ACCOUNT_ID).signAs(BOB_ACCOUNT_ID, BOB_KEYPAIR), + ).also { permissions -> assertTrue { permissions.isEmpty() } } } - QueryBuilder.findPermissionsByAccountId(BOB_ACCOUNT_ID) - .account(BOB_ACCOUNT_ID) - .buildSigned(BOB_KEYPAIR) - .let { client.sendQuery(it) } - .also { permissions -> assertTrue { permissions.isEmpty() } } - } /** * Using for docs generation @@ -480,24 +503,40 @@ class InstructionsTest : IrohaTest() { @Story("Account mints an asset") @Permission("no_permission_required") @SdkTestId("mint_asset_for_account_in_same_domain") - fun `mint asset`(): Unit = runBlocking { - client.sendTransaction { - account(super.account) - registerAssetDefinition(DEFAULT_ASSET_DEFINITION_ID, AssetType.numeric()) - mintAsset(DEFAULT_ASSET_ID, 5) - buildSigned(super.keyPair) - }.also { d -> - withTimeout(txTimeout) { d.await() } - } + fun `mint asset`(): Unit = + runBlocking { + client + .submit( + Register.assetDefinition(DEFAULT_ASSET_DEFINITION_ID, AssetType.numeric()), + Mint.asset(DEFAULT_ASSET_ID, BigDecimal(5)), + ).also { d -> + withTimeout(txTimeout) { d.await() } + } - QueryBuilder.findAssetsByAccountId(ALICE_ACCOUNT_ID) - .account(super.account) - .buildSigned(super.keyPair) - .let { query -> client.sendQuery(query) } - .also { result -> - assertEquals(5, result.get(DEFAULT_ASSET_ID)?.value?.cast()?.numeric?.asInt()) + val byAccountIdFilter = + CompoundPredicateOfAsset.Atom( + AssetProjectionOfPredicateMarker.Id( + AssetIdProjectionOfPredicateMarker.Account( + AccountIdProjectionOfPredicateMarker.Atom( + AccountIdPredicateAtom.Equals( + ALICE_ACCOUNT_ID, + ), + ), + ), + ), + ) + client.submit(QueryBuilder.findAssets(byAccountIdFilter)).also { result -> + assertEquals( + 5, + result + .get(DEFAULT_ASSET_ID)!! + .value + .cast() + .numeric + .asInt(), + ) } - } + } // #endregion java_mint_asset @Test @@ -506,20 +545,52 @@ class InstructionsTest : IrohaTest() { @Story("Account burns an asset") @Permission("no_permission_required") @SdkTestId("burn_asset_for_account_in_same_domain") - fun `burn asset`(): Unit = runBlocking { - // check balance before burn - val query = QueryBuilder.findAssetsByAccountId(ALICE_ACCOUNT_ID) - .account(super.account) - .buildSigned(super.keyPair) - var result = client.sendQuery(query) - assertEquals(100, result.get(DEFAULT_ASSET_ID)?.value?.cast()?.numeric?.asInt()) + fun `burn asset`(): Unit = + runBlocking { + val byAccountIdFilter = + CompoundPredicateOfAsset.Atom( + AssetProjectionOfPredicateMarker.Id( + AssetIdProjectionOfPredicateMarker.Account( + AccountIdProjectionOfPredicateMarker.Atom( + AccountIdPredicateAtom.Equals( + ALICE_ACCOUNT_ID, + ), + ), + ), + ), + ) + // check balance before burn + val query = + QueryBuilder + .findAssets(byAccountIdFilter) + .signAs(client.authority, client.keyPair) + var result = client.submit(query) + assertEquals( + 100, + result + .get(DEFAULT_ASSET_ID)!! + .value + .cast() + .numeric + .asInt(), + ) - client.tx { burnAsset(DEFAULT_ASSET_ID, 50) } + client.submit(Burn.asset(DEFAULT_ASSET_ID, BigDecimal(50))).also { d -> + withTimeout(txTimeout) { d.await() } + } - // check balance after burn - result = client.sendQuery(query) - assertEquals(50, result.get(DEFAULT_ASSET_ID)?.value?.cast()?.numeric?.asInt()) - } + // check balance after burn + result = client.submit(query) + assertEquals( + 50, + result + .get(DEFAULT_ASSET_ID)!! + .value + .cast() + .numeric + .asInt(), + ) + } @Test @WithIroha([DefaultGenesis::class]) @@ -527,24 +598,47 @@ class InstructionsTest : IrohaTest() { @Story("Account burns an asset") @Permission("CanBurnAssetsWithDefinition") @SdkTestId("burn_other_user_xasset") - fun `burn other user asset`(): Unit = runBlocking { - client.tx { - registerAssetDefinition(DEFAULT_ASSET_DEFINITION_ID, AssetType.numeric()) - mintAsset(DEFAULT_ASSET_ID, 100) - grantPermissionToken( - Permissions.CanBurnAssetWithDefinition, - DEFAULT_ASSET_DEFINITION_ID.asJsonString(), - BOB_ACCOUNT_ID, + fun `burn other user asset`(): Unit = + runBlocking { + client + .submit( + Register.assetDefinition(DEFAULT_ASSET_DEFINITION_ID, AssetType.numeric()), + Mint.asset(DEFAULT_ASSET_ID, BigDecimal(100)), + Grant.accountPermission( + CanBurnAssetWithDefinition(DEFAULT_ASSET_DEFINITION_ID), + BOB_ACCOUNT_ID, + ), + ).also { d -> + withTimeout(txTimeout) { d.await() } + } + + client.submit(Burn.asset(DEFAULT_ASSET_ID, BigDecimal(50))).also { d -> + withTimeout(txTimeout) { d.await() } + } + + val byAccountIdFilter = + CompoundPredicateOfAsset.Atom( + AssetProjectionOfPredicateMarker.Id( + AssetIdProjectionOfPredicateMarker.Account( + AccountIdProjectionOfPredicateMarker.Atom( + AccountIdPredicateAtom.Equals( + ALICE_ACCOUNT_ID, + ), + ), + ), + ), + ) + val result = client.submit(QueryBuilder.findAssets(byAccountIdFilter)) + assertEquals( + 50, + result + .get(DEFAULT_ASSET_ID)!! + .value + .cast() + .numeric + .asInt(), ) } - client.tx(BOB_ACCOUNT_ID, BOB_KEYPAIR) { burnAsset(DEFAULT_ASSET_ID, 50) } - - val result = QueryBuilder.findAssetsByAccountId(ALICE_ACCOUNT_ID) - .account(super.account) - .buildSigned(super.keyPair) - .let { query -> client.sendQuery(query) } - assertEquals(50, result.get(DEFAULT_ASSET_ID)?.value?.cast()?.numeric?.asInt()) - } @Test @WithIroha([DefaultGenesis::class]) @@ -552,71 +646,82 @@ class InstructionsTest : IrohaTest() { @Story("Account changes account metadata") @Permission("CanSetKeyValueInAccount") @SdkTestId("change_account_metadata_by_granted_account") - fun `change user account metadata`(): Unit = runBlocking { - val saltKey = "salt" - - // grant permission to Alice to change Bob's account metadata - client.sendTransaction { - account(BOB_ACCOUNT_ID) - grantPermissionToken( - Permissions.CanSetKeyValueInAccount, - BOB_ACCOUNT_ID.asJsonString(true), - ALICE_ACCOUNT_ID, - ) - buildSigned(BOB_KEYPAIR) - }.also { d -> - withTimeout(txTimeout) { d.await() } - } + fun `change user account metadata`(): Unit = + runBlocking { + val saltKey = "salt" + + // grant permission to Alice to change Bob's account metadata + client + .submitAs( + BOB_ACCOUNT_ID, + BOB_KEYPAIR, + Grant.accountPermission( + CanModifyAccountMetadata(BOB_ACCOUNT_ID), + ALICE_ACCOUNT_ID, + ), + ).also { d -> + withTimeout(txTimeout) { d.await() } + } - // add/update salt value in Bob's account metadata - val salt = randomAlphabetic(10) - client.tx { setKeyValue(BOB_ACCOUNT_ID, saltKey.asName(), salt) } + // add/update salt value in Bob's account metadata + val salt = randomAlphabetic(10) + client + .submit(SetKeyValue.account(BOB_ACCOUNT_ID, saltKey.asName(), salt)) + .also { d -> + withTimeout(txTimeout) { d.await() } + } - // check new metadata in Bob's account - val saltQuery = QueryBuilder.findAccountById(BOB_ACCOUNT_ID) - .account(super.account) - .buildSigned(super.keyPair) - val bobAccountMetadata = client.sendQuery(saltQuery).metadata - assertEquals(salt, bobAccountMetadata.sortedMapOfName["salt".asName()]) - } + // check new metadata in Bob's account + val bobAccountMetadata = client.submit(QueryBuilder.findAccountById(BOB_ACCOUNT_ID))!!.metadata.sortedMapOfName + assertEquals(salt, bobAccountMetadata["salt".asName()]!!.readValue()) + } @Test - @WithIroha([AliceAndBobEachHave100Xor::class]) + @WithIroha([AliceAndBobEachHave100Xor::class, AliceHasPermissionToRegisterDomain::class]) @Feature("Assets") @Story("Account transfers assets") @Permission("CanTransferUserAsset") @SdkTestId("transfer_asset") - fun `transfer asset`(): Unit = runBlocking { - val aliceAssetId = DEFAULT_ASSET_ID - val bobAssetId = AliceAndBobEachHave100Xor.BOB_ASSET_ID + fun `transfer asset`(): Unit = + runBlocking { + val aliceAssetId = DEFAULT_ASSET_ID + val bobAssetId = AliceAndBobEachHave100Xor.BOB_ASSET_ID - assertEquals(100, getAccountAmount(aliceAssetId)) - assertEquals(100, getAccountAmount(bobAssetId)) + assertEquals(100, getAccountAmount(aliceAssetId)) + assertEquals(100, getAccountAmount(bobAssetId)) - client.tx { transferAsset(aliceAssetId, 40, BOB_ACCOUNT_ID) } - assertEquals(60, getAccountAmount(aliceAssetId)) - assertEquals(140, getAccountAmount(bobAssetId)) + client.submit(Transfer.asset(aliceAssetId, BigDecimal(40), BOB_ACCOUNT_ID)).also { d -> + withTimeout(txTimeout) { d.await() } + } + assertEquals(60, getAccountAmount(aliceAssetId)) + assertEquals(140, getAccountAmount(bobAssetId)) - client.tx(BOB_ACCOUNT_ID, BOB_KEYPAIR) { transferAsset(bobAssetId, 40, ALICE_ACCOUNT_ID) } - assertEquals(100, getAccountAmount(aliceAssetId)) - assertEquals(100, getAccountAmount(bobAssetId)) + client.submitAs(BOB_ACCOUNT_ID, BOB_KEYPAIR, Transfer.asset(bobAssetId, BigDecimal(40), ALICE_ACCOUNT_ID)).also { d -> + withTimeout(txTimeout) { d.await() } + } + assertEquals(100, getAccountAmount(aliceAssetId)) + assertEquals(100, getAccountAmount(bobAssetId)) - val joeDomain = "joe_domain".asDomainId() - client.tx { registerDomain(joeDomain) } + val joeDomain = "joe_domain".asDomainId() + client.submit(Register.domain(joeDomain)).also { d -> + withTimeout(txTimeout) { d.await() } + } - val joeKeyPair = generateKeyPair() - val joeId = AccountId(joeDomain, joeKeyPair.public.toIrohaPublicKey()) - registerAccount(joeId) + val joeKeyPair = generateKeyPair() + val joeId = AccountId(joeDomain, joeKeyPair.public.toIrohaPublicKey()) + client.submit(Register.account(joeId)).also { d -> + withTimeout(txTimeout) { d.await() } + } - client.tx { - grantPermissionToken(Permissions.CanTransferUserAssetsToken, aliceAssetId.asJsonString(true), joeId) - } - client.tx(account = joeId, joeKeyPair) { - transferAsset(aliceAssetId, 40, BOB_ACCOUNT_ID) + client.submit(Grant.accountPermission(CanTransferAsset(aliceAssetId), joeId)).also { d -> + withTimeout(txTimeout) { d.await() } + } + client.submitAs(BOB_ACCOUNT_ID, BOB_KEYPAIR, Transfer.asset(aliceAssetId, BigDecimal(40), BOB_ACCOUNT_ID)).also { d -> + withTimeout(txTimeout) { d.await() } + } + assertEquals(60, getAccountAmount(aliceAssetId)) + assertEquals(140, getAccountAmount(bobAssetId)) } - assertEquals(60, getAccountAmount(aliceAssetId)) - assertEquals(140, getAccountAmount(bobAssetId)) - } @Test @WithIroha([StoreAssetWithMetadata::class]) @@ -624,18 +729,29 @@ class InstructionsTest : IrohaTest() { @Story("Account removes asset metadata") @Permission("no_permission_required") @SdkTestId("remove_asset_metadata") - fun `remove asset`(): Unit = runBlocking { - val assetId = StoreAssetWithMetadata.ASSET_ID - val assetKey = StoreAssetWithMetadata.ASSET_KEY - - val assetBefore = getAsset(assetId) - val value = assetBefore.value.cast().metadata.sortedMapOfName[assetKey]?.fromJsonString() - assertEquals(StoreAssetWithMetadata.ASSET_VALUE, value) - client.tx { removeKeyValue(assetId, assetKey) } + fun `remove asset`(): Unit = + runBlocking { + val assetId = StoreAssetWithMetadata.ASSET_ID + val assetKey = StoreAssetWithMetadata.ASSET_KEY + + val assetBefore = getAsset(assetId) + val value = + assetBefore.value + .cast() + .metadata.sortedMapOfName[assetKey]!! + assertEquals(StoreAssetWithMetadata.ASSET_VALUE, value.readValue()) + client.submit(RemoveKeyValue.asset(assetId, assetKey)).also { d -> + withTimeout(txTimeout) { d.await() } + } - val assetAfter = getAsset(assetId) - assert(assetAfter.value.cast().metadata.sortedMapOfName.isEmpty()) - } + val assetAfter = getAsset(assetId) + assert( + assetAfter.value + .cast() + .metadata.sortedMapOfName + .isEmpty(), + ) + } @Test @WithIroha([DefaultGenesis::class]) @@ -647,56 +763,78 @@ class InstructionsTest : IrohaTest() { @Story("Account burns an asset") @Permission("no_permission_required") @SdkTestId("burn_fixed_asset") - fun `check assets with type Fixed are properly minted and burned`(): Unit = runBlocking { - client.tx { registerAssetDefinition(DEFAULT_ASSET_DEFINITION_ID, AssetType.numeric()) } - - // counter to track all changes in balance - var counter = BigDecimal.ZERO - // count of changes (both mint and burn) - val probes = 20 - val random = SecureRandom() - // return positive random number what is never greater than counter - val getFpNumber = { - BigDecimal(random.nextDouble() + random.nextInt()) - .abs() - .stripTrailingZeros() - .remainder(counter, MathContext.DECIMAL64) - .setScale(random.nextInt(DEFAULT_SCALE), RoundingMode.DOWN) - } - val mintAsset: suspend (BigDecimal) -> Unit = { - client.tx { mintAsset(DEFAULT_ASSET_ID, it) } - counter += it - } - val burnAsset: suspend (BigDecimal) -> Unit = { - client.tx { burnAsset(DEFAULT_ASSET_ID, it) } - counter -= it - } - val assertBalance: suspend (BigDecimal) -> Unit = { expectedBalance -> - QueryBuilder.findAssetsByAccountId(ALICE_ACCOUNT_ID) - .account(super.account) - .buildSigned(super.keyPair) - .let { query -> client.sendQuery(query) } - .let { account -> account.get(DEFAULT_ASSET_ID)?.value } - .let { value -> - value?.cast()?.numeric?.asBigDecimal() ?: BigDecimal.ZERO - }.also { actualBalance -> - assertTrue("expected value `$expectedBalance`, but was `$actualBalance`") { - expectedBalance.compareTo(actualBalance) == 0 - } + fun `check assets with type Fixed are properly minted and burned`(): Unit = + runBlocking { + client.submit(Register.assetDefinition(DEFAULT_ASSET_DEFINITION_ID, AssetType.numeric())).also { d -> + withTimeout(txTimeout) { d.await() } + } + + // counter to track all changes in balance + var counter = BigDecimal.ZERO + // count of changes (both mint and burn) + val probes = 20 + val random = SecureRandom() + // return positive random number what is never greater than counter + val getFpNumber = { + BigDecimal(random.nextDouble() + random.nextInt()) + .abs() + .stripTrailingZeros() + .remainder(counter, MathContext.DECIMAL64) + .setScale(random.nextInt(DEFAULT_SCALE), RoundingMode.DOWN) + } + val mintAsset: suspend (BigDecimal) -> Unit = { + client.submit(Mint.asset(DEFAULT_ASSET_ID, it)).also { d -> + withTimeout(txTimeout) { d.await() } } - } - assertBalance(counter) - mintAsset(BigDecimal.TEN) - assertBalance(counter) - for (i in 0..probes) { - if (i % 2 == 0) { - mintAsset(getFpNumber()) - } else { - burnAsset(getFpNumber()) + counter += it + } + val burnAsset: suspend (BigDecimal) -> Unit = { + client.submit(Burn.asset(DEFAULT_ASSET_ID, it)).also { d -> + withTimeout(txTimeout) { d.await() } + } + counter -= it + } + val byAccountIdFilter = + CompoundPredicateOfAsset.Atom( + AssetProjectionOfPredicateMarker.Id( + AssetIdProjectionOfPredicateMarker.Account( + AccountIdProjectionOfPredicateMarker.Atom( + AccountIdPredicateAtom.Equals( + ALICE_ACCOUNT_ID, + ), + ), + ), + ), + ) + val assertBalance: suspend (BigDecimal) -> Unit = { expectedBalance -> + val asset = + client + .submit(QueryBuilder.findAssets(byAccountIdFilter)) + .get(DEFAULT_ASSET_ID) + + asset + ?.value + ?.cast() + ?.numeric + ?.asBigDecimal() ?: BigDecimal.ZERO + .also { actualBalance -> + assertTrue("expected value `$expectedBalance`, but was `$actualBalance`") { + expectedBalance.compareTo(actualBalance) == 0 + } + } } assertBalance(counter) + mintAsset(BigDecimal.TEN) + assertBalance(counter) + for (i in 0..probes) { + if (i % 2 == 0) { + mintAsset(getFpNumber()) + } else { + burnAsset(getFpNumber()) + } + assertBalance(counter) + } } - } @Test @WithIroha([DefaultGenesis::class]) @@ -704,40 +842,43 @@ class InstructionsTest : IrohaTest() { @Story("Account registers an asset definition") @Permission("no_permission_required") @SdkTestId("register_asset_definition_with_metadata") - fun `register asset with metadata`(): Unit = runBlocking { - val assetKey = "asset_metadata_key".asName() - val assetValue = "some string value" - val metadata = Metadata(mapOf(assetKey to assetValue)) + fun `register asset with metadata`(): Unit = + runBlocking { + val assetKey = "asset_metadata_key".asName() + val assetValue = "some string value" + val metadata = Metadata(mapOf(assetKey to Json.writeValue(assetValue))) + + client.submit(Register.assetDefinition(DEFAULT_ASSET_DEFINITION_ID, AssetType.Store(), metadata = metadata)).also { d -> + withTimeout(txTimeout) { d.await() } + } - client.tx { - registerAssetDefinition(DEFAULT_ASSET_DEFINITION_ID, AssetType.Store(), metadata) + client + .submit(QueryBuilder.findAssetDefinitionById(DEFAULT_ASSET_DEFINITION_ID))!! + .also { assertEquals(assetValue, it.metadata.sortedMapOfName[assetKey]!!.readValue()) } } - QueryBuilder.findAssetDefinitionKeyValueByIdAndKey(DEFAULT_ASSET_DEFINITION_ID, assetKey) - .account(super.account) - .buildSigned(super.keyPair) - .let { query -> client.sendQuery(query) } - .also { value -> - Assertions.assertEquals(value, assetValue) - } - } - @Test - @WithIroha([DefaultGenesis::class]) + @WithIroha([DefaultGenesis::class, AliceHasPermissionToRegisterDomain::class]) @Feature("Domains") @Story("Account registers a domain") @Permission("no_permission_required") @SdkTestId("register_existence_domain") - fun `double domain registration should fail`(): Unit = runBlocking { - val domainId = UUID.randomUUID().toString().asDomainId() - client.tx { registerDomain(domainId) } - assertThrows { - runBlocking { client.tx { registerDomain(domainId) } } + fun `double domain registration should fail`(): Unit = + runBlocking { + val domainId = UUID.randomUUID().toString().asDomainId() + client.submit(Register.domain(domainId)).also { d -> + withTimeout(txTimeout) { d.await() } + } + assertThrows { + runBlocking { client.submit(Register.domain(domainId)) } + .also { d -> + withTimeout(txTimeout) { d.await() } + } + } } - } @Test - @WithIroha([BobCanUnregisterAnyRole::class]) + @WithIroha([BobCanManageRoles::class, BobHasPermissionToRegisterDomain::class]) @Feature("Assets") @Story("Account registers an asset definition") @SdkTestId("register_asset_definition_with_store_value_type") @@ -750,60 +891,74 @@ class InstructionsTest : IrohaTest() { @Permission("CanSetKeyValueInUserAsset") @Feature("Accounts") @SdkTestId("set_key_value_in_foreign_asset_after_granting_role") - fun `register and grant role to account and then revoke it`(): Unit = runBlocking { - val assetId = AssetId(BOB_ACCOUNT_ID, DEFAULT_ASSET_DEFINITION_ID) - client.tx(BOB_ACCOUNT_ID, BOB_KEYPAIR) { - registerAssetDefinition(DEFAULT_ASSET_DEFINITION_ID, AssetType.Store()) - } + fun `register and grant role to account and then revoke it`(): Unit = + runBlocking { + val domainId = "Kingdom".asDomainId() + val assetDefinitionName = AssetDefinitionId(domainId, "kita".asName()) + client + .submitAs( + BOB_ACCOUNT_ID, + BOB_KEYPAIR, + Register.domain(domainId), + Register.assetDefinition(assetDefinitionName, AssetType.Store()), + ).also { d -> + withTimeout(txTimeout) { d.await() } + } - val roleId = RoleId("BOB_ASSET_ACCESS".asName()) - client.tx(BOB_ACCOUNT_ID, BOB_KEYPAIR) { - registerRole(roleId) - grantRole(roleId, ALICE_ACCOUNT_ID) - setKeyValue(assetId, "key".asName(), "value") - } + val assetId = AssetId(BOB_ACCOUNT_ID, assetDefinitionName) + val roleId = RoleId("BOB_ASSET_ACCESS".asName()) + client + .submitAs( + BOB_ACCOUNT_ID, + BOB_KEYPAIR, + Register.role(BOB_ACCOUNT_ID, roleId), + Grant.accountRole(roleId, ALICE_ACCOUNT_ID), + SetKeyValue.asset(assetId, "key".asName(), "value"), + ).also { d -> + withTimeout(txTimeout) { d.await() } + } - QueryBuilder.findAssetById(assetId) - .account(super.account) - .buildSigned(super.keyPair) - .let { query -> client.sendQuery(query) } - .also { asset -> - assertTrue( - asset.value.cast() - .metadata.sortedMapOfName - .containsValue("value"), - ) - } + client + .submit(QueryBuilder.findAssetById(assetId)) + .also { asset -> + assertEquals( + asset!! + .value + .cast() + .metadata.sortedMapOfName["key".asName()]!! + .readValue(), + "value", + ) + } - client.tx(BOB_ACCOUNT_ID, BOB_KEYPAIR) { - revokeRole(roleId, ALICE_ACCOUNT_ID) - } - QueryBuilder.findRolesByAccountId(ALICE_ACCOUNT_ID) - .account(BOB_ACCOUNT_ID) - .buildSigned(BOB_KEYPAIR) - .let { query -> client.sendQuery(query) } - .also { roles -> - assertTrue( - roles.isEmpty(), - ) + client.submitAs(BOB_ACCOUNT_ID, BOB_KEYPAIR, Revoke.accountRole(roleId, ALICE_ACCOUNT_ID)).also { d -> + withTimeout(txTimeout) { d.await() } } - QueryBuilder.findAllRoles() - .account(BOB_ACCOUNT_ID) - .buildSigned(BOB_KEYPAIR) - .let { query -> client.sendQuery(query) } - .firstOrNull { it.id == roleId } - .also { Assertions.assertNotNull(it) } - - client.tx(BOB_ACCOUNT_ID, BOB_KEYPAIR) { - unregisterRole(roleId) + client + .submit(QueryBuilder.findRolesByAccountId(ALICE_ACCOUNT_ID).signAs(BOB_ACCOUNT_ID, BOB_KEYPAIR)) + .also { roles -> + assertTrue( + roles.isEmpty(), + ) + } + client + .submit(QueryBuilder.findRoles().signAs(BOB_ACCOUNT_ID, BOB_KEYPAIR)) + .firstOrNull { it.id == roleId } + .also { assertNotNull(it) } + + client + .submitAs( + BOB_ACCOUNT_ID, + BOB_KEYPAIR, + Unregister.role(roleId), + ).also { d -> + withTimeout(txTimeout) { d.await() } + } + client + .submit(QueryBuilder.findRoles().signAs(BOB_ACCOUNT_ID, BOB_KEYPAIR)) + .firstOrNull { it.id == roleId } + .also { assertNull(it) } } - QueryBuilder.findAllRoles() - .account(BOB_ACCOUNT_ID) - .buildSigned(BOB_KEYPAIR) - .let { query -> client.sendQuery(query) } - .firstOrNull { it.id == roleId } - .also { Assertions.assertNull(it) } - } @Test @WithIroha( @@ -822,106 +977,113 @@ class InstructionsTest : IrohaTest() { ) @Feature("Configurations") @Permission("no_permission_required") - fun `multiple genesis`(): Unit = runBlocking { - val assetId = StoreAssetWithMetadata.ASSET_ID - val assetKey = StoreAssetWithMetadata.ASSET_KEY - - val assetBefore = getAsset(assetId) - assertEquals( - StoreAssetWithMetadata.ASSET_VALUE, - assetBefore.value.cast().metadata.sortedMapOfName[assetKey]?.fromJsonString(), - ) - QueryBuilder.findAccountById(ALICE_ACCOUNT_ID) - .account(super.account) - .buildSigned(super.keyPair) - .let { query -> client.sendQuery(query) } - .also { alice -> - assertEquals( - RubbishToTestMultipleGenesis.ALICE_KEY_VALUE, - alice.metadata.sortedMapOfName[RubbishToTestMultipleGenesis.ALICE_KEY_VALUE.asName()]?.fromJsonString(), - ) - } - QueryBuilder.findAccountById(BOB_ACCOUNT_ID) - .account(BOB_ACCOUNT_ID) - .buildSigned(BOB_KEYPAIR) - .let { query -> client.sendQuery(query) } - .also { bob -> - assertEquals( - RubbishToTestMultipleGenesis.BOB_KEY_VALUE, - bob.metadata.sortedMapOfName[RubbishToTestMultipleGenesis.BOB_KEY_VALUE.asName()]?.fromJsonString(), - ) - } - QueryBuilder.findDomainById(DEFAULT_DOMAIN_ID) - .account(super.account) - .buildSigned(super.keyPair) - .let { query -> client.sendQuery(query) } - .also { domain -> - assertEquals( - RubbishToTestMultipleGenesis.DOMAIN_KEY_VALUE, - domain.metadata.sortedMapOfName[RubbishToTestMultipleGenesis.DOMAIN_KEY_VALUE.asName()]?.fromJsonString(), - ) - } - } + fun `multiple genesis`(): Unit = + runBlocking { + val assetId = StoreAssetWithMetadata.ASSET_ID + val assetKey = StoreAssetWithMetadata.ASSET_KEY + + val assetBefore = getAsset(assetId) + assertEquals( + StoreAssetWithMetadata.ASSET_VALUE, + assetBefore.value + .cast() + .metadata.sortedMapOfName[assetKey]!! + .readValue(), + ) + client + .submit(QueryBuilder.findAccountById(ALICE_ACCOUNT_ID).signAs(BOB_ACCOUNT_ID, BOB_KEYPAIR)) + .also { alice -> + assertEquals( + RubbishToTestMultipleGenesis.ALICE_KEY_VALUE, + alice!!.metadata.sortedMapOfName[RubbishToTestMultipleGenesis.ALICE_KEY_VALUE.asName()]!!.readValue(), + ) + } + client + .submit(QueryBuilder.findAccountById(BOB_ACCOUNT_ID).signAs(BOB_ACCOUNT_ID, BOB_KEYPAIR)) + .also { bob -> + assertEquals( + RubbishToTestMultipleGenesis.BOB_KEY_VALUE, + bob!!.metadata.sortedMapOfName[RubbishToTestMultipleGenesis.BOB_KEY_VALUE.asName()]!!.readValue(), + ) + } + client + .submit(QueryBuilder.findDomainById(DEFAULT_DOMAIN_ID)) + .also { domain -> + assertEquals( + RubbishToTestMultipleGenesis.DOMAIN_KEY_VALUE, + domain!!.metadata.sortedMapOfName[RubbishToTestMultipleGenesis.DOMAIN_KEY_VALUE.asName()]!!.readValue(), + ) + } + } @Test @WithIroha([WithDomainTransferredToBob::class]) @Feature("Domains") @Story("Account transfers domain ownership") @SdkTestId("transfer_domain_ownership_in_genesis") - fun `transfer domain ownership in genesis`(): Unit = runBlocking { - val key = randomAlphabetic(5).asName() - val value = randomAlphabetic(5) - client.tx(BOB_ACCOUNT_ID, BOB_KEYPAIR) { - setKeyValue(WithDomainTransferredToBob.DOMAIN_ID, key, value) + fun `transfer domain ownership in genesis`(): Unit = + runBlocking { + val key = randomAlphabetic(5).asName() + val value = randomAlphabetic(5) + client.submitAs(BOB_ACCOUNT_ID, BOB_KEYPAIR, SetKeyValue.domain(WithDomainTransferredToBob.DOMAIN_ID, key, value)).also { d -> + withTimeout(txTimeout) { d.await() } + } + val extractedValue: String = + client + .submit(QueryBuilder.findDomainById(WithDomainTransferredToBob.DOMAIN_ID))!! + .metadata.sortedMapOfName[key]!! + .readValue() + assertEquals(value, extractedValue) } - val extractedValue = QueryBuilder.findDomainById(WithDomainTransferredToBob.DOMAIN_ID) - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> client.sendQuery(query) } - .metadata.sortedMapOfName[key] - assertEquals(value, extractedValue) - } @Test - @WithIroha([DefaultGenesis::class]) + @WithIroha([DefaultGenesis::class, AliceHasPermissionToRegisterDomain::class]) @Feature("Domains") @Story("Account transfers domain ownership") @SdkTestId("transfer_domain_ownership") - fun `transfer domain ownership`(): Unit = runBlocking { - val domainId = "Kingdom".asDomainId() - client.tx(ALICE_ACCOUNT_ID, ALICE_KEYPAIR) { registerDomain(domainId) } + fun `transfer domain ownership`(): Unit = + runBlocking { + val domainId = "Kingdom".asDomainId() + client.submit(Register.domain(domainId)).also { d -> + withTimeout(txTimeout) { d.await() } + } - assertFailsWith(TransactionRejectedException::class) { - client.tx(BOB_ACCOUNT_ID, BOB_KEYPAIR) { - setKeyValue(domainId, randomAlphabetic(5).asName(), randomAlphabetic(5)) + assertFailsWith(TransactionRejectedException::class) { + client + .submitAs( + BOB_ACCOUNT_ID, + BOB_KEYPAIR, + SetKeyValue.domain(domainId, randomAlphabetic(5).asName(), randomAlphabetic(5)), + ).also { d -> + withTimeout(txTimeout) { d.await() } + } } + val query = + QueryBuilder + .findDomainById(domainId) + .signAs(ALICE_ACCOUNT_ID, ALICE_KEYPAIR) + var kingdomDomainOwnedBy = client.submit(query)!!.ownedBy + assertEquals(ALICE_ACCOUNT_ID, kingdomDomainOwnedBy) + + client.submit(Transfer.domain(ALICE_ACCOUNT_ID, domainId, BOB_ACCOUNT_ID)).also { d -> + withTimeout(txTimeout) { d.await() } + } + kingdomDomainOwnedBy = client.submit(query)!!.ownedBy + assertEquals(BOB_ACCOUNT_ID, kingdomDomainOwnedBy) + + val key = randomAlphabetic(5).asName() + val value = randomAlphabetic(5) + client.submitAs(BOB_ACCOUNT_ID, BOB_KEYPAIR, SetKeyValue.domain(domainId, key, value)).also { d -> + withTimeout(txTimeout) { d.await() } + } + + val extractedValue: String = + client + .submit(QueryBuilder.findDomainById(domainId))!! + .metadata.sortedMapOfName[key]!! + .readValue() + assertEquals(value, extractedValue) } - var kingdomDomainOwnedBy = QueryBuilder.findDomainById(domainId) - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> client.sendQuery(query) }.ownedBy - assertEquals(ALICE_ACCOUNT_ID, kingdomDomainOwnedBy) - - client.tx(ALICE_ACCOUNT_ID, ALICE_KEYPAIR) { - transferDomainOwnership(ALICE_ACCOUNT_ID, domainId, BOB_ACCOUNT_ID) - } - kingdomDomainOwnedBy = QueryBuilder.findDomainById(domainId) - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> client.sendQuery(query) }.ownedBy - assertEquals(BOB_ACCOUNT_ID, kingdomDomainOwnedBy) - - val key = randomAlphabetic(5).asName() - val value = randomAlphabetic(5) - client.tx(BOB_ACCOUNT_ID, BOB_KEYPAIR) { setKeyValue(domainId, key, value) } - - val extractedValue = QueryBuilder.findDomainById(domainId) - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> client.sendQuery(query) } - .metadata.sortedMapOfName[key] - assertEquals(value, extractedValue) - } @Test @Permission("no_permission_required") @@ -929,42 +1091,30 @@ class InstructionsTest : IrohaTest() { @Story("Initiator starts network with fat genesis") @SdkTestId("initiator_start_network_with_fat_genesis") @WithIroha([FatGenesis::class]) - fun `fat genesis apply`(): Unit = runBlocking { - QueryBuilder.findAllAccounts() - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> client.sendQuery(query) } - .also { accounts -> assert(accounts.any { it.id == ALICE_ACCOUNT_ID }) } - .also { accounts -> assert(accounts.any { it.id == BOB_ACCOUNT_ID }) } - } - - private suspend fun registerAccount(id: AccountId) { - client.sendTransaction { - account(super.account) - registerAccount(id) - buildSigned(super.keyPair) - }.also { d -> - withTimeout(txTimeout) { d.await() } - } - } - - private suspend fun getAccountAmount(assetId: AssetId = DEFAULT_ASSET_ID) = QueryBuilder - .findAssetById(assetId) - .account(super.account) - .buildSigned(super.keyPair) - .let { query -> - client.sendQuery(query).value - }.let { value -> - (value as? AssetValue.Numeric)?.numeric?.asLong() ?: 0 + fun `fat genesis apply`(): Unit = + runBlocking { + client + .submit(QueryBuilder.findAccounts()) + .also { accounts -> assert(accounts.any { it.id == ALICE_ACCOUNT_ID }) } + .also { accounts -> assert(accounts.any { it.id == BOB_ACCOUNT_ID }) } } - private suspend fun getAsset(assetId: AssetId? = null) = QueryBuilder - .findAssetById(assetId ?: DEFAULT_ASSET_ID) - .account(super.account) - .buildSigned(super.keyPair) - .let { query -> - client.sendQuery(query) - } + private suspend fun getAccountAmount(assetId: AssetId = DEFAULT_ASSET_ID) = + client + .submit( + QueryBuilder + .findAssetById(assetId), + )!! + .value + .let { value -> + (value as AssetValue.Numeric).numeric.asLong() + } + + private suspend fun getAsset(assetId: AssetId? = null) = + client.submit( + QueryBuilder + .findAssetById(assetId ?: DEFAULT_ASSET_ID), + )!! private fun List.get(id: AssetId) = this.find { it.id == id } } diff --git a/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/PeerTest.kt b/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/PeerTest.kt index ece88ac9e..9e6b65e55 100644 --- a/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/PeerTest.kt +++ b/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/PeerTest.kt @@ -7,33 +7,32 @@ import jp.co.soramitsu.iroha2.annotations.Permission import jp.co.soramitsu.iroha2.annotations.Sdk import jp.co.soramitsu.iroha2.annotations.SdkTestId import jp.co.soramitsu.iroha2.client.Iroha2Client -import jp.co.soramitsu.iroha2.generated.AccountId import jp.co.soramitsu.iroha2.generated.DomainId +import jp.co.soramitsu.iroha2.generated.Peer import jp.co.soramitsu.iroha2.generated.PeerId import jp.co.soramitsu.iroha2.generated.SocketAddr import jp.co.soramitsu.iroha2.generated.SocketAddrHost import jp.co.soramitsu.iroha2.query.QueryBuilder import jp.co.soramitsu.iroha2.testengine.ALICE_ACCOUNT_ID import jp.co.soramitsu.iroha2.testengine.ALICE_KEYPAIR -import jp.co.soramitsu.iroha2.testengine.AliceCanUnregisterAnyPeer +import jp.co.soramitsu.iroha2.testengine.AliceCanManagePeers import jp.co.soramitsu.iroha2.testengine.DEFAULT_DOMAIN_ID import jp.co.soramitsu.iroha2.testengine.DefaultGenesis import jp.co.soramitsu.iroha2.testengine.IrohaConfig import jp.co.soramitsu.iroha2.testengine.IrohaContainer import jp.co.soramitsu.iroha2.testengine.IrohaTest import jp.co.soramitsu.iroha2.testengine.WithIroha +import jp.co.soramitsu.iroha2.transaction.Register +import jp.co.soramitsu.iroha2.transaction.Unregister import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.async import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.delay import kotlinx.coroutines.runBlocking import kotlinx.coroutines.time.withTimeout import kotlinx.coroutines.withContext -import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Test import org.junit.jupiter.api.Timeout import java.security.KeyPair -import java.time.Duration import kotlin.test.assertEquals import kotlin.test.assertFalse import kotlin.test.assertTrue @@ -42,183 +41,136 @@ import kotlin.test.assertTrue @Owner("akostyuchenko") @Sdk("Java/Kotlin") @Feature("Peers") -@Disabled // https://github.com/hyperledger/iroha/issues/4999 class PeerTest : IrohaTest() { - companion object { private const val PEER_AMOUNT = 4 } @Test - @WithIroha([DefaultGenesis::class], amount = PEER_AMOUNT) + @WithIroha([AliceCanManagePeers::class], amount = PEER_AMOUNT) @Story("Account registers a peer") @Permission("no_permission_required") @SdkTestId("register_peer") - fun `register peer`(): Unit = runBlocking { - val p2pPort = DEFAULT_P2P_PORT + PEER_AMOUNT - val alias = "iroha$p2pPort" - val address = "$alias:$p2pPort" - val keyPair = generateKeyPair() - val payload = keyPair.public.bytes() - - val containerJob = async { - startNewContainer(keyPair, alias, PEER_AMOUNT) - } - val registerJob = async { - registerPeer(PeerId(SocketAddr.Host(SocketAddrHost(address, p2pPort)), keyPair.public.toIrohaPublicKey())) - } - containerJob.await() - registerJob.await() + fun `register peer`(): Unit = + runBlocking { + val keyPair = generateKeyPair() + val payload = keyPair.public.bytes() - assertTrue(isPeerAvailable(address, payload)) - } + client.submit(Register.peer(PeerId(keyPair.public.toIrohaPublicKey()))).also { d -> + withTimeout(txTimeout) { d.await() } + } + + assertTrue(isPeerRegistered(payload)) + } - @Disabled // https://app.zenhub.com/workspaces/iroha-v2-60ddb820813b9100181fc060/issues/gh/hyperledger/iroha-java/372 @Test - @WithIroha([AliceCanUnregisterAnyPeer::class], amount = PEER_AMOUNT) + @WithIroha([AliceCanManagePeers::class], amount = PEER_AMOUNT) @Story("Account unregisters a peer") @Permission("no_permission_required") @SdkTestId("unregister_peer") - fun `unregister peer`(): Unit = runBlocking { - val p2pPort = DEFAULT_P2P_PORT - val alias = "iroha$p2pPort" - val address = "$alias:$p2pPort" - val keyPair = generateKeyPair() - val payload = keyPair.public.bytes() - - startNewContainer(keyPair, alias, PEER_AMOUNT).use { - registerPeer(PeerId(SocketAddr.Host(SocketAddrHost(address, p2pPort)), keyPair.public.toIrohaPublicKey())) - repeat(PEER_AMOUNT) { assertTrue(isPeerAvailable(address, payload)) } - - unregisterPeer(PeerId(SocketAddr.Host(SocketAddrHost(address, p2pPort)), keyPair.public.toIrohaPublicKey())) - repeat(PEER_AMOUNT) { assertFalse(isPeerAvailable(address, payload)) } + fun `unregister peer`(): Unit = + runBlocking { + val p2pPort = DEFAULT_P2P_PORT + val alias = "iroha$p2pPort" + val address = "$alias:$p2pPort" + val keyPair = generateKeyPair() + val payload = keyPair.public.bytes() + + startNewContainer(keyPair, alias, PEER_AMOUNT).use { + client.submit(Register.peer(PeerId(keyPair.public.toIrohaPublicKey()))).also { d -> + withTimeout(txTimeout) { d.await() } + } + + assertTrue(isPeerRegistered(payload)) + client.submit(Unregister.peer(PeerId(keyPair.public.toIrohaPublicKey()))).also { d -> + withTimeout(txTimeout) { d.await() } + } + + assertFalse(isPeerRegistered(payload)) + } } - } @Test - @WithIroha([DefaultGenesis::class], amount = PEER_AMOUNT) - fun `registered peer should return consistent data`(): Unit = runBlocking { - val p2pPort = DEFAULT_P2P_PORT - val alias = "iroha$p2pPort" - val address = "$alias:$p2pPort" - val keyPair = generateKeyPair() - val payload = keyPair.public.bytes() - - startNewContainer(keyPair, alias, PEER_AMOUNT).use { container -> - registerPeer(PeerId(SocketAddr.Host(SocketAddrHost(address, p2pPort)), keyPair.public.toIrohaPublicKey())) - assertTrue(isPeerAvailable(address, payload)) - - delay(5000) - - val peersCount = QueryBuilder.findAllPeers() - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { client.sendQuery(it) } - .size - - repeat(5) { - runCatching { - QueryBuilder.findAllPeers() - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { - Iroha2Client( - container.getApiUrl(), - container.getP2pUrl(), - ).sendQuery(it) - } - .also { peers -> assertEquals(peers.size, peersCount) } - .also { return@repeat } + @WithIroha([AliceCanManagePeers::class], amount = PEER_AMOUNT) + fun `registered peer should return consistent data`(): Unit = + runBlocking { + val p2pPort = DEFAULT_P2P_PORT + val alias = "iroha$p2pPort" + val keyPair = generateKeyPair() + val payload = keyPair.public.bytes() + + startNewContainer(keyPair, alias, PEER_AMOUNT).use { container -> + client.submit(Register.peer(PeerId(keyPair.public.toIrohaPublicKey()))).also { d -> + withTimeout(txTimeout) { d.await() } } - delay(2000) + assertTrue(isPeerRegistered(payload)) + + val peersCount = client.submit(QueryBuilder.findPeers()).size + + delay(10000) + Iroha2Client( + listOf(container.getApiUrl()), + container.config.chain, + ALICE_ACCOUNT_ID, + ALICE_KEYPAIR, + ).submit(QueryBuilder.findPeers()) + .also { peers -> assertEquals(peersCount, peers.size) } } } - } @Test @WithIroha([DefaultGenesis::class], amount = PEER_AMOUNT) - fun `round-robin load balancing test`(): Unit = runBlocking { - repeat(PEER_AMOUNT + 1) { - assertEquals(findDomain(DEFAULT_DOMAIN_ID).id, DEFAULT_DOMAIN_ID) + fun `round-robin load balancing test`(): Unit = + runBlocking { + repeat(PEER_AMOUNT + 1) { + assertEquals(findDomain(DEFAULT_DOMAIN_ID).id, DEFAULT_DOMAIN_ID) + } } - } private suspend fun startNewContainer( keyPair: KeyPair, alias: String, amount: Int, - ): IrohaContainer = coroutineScope { - IrohaContainer { - this.waitStrategy = false - this.keyPair = keyPair - this.alias = alias - this.networkToJoin = containers.first().network ?: throw IrohaSdkException("Container network not found") - this.submitGenesis = false - this.ports = listOf(DEFAULT_P2P_PORT + amount, DEFAULT_API_PORT + amount) - this.trustedPeers = containers.map { it.extractPeerId() } - }.also { - withContext(Dispatchers.IO) { - it.start() + ): IrohaContainer = + coroutineScope { + IrohaContainer { + this.waitStrategy = false + this.keyPair = keyPair + this.alias = alias + this.networkToJoin = containers.first().network ?: throw IrohaSdkException("Container network not found") + this.submitGenesis = false + this.ports = listOf(DEFAULT_P2P_PORT + amount, DEFAULT_API_PORT + amount) + this.trustedPeers = containers.map { it.extractPeer() } + }.also { + withContext(Dispatchers.IO) { + it.start() + } } } - } - private suspend fun isPeerAvailable( - address: String, + private suspend fun isPeerRegistered( payload: ByteArray, keyPair: KeyPair = ALICE_KEYPAIR, - ): Boolean { - return QueryBuilder.findAllPeers() - .account(ALICE_ACCOUNT_ID) - .buildSigned(keyPair) - .let { query -> - client.sendQuery(query) - }.any { peer -> - val peerAddr = peer.id.address.cast().socketAddrHost - "${peerAddr.host}:${peerAddr.port}" == address && peer.id.publicKey.payload.contentEquals(payload) + ): Boolean = + client + .submit(QueryBuilder.findPeers()) + .any { peer -> + peer.publicKey.payload.contentEquals(payload) } - } - private suspend fun unregisterPeer( - peerId: PeerId, - keyPair: KeyPair = ALICE_KEYPAIR, - ) { - client.sendTransaction { - account(ALICE_ACCOUNT_ID) - unregisterPeer(peerId) - buildSigned(keyPair) - }.also { d -> - withTimeout(txTimeout.plus(Duration.ofSeconds(20))) { d.await() } - } - } - - private suspend fun registerPeer( - peerId: PeerId, - account: AccountId = ALICE_ACCOUNT_ID, - keyPair: KeyPair = ALICE_KEYPAIR, - ) { - client.sendTransaction { - account(account) - registerPeer(peerId) - buildSigned(keyPair) - }.also { d -> - withTimeout(txTimeout.plus(Duration.ofSeconds(20))) { d.await() } - } - } - - private fun IrohaContainer.extractPeerId() = PeerId( - SocketAddr.Host( - SocketAddrHost( - this.config.alias, - this.config.ports[IrohaConfig.P2P_PORT_IDX], + private fun IrohaContainer.extractPeer() = + Peer( + SocketAddr.Host( + SocketAddrHost( + this.config.alias, + this.config.ports[IrohaConfig.P2P_PORT_IDX], + ), + ), + PeerId( + this.config.keyPair.public + .toIrohaPublicKey(), ), - ), - this.config.keyPair.public.toIrohaPublicKey(), - ) - - private suspend fun findDomain(id: DomainId = DEFAULT_DOMAIN_ID) = QueryBuilder - .findDomainById(id) - .account(super.account) - .buildSigned(super.keyPair) - .let { client.sendQuery(it) } + ) + + private suspend fun findDomain(id: DomainId = DEFAULT_DOMAIN_ID) = client.submit(QueryBuilder.findDomainById(id))!! } diff --git a/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/QueriesTest.kt b/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/QueriesTest.kt index 30851121d..82109b402 100644 --- a/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/QueriesTest.kt +++ b/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/QueriesTest.kt @@ -9,18 +9,49 @@ import jp.co.soramitsu.iroha2.annotations.Sdk import jp.co.soramitsu.iroha2.annotations.SdkTestId import jp.co.soramitsu.iroha2.client.Iroha2Client import jp.co.soramitsu.iroha2.generated.AccountId +import jp.co.soramitsu.iroha2.generated.AccountIdPredicateAtom +import jp.co.soramitsu.iroha2.generated.AccountIdProjectionOfPredicateMarker +import jp.co.soramitsu.iroha2.generated.AccountProjectionOfPredicateMarker +import jp.co.soramitsu.iroha2.generated.AssetDefinitionIdPredicateAtom +import jp.co.soramitsu.iroha2.generated.AssetDefinitionIdProjectionOfPredicateMarker +import jp.co.soramitsu.iroha2.generated.AssetDefinitionProjectionOfPredicateMarker import jp.co.soramitsu.iroha2.generated.AssetId +import jp.co.soramitsu.iroha2.generated.AssetIdProjectionOfPredicateMarker +import jp.co.soramitsu.iroha2.generated.AssetProjectionOfPredicateMarker import jp.co.soramitsu.iroha2.generated.AssetType +import jp.co.soramitsu.iroha2.generated.AssetValue +import jp.co.soramitsu.iroha2.generated.CanBurnAssetWithDefinition +import jp.co.soramitsu.iroha2.generated.CanMintAssetWithDefinition +import jp.co.soramitsu.iroha2.generated.CommittedTransactionProjectionOfPredicateMarker +import jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAccount +import jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAsset +import jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAssetDefinition +import jp.co.soramitsu.iroha2.generated.CompoundPredicateOfCommittedTransaction +import jp.co.soramitsu.iroha2.generated.CompoundPredicateOfDomain +import jp.co.soramitsu.iroha2.generated.CompoundPredicateOfRole +import jp.co.soramitsu.iroha2.generated.CompoundPredicateOfTriggerId import jp.co.soramitsu.iroha2.generated.DomainId +import jp.co.soramitsu.iroha2.generated.DomainIdPredicateAtom +import jp.co.soramitsu.iroha2.generated.DomainIdProjectionOfPredicateMarker +import jp.co.soramitsu.iroha2.generated.DomainProjectionOfPredicateMarker import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.generated.Json import jp.co.soramitsu.iroha2.generated.Metadata import jp.co.soramitsu.iroha2.generated.Name +import jp.co.soramitsu.iroha2.generated.NameProjectionOfPredicateMarker import jp.co.soramitsu.iroha2.generated.RegisterBox +import jp.co.soramitsu.iroha2.generated.RoleIdPredicateAtom +import jp.co.soramitsu.iroha2.generated.RoleIdProjectionOfPredicateMarker +import jp.co.soramitsu.iroha2.generated.RoleProjectionOfPredicateMarker import jp.co.soramitsu.iroha2.generated.SignedTransaction -import jp.co.soramitsu.iroha2.generated.StringPredicate +import jp.co.soramitsu.iroha2.generated.SignedTransactionProjectionOfPredicateMarker +import jp.co.soramitsu.iroha2.generated.StringPredicateAtom +import jp.co.soramitsu.iroha2.generated.TransactionHashPredicateAtom +import jp.co.soramitsu.iroha2.generated.TransactionHashProjectionOfPredicateMarker +import jp.co.soramitsu.iroha2.generated.TriggerIdPredicateAtom +import jp.co.soramitsu.iroha2.generated.TriggerIdProjectionOfPredicateMarker import jp.co.soramitsu.iroha2.query.QueryBuilder import jp.co.soramitsu.iroha2.testengine.ALICE_ACCOUNT_ID -import jp.co.soramitsu.iroha2.testengine.ALICE_KEYPAIR import jp.co.soramitsu.iroha2.testengine.ALICE_PUBLIC_KEY import jp.co.soramitsu.iroha2.testengine.AliceCanMintXor import jp.co.soramitsu.iroha2.testengine.AliceHas100XorAndPermissionToMintAndBurn @@ -44,42 +75,39 @@ import jp.co.soramitsu.iroha2.testengine.WithIroha import jp.co.soramitsu.iroha2.testengine.WithManyDomains import jp.co.soramitsu.iroha2.testengine.XOR_DEFINITION_ID import jp.co.soramitsu.iroha2.testengine.XorAndValAssets -import jp.co.soramitsu.iroha2.transaction.QueryFilters +import jp.co.soramitsu.iroha2.transaction.Burn +import jp.co.soramitsu.iroha2.transaction.Mint +import jp.co.soramitsu.iroha2.transaction.Register import kotlinx.coroutines.runBlocking import kotlinx.coroutines.time.withTimeout import org.apache.commons.lang3.RandomStringUtils import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Test +import java.math.BigDecimal import java.math.BigInteger import java.security.KeyPair import java.time.Instant import kotlin.test.assertContains import kotlin.test.assertContentEquals import kotlin.test.assertEquals -import kotlin.test.assertTrue @Owner("akostyuchenko") @Sdk("Java/Kotlin") @Permission("no_permission_required") class QueriesTest : IrohaTest() { - @Test @WithIroha([NewAccountWithMetadata::class], configs = ["LOG_LEVEL${IROHA_CONFIG_DELIMITER}TRACE"]) @Feature("Accounts") @Query("FindAllAccounts") @Story("Account queries all accounts") @SdkTestId("find_all_accounts") - fun `find all accounts`(): Unit = runBlocking { - QueryBuilder.findAllAccounts() - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> - client.sendQuery(query) - }.also { accounts -> - assert(accounts.any { it.id.signatory == ALICE_PUBLIC_KEY }) - assert(accounts.any { it.id.signatory == NewAccountWithMetadata.ACCOUNT_ID.signatory }) + fun `find all accounts`(): Unit = + runBlocking { + client.submit(QueryBuilder.findAccounts()).also { accounts -> + assert(accounts.any { ALICE_PUBLIC_KEY == it.id.signatory }) + assert(accounts.any { NewAccountWithMetadata.ACCOUNT_ID.signatory == it.id.signatory }) } - } + } @Test @WithIroha([NewAccountWithMetadata::class]) @@ -87,22 +115,38 @@ class QueriesTest : IrohaTest() { @Query("FindAllAccountsWithFilter") @Story("Account queries all accounts with a filter") @SdkTestId("find_all_accounts_with_filter") - fun `find all accounts with filter`(): Unit = runBlocking { - val filter = QueryFilters.or( - StringPredicate.Is("ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland"), - StringPredicate.Is("ed012004FF5B81046DDCCF19E2E451C45DFB6F53759D4EB30FA2EFA807284D1CC33016@wonderland"), - ) - QueryBuilder.findAllAccounts(filter) - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> - client.sendQuery(query) - }.also { accounts -> - assert(accounts.size == 2) + fun `find all accounts with filter`(): Unit = + runBlocking { + val filter = + CompoundPredicateOfAccount.Or( + listOf( + CompoundPredicateOfAccount.Atom( + AccountProjectionOfPredicateMarker.Id( + AccountIdProjectionOfPredicateMarker.Atom( + AccountIdPredicateAtom.Equals( + "ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland".asAccountId(), + ), + ), + ), + ), + CompoundPredicateOfAccount.Atom( + AccountProjectionOfPredicateMarker.Id( + AccountIdProjectionOfPredicateMarker.Atom( + AccountIdPredicateAtom.Equals( + "ed012004FF5B81046DDCCF19E2E451C45DFB6F53759D4EB30FA2EFA807284D1CC33016@wonderland".asAccountId(), + ), + ), + ), + ), + ), + ) + + client.submit(QueryBuilder.findAccounts(filter)).also { accounts -> + assertEquals(2, accounts.size) assert(accounts.any { it.id.signatory == ALICE_PUBLIC_KEY }) assert(accounts.any { it.id.signatory == BOB_PUBLIC_KEY }) } - } + } @Test @WithIroha([NewAccountWithMetadata::class]) @@ -110,19 +154,18 @@ class QueriesTest : IrohaTest() { @Query("FindAccountKeyValueByIdAndKey") @Story("Account queries account key value by ID and key") @SdkTestId("find_account_key_value_by_ID_and_key") - fun `find account key value by ID and key`(): Unit = runBlocking { - QueryBuilder.findAccountKeyValueByIdAndKey( - NewAccountWithMetadata.ACCOUNT_ID, - NewAccountWithMetadata.KEY, - ) - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> - client.sendQuery(query) - }.also { - assertEquals(NewAccountWithMetadata.VALUE, it) - } - } + fun `find account key value by ID and key`(): Unit = + runBlocking { + val metadata = + client + .submit( + QueryBuilder.findAccountById( + NewAccountWithMetadata.ACCOUNT_ID, + ), + )!! + .metadata.sortedMapOfName + assertEquals(NewAccountWithMetadata.VALUE, metadata[ NewAccountWithMetadata.KEY ]!!.readValue()) + } @Test @WithIroha([DefaultGenesis::class]) @@ -130,33 +173,41 @@ class QueriesTest : IrohaTest() { @Query("FindAccountsByDomainId") @Story("Account queries accounts by domain ID") @SdkTestId("find_accounts_by_domain_ID") - fun `find accounts by domain ID`(): Unit = runBlocking { - QueryBuilder.findAccountsByDomainId(DEFAULT_DOMAIN_ID) - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> - client.sendQuery(query) - }.also { accounts -> - assert(accounts.all { it.id.domain == DEFAULT_DOMAIN_ID }) - } - } + fun `find accounts by domain ID`(): Unit = + runBlocking { + val byDomainIdFilter = + CompoundPredicateOfAccount.Atom( + AccountProjectionOfPredicateMarker.Id( + AccountIdProjectionOfPredicateMarker.Domain( + DomainIdProjectionOfPredicateMarker.Atom( + DomainIdPredicateAtom.Equals( + DEFAULT_DOMAIN_ID, + ), + ), + ), + ), + ) - @Test + val accounts = client.submit(QueryBuilder.findAccounts(byDomainIdFilter)) + assert(accounts.all { it.id.domain == DEFAULT_DOMAIN_ID }) + } + +// @Test @WithIroha([XorAndValAssets::class, AliceCanMintXor::class]) @Feature("Assets") @Query("FindTotalAssetQuantityByAssetDefinitionId") @Story("Account queries total asset quantity by AssetDefinitionId") @SdkTestId("find_total_asset_quantity_by_AssetDefinitionId") - fun `find total asset quantity by AssetDefinitionId`(): Unit = runBlocking { - val quantity = 10 - client.tx { mintAsset(AssetId(definition = XOR_DEFINITION_ID, account = BOB_ACCOUNT_ID), quantity) } - - QueryBuilder.findTotalAssetQuantityByAssetDefinitionId(XOR_DEFINITION_ID) - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> client.sendQuery(query) } - .also { assertEquals(quantity + XorAndValAssets.XOR_QUANTITY, it.asInt()) } - } + fun `find total asset quantity by AssetDefinitionId`(): Unit = + runBlocking { + val quantity = BigDecimal(10) + client.submit(Mint.asset(AssetId(BOB_ACCOUNT_ID, XOR_DEFINITION_ID), quantity)).also { + withTimeout(txTimeout) { it.await() } + } + + val totalQuantity = client.submit(QueryBuilder.findAssetDefinitionById(XOR_DEFINITION_ID))!!.totalQuantity + assertEquals(quantity + XorAndValAssets.XOR_QUANTITY, totalQuantity.asBigDecimal()) + } @Test @WithIroha([XorAndValAssets::class]) @@ -164,17 +215,13 @@ class QueriesTest : IrohaTest() { @Query("FindAllAssets") @Story("Account queries all assets") @SdkTestId("find_all_assets") - fun `find all assets`(): Unit = runBlocking { - QueryBuilder.findAllAssets() - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> - client.sendQuery(query) - }.also { assets -> + fun `find all assets`(): Unit = + runBlocking { + client.submit(QueryBuilder.findAssets()).also { assets -> assert(assets.any { it.id.definition == XOR_DEFINITION_ID }) assert(assets.any { it.id.definition == VAL_DEFINITION_ID }) } - } + } @Test @WithIroha([XorAndValAssets::class]) @@ -182,16 +229,27 @@ class QueriesTest : IrohaTest() { @Query("FindAssetsByName") @Story("Account queries assets by name") @SdkTestId("find_assets_by_name") - fun `find assets by name`(): Unit = runBlocking { - QueryBuilder.findAssetsByName(XOR_DEFINITION_ID.name) - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> - client.sendQuery(query) - }.also { assets -> + fun `find assets by name`(): Unit = + runBlocking { + val byNameFilter = + CompoundPredicateOfAsset.Atom( + AssetProjectionOfPredicateMarker.Id( + AssetIdProjectionOfPredicateMarker.Definition( + AssetDefinitionIdProjectionOfPredicateMarker.Name( + NameProjectionOfPredicateMarker.Atom( + StringPredicateAtom.Equals( + XOR_DEFINITION_ID.name.string, + ), + ), + ), + ), + ), + ) + + client.submit(QueryBuilder.findAssets(byNameFilter)).also { assets -> assert(assets.all { it.id.definition.name == XOR_DEFINITION_ID.name }) } - } + } @Test @WithIroha([XorAndValAssets::class]) @@ -199,18 +257,24 @@ class QueriesTest : IrohaTest() { @Query("FindAssetsByAccountId") @Story("Account queries assets by account ID") @SdkTestId("find_assets_by_account_ID") - fun `find assets by account id`(): Unit = runBlocking { - QueryBuilder.findAssetsByAccountId(ALICE_ACCOUNT_ID) - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> - client.sendQuery(query) - }.also { assets -> + fun `find assets by account id`(): Unit = + runBlocking { + val byNameFilter = + CompoundPredicateOfAsset.Atom( + AssetProjectionOfPredicateMarker.Id( + AssetIdProjectionOfPredicateMarker.Account( + AccountIdProjectionOfPredicateMarker.Atom( + AccountIdPredicateAtom.Equals(ALICE_ACCOUNT_ID), + ), + ), + ), + ) + client.submit(QueryBuilder.findAssets(byNameFilter)).also { assets -> assert(assets.all { it.id.account == ALICE_ACCOUNT_ID }) assert(assets.any { it.id.definition == XOR_DEFINITION_ID }) assert(assets.any { it.id.definition == VAL_DEFINITION_ID }) } - } + } @Test @WithIroha([XorAndValAssets::class]) @@ -218,20 +282,39 @@ class QueriesTest : IrohaTest() { @Query("FindAssetsByDomainIdAndAssetDefinitionId") @Story("Account queries assets by domain name and asset definition ID") @SdkTestId("find_assets_by_domain_name_and_asset_definition_ID") - fun `find assets by domain name and asset definition id`(): Unit = runBlocking { - QueryBuilder.findAssetsByDomainIdAndAssetDefinitionId( - DEFAULT_DOMAIN_ID, - XOR_DEFINITION_ID, - ) - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> - client.sendQuery(query) - }.also { assets -> + fun `find assets by domain name and asset definition id`(): Unit = + runBlocking { + val byAccountDomainIdAndAssetDefinitionIdFilter = + CompoundPredicateOfAsset.And( + listOf( + CompoundPredicateOfAsset.Atom( + AssetProjectionOfPredicateMarker.Id( + AssetIdProjectionOfPredicateMarker.Account( + AccountIdProjectionOfPredicateMarker.Domain( + DomainIdProjectionOfPredicateMarker.Atom( + DomainIdPredicateAtom.Equals(DEFAULT_DOMAIN_ID), + ), + ), + ), + ), + ), + CompoundPredicateOfAsset.Atom( + AssetProjectionOfPredicateMarker.Id( + AssetIdProjectionOfPredicateMarker.Definition( + AssetDefinitionIdProjectionOfPredicateMarker.Atom( + AssetDefinitionIdPredicateAtom.Equals(XOR_DEFINITION_ID), + ), + ), + ), + ), + ), + ) + + client.submit(QueryBuilder.findAssets(byAccountDomainIdAndAssetDefinitionIdFilter)).also { assets -> assert(assets.all { it.id.definition == XOR_DEFINITION_ID }) assert(assets.all { it.id.account.domain == DEFAULT_DOMAIN_ID }) } - } + } @Test @WithIroha([XorAndValAssets::class]) @@ -239,17 +322,19 @@ class QueriesTest : IrohaTest() { @Query("FindAssetQuantityById") @Story("Account queries asset quantity by asset ID") @SdkTestId("find_asset_quantity_by_ID") - fun `find asset quantity by id`(): Unit = runBlocking { - val assetId = AssetId(definition = XOR_DEFINITION_ID, account = ALICE_ACCOUNT_ID) - QueryBuilder.findAssetQuantityById(assetId) - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> - client.sendQuery(query) - }.also { quantity -> - assert(quantity.asInt() == XorAndValAssets.XOR_QUANTITY) - } - } + fun `find asset quantity by id`(): Unit = + runBlocking { + val assetId = AssetId(ALICE_ACCOUNT_ID, XOR_DEFINITION_ID) + + val asset = client.submit(QueryBuilder.findAssetById(assetId))!! + assertEquals( + XorAndValAssets.XOR_QUANTITY, + asset.value + .cast() + .numeric + .asBigDecimal(), + ) + } @Test @WithIroha([StoreAssetWithMetadata::class]) @@ -257,19 +342,19 @@ class QueriesTest : IrohaTest() { @Query("FindAssetKeyValueByIdAndKey") @Story("Account queries asset key value by ID and key") @SdkTestId("find_asset_key_value_by_ID_and_key") - fun `find asset key value by ID and key`(): Unit = runBlocking { - QueryBuilder.findAssetKeyValueByIdAndKey( - StoreAssetWithMetadata.ASSET_ID, - StoreAssetWithMetadata.ASSET_KEY, - ) - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> - client.sendQuery(query) - }.also { value -> - assert(value == StoreAssetWithMetadata.ASSET_VALUE) - } - } + fun `find asset key value by ID and key`(): Unit = + runBlocking { + val metadata = + client + .submit( + QueryBuilder.findAssetById( + StoreAssetWithMetadata.ASSET_ID, + ), + )!! + .metadata() + + assertEquals(StoreAssetWithMetadata.ASSET_VALUE, metadata[StoreAssetWithMetadata.ASSET_KEY]!!.readValue()) + } @Test @WithIroha([StoreAssetWithMetadata::class]) @@ -277,19 +362,18 @@ class QueriesTest : IrohaTest() { @Query("FindAssetDefinitionKeyValueByIdAndKey") @Story("Account queries asset definition key value by ID and key") @SdkTestId("find_asset_definition_key_value_by_ID_and_key") - fun `find asset definition key value by ID and key`(): Unit = runBlocking { - QueryBuilder.findAssetDefinitionKeyValueByIdAndKey( - StoreAssetWithMetadata.DEFINITION_ID, - StoreAssetWithMetadata.ASSET_KEY, - ) - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> - client.sendQuery(query) - }.also { - assertEquals(it, StoreAssetWithMetadata.ASSET_VALUE) - } - } + fun `find asset definition key value by ID and key`(): Unit = + runBlocking { + val metadata = + client + .submit( + QueryBuilder.findAssetDefinitionById( + StoreAssetWithMetadata.DEFINITION_ID, + ), + )!! + .metadata.sortedMapOfName + assertEquals(StoreAssetWithMetadata.ASSET_VALUE, metadata[StoreAssetWithMetadata.ASSET_KEY]!!.readValue()) + } @Test @WithIroha([StoreAssetWithMetadata::class]) @@ -298,16 +382,12 @@ class QueriesTest : IrohaTest() { @Story("Account queries asset by metadata filters") @SdkTestId("find_asset_by_metadata_filters") @Disabled // https://github.com/hyperledger/iroha/issues/2697 - fun `find asset by metadata filters`(): Unit = runBlocking { - QueryBuilder.findAllAssets() - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> - client.sendQuery(query) - }.also { + fun `find asset by metadata filters`(): Unit = + runBlocking { + client.submit(QueryBuilder.findAssets()).also { assert(it.isNotEmpty()) } - } + } @Test @WithIroha([AliceHas100XorAndPermissionToMintAndBurn::class]) @@ -315,15 +395,12 @@ class QueriesTest : IrohaTest() { @Query("FindAssetDefinitionById") @Story("Account queries asset definition by ID") @SdkTestId("find_asset_definition_by_ID") - fun `find asset definition by ID`(): Unit = runBlocking { - QueryBuilder.findAssetDefinitionById(DEFAULT_ASSET_DEFINITION_ID) - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { client.sendQuery(it) } - .also { assetDefinition -> - assertEquals(assetDefinition.id, DEFAULT_ASSET_DEFINITION_ID) - } - } + fun `find asset definition by ID`(): Unit = + runBlocking { + client + .submit(QueryBuilder.findAssetDefinitionById(DEFAULT_ASSET_DEFINITION_ID))!! + .also { assertEquals(it.id, DEFAULT_ASSET_DEFINITION_ID) } + } @Test @WithIroha([NewDomain::class]) @@ -331,17 +408,15 @@ class QueriesTest : IrohaTest() { @Query("FindAllDomains") @Story("Account queries all domains") @SdkTestId("find_all_domains") - fun `find all domains`(): Unit = runBlocking { - QueryBuilder.findAllDomains() - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> - client.sendQuery(query) - }.also { domains -> - assert(domains.any { it.id == DEFAULT_DOMAIN_ID }) - assert(domains.any { it.id == NewDomain.DOMAIN_ID }) - } - } + fun `find all domains`(): Unit = + runBlocking { + client + .submit(QueryBuilder.findDomains()) + .also { domains -> + assert(domains.any { it.id == DEFAULT_DOMAIN_ID }) + assert(domains.any { it.id == NewDomain.DOMAIN_ID }) + } + } @Test @WithIroha([NewDomain::class]) @@ -349,18 +424,23 @@ class QueriesTest : IrohaTest() { @Query("FindAllDomainsWithFilter") @Story("Account queries all domains with filter") @SdkTestId("find_all_domains_with_filter") - fun `find all domains with filter`(): Unit = runBlocking { - val filter = QueryFilters.startsWith("wonder") - QueryBuilder.findAllDomains(filter) - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> - client.sendQuery(query) - }.also { domains -> - assert(domains.size == 1) - assert(domains.any { it.id == DEFAULT_DOMAIN_ID }) - } - } + fun `find all domains with filter`(): Unit = + runBlocking { + val filter = + CompoundPredicateOfDomain.Atom( + DomainProjectionOfPredicateMarker.Id( + DomainIdProjectionOfPredicateMarker.Name( + NameProjectionOfPredicateMarker.Atom( + StringPredicateAtom.StartsWith("wonder"), + ), + ), + ), + ) + + val domains = client.submit(QueryBuilder.findDomains(filter)) + assertEquals(1, domains.size) + assertEquals(DEFAULT_DOMAIN_ID, domains[0].id) + } @Test @WithIroha([DefaultGenesis::class]) @@ -368,16 +448,12 @@ class QueriesTest : IrohaTest() { @Query("FindDomainById") @Story("Domain queries domain by ID") @SdkTestId("find_domain_by_ID") - fun `find domain by ID`(): Unit = runBlocking { - QueryBuilder.findDomainById(DEFAULT_DOMAIN_ID) - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> - client.sendQuery(query) - }.also { domain -> - assert(domain.id == DEFAULT_DOMAIN_ID) + fun `find domain by ID`(): Unit = + runBlocking { + client.submit(QueryBuilder.findDomainById(DEFAULT_DOMAIN_ID))!!.also { + assertEquals(DEFAULT_DOMAIN_ID, it.id) } - } + } @Test @WithIroha([DefaultGenesis::class]) @@ -385,16 +461,12 @@ class QueriesTest : IrohaTest() { @Query("FindAllPeers") @Story("Peer queries all peers") @SdkTestId("find_all_peers") - fun `find all peers`(): Unit = runBlocking { - QueryBuilder.findAllPeers() - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> - client.sendQuery(query) - }.also { peers -> - assert(peers.isNotEmpty()) - } - } + fun `find all peers`(): Unit = + runBlocking { + client + .submit(QueryBuilder.findPeers()) + .also { assert(it.isNotEmpty()) } + } @Test @WithIroha([DefaultGenesis::class]) @@ -402,28 +474,29 @@ class QueriesTest : IrohaTest() { @Query("FindTransactionsByAccountId") @Story("Transaction queries transactions by account id") @SdkTestId("find_transactions_by_account_id") - fun `find transactions by account id`(): Unit = runBlocking { - client.sendTransaction { - account(ALICE_ACCOUNT_ID) - registerAssetDefinition(DEFAULT_ASSET_DEFINITION_ID, AssetType.numeric()) - buildSigned(ALICE_KEYPAIR) - } - - QueryBuilder.findTransactionsByAccountId(ALICE_ACCOUNT_ID) - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> - client.sendQuery(query) - }.let { txValues -> - txValues.all { value -> - value.transaction.value - .cast().signedTransactionV1 - .payload.authority == ALICE_ACCOUNT_ID - } - }.also { - assert(it) - } - } + fun `find transactions by account id`(): Unit = + runBlocking { + client.submit(Register.assetDefinition(DEFAULT_ASSET_DEFINITION_ID, AssetType.numeric())).also { + withTimeout(txTimeout) { it.await() } + } + + val result = + client.submit( + QueryBuilder.findTransactions( + CompoundPredicateOfCommittedTransaction.Atom( + CommittedTransactionProjectionOfPredicateMarker.Value( + SignedTransactionProjectionOfPredicateMarker.Authority( + AccountIdProjectionOfPredicateMarker.Atom( + AccountIdPredicateAtom.Equals(ALICE_ACCOUNT_ID), + ), + ), + ), + ), + ), + ) + + assertEquals(1, result.size) + } @Test @WithIroha([AliceHas100XorAndPermissionToMintAndBurn::class]) @@ -431,19 +504,20 @@ class QueriesTest : IrohaTest() { @Query("FindPermissionTokensByAccountId") @Story("PermissionToken queries permission tokens by account id") @SdkTestId("find_permission_tokens_by_account_id") - fun `find permission tokens by account id`(): Unit = runBlocking { - QueryBuilder.findPermissionsByAccountId(ALICE_ACCOUNT_ID) - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> - client.sendQuery(query) - } - .let { tokens -> - tokens.any { "{\"asset_definition\":\"xor#wonderland\"}" == it.payload } - }.also { - assert(it) - } - } + fun `find permission tokens by account id`(): Unit = + runBlocking { + val result = + client.submit(QueryBuilder.findPermissionsByAccountId(ALICE_ACCOUNT_ID)).filter { + it.name == CanMintAssetWithDefinition::class.simpleName && + CanMintAssetWithDefinition("xor#wonderland".asAssetDefinitionId()) == + it.payload.readValue() || + it.name == CanBurnAssetWithDefinition::class.simpleName && + CanBurnAssetWithDefinition("xor#wonderland".asAssetDefinitionId()) == + it.payload.readValue() + } + + assertEquals(2, result.size) + } @Test @WithIroha([DefaultGenesis::class]) @@ -451,36 +525,45 @@ class QueriesTest : IrohaTest() { @Query("FindTransactionByHash") @Story("Transaction queries transaction by hash") @SdkTestId("find_transaction_by_hash") - fun `find transaction by hash`(): Unit = runBlocking { - client.sendTransaction { - account(ALICE_ACCOUNT_ID) - registerAssetDefinition(DEFAULT_ASSET_DEFINITION_ID, AssetType.numeric()) - buildSigned(ALICE_KEYPAIR) - }.let { d -> - withTimeout(txTimeout) { d.await() } - } - - val transactions = QueryBuilder.findAllTransactions() - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> client.sendQuery(query) } - - val hash = SignedTransaction.encode(transactions[2].transaction.value).hash() - - val txByHash = QueryBuilder.findTransactionByHash(hash) - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> client.sendQuery(query) } - assertEquals( - DEFAULT_ASSET_DEFINITION_ID.domain, - txByHash.transaction.value - .extractInstruction() - .registerBox.cast().registerOfDomain.`object`.id, - ) - txByHash.transaction.value - .let { SignedTransaction.encode(it).hash() } - .also { assertContentEquals(hash, it) } - } + fun `find transaction by hash`(): Unit = + runBlocking { + client.submit(Register.assetDefinition(DEFAULT_ASSET_DEFINITION_ID, AssetType.numeric())).let { + withTimeout(txTimeout) { it.await() } + } + + var transactions = client.submit(QueryBuilder.findTransactions()) + val hash = SignedTransaction.encode(transactions[2].value).hash() + + transactions = + client.submit( + QueryBuilder.findTransactions( + CompoundPredicateOfCommittedTransaction.Atom( + CommittedTransactionProjectionOfPredicateMarker.Value( + SignedTransactionProjectionOfPredicateMarker.Hash( + TransactionHashProjectionOfPredicateMarker.Atom( + TransactionHashPredicateAtom.Equals(hash.asHashOf()), + ), + ), + ), + ), + ), + ) + + assertEquals(1, transactions.size) + assertEquals( + DEFAULT_ASSET_DEFINITION_ID.domain, + transactions[0] + .value + .extractInstruction() + .registerBox + .cast() + .registerOfDomain.`object`.id, + ) + transactions[0] + .value + .let { SignedTransaction.encode(it).hash() } + .also { assertContentEquals(hash, it) } + } @Test @WithIroha([NewDomainWithMetadata::class]) @@ -488,15 +571,17 @@ class QueriesTest : IrohaTest() { @Query("FindDomainKeyValueByIdAndKey") @Story("Domain queries domain key value by ID and key") @SdkTestId("find_domain_key_value_by_ID_and_key") - fun `find domain key value by ID and key`(): Unit = runBlocking { - QueryBuilder.findDomainKeyValueByIdAndKey( - NewDomainWithMetadata.DOMAIN_ID, - NewDomainWithMetadata.KEY, - ).account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> client.sendQuery(query) } - .also { assertEquals(NewDomainWithMetadata.VALUE, it) } - } + fun `find domain key value by ID and key`(): Unit = + runBlocking { + val metadata = + client + .submit( + QueryBuilder.findDomainById(NewDomainWithMetadata.DOMAIN_ID), + )!! + .metadata.sortedMapOfName + + assertEquals(NewDomainWithMetadata.VALUE, metadata[NewDomainWithMetadata.KEY]!!.readValue()) + } @Test @WithIroha([WithExecutableTrigger::class]) @@ -504,29 +589,13 @@ class QueriesTest : IrohaTest() { @Query("FindTriggerById") @Story("Trigger queries trigger by ID") @SdkTestId("find_trigger_by_id") - fun `find trigger by ID`(): Unit = runBlocking { - val triggerId = WithExecutableTrigger.TRIGGER_ID - - QueryBuilder.findTriggerById(triggerId) - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { client.sendQuery(it) } - .also { trigger -> assertTrue { trigger.id == triggerId } } - } + fun `find trigger by ID`(): Unit = + runBlocking { + val triggerId = WithExecutableTrigger.TRIGGER_ID - @Test - @WithIroha([WithExecutableTrigger::class]) - @Feature("Triggers") - @Query("FindTriggersByDomainId") - @Story("Trigger queries triggers by domain ID") - @SdkTestId("find_triggers_by_domain_id") - fun `find triggers by domain ID`(): Unit = runBlocking { - QueryBuilder.findTriggersByAuthorityDomainId(ALICE_ACCOUNT_ID.domain) - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { client.sendQuery(it) } - .also { triggers -> assert(triggers.all { it.id == WithExecutableTrigger.TRIGGER_ID }) } - } + val trigger = client.submit(QueryBuilder.findTriggerById(triggerId))!! + assertEquals(triggerId, trigger.id) + } @Test @WithIroha([WithExecutableTrigger::class]) @@ -534,17 +603,24 @@ class QueriesTest : IrohaTest() { @Query("FindAllActiveTriggerIds") @Story("Trigger queries all active trigger IDs") @SdkTestId("find_all_active_trigger_ids") - fun `find all active trigger IDs`(): Unit = runBlocking { - val triggerId = WithExecutableTrigger.TRIGGER_ID - - QueryBuilder.findAllActiveTriggerIds() - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { client.sendQuery(it) } - .also { ids -> - assertTrue { ids.all { it == triggerId } } - } - } + fun `find all active trigger IDs`(): Unit = + runBlocking { + val triggerId = WithExecutableTrigger.TRIGGER_ID + + val triggers = + client.submit( + QueryBuilder.findActiveTriggerIds( + CompoundPredicateOfTriggerId.Atom( + TriggerIdProjectionOfPredicateMarker.Atom( + TriggerIdPredicateAtom.Equals(triggerId), + ), + ), + ), + ) + + assertEquals(1, triggers.size) + assertEquals(triggerId, triggers[0]) + } @Test @WithIroha([DefaultGenesis::class]) @@ -552,27 +628,23 @@ class QueriesTest : IrohaTest() { @Query("FindAllAccountsWithPaginationAndSorting") @Story("Account queries all accounts with pagination and sorting by metadata key") @SdkTestId("pagination_plus_sorting_by_metadata_key") - fun `pagination plus sorting by metadata key`(): Unit = runBlocking { - val key1 = RandomStringUtils.randomAlphabetic(5).asName() - val key2 = RandomStringUtils.randomAlphabetic(5).asName() - - createAccount(metadata = mapOf(key1 to "1", key2 to "1")) - createAccount(metadata = mapOf(key1 to "0", key2 to "0")) - createAccount(metadata = mapOf(key1 to "2", key2 to "2")) - - listOf(key1, key2).forEach { key -> - QueryBuilder.findAllAccounts() - .account(ALICE_ACCOUNT_ID) - .sorting(key.string) - .buildSigned(ALICE_KEYPAIR) - .let { query -> client.sendQuery(query) } - .let { accounts -> - assertEquals("0", accounts[0].metadata.sortedMapOfName[key]) - assertEquals("1", accounts[1].metadata.sortedMapOfName[key]) - assertEquals("2", accounts[2].metadata.sortedMapOfName[key]) + fun `pagination plus sorting by metadata key`(): Unit = + runBlocking { + val key1 = RandomStringUtils.randomAlphabetic(5).asName() + val key2 = RandomStringUtils.randomAlphabetic(5).asName() + + createAccount(metadata = mapOf(key1 to Json.writeValue("1"), key2 to Json.writeValue("1"))) + createAccount(metadata = mapOf(key1 to Json.writeValue("0"), key2 to Json.writeValue("0"))) + createAccount(metadata = mapOf(key1 to Json.writeValue("2"), key2 to Json.writeValue("2"))) + + listOf(key1, key2).forEach { key -> + client.submit(QueryBuilder.findAccounts().sorting(key.string)).let { accounts -> + assertEquals("0", accounts[0].metadata.sortedMapOfName[key]!!.readValue()) + assertEquals("1", accounts[1].metadata.sortedMapOfName[key]!!.readValue()) + assertEquals("2", accounts[2].metadata.sortedMapOfName[key]!!.readValue()) } + } } - } @Test @WithIroha([NewDomainWithMetadata::class]) @@ -580,65 +652,81 @@ class QueriesTest : IrohaTest() { @Query("FindAllAccountsWithPagination") @Story("Account queries all accounts with pagination after inserting some new accounts") @SdkTestId("pagination_works_correct_after_inserting_some_new_accounts") - fun `pagination works correct after inserting some new accounts`(): Unit = runBlocking { - val key = "ts".asName() - val limit = 3L - - val metadata0 = Instant.now().toEpochMilli().toString() - createAccount(domainId = NewDomainWithMetadata.DOMAIN_ID, metadata = mapOf(key to metadata0)) - val metadata1 = Instant.now().toEpochMilli().toString() - createAccount(domainId = NewDomainWithMetadata.DOMAIN_ID, metadata = mapOf(key to metadata1)) - val metadata2 = Instant.now().toEpochMilli().toString() - createAccount(domainId = NewDomainWithMetadata.DOMAIN_ID, metadata = mapOf(key to metadata2)) - val metadata3 = Instant.now().toEpochMilli().toString() - createAccount(domainId = NewDomainWithMetadata.DOMAIN_ID, metadata = mapOf(key to metadata3)) - val metadata4 = Instant.now().toEpochMilli().toString() - createAccount(domainId = NewDomainWithMetadata.DOMAIN_ID, metadata = mapOf(key to metadata4)) - - QueryBuilder.findAccountsByDomainId(NewDomainWithMetadata.DOMAIN_ID) - .account(ALICE_ACCOUNT_ID) - .pagination(limit = limit) - .sorting(key) - .buildSigned(ALICE_KEYPAIR) - .let { query -> client.sendQuery(query) } - .let { accounts -> - assertEquals(limit, accounts.size.toLong()) - assertEquals(metadata2, accounts[2].metadata.sortedMapOfName[key]) - } - QueryBuilder.findAccountsByDomainId(NewDomainWithMetadata.DOMAIN_ID) - .account(ALICE_ACCOUNT_ID) - .pagination(start = limit.toBigInteger(), limit = limit) - .sorting(key) - .buildSigned(ALICE_KEYPAIR) - .let { query -> client.sendQuery(query) } - .let { accounts -> - assertEquals(2, accounts.size) - assertEquals(metadata4, accounts[1].metadata.sortedMapOfName[key]) - } + fun `pagination works correct after inserting some new accounts`(): Unit = + runBlocking { + val key = "ts".asName() + val limit = 3L + + val metadata0 = Instant.now().toEpochMilli() + val metadata1 = Instant.now().toEpochMilli() + val metadata2 = Instant.now().toEpochMilli() + val metadata3 = Instant.now().toEpochMilli() + val metadata4 = Instant.now().toEpochMilli() + + createAccount(NewDomainWithMetadata.DOMAIN_ID, mapOf(key to Json.writeValue(metadata0))) + createAccount(NewDomainWithMetadata.DOMAIN_ID, mapOf(key to Json.writeValue(metadata1))) + createAccount(NewDomainWithMetadata.DOMAIN_ID, mapOf(key to Json.writeValue(metadata2))) + createAccount(NewDomainWithMetadata.DOMAIN_ID, mapOf(key to Json.writeValue(metadata3))) + createAccount(NewDomainWithMetadata.DOMAIN_ID, mapOf(key to Json.writeValue(metadata4))) + + val byDomainIdFilter = + CompoundPredicateOfAccount.Atom( + AccountProjectionOfPredicateMarker.Id( + AccountIdProjectionOfPredicateMarker.Domain( + DomainIdProjectionOfPredicateMarker.Atom( + DomainIdPredicateAtom.Equals( + NewDomainWithMetadata.DOMAIN_ID, + ), + ), + ), + ), + ) + client + .submit( + QueryBuilder + .findAccounts(byDomainIdFilter) + .pagination(limit.toBigInteger()) + .sorting(key), + ).map { it.metadata.sortedMapOfName } + .let { accounts -> + assertEquals(limit, accounts.size.toLong()) + assertEquals(metadata2, accounts[2][key]!!.readValue()) + } + client + .submit( + QueryBuilder + .findAccounts(byDomainIdFilter) + .pagination(limit.toBigInteger(), limit.toBigInteger()) + .sorting(key), + ).map { it.metadata.sortedMapOfName } + .let { accounts -> + assertEquals(2, accounts.size) + assertEquals(metadata4, accounts[1][key]!!.readValue()) + } - val metadata5 = Instant.now().toEpochMilli().toString() - createAccount(domainId = NewDomainWithMetadata.DOMAIN_ID, metadata = mapOf(key to metadata5)) - val metadata6 = Instant.now().toEpochMilli().toString() - createAccount(domainId = NewDomainWithMetadata.DOMAIN_ID, metadata = mapOf(key to metadata6)) - val metadata7 = Instant.now().toEpochMilli().toString() - createAccount(domainId = NewDomainWithMetadata.DOMAIN_ID, metadata = mapOf(key to metadata7)) - val metadata8 = Instant.now().toEpochMilli().toString() - createAccount(domainId = NewDomainWithMetadata.DOMAIN_ID, metadata = mapOf(key to metadata8)) - - QueryBuilder.findAccountsByDomainId(NewDomainWithMetadata.DOMAIN_ID) - .account(ALICE_ACCOUNT_ID) - .pagination(start = BigInteger.valueOf(2).multiply(limit.toBigInteger()), limit = limit) - .sorting(key) - .buildSigned(ALICE_KEYPAIR) - .let { query -> client.sendQuery(query) } - .let { accounts -> - assertEquals(3, accounts.size) - assertEquals(metadata6, accounts[0].metadata.sortedMapOfName[key]) - assertEquals(metadata8, accounts[2].metadata.sortedMapOfName[key]) - } - print(metadata5) - print(metadata7) - } + val metadata5 = Instant.now().toEpochMilli() + val metadata6 = Instant.now().toEpochMilli() + val metadata7 = Instant.now().toEpochMilli() + val metadata8 = Instant.now().toEpochMilli() + + createAccount(NewDomainWithMetadata.DOMAIN_ID, mapOf(key to Json.writeValue(metadata5))) + createAccount(NewDomainWithMetadata.DOMAIN_ID, mapOf(key to Json.writeValue(metadata6))) + createAccount(NewDomainWithMetadata.DOMAIN_ID, mapOf(key to Json.writeValue(metadata7))) + createAccount(NewDomainWithMetadata.DOMAIN_ID, mapOf(key to Json.writeValue(metadata8))) + + client + .submit( + QueryBuilder + .findAccounts(byDomainIdFilter) + .pagination(limit.toBigInteger(), BigInteger.valueOf(2).multiply(limit.toBigInteger())) + .sorting(key), + ).map { it.metadata.sortedMapOfName } + .let { accounts -> + assertEquals(3, accounts.size) + assertEquals(metadata6, accounts[0][key]!!.readValue()) + assertEquals(metadata8, accounts[2][key]!!.readValue()) + } + } @Test @WithIroha([AliceHas100XorAndPermissionToMintAndBurn::class]) @@ -646,25 +734,23 @@ class QueriesTest : IrohaTest() { @Query("FindAllAccountsWithPagination") @Story("Account queries all accounts with pagination") @SdkTestId("find_all_account_with_pagination") - fun `find all account with pagination`(): Unit = runBlocking { - val limit = 5L - val start = 3L - var accounts = QueryBuilder.findAllAccounts() - .account(ALICE_ACCOUNT_ID) - .pagination(limit = 5) - .buildSigned(ALICE_KEYPAIR) - .let { query -> client.sendQuery(query) } - assertEquals(3, accounts.size) - - repeat(2) { createAccount() } - - accounts = QueryBuilder.findAllAccounts() - .account(ALICE_ACCOUNT_ID) - .pagination(start = BigInteger.valueOf(start), limit = limit) - .buildSigned(ALICE_KEYPAIR) - .let { query -> client.sendQuery(query) } - assertEquals(limit - start, accounts.size.toLong()) - } + fun `find all account with pagination`(): Unit = + runBlocking { + val limit = 5L + val start = 3L + + var accounts = client.submit(QueryBuilder.findAccounts().pagination(BigInteger.valueOf(5))) + assertEquals(3, accounts.size) + + repeat(2) { createAccount() } + accounts = + client.submit( + QueryBuilder + .findAccounts() + .pagination(BigInteger.valueOf(limit), BigInteger.valueOf(start)), + ) + assertEquals(limit - start, accounts.size.toLong()) + } @Test @WithIroha([AliceHas100XorAndPermissionToMintAndBurn::class]) @@ -672,24 +758,17 @@ class QueriesTest : IrohaTest() { @Query("FindAllTransactions") @Story("Account queries all transactions") @SdkTestId("find_all_transactions") - fun `find all transactions`(): Unit = runBlocking { - repeat(5) { - client.sendTransaction { - account(ALICE_ACCOUNT_ID) - burnAsset(DEFAULT_ASSET_ID, 1) - buildSigned(ALICE_KEYPAIR) - }.also { d -> - withTimeout(txTimeout) { d.await() } + fun `find all transactions`(): Unit = + runBlocking { + repeat(5) { + client.submit(Burn.asset(DEFAULT_ASSET_ID, BigDecimal(1))).also { + withTimeout(txTimeout) { it.await() } + } } - } - QueryBuilder.findAllTransactions() - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { client.sendQuery(it) } - .also { txs -> - assertTrue(txs.size == 9) // 5 + 4 genesis txs + client.submit(QueryBuilder.findTransactions()).also { + assertEquals(9, it.size) // 5 + 4 genesis txs } - } + } @Test @WithIroha([AliceHas100XorAndPermissionToMintAndBurn::class]) @@ -697,61 +776,68 @@ class QueriesTest : IrohaTest() { @Query("FindAllBlocks") @Story("Account queries all blocks") @SdkTestId("find_all_blocks") - fun `find all blocks`(): Unit = runBlocking { - client.sendTransaction { - account(ALICE_ACCOUNT_ID) - burnAsset(DEFAULT_ASSET_ID, 1) - buildSigned(ALICE_KEYPAIR) - }.also { d -> - withTimeout(txTimeout) { d.await() } - } - QueryBuilder.findAllBlocks() - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { client.sendQuery(it) } - .also { blocks -> - assertTrue(blocks.size == 2) + fun `find all blocks`(): Unit = + runBlocking { + client.submit(Burn.asset(DEFAULT_ASSET_ID, BigDecimal(1))).also { + withTimeout(txTimeout) { it.await() } } - } - - @Test - @WithIroha([AliceHas100XorAndPermissionToMintAndBurn::class]) - @Feature("Blocks") - @Query("FindAllBlockHeaders") - @Story("Account queries all block headers") - @SdkTestId("find_all_block_headers") - fun `find all block headers`(): Unit = runBlocking { - client.sendTransaction { - account(ALICE_ACCOUNT_ID) - burnAsset(DEFAULT_ASSET_ID, 1) - buildSigned(ALICE_KEYPAIR) - }.also { d -> - withTimeout(txTimeout) { d.await() } - } - QueryBuilder.findAllBlockHeaders() - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { client.sendQuery(it) } - .also { headers -> - assertTrue(headers.size == 2) + client.submit(QueryBuilder.findBlocks()).also { + assertEquals(2, it.size) } - } + } + +// @Test +// @WithIroha([AliceHas100XorAndPermissionToMintAndBurn::class]) +// @Feature("Blocks") +// @Query("FindAllBlockHeaders") +// @Story("Account queries all block headers") +// @SdkTestId("find_all_block_headers") +// fun `find all block headers`(): Unit = runBlocking { +// client.submit(Burn.asset(DEFAULT_ASSET_ID, BigDecimal(1))).also { +// withTimeout(txTimeout) { it.await() } +// } +// val headers: List = client.submit( +// QueryBuilder.findBlocks( +// selector = SelectorTupleOfSignedBlock( +// listOf( +// SignedBlockProjectionOfSelectorMarker.Header(BlockHeaderProjectionOfSelectorMarker.Atom()), +// ), +// ), +// ), +// ) +// assertEquals(2, headers.size) +// } + +// @Test +// @WithIroha([AliceHasRoleWithAccessToBobsMetadata::class]) +// @Feature("Roles") +// @Query("FindAllRoleIds") +// @Story("Account queries all role IDs") +// @SdkTestId("find_all_role_IDs") +// fun `find all role IDs`(): Unit = runBlocking { +// val roles: List = client.submit( +// QueryBuilder.findRoles( +// selector = SelectorTupleOfRole( +// listOf( +// RoleProjectionOfSelectorMarker.Id(RoleIdProjectionOfSelectorMarker.Atom()), +// ), +// ), +// ), +// ) +// assertContains(roles, AliceHasRoleWithAccessToBobsMetadata.ROLE_ID) +// } @Test @WithIroha([AliceHasRoleWithAccessToBobsMetadata::class]) @Feature("Roles") - @Query("FindAllRoleIds") - @Story("Account queries all role IDs") - @SdkTestId("find_all_role_IDs") - fun `find all role IDs`(): Unit = runBlocking { - QueryBuilder.findAllRoleIds() - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> client.sendQuery(query) } - .also { ids -> - assertContains(ids, AliceHasRoleWithAccessToBobsMetadata.ROLE_ID) - } - } + @Query("FindAllRoles") + @Story("Account queries all roles") + @SdkTestId("find_all_roles") + fun `find all roles`(): Unit = + runBlocking { + val roles = client.submit(QueryBuilder.findRoles()) + assertEquals(1, roles.size) + } @Test @WithIroha([AliceHasRoleWithAccessToBobsMetadata::class]) @@ -759,34 +845,12 @@ class QueriesTest : IrohaTest() { @Query("FindRolesByAccountId") @Story("Account queries roles by account ID") @SdkTestId("find_roles_by_account_ID") - fun `find roles by account ID`(): Unit = runBlocking { - QueryBuilder.findRolesByAccountId(ALICE_ACCOUNT_ID) - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> client.sendQuery(query) } - .also { ids -> - assertContains(ids, AliceHasRoleWithAccessToBobsMetadata.ROLE_ID) - } - } - - @Test - @WithIroha([AliceHasRoleWithAccessToBobsMetadata::class]) - @Feature("Roles") - @Query("FindAllRoles") - @Story("Account queries all roles") - @SdkTestId("find_all_roles") - fun `find all roles`(): Unit = runBlocking { - QueryBuilder.findAllRoles() - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> client.sendQuery(query) } - .also { roles -> - assertContains( - roles.map { it.id }, - AliceHasRoleWithAccessToBobsMetadata.ROLE_ID, - ) + fun `find roles by account ID`(): Unit = + runBlocking { + client.submit(QueryBuilder.findRolesByAccountId(ALICE_ACCOUNT_ID)).also { + assertContains(it, AliceHasRoleWithAccessToBobsMetadata.ROLE_ID) } - } + } @Test @WithIroha([AliceHasRoleWithAccessToBobsMetadata::class]) @@ -794,14 +858,22 @@ class QueriesTest : IrohaTest() { @Query("FindRoleByRoleId") @Story("Account queries role by role ID") @SdkTestId("find_role_by_role_ID") - fun `find role by ID`(): Unit = runBlocking { - val roleId = AliceHasRoleWithAccessToBobsMetadata.ROLE_ID - QueryBuilder.findRoleByRoleId(roleId) - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> client.sendQuery(query) } - .also { role -> assertEquals(role.id, roleId) } - } + fun `find role by ID`(): Unit = + runBlocking { + val roleId = AliceHasRoleWithAccessToBobsMetadata.ROLE_ID + + val result = + client.submit( + QueryBuilder.findRoles( + CompoundPredicateOfRole.Atom( + RoleProjectionOfPredicateMarker.Id(RoleIdProjectionOfPredicateMarker.Atom(RoleIdPredicateAtom.Equals(roleId))), + ), + ), + ) + + assertEquals(1, result.size) + assertEquals(roleId, result[0].id) + } @Test @WithIroha([AliceWithTestAssets::class]) @@ -809,47 +881,45 @@ class QueriesTest : IrohaTest() { @Query("FindAssetDefinitionsWithOrFilter") @Story("Account queries asset definitions with or filter") @SdkTestId("find_asset_definitions_with_or_filter") - fun `find asset definitions with or filter`(): Unit = runBlocking { - val definitionId = AliceWithTestAssets.TEST_ASSET_DEFINITION_ID - val filter = QueryFilters.or( - StringPredicate.Is("${definitionId.name.string}#${definitionId.domain.name.string}"), - ) - QueryBuilder.findAllAssetsDefinitions(filter) - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> - client.sendQuery(query) - }.also { assets -> - assertEquals(1, assets.size) - assertEquals(definitionId, assets[0].id) - } - } + fun `find asset definitions with or filter`(): Unit = + runBlocking { + val definitionId = AliceWithTestAssets.TEST_ASSET_DEFINITION_ID + + val assets = + client.submit( + QueryBuilder.findAssetsDefinitions( + CompoundPredicateOfAssetDefinition.Atom( + AssetDefinitionProjectionOfPredicateMarker.Id( + AssetDefinitionIdProjectionOfPredicateMarker.Atom(AssetDefinitionIdPredicateAtom.Equals(definitionId)), + ), + ), + ), + ) + + assertEquals(1, assets.size) + assertEquals(definitionId, assets[0].id) + } @WithIroha([WithManyDomains::class]) @Feature("Domains") @Query("FindAllDomains") @Story("Account queries all domains using cursor pagination") @SdkTestId("querying_multiple_domains_with_cursor_test") - fun `find multiple domains with cursor test`(): Unit = runBlocking { - val domains = QueryBuilder.findAllDomains() - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> client.sendQuery(query) } - assertEquals(WithManyDomains.DOMAINS_COUNT + 2, domains.size) - } + fun `find multiple domains with cursor test`(): Unit = + runBlocking { + val domains = client.submit(QueryBuilder.findDomains()) + assertEquals(WithManyDomains.DOMAINS_COUNT + 2, domains.size) + } private suspend fun createAccount( domainId: DomainId = DEFAULT_DOMAIN_ID, - keyPair: KeyPair = generateKeyPair(), - metadata: Map = mapOf(), + metadata: Map = mapOf(), ) { + val keyPair: KeyPair = generateKeyPair() val newAccountId = AccountId(domainId, keyPair.public.toIrohaPublicKey()) - client.sendTransaction { - accountId = ALICE_ACCOUNT_ID - registerAccount(newAccountId, Metadata(metadata)) - buildSigned(ALICE_KEYPAIR) - }.also { d -> - withTimeout(txTimeout) { d.await() } + + client.submit(Register.account(newAccountId, Metadata(metadata))).also { + withTimeout(txTimeout) { it.await() } } } } diff --git a/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/TriggersTest.kt b/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/TriggersTest.kt index f28aa9b96..becf6b425 100644 --- a/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/TriggersTest.kt +++ b/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/TriggersTest.kt @@ -7,15 +7,20 @@ import jp.co.soramitsu.iroha2.annotations.Sdk import jp.co.soramitsu.iroha2.annotations.SdkTestId import jp.co.soramitsu.iroha2.client.Iroha2Client import jp.co.soramitsu.iroha2.generated.AccountId +import jp.co.soramitsu.iroha2.generated.AccountIdPredicateAtom +import jp.co.soramitsu.iroha2.generated.AccountIdProjectionOfPredicateMarker import jp.co.soramitsu.iroha2.generated.AssetDefinitionId import jp.co.soramitsu.iroha2.generated.AssetId +import jp.co.soramitsu.iroha2.generated.AssetIdProjectionOfPredicateMarker +import jp.co.soramitsu.iroha2.generated.AssetProjectionOfPredicateMarker import jp.co.soramitsu.iroha2.generated.AssetType import jp.co.soramitsu.iroha2.generated.AssetValue +import jp.co.soramitsu.iroha2.generated.CompoundPredicateOfAsset import jp.co.soramitsu.iroha2.generated.EventFilterBox -import jp.co.soramitsu.iroha2.generated.InstructionBox -import jp.co.soramitsu.iroha2.generated.Metadata -import jp.co.soramitsu.iroha2.generated.Name +import jp.co.soramitsu.iroha2.generated.ExecuteTriggerEventFilter +import jp.co.soramitsu.iroha2.generated.ExecutionTime import jp.co.soramitsu.iroha2.generated.Repeats +import jp.co.soramitsu.iroha2.generated.TimeEventFilter import jp.co.soramitsu.iroha2.generated.TriggerId import jp.co.soramitsu.iroha2.query.QueryBuilder import jp.co.soramitsu.iroha2.testengine.ALICE_ACCOUNT_ID @@ -29,15 +34,22 @@ import jp.co.soramitsu.iroha2.testengine.IROHA_CONFIG_DELIMITER import jp.co.soramitsu.iroha2.testengine.IrohaTest import jp.co.soramitsu.iroha2.testengine.WithIroha import jp.co.soramitsu.iroha2.testengine.XOR_DEFINITION_ID +import jp.co.soramitsu.iroha2.transaction.Burn import jp.co.soramitsu.iroha2.transaction.EntityFilters import jp.co.soramitsu.iroha2.transaction.EventFilters +import jp.co.soramitsu.iroha2.transaction.Execute import jp.co.soramitsu.iroha2.transaction.Filters -import jp.co.soramitsu.iroha2.transaction.Instructions +import jp.co.soramitsu.iroha2.transaction.Instruction +import jp.co.soramitsu.iroha2.transaction.Mint +import jp.co.soramitsu.iroha2.transaction.Register +import jp.co.soramitsu.iroha2.transaction.SetKeyValue +import jp.co.soramitsu.iroha2.transaction.Transfer +import jp.co.soramitsu.iroha2.transaction.Unregister import kotlinx.coroutines.delay import kotlinx.coroutines.runBlocking import kotlinx.coroutines.time.withTimeout import org.junit.jupiter.api.Test -import org.junit.jupiter.api.assertThrows +import java.math.BigDecimal import java.math.BigInteger import java.security.KeyPair import java.time.Duration @@ -45,315 +57,325 @@ import java.time.Instant import java.util.Date import kotlin.test.assertEquals import kotlin.test.assertNotNull +import kotlin.test.assertNull @Feature("Triggers") @Owner("akostyuchenko") @Sdk("Java/Kotlin") class TriggersTest : IrohaTest() { - @Test @WithIroha([AliceHas100XorAndPermissionToMintAndBurn::class]) @Story("Data created trigger mints asset upon asset definition creation") @SdkTestId("data_created_trigger") - fun `data created trigger`(): Unit = runBlocking { - val triggerId = TriggerId(name = "data_trigger".asName()) - val newAssetName = "token1" - - // check account assets before trigger - val query = QueryBuilder.findAllAssetsDefinitions() - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - val assetDefinitions = client.sendQuery(query) - assertEquals(1, assetDefinitions.size) - val asset = assetDefinitions.first { it.id.name.string == "xor" } - assertNotNull(asset) - - // Check default asset quantity before trigger - val prevQuantity = checkDefaultAssetQuantity() - assertEquals(100L, prevQuantity) - - val filter = EventFilterBox.Data( - EntityFilters.byAssetDefinition(1), - ) - client.sendTransaction { - accountId = ALICE_ACCOUNT_ID - registerEventTrigger( - triggerId, - listOf(Instructions.mintAsset(DEFAULT_ASSET_ID, 1)), - Repeats.Indefinitely(), - ALICE_ACCOUNT_ID, - Metadata(mapOf()), - filter, - ) - buildSigned(ALICE_KEYPAIR) - }.also { d -> - withTimeout(txTimeout) { d.await() } + fun `data created trigger`(): Unit = + runBlocking { + val triggerId = TriggerId(name = "data_trigger".asName()) + val newAssetName = "token1" + + // check account assets before trigger + val query = QueryBuilder.findAssetsDefinitions() + val assetDefinitions = client.submit(query) + assertEquals(1, assetDefinitions.size) + val asset = assetDefinitions.first { it.id.name.string == "xor" } + assertNotNull(asset) + + // Check default asset quantity before trigger + val prevQuantity = checkDefaultAssetQuantity() + assertEquals(100L, prevQuantity) + + val filter = + EventFilterBox.Data( + EntityFilters.byAssetDefinition(1), + ) + client + .submit( + Register.trigger( + triggerId, + listOf(Mint.asset(DEFAULT_ASSET_ID, BigDecimal(1))), + Repeats.Indefinitely(), + ALICE_ACCOUNT_ID, + filter, + ), + ).also { d -> + withTimeout(txTimeout) { d.await() } + } + + // register new asset + // after that trigger should mint DEFAULT_ASSET_ID + createNewAsset(newAssetName, assetDefinitions.size) + + // check new quantity after trigger is run + val newQuantity = checkDefaultAssetQuantity() + assertEquals(prevQuantity + 1L, newQuantity) } - // register new asset - // after that trigger should mint DEFAULT_ASSET_ID - createNewAsset(newAssetName, assetDefinitions.size) - - // check new quantity after trigger is run - val newQuantity = checkDefaultAssetQuantity() - assertEquals(prevQuantity + 1L, newQuantity) - } - @Test @WithIroha([AliceHas100XorAndPermissionToMintAndBurn::class]) @Story("Pre commit trigger mints asset to account for every transaction") @SdkTestId("pre_commit_trigger_should_mint_asset_to_account_for_every_transaction") - fun `pre commit trigger should mint asset to account for every transaction`(): Unit = runBlocking { - val triggerId = TriggerId(name = "pre_commit_trigger".asName()) - val newAssetName = "token1" - - // check account assets before trigger - val query = QueryBuilder.findAllAssetsDefinitions() - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - val assetDefinitions = client.sendQuery(query) - assertEquals(1, assetDefinitions.size) - - // check DEFAULT_ASSET_ID quantity before trigger - val prevQuantity = checkDefaultAssetQuantity() - assertEquals(100L, prevQuantity) - - // register pre commit trigger - client.sendTransaction { - accountId = ALICE_ACCOUNT_ID - registerPreCommitTrigger( - triggerId, - listOf(Instructions.mintAsset(DEFAULT_ASSET_ID, 10)), - Repeats.Indefinitely(), - ALICE_ACCOUNT_ID, - ) - buildSigned(ALICE_KEYPAIR) - }.also { d -> - withTimeout(txTimeout) { d.await() } - } - - // check DEFAULT_ASSET_ID quantity after trigger is run - var newQuantity = checkDefaultAssetQuantity() - assertEquals(110L, newQuantity) - - // register new asset - // after that trigger should mint 10 more quantity to DEFAULT_ASSET_ID - createNewAsset(newAssetName, assetDefinitions.size) - - // check DEFAULT_ASSET_ID quantity after trigger is run - newQuantity = checkDefaultAssetQuantity() - assertEquals(120L, newQuantity) - - // transfer asset instruction just to test trigger - client.sendTransaction { - account(ALICE_ACCOUNT_ID) - transferAsset(DEFAULT_ASSET_ID, 100, BOB_ACCOUNT_ID) - buildSigned(ALICE_KEYPAIR) - }.also { d -> - withTimeout(txTimeout) { d.await() } + fun `pre commit trigger should mint asset to account for every transaction`(): Unit = + runBlocking { + val triggerId = TriggerId(name = "pre_commit_trigger".asName()) + val newAssetName = "token1" + + // check account assets before trigger + val query = QueryBuilder.findAssetsDefinitions() + val assetDefinitions = client.submit(query) + assertEquals(1, assetDefinitions.size) + + // check DEFAULT_ASSET_ID quantity before trigger + val prevQuantity = checkDefaultAssetQuantity() + assertEquals(100L, prevQuantity) + + // register pre commit trigger + client + .submit( + Register.trigger( + triggerId, + listOf(Mint.asset(DEFAULT_ASSET_ID, BigDecimal(10))), + Repeats.Indefinitely(), + ALICE_ACCOUNT_ID, + EventFilterBox.Time(TimeEventFilter(ExecutionTime.PreCommit())), + ), + ).also { d -> + withTimeout(txTimeout) { d.await() } + } + + // check DEFAULT_ASSET_ID quantity after trigger is run + var newQuantity = checkDefaultAssetQuantity() + assertEquals(110L, newQuantity) + + // register new asset + // after that trigger should mint 10 more quantity to DEFAULT_ASSET_ID + createNewAsset(newAssetName, assetDefinitions.size) + + // check DEFAULT_ASSET_ID quantity after trigger is run + newQuantity = checkDefaultAssetQuantity() + assertEquals(120L, newQuantity) + + // transfer asset instruction just to test trigger + client + .submit(Transfer.asset(DEFAULT_ASSET_ID, BigDecimal(100), BOB_ACCOUNT_ID)) + .also { d -> + withTimeout(txTimeout) { d.await() } + } + + // check DEFAULT_ASSET_ID quantity after trigger is run + newQuantity = checkDefaultAssetQuantity() + assertEquals(30L, newQuantity) } - // check DEFAULT_ASSET_ID quantity after trigger is run - newQuantity = checkDefaultAssetQuantity() - assertEquals(30L, newQuantity) - } - @Test @WithIroha([AliceHas100XorAndPermissionToMintAndBurn::class]) @Story("Executable trigger mints asset") @SdkTestId("executable_trigger") - fun `executable trigger`(): Unit = runBlocking { - val triggerId = TriggerId(name = "executable_trigger".asName()) - - client.sendTransaction { - accountId = ALICE_ACCOUNT_ID - registerExecutableTrigger( - triggerId, - listOf(Instructions.mintAsset(DEFAULT_ASSET_ID, 1)), - Repeats.Exactly(1L), - ALICE_ACCOUNT_ID, - ) - executeTrigger(triggerId) - buildSigned(ALICE_KEYPAIR) - }.also { d -> - withTimeout(txTimeout) { d.await() } + fun `executable trigger`(): Unit = + runBlocking { + val triggerId = TriggerId("executable_trigger".asName()) + + client + .submit( + Register.trigger( + triggerId, + listOf(Mint.asset(DEFAULT_ASSET_ID, BigDecimal(1))), + Repeats.Exactly(1L), + ALICE_ACCOUNT_ID, + EventFilterBox.ExecuteTrigger(ExecuteTriggerEventFilter(triggerId)), + ), + Execute.trigger(triggerId, null), + ).also { d -> + withTimeout(txTimeout) { d.await() } + } + + assertEquals(101L, readQuantity()) } - assertEquals(101L, readQuantity()) - } - @Test @WithIroha([AliceHas100XorAndPermissionToMintAndBurn::class], configs = ["LOG_LEVEL${IROHA_CONFIG_DELIMITER}TRACE"]) @Story("Endless time trigger decreases asset quantity continuously") @SdkTestId("endless_time_trigger") - fun `endless time trigger`(): Unit = runBlocking { - val triggerId = TriggerId(name = Name("endless_time_trigger")) - - sendAndAwaitTimeTrigger( - triggerId, - Repeats.Indefinitely(), - Instructions.burnAsset(DEFAULT_ASSET_ID, 1), - ) - sendAndWait10Txs() - - delay(3000) - val q = readQuantity() - assert(q <= 90L) - } + fun `endless time trigger`(): Unit = + runBlocking { + val triggerId = TriggerId("endless_time_trigger".asName()) + + sendAndAwaitTimeTrigger( + triggerId, + Repeats.Indefinitely(), + Burn.asset(DEFAULT_ASSET_ID, BigDecimal(1)), + ) + sendAndWait10Txs() + + delay(3000) + val q = readQuantity() + assert(q <= 90L) + } @Test @WithIroha([AliceHas100XorAndPermissionToMintAndBurn::class]) @Story("Time trigger executes a limited number of times") @SdkTestId("time_trigger_execution_repeats_few_times") - fun `time trigger execution repeats few times`(): Unit = runBlocking { - val triggerId = TriggerId(name = Name("time_trigger")) - - sendAndAwaitTimeTrigger( - triggerId, - Repeats.Exactly(5L), - Instructions.burnAsset(DEFAULT_ASSET_ID, 1), - ) - sendAndWait10Txs() - - delay(3000) - assertEquals(95, readQuantity()) - } + fun `time trigger execution repeats few times`(): Unit = + runBlocking { + val triggerId = TriggerId("time_trigger".asName()) + + sendAndAwaitTimeTrigger( + triggerId, + Repeats.Exactly(5L), + Burn.asset(DEFAULT_ASSET_ID, BigDecimal(1)), + ) + sendAndWait10Txs() + + delay(3000) + assertEquals(95, readQuantity()) + } @Test @WithIroha([AliceHas100XorAndPermissionToMintAndBurn::class]) @Story("Wasm trigger mints NFT for every user") @SdkTestId("wasm_trigger_to_mint_nft_for_every_user") - fun `wasm trigger to mint nft for every user and update trigger metadata`(): Unit = runBlocking { - val triggerId = TriggerId(name = "wasm_trigger".asName()) - - val currentTime = Date().time + 10000 - val filter = EventFilterBox.Time( - EventFilters.timeEventFilter(BigInteger.valueOf(currentTime), BigInteger.valueOf(1000L)), - ) - val wasm = this.javaClass.classLoader - .getResource("create_nft_for_alice_smartcontract.wasm") - .readBytes() - - client.tx { - registerWasmTrigger( - triggerId, - wasm, - Repeats.Indefinitely(), - ALICE_ACCOUNT_ID, - Metadata(mapOf()), - filter, + fun `wasm trigger to mint nft for every user and update trigger metadata`(): Unit = + runBlocking { + val triggerId = TriggerId(name = "wasm_trigger".asName()) + + val currentTime = Date().time + 5000 + val filter = + EventFilterBox.Time( + EventFilters.timeEventFilter(BigInteger.valueOf(currentTime), BigInteger.valueOf(1000L)), + ) + val wasm = + this.javaClass.classLoader + .getResource("create_nft_for_alice_smartcontract.wasm") + .readBytes() + + client.submit( + Register.trigger( + triggerId, + wasm, + Repeats.Indefinitely(), + ALICE_ACCOUNT_ID, + filter, + ), ) + keepNetworkBusyAndCheckAssetDefinitionIds() + + val testKey = "key02357123".asName() + val testValue = "value986441123" + client + .submit(SetKeyValue.trigger(triggerId, testKey, testValue)) + .also { d -> + withTimeout(txTimeout) { d.await() } + } + + delay(15000) + + client + .submit(QueryBuilder.findTriggerById(triggerId))!! + .also { + assertEquals( + testValue, + it.action.metadata.sortedMapOfName[testKey]!! + .readValue(), + ) + } } - keepNetworkBusyAndCheckAssetDefinitionIds() - - val testKey = "key02357123" - val testValue = "value986441123" - client.tx { setKeyValue(triggerId, testKey.asName(), testValue) } - - delay(15000) - - QueryBuilder.findTriggerById(triggerId) - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> client.sendQuery(query) } - .also { assertEquals(testValue, it.action.metadata.getStringValue(testKey)) } - } @Test @WithIroha([AliceHas100XorAndPermissionToMintAndBurn::class]) @Story("Wasm trigger mints NFT for every user when trigger metadata is updated") @SdkTestId("wasm_trigger_to_mint_nft_for_every_user_on_update_trigger_metadata_event") - fun `wasm trigger to mint nft for every user on update trigger metadata event`(): Unit = runBlocking { - val wasmTriggerId = TriggerId(name = "wasm_trigger".asName()) - val setKeyValueTriggerId = TriggerId(name = "update_trigger".asName()) - - val filter = Filters.data( - EntityFilters.byTrigger(1, wasmTriggerId), - ) - val wasm = this.javaClass.classLoader - .getResource("create_nft_for_alice_smartcontract.wasm") - .readBytes() - - client.tx { - registerWasmTrigger( - wasmTriggerId, - wasm, - Repeats.Indefinitely(), - ALICE_ACCOUNT_ID, - Metadata(mapOf()), - filter, - ) - } - val testKey = "key" - val testValue = "value" - client.tx { - registerExecutableTrigger( - setKeyValueTriggerId, - listOf(Instructions.setKeyValue(wasmTriggerId, testKey.asName(), testValue)), - Repeats.Exactly(1L), - ALICE_ACCOUNT_ID, + fun `wasm trigger to mint nft for every user on update trigger metadata event`(): Unit = + runBlocking { + val wasmTriggerId = TriggerId(name = "wasm_trigger".asName()) + val setKeyValueTriggerId = TriggerId(name = "update_trigger".asName()) + + val filter = + Filters.data( + EntityFilters.byTrigger(1, wasmTriggerId), + ) + val wasm = + this.javaClass.classLoader + .getResource("create_nft_for_alice_smartcontract.wasm") + .readBytes() + + client + .submit( + Register.trigger( + wasmTriggerId, + wasm, + Repeats.Indefinitely(), + ALICE_ACCOUNT_ID, + filter, + ), + ).also { d -> + withTimeout(txTimeout) { d.await() } + } + val testKey = "key".asName() + val testValue = "value" + client.submit( + Register.trigger( + setKeyValueTriggerId, + listOf(SetKeyValue.trigger(wasmTriggerId, testKey, testValue)), + Repeats.Exactly(1L), + ALICE_ACCOUNT_ID, + EventFilterBox.ExecuteTrigger(ExecuteTriggerEventFilter(setKeyValueTriggerId)), + ), + Execute.trigger(setKeyValueTriggerId, null), ) - executeTrigger(setKeyValueTriggerId) - } - keepNetworkBusyAndCheckAssetDefinitionIds() - - QueryBuilder.findTriggerById(wasmTriggerId) - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> client.sendQuery(query) } - .also { assertEquals(testValue, it.action.metadata.getStringValue(testKey)) } - } + keepNetworkBusyAndCheckAssetDefinitionIds() + + client + .submit(QueryBuilder.findTriggerById(wasmTriggerId))!! + .also { + assertEquals( + testValue, + it.action.metadata.sortedMapOfName[testKey]!! + .readValue(), + ) + } + } @Test @WithIroha([AliceHas100XorAndPermissionToMintAndBurn::class]) @Story("Unregister an executable trigger") @SdkTestId("unregister_executable_trigger") - fun `unregister executable trigger`(): Unit = runBlocking { - val triggerName = "executable_trigger" - val triggerId = TriggerId(name = triggerName.asName()) - - client.sendTransaction { - accountId = ALICE_ACCOUNT_ID - registerExecutableTrigger( - triggerId, - listOf(Instructions.mintAsset(DEFAULT_ASSET_ID, 1)), - Repeats.Exactly(1L), - ALICE_ACCOUNT_ID, - ) - buildSigned(ALICE_KEYPAIR) - }.also { d -> - withTimeout(txTimeout) { d.await() } - } - - client.sendTransaction { - accountId = ALICE_ACCOUNT_ID - unregisterTrigger(triggerName) - buildSigned(ALICE_KEYPAIR) - }.also { d -> - withTimeout(txTimeout) { d.await() } - } - - assertThrows { - runBlocking { - QueryBuilder.findTriggerById(triggerId) - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> client.sendQuery(query) } + fun `unregister executable trigger`(): Unit = + runBlocking { + val triggerName = "executable_trigger" + val triggerId = TriggerId(name = triggerName.asName()) + + client + .submit( + Register.trigger( + triggerId, + listOf(Mint.asset(DEFAULT_ASSET_ID, BigDecimal(1))), + Repeats.Exactly(1L), + ALICE_ACCOUNT_ID, + EventFilterBox.ExecuteTrigger(ExecuteTriggerEventFilter(triggerId)), + ), + ).also { d -> + withTimeout(txTimeout) { d.await() } + } + + client + .submit(Unregister.trigger(triggerId)) + .also { d -> + withTimeout(txTimeout) { d.await() } + } + + client.submit(QueryBuilder.findTriggerById(triggerId)).also { + assertNull(it) } } - } private suspend fun sendAndWait10Txs() { repeat(10) { i -> - client.sendTransaction { - accountId = ALICE_ACCOUNT_ID - setKeyValue(ALICE_ACCOUNT_ID, "key$i".asName(), "value$i") - buildSigned(ALICE_KEYPAIR) - }.also { d -> - delay(1000) - withTimeout(txTimeout) { d.await() } - } + client + .submit(SetKeyValue.account(ALICE_ACCOUNT_ID, "key$i".asName(), "value$i")) + .also { d -> + delay(1000) + withTimeout(txTimeout) { d.await() } + } } } @@ -361,94 +383,105 @@ class TriggersTest : IrohaTest() { assetId: AssetId = DEFAULT_ASSET_ID, accountId: AccountId = ALICE_ACCOUNT_ID, keyPair: KeyPair = ALICE_KEYPAIR, - ): Long { - return QueryBuilder.findAssetById(assetId) - .account(accountId) - .buildSigned(keyPair) - .let { query -> client.sendQuery(query) } - .value.cast().numeric.asLong() - } - - private suspend fun sendAndAwaitTimeTrigger( + ): Long = + client + .submit(QueryBuilder.findAssetById(assetId))!! + .value + .cast() + .numeric + .asLong() + + private suspend fun sendAndAwaitTimeTrigger( triggerId: TriggerId, repeats: Repeats, - instruction: InstructionBox, + instruction: I, accountId: AccountId = ALICE_ACCOUNT_ID, ) { - client.sendTransaction { - this.accountId = accountId - registerTimeTrigger( - triggerId, - listOf(instruction), - repeats, - accountId, - EventFilters.timeEventFilter( - BigInteger.valueOf(Instant.now().toEpochMilli()), - BigInteger.valueOf(500L), + client + .submit( + Register.trigger( + triggerId, + listOf(instruction), + repeats, + accountId, + EventFilterBox.Time( + EventFilters.timeEventFilter( + BigInteger.valueOf(Instant.now().toEpochMilli()), + BigInteger.valueOf(500L), + ), + ), ), - ) - buildSigned(ALICE_KEYPAIR) - }.also { d -> - withTimeout(txTimeout) { d.await() } - } + ).also { d -> + withTimeout(txTimeout) { d.await() } + } } - private suspend fun createNewAsset(assetName: String, prevSize: Int) { + private suspend fun createNewAsset( + assetName: String, + prevSize: Int, + ) { val newAsset = AssetDefinitionId(DEFAULT_DOMAIN_ID, assetName.asName()) - client.sendTransaction { - accountId = ALICE_ACCOUNT_ID - registerAssetDefinition(newAsset, AssetType.numeric()) - buildSigned(ALICE_KEYPAIR) - }.also { d -> - withTimeout(txTimeout) { d.await() } - } + client + .submit(Register.assetDefinition(newAsset, AssetType.numeric())) + .also { d -> + withTimeout(txTimeout) { d.await() } + } // check new asset is created - val query = QueryBuilder.findAllAssetsDefinitions() - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - val assetDefinitions = client.sendQuery(query) + val query = QueryBuilder.findAssetsDefinitions() + val assetDefinitions = client.submit(query) assertEquals(prevSize + 1, assetDefinitions.size) val asset = assetDefinitions.first { it.id.name.string == assetName } assertNotNull(asset) } - private suspend fun checkDefaultAssetQuantity(): Long { - return QueryBuilder.findAssetById(DEFAULT_ASSET_ID) - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> client.sendQuery(query) } - .value.cast() - .numeric.asLong() - } + private suspend fun checkDefaultAssetQuantity(): Long = + client + .submit(QueryBuilder.findAssetById(DEFAULT_ASSET_ID))!! + .value + .cast() + .numeric + .asLong() private suspend fun keepNetworkBusyAndCheckAssetDefinitionIds() { // send some transactions to keep Iroha2 network busy repeat(5) { i -> - client.sendTransaction { - accountId = ALICE_ACCOUNT_ID - setKeyValue(ALICE_ACCOUNT_ID, "test$i".asName(), "test$i") - buildSigned(ALICE_KEYPAIR) - }.also { d -> - withTimeout(Duration.ofSeconds(60)) { d.await() } - } + client + .submit(SetKeyValue.account(ALICE_ACCOUNT_ID, "test$i".asName(), "test$i")) + .also { d -> + withTimeout(Duration.ofSeconds(60)) { d.await() } + } delay(500) } - QueryBuilder.findAssetsByAccountId(ALICE_ACCOUNT_ID) - .account(ALICE_ACCOUNT_ID) - .buildSigned(ALICE_KEYPAIR) - .let { query -> client.sendQuery(query) } + val byAccountIdFilter = + CompoundPredicateOfAsset.Atom( + AssetProjectionOfPredicateMarker.Id( + AssetIdProjectionOfPredicateMarker.Account( + AccountIdProjectionOfPredicateMarker.Atom( + AccountIdPredicateAtom.Equals( + ALICE_ACCOUNT_ID, + ), + ), + ), + ), + ) + client + .submit(QueryBuilder.findAssets(byAccountIdFilter)) .also { assets -> - val expectedDefinition = AssetDefinitionId( - DEFAULT_DOMAIN_ID, - "nft_number_1_for_${ALICE_PUBLIC_KEY.payload.toHex(true)}".asName(), - ) + val expectedDefinition = + AssetDefinitionId( + DEFAULT_DOMAIN_ID, + "nft_number_1_for_${ALICE_PUBLIC_KEY.payload.toHex(true)}".asName(), + ) assert(assets.size > 1) assert(assets.all { it.id.account == ALICE_ACCOUNT_ID }) assert(assets.any { it.id.definition == XOR_DEFINITION_ID }) assert( assets.any { - it.id.definition.asString().lowercase() == expectedDefinition.asString().lowercase() + expectedDefinition.asString().lowercase() == + it.id.definition + .asString() + .lowercase() }, ) } diff --git a/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/annotations/Permission.kt b/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/annotations/Permission.kt index 3b68e223e..d31bc313f 100644 --- a/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/annotations/Permission.kt +++ b/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/annotations/Permission.kt @@ -9,4 +9,6 @@ import java.lang.annotation.Inherited @Target(AnnotationTarget.FUNCTION, AnnotationTarget.CLASS) @LabelAnnotation(name = "permission") @Repeatable -annotation class Permission(val value: String) +annotation class Permission( + val value: String, +) diff --git a/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/annotations/Query.kt b/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/annotations/Query.kt index 4dcdbfa17..92091c236 100644 --- a/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/annotations/Query.kt +++ b/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/annotations/Query.kt @@ -9,4 +9,6 @@ import java.lang.annotation.Inherited @Target(AnnotationTarget.FUNCTION) @LabelAnnotation(name = "query") @Repeatable -annotation class Query(val value: String) +annotation class Query( + val value: String, +) diff --git a/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/annotations/Sdk.kt b/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/annotations/Sdk.kt index f62090de9..18984f2c5 100644 --- a/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/annotations/Sdk.kt +++ b/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/annotations/Sdk.kt @@ -8,4 +8,6 @@ import java.lang.annotation.Inherited @Retention(AnnotationRetention.RUNTIME) @Target(AnnotationTarget.FUNCTION, AnnotationTarget.CLASS) @LabelAnnotation(name = "sdk") -annotation class Sdk(val value: String) +annotation class Sdk( + val value: String, +) diff --git a/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/annotations/SdkTestId.kt b/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/annotations/SdkTestId.kt index 553af31d1..bf815ab4e 100644 --- a/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/annotations/SdkTestId.kt +++ b/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/annotations/SdkTestId.kt @@ -9,4 +9,6 @@ import java.lang.annotation.Inherited @Target(AnnotationTarget.FUNCTION) @LabelAnnotation(name = "sdk_test_id") @Repeatable -annotation class SdkTestId(val value: String) +annotation class SdkTestId( + val value: String, +) diff --git a/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/testengine/Genesis.kt b/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/testengine/Genesis.kt index 97a077d06..670186a8e 100644 --- a/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/testengine/Genesis.kt +++ b/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/testengine/Genesis.kt @@ -1,9 +1,7 @@ package jp.co.soramitsu.iroha2.testengine import jp.co.soramitsu.iroha2.Genesis -import jp.co.soramitsu.iroha2.Permissions import jp.co.soramitsu.iroha2.asDomainId -import jp.co.soramitsu.iroha2.asJsonString import jp.co.soramitsu.iroha2.asName import jp.co.soramitsu.iroha2.generateKeyPair import jp.co.soramitsu.iroha2.generatePublicKey @@ -11,21 +9,42 @@ import jp.co.soramitsu.iroha2.generated.AccountId import jp.co.soramitsu.iroha2.generated.AssetDefinitionId import jp.co.soramitsu.iroha2.generated.AssetId import jp.co.soramitsu.iroha2.generated.AssetType +import jp.co.soramitsu.iroha2.generated.BlockParameters +import jp.co.soramitsu.iroha2.generated.CanBurnAssetWithDefinition +import jp.co.soramitsu.iroha2.generated.CanManagePeers +import jp.co.soramitsu.iroha2.generated.CanManageRoles +import jp.co.soramitsu.iroha2.generated.CanMintAssetWithDefinition +import jp.co.soramitsu.iroha2.generated.CanModifyAccountMetadata +import jp.co.soramitsu.iroha2.generated.CanRegisterDomain +import jp.co.soramitsu.iroha2.generated.CanTransferAssetWithDefinition +import jp.co.soramitsu.iroha2.generated.CanUnregisterDomain +import jp.co.soramitsu.iroha2.generated.CanUpgradeExecutor import jp.co.soramitsu.iroha2.generated.ChainId import jp.co.soramitsu.iroha2.generated.DomainId -import jp.co.soramitsu.iroha2.generated.InstructionBox +import jp.co.soramitsu.iroha2.generated.EventFilterBox +import jp.co.soramitsu.iroha2.generated.ExecuteTriggerEventFilter +import jp.co.soramitsu.iroha2.generated.Json import jp.co.soramitsu.iroha2.generated.Metadata +import jp.co.soramitsu.iroha2.generated.Name import jp.co.soramitsu.iroha2.generated.NonZeroOfu64 -import jp.co.soramitsu.iroha2.generated.Parameter -import jp.co.soramitsu.iroha2.generated.Permission +import jp.co.soramitsu.iroha2.generated.Parameters import jp.co.soramitsu.iroha2.generated.RawGenesisTransaction import jp.co.soramitsu.iroha2.generated.Repeats import jp.co.soramitsu.iroha2.generated.RoleId -import jp.co.soramitsu.iroha2.generated.SmartContractParameter +import jp.co.soramitsu.iroha2.generated.SmartContractParameters +import jp.co.soramitsu.iroha2.generated.SumeragiParameters +import jp.co.soramitsu.iroha2.generated.TransactionParameters import jp.co.soramitsu.iroha2.generated.TriggerId import jp.co.soramitsu.iroha2.numeric import jp.co.soramitsu.iroha2.toIrohaPublicKey -import jp.co.soramitsu.iroha2.transaction.Instructions +import jp.co.soramitsu.iroha2.transaction.Burn +import jp.co.soramitsu.iroha2.transaction.Grant +import jp.co.soramitsu.iroha2.transaction.Instruction +import jp.co.soramitsu.iroha2.transaction.Mint +import jp.co.soramitsu.iroha2.transaction.Register +import jp.co.soramitsu.iroha2.transaction.SetKeyValue +import jp.co.soramitsu.iroha2.transaction.Transfer +import jp.co.soramitsu.iroha2.writeValue import org.apache.commons.lang3.RandomStringUtils.randomAlphabetic import org.testcontainers.shaded.org.apache.commons.lang3.RandomStringUtils import java.math.BigDecimal @@ -35,81 +54,102 @@ import kotlin.random.Random.Default.nextDouble /** * Create a default genesis where there is just one domain with only Alice and Bob in it */ -open class DefaultGenesis(transaction: RawGenesisTransaction? = null) : Genesis(transaction ?: rawGenesisTx()) +open class DefaultGenesis( + transaction: RawGenesisTransaction? = null, +) : Genesis(transaction ?: rawGenesisTx()) -open class AliceCanUpgradeExecutor : Genesis( - rawGenesisTx( - Instructions.grantPermissionToken( - Permissions.CanUpgradeExecutor, - destinationId = ALICE_ACCOUNT_ID, +open class BobCanManageRoles : + Genesis( + rawGenesisTx( + Grant.accountPermission( + CanManageRoles(), + BOB_ACCOUNT_ID, + ), ), - ), -) + ) + +open class BobHasPermissionToRegisterDomain : + Genesis( + rawGenesisTx( + Grant.accountPermission( + CanRegisterDomain(), + BOB_ACCOUNT_ID, + ), + ), + ) + +open class AliceHasPermissionToRegisterDomain : + Genesis( + rawGenesisTx( + Grant.accountPermission( + CanRegisterDomain(), + ALICE_ACCOUNT_ID, + ), + ), + ) -open class WithDomainTransferredToBob : Genesis( - rawGenesisTx( - Instructions.registerDomain(DOMAIN_ID), - Instructions.transferDomainOwnership(GENESIS_ACCOUNT, DOMAIN_ID, BOB_ACCOUNT_ID), - ), -) { +open class AliceCanUpgradeExecutor : + Genesis( + rawGenesisTx( + Grant.accountPermission( + CanUpgradeExecutor(), + ALICE_ACCOUNT_ID, + ), + ), + ) + +open class WithDomainTransferredToBob : + Genesis( + rawGenesisTx( + Register.domain(DOMAIN_ID), + Transfer.domain(GENESIS_ACCOUNT, DOMAIN_ID, BOB_ACCOUNT_ID), + ), + ) { companion object { val DOMAIN_ID = randomAlphabetic(10).asDomainId() } } -open class AliceCanUnregisterAnyPeer : Genesis( - rawGenesisTx( - Instructions.grantPermissionToken( - Permissions.CanUnregisterAnyPeer, - destinationId = ALICE_ACCOUNT_ID, - ), - ), -) - -open class AliceAndBobHasPermissionToMintPublicKeys : Genesis( - rawGenesisTx( - Instructions.grantPermissionToken( - Permissions.CanMintUserPublicKeys, - ALICE_ACCOUNT_ID.asJsonString(), - ALICE_ACCOUNT_ID, - ), - Instructions.grantPermissionToken( - Permissions.CanMintUserPublicKeys, - BOB_ACCOUNT_ID.asJsonString(), - BOB_ACCOUNT_ID, +open class AliceCanManagePeers : + Genesis( + rawGenesisTx( + Grant.accountPermission( + CanManagePeers(), + ALICE_ACCOUNT_ID, + ), ), - ), -) + ) -open class AliceHasPermissionToUnregisterDomain : Genesis( - rawGenesisTx( - Instructions.registerDomain(NEW_DOMAIN_ID), - Instructions.grantPermissionToken( - Permissions.CanUnregisterDomain, - NEW_DOMAIN_ID.asJsonString(), - ALICE_ACCOUNT_ID, +open class AliceHasPermissionToUnregisterDomain : + Genesis( + rawGenesisTx( + Register.domain(NEW_DOMAIN_ID), + Grant.accountPermission( + CanUnregisterDomain(NEW_DOMAIN_ID), + ALICE_ACCOUNT_ID, + ), ), - ), -) { + ) { companion object { val NEW_DOMAIN_ID = DomainId("NEW_DOMAIN".asName()) } } -open class WithManyDomains : Genesis( - rawGenesisTx( - *registerDomains(DOMAINS_COUNT), - ), -) { +open class WithManyDomains : + Genesis( + rawGenesisTx( + *registerDomains(DOMAINS_COUNT), + ), + ) { companion object { const val DOMAINS_COUNT = 25 } } -fun registerDomains(count: Int): Array { - val instructions = mutableListOf() +fun registerDomains(count: Int): Array { + val instructions = mutableListOf() for (i in 1..count) { - instructions.add(Instructions.registerDomain(DomainId("NEW_DOMAIN$i".asName()))) + instructions.add(Register.domain(DomainId("NEW_DOMAIN$i".asName()))) } return instructions.toTypedArray() } @@ -117,22 +157,16 @@ fun registerDomains(count: Int): Array { /** * Give Alice access to Bob's metadata */ -open class AliceHasRoleWithAccessToBobsMetadata : Genesis( - rawGenesisTx( - Instructions.registerRole( - ROLE_ID, - Permission( - Permissions.CanSetKeyValueInAccount.type, - BOB_ACCOUNT_ID.asJsonString(true), - ), - Permission( - Permissions.CanRemoveKeyValueInAccount.type, - BOB_ACCOUNT_ID.asJsonString(true), +open class AliceHasRoleWithAccessToBobsMetadata : + Genesis( + rawGenesisTx( + Register.role( + ALICE_ACCOUNT_ID, + ROLE_ID, + CanModifyAccountMetadata(BOB_ACCOUNT_ID), ), ), - Instructions.grantRole(ROLE_ID, ALICE_ACCOUNT_ID), - ), -) { + ) { companion object { val ROLE_ID = RoleId("USER_METADATA_ACCESS".asName()) } @@ -141,40 +175,61 @@ open class AliceHasRoleWithAccessToBobsMetadata : Genesis( /** * Give Alice 100 XOR and the permission to burn them */ -open class AliceHas100XorAndPermissionToMintAndBurn : Genesis( - rawGenesisTx( - Instructions.registerAssetDefinition(DEFAULT_ASSET_DEFINITION_ID, AssetType.numeric()), - Instructions.mintAsset(DEFAULT_ASSET_ID, 100), - Instructions.grantPermissionToken( - Permissions.CanMintAssetWithDefinition, - DEFAULT_ASSET_DEFINITION_ID.asJsonString(), - ALICE_ACCOUNT_ID, - ), - Instructions.grantPermissionToken( - Permissions.CanBurnAssetWithDefinition, - DEFAULT_ASSET_DEFINITION_ID.asJsonString(), - ALICE_ACCOUNT_ID, - ), - params = listOf( - Parameter.SmartContract( - SmartContractParameter.Fuel(NonZeroOfu64(BigInteger.valueOf(5500000000))), +open class AliceHas100XorAndPermissionToMintAndBurn : + Genesis( + rawGenesisTx( + Register.assetDefinition(DEFAULT_ASSET_DEFINITION_ID, AssetType.numeric()), + Mint.asset(DEFAULT_ASSET_ID, BigDecimal(100)), + Grant.accountPermission( + CanMintAssetWithDefinition(DEFAULT_ASSET_DEFINITION_ID), + ALICE_ACCOUNT_ID, ), - Parameter.Executor( - SmartContractParameter.Fuel(NonZeroOfu64(BigInteger.valueOf(5500000000))), + Grant.accountPermission( + CanBurnAssetWithDefinition(DEFAULT_ASSET_DEFINITION_ID), + ALICE_ACCOUNT_ID, ), + params = + Parameters( + sumeragi = + SumeragiParameters( + blockTimeMs = BigInteger.valueOf(2000), + commitTimeMs = BigInteger.valueOf(4000), + maxClockDriftMs = BigInteger.valueOf(1000), + ), + block = + BlockParameters( + maxTransactions = NonZeroOfu64(BigInteger.valueOf(4096)), + ), + smartContract = + SmartContractParameters( + fuel = NonZeroOfu64(BigInteger.valueOf(5500000000)), + memory = NonZeroOfu64(BigInteger.valueOf(55000000)), + ), + executor = + SmartContractParameters( + fuel = NonZeroOfu64(BigInteger.valueOf(5500000000)), + memory = NonZeroOfu64(BigInteger.valueOf(55000000)), + ), + transaction = + TransactionParameters( + maxInstructions = NonZeroOfu64(BigInteger.valueOf(4096)), + smartContractSize = NonZeroOfu64(BigInteger.valueOf(4194304)), + ), + custom = emptyMap(), + ), ), - ), -) + ) /** * Give Alice test assets */ -open class AliceWithTestAssets : Genesis( - rawGenesisTx( - Instructions.registerAssetDefinition(TEST_ASSET_DEFINITION_ID, AssetType.Store()), - Instructions.registerAssetDefinition(TEST_ASSET_DEFINITION_ID2, AssetType.Store()), - ), -) { +open class AliceWithTestAssets : + Genesis( + rawGenesisTx( + Register.assetDefinition(TEST_ASSET_DEFINITION_ID, AssetType.Store()), + Register.assetDefinition(TEST_ASSET_DEFINITION_ID2, AssetType.Store()), + ), + ) { companion object { val TEST_ASSET_DEFINITION_ID = AssetDefinitionId(DEFAULT_DOMAIN_ID, "test".asName()) val TEST_ASSET_DEFINITION_ID2 = AssetDefinitionId(DEFAULT_DOMAIN_ID, "test2".asName()) @@ -184,17 +239,18 @@ open class AliceWithTestAssets : Genesis( /** * Register an executable trigger without instructions */ -open class WithExecutableTrigger : Genesis( - rawGenesisTx( - Instructions.registerTrigger( - TRIGGER_ID, - listOf(), - Repeats.Exactly(1L), - ALICE_ACCOUNT_ID, - Metadata(mapOf()), +open class WithExecutableTrigger : + Genesis( + rawGenesisTx( + Register.trigger( + TRIGGER_ID, + listOf(), + Repeats.Exactly(1L), + ALICE_ACCOUNT_ID, + EventFilterBox.ExecuteTrigger(ExecuteTriggerEventFilter(TRIGGER_ID)), + ), ), - ), -) { + ) { companion object { val TRIGGER_ID = TriggerId("some_trigger".asName()) } @@ -203,23 +259,22 @@ open class WithExecutableTrigger : Genesis( /** * Mint 100 XOR for Alice and Bob */ -open class AliceAndBobEachHave100Xor : Genesis( - rawGenesisTx( - Instructions.registerAssetDefinition(DEFAULT_ASSET_DEFINITION_ID, AssetType.numeric()), - Instructions.grantPermissionToken( - Permissions.CanTransferAssetWithDefinition, - DEFAULT_ASSET_DEFINITION_ID.asJsonString(), - ALICE_ACCOUNT_ID, - ), - Instructions.grantPermissionToken( - Permissions.CanTransferAssetWithDefinition, - DEFAULT_ASSET_DEFINITION_ID.asJsonString(), - BOB_ACCOUNT_ID, +open class AliceAndBobEachHave100Xor : + Genesis( + rawGenesisTx( + Register.assetDefinition(DEFAULT_ASSET_DEFINITION_ID, AssetType.numeric()), + Grant.accountPermission( + CanTransferAssetWithDefinition(DEFAULT_ASSET_DEFINITION_ID), + ALICE_ACCOUNT_ID, + ), + Grant.accountPermission( + CanTransferAssetWithDefinition(DEFAULT_ASSET_DEFINITION_ID), + BOB_ACCOUNT_ID, + ), + Mint.asset(DEFAULT_ASSET_ID, BigDecimal(100)), + Mint.asset(BOB_ASSET_ID, BigDecimal(100)), ), - Instructions.mintAsset(DEFAULT_ASSET_ID, 100), - Instructions.mintAsset(BOB_ASSET_ID, 100), - ), -) { + ) { companion object { val BOB_ASSET_ID = AssetId(BOB_ACCOUNT_ID, DEFAULT_ASSET_DEFINITION_ID) } @@ -228,16 +283,17 @@ open class AliceAndBobEachHave100Xor : Genesis( /** * Create a Store asset with metadata */ -open class StoreAssetWithMetadata : Genesis( - rawGenesisTx( - Instructions.registerAssetDefinition( - DEFINITION_ID, - AssetType.Store(), - Metadata(mapOf(ASSET_KEY to ASSET_VALUE)), +open class StoreAssetWithMetadata : + Genesis( + rawGenesisTx( + Register.assetDefinition( + DEFINITION_ID, + AssetType.Store(), + metadata = Metadata(mapOf(ASSET_KEY to Json.writeValue(ASSET_VALUE))), + ), + SetKeyValue.asset(ASSET_ID, ASSET_KEY, ASSET_VALUE), ), - Instructions.setKeyValue(ASSET_ID, ASSET_KEY, ASSET_VALUE), - ), -) { + ) { companion object { val ASSET_KEY = "key".asName() val ASSET_VALUE: String = RandomStringUtils.randomAlphabetic(50) @@ -246,45 +302,46 @@ open class StoreAssetWithMetadata : Genesis( } } -open class AliceCanMintXor : Genesis( - rawGenesisTx( - Instructions.grantPermissionToken( - Permissions.CanMintAssetWithDefinition, - XOR_DEFINITION_ID.asJsonString(), - ALICE_ACCOUNT_ID, +open class AliceCanMintXor : + Genesis( + rawGenesisTx( + Grant.accountPermission( + CanMintAssetWithDefinition(XOR_DEFINITION_ID), + ALICE_ACCOUNT_ID, + ), ), - ), -) + ) /** * Create XOR and VAL assets with one token for each and metadata */ -open class XorAndValAssets : Genesis( - rawGenesisTx( - Instructions.registerAssetDefinition(XOR_DEFINITION_ID, AssetType.numeric()), - Instructions.mintAsset(AssetId(ALICE_ACCOUNT_ID, XOR_DEFINITION_ID), XOR_QUANTITY), - - Instructions.registerAssetDefinition(VAL_DEFINITION_ID, AssetType.numeric()), - Instructions.mintAsset(AssetId(ALICE_ACCOUNT_ID, VAL_DEFINITION_ID), VAL_QUANTITY), - ), -) { +open class XorAndValAssets : + Genesis( + rawGenesisTx( + Register.assetDefinition(XOR_DEFINITION_ID, AssetType.numeric()), + Mint.asset(AssetId(ALICE_ACCOUNT_ID, XOR_DEFINITION_ID), XOR_QUANTITY), + Register.assetDefinition(VAL_DEFINITION_ID, AssetType.numeric()), + Mint.asset(AssetId(ALICE_ACCOUNT_ID, VAL_DEFINITION_ID), VAL_QUANTITY), + ), + ) { companion object { - const val XOR_QUANTITY = 1 - const val VAL_QUANTITY = 1 + val XOR_QUANTITY = BigDecimal(1) + val VAL_QUANTITY = BigDecimal(1) } } /** * Create a new account with metadata */ -open class NewAccountWithMetadata : Genesis( - rawGenesisTx( - Instructions.registerAccount( - id = ACCOUNT_ID, - metadata = Metadata(mapOf(KEY to VALUE)), +open class NewAccountWithMetadata : + Genesis( + rawGenesisTx( + Register.account( + ACCOUNT_ID, + Metadata(mapOf(KEY to Json.writeValue(VALUE))), + ), ), - ), -) { + ) { companion object { const val VALUE = "value" @@ -297,30 +354,27 @@ open class NewAccountWithMetadata : Genesis( /** * Create a new domain with metadata */ -open class NewDomainWithMetadata : Genesis( - rawGenesisTx( - Instructions.registerDomain( - domainId = DOMAIN_ID, - metadata = mapOf(KEY to VALUE), +open class NewDomainWithMetadata : + Genesis( + rawGenesisTx( + Register.domain( + DOMAIN_ID, + mapOf(KEY to Json.writeValue(VALUE)), + ), + Transfer.domain(GENESIS_ACCOUNT, DOMAIN_ID, ALICE_ACCOUNT_ID), ), - Instructions.transferDomainOwnership(GENESIS_ACCOUNT, DOMAIN_ID, ALICE_ACCOUNT_ID), - ), -) { + ) { companion object { - val KEY = "key".asName() - val VALUE = "value" - val DOMAIN_ID = DomainId("foo_domain".asName()) + val KEY: Name = "key".asName() + val VALUE: String = "value" + val DOMAIN_ID: DomainId = DomainId("foo_domain".asName()) } } /** * Create a new domain */ -open class NewDomain : Genesis( - rawGenesisTx( - Instructions.registerDomain(DOMAIN_ID), - ), -) { +open class NewDomain : Genesis(rawGenesisTx(Register.domain(DOMAIN_ID))) { companion object { val DOMAIN_ID = "foo_domain".asDomainId() } @@ -329,22 +383,23 @@ open class NewDomain : Genesis( /** * Specific genesis to test multiple genesis case */ -open class RubbishToTestMultipleGenesis : Genesis( - rawGenesisTx( - Instructions.registerDomain( - DEFAULT_DOMAIN_ID, - mapOf(DOMAIN_KEY_VALUE.asName() to DOMAIN_KEY_VALUE), - ), - Instructions.registerAccount( - ALICE_ACCOUNT_ID, - Metadata(mapOf(ALICE_KEY_VALUE.asName() to ALICE_KEY_VALUE)), - ), - Instructions.registerAccount( - BOB_ACCOUNT_ID, - Metadata(mapOf(BOB_KEY_VALUE.asName() to BOB_KEY_VALUE)), +open class RubbishToTestMultipleGenesis : + Genesis( + rawGenesisTx( + Register.domain( + DEFAULT_DOMAIN_ID, + mapOf(DOMAIN_KEY_VALUE.asName() to Json.writeValue(DOMAIN_KEY_VALUE)), + ), + Register.account( + ALICE_ACCOUNT_ID, + Metadata(mapOf(ALICE_KEY_VALUE.asName() to Json.writeValue(ALICE_KEY_VALUE))), + ), + Register.account( + BOB_ACCOUNT_ID, + Metadata(mapOf(BOB_KEY_VALUE.asName() to Json.writeValue(BOB_KEY_VALUE))), + ), ), - ), -) { + ) { companion object { val DOMAIN_KEY_VALUE: String = RandomStringUtils.randomAlphabetic(10) val ALICE_KEY_VALUE: String = RandomStringUtils.randomAlphabetic(10) @@ -355,67 +410,60 @@ open class RubbishToTestMultipleGenesis : Genesis( /** * To test serializers */ -open class FatGenesis : Genesis( - rawGenesisTx( - Instructions.registerDomain( - randomAlphabetic(10).asDomainId(), - mapOf(randomAlphabetic(10).asName() to randomAlphabetic(10)), - ), - Instructions.registerAccount( - AccountId(domain = DEFAULT_DOMAIN_ID, signatory = generatePublicKey()), - Metadata(mapOf(randomAlphabetic(10).asName() to randomAlphabetic(10))), - ), - Instructions.registerAssetDefinition(DEFAULT_ASSET_DEFINITION_ID, AssetType.numeric()), - Instructions.grantPermissionToken( - Permissions.CanTransferAssetWithDefinition, - DEFAULT_ASSET_DEFINITION_ID.asJsonString(), - ALICE_ACCOUNT_ID, - ), - Instructions.grantPermissionToken( - Permissions.CanTransferAssetWithDefinition, - DEFAULT_ASSET_DEFINITION_ID.asJsonString(), - BOB_ACCOUNT_ID, - ), - Instructions.registerAssetDefinition( - DEFINITION_ID, - AssetType.Store(), - Metadata(mapOf(randomAlphabetic(10).asName() to randomAlphabetic(10))), - ), - Instructions.registerRole( - ROLE_ID, - Permission( - Permissions.CanSetKeyValueInAccount.type, - BOB_ACCOUNT_ID.asJsonString(true), +open class FatGenesis : + Genesis( + rawGenesisTx( + Register.domain( + randomAlphabetic(10).asDomainId(), + mapOf(randomAlphabetic(10).asName() to Json.writeValue(randomAlphabetic(10))), ), - Permission( - Permissions.CanRemoveKeyValueInAccount.type, - BOB_ACCOUNT_ID.asJsonString(true), + Register.account( + AccountId(DEFAULT_DOMAIN_ID, generatePublicKey()), + Metadata(mapOf(randomAlphabetic(10).asName() to Json.writeValue(randomAlphabetic(10)))), + ), + Register.assetDefinition(DEFAULT_ASSET_DEFINITION_ID, AssetType.numeric()), + Grant.accountPermission( + CanTransferAssetWithDefinition(DEFAULT_ASSET_DEFINITION_ID), + ALICE_ACCOUNT_ID, + ), + Grant.accountPermission( + CanTransferAssetWithDefinition(DEFAULT_ASSET_DEFINITION_ID), + BOB_ACCOUNT_ID, + ), + Register.assetDefinition( + DEFINITION_ID, + AssetType.Store(), + metadata = Metadata(mapOf(randomAlphabetic(10).asName() to Json.writeValue(randomAlphabetic(10)))), + ), + Register.role( + BOB_ACCOUNT_ID, + ROLE_ID, + CanModifyAccountMetadata(BOB_ACCOUNT_ID), + ), + Grant.accountRole(ROLE_ID, ALICE_ACCOUNT_ID), + Mint.asset(AssetId(BOB_ACCOUNT_ID, DEFAULT_ASSET_DEFINITION_ID), BigDecimal(100)), + Burn.asset(AssetId(BOB_ACCOUNT_ID, DEFAULT_ASSET_DEFINITION_ID), BigDecimal(100)), + SetKeyValue.asset(ASSET_ID, randomAlphabetic(10).asName(), Int.MAX_VALUE.toString()), + SetKeyValue.asset(ASSET_ID, randomAlphabetic(10).asName(), (Int.MAX_VALUE * 10L).toString()), + SetKeyValue.asset(ASSET_ID, randomAlphabetic(10).asName(), nextDouble().toString()), + SetKeyValue.asset( + ASSET_ID, + randomAlphabetic(10).asName(), + BigDecimal(nextDouble()).toString(), + ), + SetKeyValue.asset( + ASSET_ID, + randomAlphabetic(10).asName(), + (BigInteger.valueOf(Long.MAX_VALUE) * BigInteger.valueOf(2)).toString(), + ), + SetKeyValue.asset(ASSET_ID, randomAlphabetic(10).asName(), randomAlphabetic(10)), + SetKeyValue.domain( + DEFAULT_DOMAIN_ID, + randomAlphabetic(10).asName(), + randomAlphabetic(10), ), ), - Instructions.grantRole(ROLE_ID, ALICE_ACCOUNT_ID), - Instructions.mintAsset(AssetId(BOB_ACCOUNT_ID, DEFAULT_ASSET_DEFINITION_ID), 100), - Instructions.burnAsset(AssetId(BOB_ACCOUNT_ID, DEFAULT_ASSET_DEFINITION_ID), 100), - Instructions.setKeyValue(ASSET_ID, randomAlphabetic(10).asName(), Int.MAX_VALUE.toString()), - Instructions.setKeyValue(ASSET_ID, randomAlphabetic(10).asName(), (Int.MAX_VALUE * 10L).toString()), - Instructions.setKeyValue(ASSET_ID, randomAlphabetic(10).asName(), nextDouble().toString()), - Instructions.setKeyValue( - ASSET_ID, - randomAlphabetic(10).asName(), - BigDecimal(nextDouble()).toString(), - ), - Instructions.setKeyValue( - ASSET_ID, - randomAlphabetic(10).asName(), - (BigInteger.valueOf(Long.MAX_VALUE) * BigInteger.valueOf(2)).toString(), - ), - Instructions.setKeyValue(ASSET_ID, randomAlphabetic(10).asName(), randomAlphabetic(10)), - Instructions.setKeyValue( - DEFAULT_DOMAIN_ID, - randomAlphabetic(10).asName(), - randomAlphabetic(10), - ), - ), -) { + ) { companion object { val DEFINITION_ID = AssetDefinitionId(DEFAULT_DOMAIN_ID, "foo".asName()) val ASSET_ID = AssetId(BOB_ACCOUNT_ID, DEFINITION_ID) @@ -423,36 +471,25 @@ open class FatGenesis : Genesis( } } -/** - * Grant permission token to unregister any role - */ -open class BobCanUnregisterAnyRole : Genesis( - rawGenesisTx( - Instructions.grantPermissionToken( - permission = Permissions.CanUnregisterAnyRole, - destinationId = BOB_ACCOUNT_ID, - ), - transferTo = BOB_ACCOUNT_ID, - ), -) - /** * Return [RawGenesisTransaction] with instructions to init genesis */ fun rawGenesisTx( - vararg isi: InstructionBox, - params: List = emptyList(), + vararg isi: Instruction, + params: Parameters? = null, transferTo: AccountId = ALICE_ACCOUNT_ID, ) = RawGenesisTransaction( - chain = ChainId("00000000-0000-0000-0000-000000000000"), - executor = Genesis.EXECUTOR_FILE_NAME, - parameters = params, - instructions = listOf( - Instructions.registerDomain(DEFAULT_DOMAIN_ID), - Instructions.registerAccount(ALICE_ACCOUNT_ID, Metadata(emptyMap())), - Instructions.registerAccount(BOB_ACCOUNT_ID, Metadata(emptyMap())), - Instructions.transferDomainOwnership(GENESIS_ACCOUNT, DEFAULT_DOMAIN_ID, transferTo), + ChainId("00000000-0000-0000-0000-000000000000"), + Genesis.EXECUTOR_FILE_NAME, + params ?: DEFAULT_GENESIS_PARAMETERS, + listOf( + Register.domain(DEFAULT_DOMAIN_ID), + Register.account(ALICE_ACCOUNT_ID, Metadata(emptyMap())), + Register.account(BOB_ACCOUNT_ID, Metadata(emptyMap())), + Transfer.domain(GENESIS_ACCOUNT, DEFAULT_DOMAIN_ID, transferTo), *isi, - ), - topology = emptyList(), + ).map { it.asInstructionBox() }, + "libs", + emptyList(), + emptyList(), ) diff --git a/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/util/CryptoTest.kt b/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/util/CryptoTest.kt index 4f106ac29..5dfa8d06a 100644 --- a/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/util/CryptoTest.kt +++ b/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/util/CryptoTest.kt @@ -5,7 +5,7 @@ import jp.co.soramitsu.iroha2.fromHex import jp.co.soramitsu.iroha2.generateKeyPair import jp.co.soramitsu.iroha2.hash import jp.co.soramitsu.iroha2.keyPairFromHex -import jp.co.soramitsu.iroha2.sign +import jp.co.soramitsu.iroha2.signAs import jp.co.soramitsu.iroha2.toHex import jp.co.soramitsu.iroha2.verify import kotlinx.coroutines.CoroutineScope @@ -19,21 +19,22 @@ import kotlin.test.assertEquals import kotlin.test.assertTrue class CryptoTest { - @Test fun `generating key pairs is thread safe`() { val iterations = 1000 - val futureResults = generateSequence { - CoroutineScope(Dispatchers.Default) - .async { generateKeyPair() } - }.take(iterations).toSet() + val futureResults = + generateSequence { + CoroutineScope(Dispatchers.Default) + .async { generateKeyPair() } + }.take(iterations).toSet() - class ByteArrayWrapper(private val byteArray: ByteArray) { + class ByteArrayWrapper( + private val byteArray: ByteArray, + ) { override fun equals(other: Any?): Boolean { if (this === other) return true if (other !is ByteArrayWrapper) return false - if (!byteArray.contentEquals(other.byteArray)) return false - return true + return byteArray.contentEquals(other.byteArray) } override fun hashCode() = byteArray.contentHashCode() @@ -42,9 +43,11 @@ class CryptoTest { runBlocking { assertEquals( iterations, - futureResults.map { it.await().private.bytes() } + futureResults + .map { it.await().private.bytes() } .map { ByteArrayWrapper(it) } - .toSet().size, + .toSet() + .size, ) } } @@ -53,7 +56,7 @@ class CryptoTest { fun `signature created and verified`() { val keyPair = generateKeyPair() val message = "Test message to sign.".toByteArray() - val signature = keyPair.private.sign(message) + val signature = keyPair.private.signAs(message) assertTrue { keyPair.public.verify(signature, message) } } @@ -72,7 +75,7 @@ class CryptoTest { val privKey = keyPair.private.bytes().toHex() val message = "foo".toByteArray() - val signature = keyPair.private.sign(message) + val signature = keyPair.private.signAs(message) val restoredKeyPair = keyPairFromHex(pubKey, privKey) assertEquals(keyPair.private, restoredKeyPair.private) diff --git a/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/util/FixnumTest.kt b/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/util/FixnumTest.kt index 57fc9b91a..76d26c282 100644 --- a/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/util/FixnumTest.kt +++ b/modules/client/src/test/kotlin/jp/co/soramitsu/iroha2/util/FixnumTest.kt @@ -12,7 +12,6 @@ import kotlin.test.assertFailsWith import kotlin.test.assertTrue class FixnumTest { - @Test fun `check there and back works for floating point numbers with fractional parts only`() { val random = SecureRandom() @@ -52,7 +51,11 @@ class FixnumTest { test(1, 3) { BigDecimal.ONE.setScale(15) } } - private fun test(probes: Int = 20_000, scale: Int = DEFAULT_SCALE, generator: () -> BigDecimal) { + private fun test( + probes: Int = 20_000, + scale: Int = DEFAULT_SCALE, + generator: () -> BigDecimal, + ) { generateSequence { generator() } .take(probes) .forEachIndexed { iteration, expected -> diff --git a/modules/client/src/test/resources/create_nft_for_alice_smartcontract.wasm b/modules/client/src/test/resources/create_nft_for_alice_smartcontract.wasm index 272357a694a41105bfd84c90e6026eec2f33bf67..ad4722e3b9b07d99a5f215fe64421d24331e2db5 100755 GIT binary patch literal 289802 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%0A%5r(Qwwk` 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 bce(1yodccQzxu2WVDDXZS8-^s=8XG4^s=B( diff --git a/modules/client/src/test/resources/create_nft_for_alice_smartcontract/Cargo.toml b/modules/client/src/test/resources/create_nft_for_alice_smartcontract/Cargo.toml index a723e6eb4..1a51f2a41 100644 --- a/modules/client/src/test/resources/create_nft_for_alice_smartcontract/Cargo.toml +++ b/modules/client/src/test/resources/create_nft_for_alice_smartcontract/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "create_nft_for_alice_smartcontract" -version = "2.0.0-pre-rc.22.2" +version = "2.0.0-rc.1.0" # TODO: teams are being deprecated update the authors URL authors = ["Iroha 2 team "] edition = "2021" @@ -14,17 +14,21 @@ crate-type = ['cdylib'] # Empty workspace to fix "current package believes it's in a workspace when it's not" [workspace] +[profile.dev] +panic = "abort" + [profile.release] +panic = "abort" + +[profile.deploy] +inherits = "release" strip = "debuginfo" # Remove debugging info from the binary -panic = "abort" # Panics are transcribed to Traps when compiling for wasm anyways lto = true # Link-time-optimization produces notable decrease in binary size opt-level = "z" # Optimize for size vs speed with "s"/"z"(removes vectorization) codegen-units = 1 # Further reduces binary size but increases compilation time [dependencies] -iroha_trigger = { git = "https://github.com/hyperledger/iroha/", tag = "v2.0.0-pre-rc.22.2", features = ["debug"] } - -getrandom = { version = "0.2", features = ["custom"] } +iroha_trigger = { git = "https://github.com/hyperledger/iroha/", tag = "v2.0.0-rc.1.0", features = ["debug"] } -lol_alloc = "0.4.0" +dlmalloc = { version = "0.2.6", features = ["global"] } panic-halt = "0.2.0" diff --git a/modules/client/src/test/resources/create_nft_for_alice_smartcontract/build.sh b/modules/client/src/test/resources/create_nft_for_alice_smartcontract/build.sh index b80cf0267..1778189ce 100755 --- a/modules/client/src/test/resources/create_nft_for_alice_smartcontract/build.sh +++ b/modules/client/src/test/resources/create_nft_for_alice_smartcontract/build.sh @@ -1,4 +1,4 @@ #!/bin/bash -cargo +nightly-2024-04-18 build --release -Zbuild-std -Zbuild-std-features=panic_immediate_abort -cp ./target/wasm32-unknown-unknown/release/create_nft_for_alice_smartcontract.wasm ../create_nft_for_alice_smartcontract.wasm +cargo +nightly-2024-09-09 build --profile=deploy -Zbuild-std -Zbuild-std-features=panic_immediate_abort +cp ./target/wasm32-unknown-unknown/deploy/create_nft_for_alice_smartcontract.wasm ../create_nft_for_alice_smartcontract.wasm diff --git a/modules/client/src/test/resources/create_nft_for_alice_smartcontract/src/lib.rs b/modules/client/src/test/resources/create_nft_for_alice_smartcontract/src/lib.rs index f4389fbc5..668966355 100644 --- a/modules/client/src/test/resources/create_nft_for_alice_smartcontract/src/lib.rs +++ b/modules/client/src/test/resources/create_nft_for_alice_smartcontract/src/lib.rs @@ -9,16 +9,19 @@ extern crate alloc; extern crate panic_halt; use alloc::{format, string::ToString}; -use lol_alloc::{FreeListAllocator, LockedAllocator}; +use dlmalloc::GlobalDlmalloc; #[global_allocator] -static ALLOC: LockedAllocator = LockedAllocator::new(FreeListAllocator::new()); +static ALLOC: GlobalDlmalloc = GlobalDlmalloc; -use iroha_trigger::{prelude::*}; +use iroha_trigger::prelude::*; #[iroha_trigger::main] -fn main(_id: TriggerId, _owner: AccountId, _event: EventBox) { - let account_id: AccountId = "ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland".parse().unwrap(); +fn main(host: Iroha, _context: Context) { + let account_id: AccountId = + "ed0120CE7FA46C9DCE7EA4B125E2E36BDB63EA33073E7590AC92816AE1E861B7048B03@wonderland" + .parse() + .unwrap(); let mut metadata = Metadata::default(); let name = format!( "nft_for_{}_in_{}", @@ -29,25 +32,25 @@ fn main(_id: TriggerId, _owner: AccountId, _event: EventBox) { .dbg_unwrap(); metadata.insert(name, true); - let nft_id = generate_new_nft_id(&account_id); + let nft_id = generate_new_nft_id(&host, &account_id); let nft_definition = AssetDefinition::store(nft_id.clone()) .mintable_once() .with_metadata(metadata); - Register::asset_definition(nft_definition) - .execute() + host.submit(&Register::asset_definition(nft_definition)) .dbg_unwrap(); - SetKeyValue::asset( + host.submit(&SetKeyValue::asset( AssetId::new(nft_id, account_id), "has_this_nft".parse::().dbg_unwrap(), true, - ) - .execute() + )) .dbg_unwrap(); } -fn generate_new_nft_id(account_id: &AccountId) -> AssetDefinitionId { - let assets = FindAssetsByAccountId::new(account_id.clone()) +fn generate_new_nft_id(host: &Iroha, account_id: &AccountId) -> AssetDefinitionId { + let assets = host + .query(FindAssets) + .filter_with(|asset| asset.id.account.eq(account_id.clone())) .execute() .dbg_unwrap(); diff --git a/modules/client/src/test/resources/executor.wasm b/modules/client/src/test/resources/executor.wasm index f51b5112367097b7fd6d53cb3056c6d74b61f1aa..11cc0f19f937a724d8ec886e2c69378864a99189 100644 GIT binary patch literal 1052756 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 z�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%0ALw}`{qZai>jbh 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