trac-msb 0.2.18 → 0.2.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +62 -2
- package/SECURITY.md +9 -6
- package/cli/commandHandler.js +272 -0
- package/cli/handlers.js +210 -0
- package/cli/interactive.js +182 -0
- package/msb.mjs +7 -8
- package/package.json +25 -8
- package/rpc/create_server.js +44 -44
- package/rpc/handlers.js +43 -56
- package/rpc/routes/index.js +8 -8
- package/rpc/rpc_server.js +6 -2
- package/rpc/utils/helpers.js +46 -66
- package/scripts/pear-runner.js +170 -0
- package/src/config/args.js +60 -13
- package/src/config/config.js +138 -10
- package/src/config/env.js +36 -18
- package/src/core/network/Network.js +130 -34
- package/src/core/network/protocols/ProtocolInterface.js +5 -5
- package/src/core/network/protocols/connectionPolicies.js +86 -0
- package/src/core/network/protocols/legacy/NetworkMessageRouter.js +1 -1
- package/src/core/network/protocols/legacy/handlers/BaseStateOperationHandler.js +2 -2
- package/src/core/network/protocols/legacy/handlers/LegacyGetRequestHandler.js +3 -3
- package/src/core/network/protocols/legacy/handlers/LegacyRoleOperationHandler.js +1 -1
- package/src/core/network/protocols/legacy/handlers/LegacySubnetworkOperationHandler.js +1 -1
- package/src/core/network/protocols/legacy/handlers/LegacyTransferOperationHandler.js +1 -1
- package/src/core/network/protocols/legacy/validators/base/BaseResponse.js +7 -10
- package/src/core/network/protocols/shared/validators/PartialBootstrapDeploymentValidator.js +2 -2
- package/src/core/network/protocols/shared/validators/PartialOperationValidator.js +23 -23
- package/src/core/network/protocols/shared/validators/PartialRoleAccessValidator.js +14 -14
- package/src/core/network/protocols/shared/validators/PartialTransactionValidator.js +5 -5
- package/src/core/network/protocols/shared/validators/PartialTransferValidator.js +12 -11
- package/src/core/network/protocols/v1/V1ProtocolError.js +5 -69
- package/src/core/network/protocols/v1/handlers/V1BaseOperationHandler.js +3 -2
- package/src/core/network/protocols/v1/handlers/V1BroadcastTransactionOperationHandler.js +130 -247
- package/src/core/network/protocols/v1/handlers/V1LivenessOperationHandler.js +6 -5
- package/src/core/network/protocols/v1/handlers/broadcastTransaction/BroadcastTransactionErrorMapper.js +84 -0
- package/src/core/network/protocols/v1/handlers/broadcastTransaction/BroadcastTransactionOperationStrategies.js +128 -0
- package/src/core/network/protocols/v1/handlers/broadcastTransaction/BroadcastTransactionPayloadUtils.js +26 -0
- package/src/core/network/protocols/v1/validators/V1BaseOperation.js +32 -31
- package/src/core/network/protocols/v1/validators/V1BroadcastTransactionRequest.js +5 -3
- package/src/core/network/protocols/v1/validators/V1BroadcastTransactionResponse.js +34 -50
- package/src/core/network/protocols/v1/validators/V1ValidationSchema.js +1 -1
- package/src/core/network/services/ConnectionManager.js +11 -10
- package/src/core/network/services/MessageOrchestrator.js +53 -17
- package/src/core/network/services/PendingRequestService.js +22 -19
- package/src/core/network/services/TransactionCommitService.js +36 -36
- package/src/core/network/services/TransactionPoolService.js +39 -39
- package/src/core/network/services/TransactionRateLimiterService.js +8 -4
- package/src/core/network/services/ValidatorObserverService.js +397 -110
- package/src/core/state/State.js +190 -138
- package/src/core/state/utils/address.js +4 -9
- package/src/core/state/utils/balance.js +7 -7
- package/src/core/state/utils/roles.js +1 -1
- package/src/index.js +316 -275
- package/src/messages/network/v1/NetworkMessageBuilder.js +12 -21
- package/src/messages/network/v1/networkMessageFactory.js +1 -1
- package/src/messages/state/ApplyStateMessageBuilder.js +6 -6
- package/src/messages/state/applyStateMessageFactory.js +1 -1
- package/src/utils/buffer.js +1 -1
- package/src/utils/check.js +12 -13
- package/src/utils/constants.js +7 -0
- package/src/utils/errors.js +20 -0
- package/src/utils/fileUtils.js +12 -3
- package/src/utils/helpers.js +2 -2
- package/src/utils/migrationUtils.js +3 -3
- package/.dockerignore +0 -16
- package/CODE_OF_CONDUCT.md +0 -128
- package/docker-compose.yml +0 -17
- package/dockerfile +0 -41
- package/docs/fee_distribution.md +0 -89
- package/docs/trac_network_http_api.openapi.yaml +0 -889
- package/migration/.gitkeep +0 -0
- package/proto/applyOperations.proto +0 -117
- package/proto/network/v1/enums/message_type.proto +0 -16
- package/proto/network/v1/enums/result_code.proto +0 -84
- package/proto/network/v1/messages/broadcast_transaction_request.proto +0 -9
- package/proto/network/v1/messages/broadcast_transaction_response.proto +0 -13
- package/proto/network/v1/messages/liveness_request.proto +0 -8
- package/proto/network/v1/messages/liveness_response.proto +0 -11
- package/proto/network/v1/network_message.proto +0 -22
- package/rpc/rpc_services.js +0 -181
- package/scripts/generate-protobufs.js +0 -67
- package/src/core/network/identity/NetworkWalletFactory.js +0 -77
- package/src/core/network/protocols/shared/errors/SharedValidatorRejectionError.js +0 -27
- package/src/utils/cli.js +0 -130
- package/src/utils/cliCommands.js +0 -280
- package/tests/acceptance/v1/account/account.test.mjs +0 -129
- package/tests/acceptance/v1/balance/balance.test.mjs +0 -54
- package/tests/acceptance/v1/broadcast-transaction/broadcast-transaction.test.mjs +0 -116
- package/tests/acceptance/v1/confirmed-length/confirmed-length.test.mjs +0 -19
- package/tests/acceptance/v1/fee/fee.test.mjs +0 -11
- package/tests/acceptance/v1/health/health.test.mjs +0 -33
- package/tests/acceptance/v1/rpc.test.mjs +0 -95
- package/tests/acceptance/v1/tx/tx.test.mjs +0 -133
- package/tests/acceptance/v1/tx-details/tx-details.test.mjs +0 -241
- package/tests/acceptance/v1/tx-hashes/tx-hashes.test.mjs +0 -72
- package/tests/acceptance/v1/tx-payloads-bulk/tx-payloads-bulk.test.mjs +0 -27
- package/tests/acceptance/v1/txv/txv.test.mjs +0 -11
- package/tests/acceptance/v1/unconfirmed-length/unconfirmed-length.test.mjs +0 -11
- package/tests/fixtures/apply.fixtures.js +0 -77
- package/tests/fixtures/assembleMessage.fixtures.js +0 -41
- package/tests/fixtures/check.fixtures.js +0 -428
- package/tests/fixtures/networkV1.fixtures.js +0 -59
- package/tests/fixtures/protobuf.fixtures.js +0 -388
- package/tests/helpers/StateNetworkFactory.js +0 -155
- package/tests/helpers/address.js +0 -6
- package/tests/helpers/autobaseTestHelpers.js +0 -419
- package/tests/helpers/config.js +0 -4
- package/tests/helpers/createTestSignature.js +0 -13
- package/tests/helpers/regexHelper.js +0 -3
- package/tests/helpers/setupApplyTests.js +0 -587
- package/tests/helpers/transactionPayloads.mjs +0 -92
- package/tests/helpers/wrapper.js +0 -28
- package/tests/unit/messages/messages.test.js +0 -12
- package/tests/unit/messages/network/NetworkMessageBuilder.test.js +0 -436
- package/tests/unit/messages/network/NetworkMessageDirector.test.js +0 -347
- package/tests/unit/messages/state/applyStateMessageBuilder.complete.test.js +0 -525
- package/tests/unit/messages/state/applyStateMessageBuilder.partial.test.js +0 -237
- package/tests/unit/network/LegacyNetworkMessageRouter.test.js +0 -54
- package/tests/unit/network/NetworkWalletFactory.test.js +0 -156
- package/tests/unit/network/ProtocolSession.test.js +0 -127
- package/tests/unit/network/networkModule.test.js +0 -13
- package/tests/unit/network/services/ConnectionManager.test.js +0 -450
- package/tests/unit/network/services/MessageOrchestrator.test.js +0 -445
- package/tests/unit/network/services/PendingRequestService.test.js +0 -431
- package/tests/unit/network/services/TransactionCommitService.test.js +0 -246
- package/tests/unit/network/services/TransactionPoolService.test.js +0 -489
- package/tests/unit/network/services/TransactionRateLimiterService.test.js +0 -139
- package/tests/unit/network/services/ValidatorHealthCheckService.test.js +0 -115
- package/tests/unit/network/services/services.test.js +0 -17
- package/tests/unit/network/utils/v1TestUtils.js +0 -153
- package/tests/unit/network/v1/NetworkMessageRouterV1.test.js +0 -151
- package/tests/unit/network/v1/V1BaseOperation.test.js +0 -356
- package/tests/unit/network/v1/V1BroadcastTransactionOperationHandler.test.js +0 -129
- package/tests/unit/network/v1/V1BroadcastTransactionRequest.test.js +0 -53
- package/tests/unit/network/v1/V1BroadcastTransactionResponse.test.js +0 -512
- package/tests/unit/network/v1/V1LivenessRequest.test.js +0 -32
- package/tests/unit/network/v1/V1LivenessResponse.test.js +0 -45
- package/tests/unit/network/v1/V1ResultCode.test.js +0 -84
- package/tests/unit/network/v1/V1ValidationSchema.test.js +0 -13
- package/tests/unit/network/v1/connectionPolicies.test.js +0 -49
- package/tests/unit/network/v1/handlers/V1BaseOperationHandler.test.js +0 -284
- package/tests/unit/network/v1/handlers/V1BroadcastTransactionOperationHandler.test.js +0 -794
- package/tests/unit/network/v1/handlers/V1LivenessOperationHandler.test.js +0 -193
- package/tests/unit/network/v1/v1.handlers.test.js +0 -15
- package/tests/unit/network/v1/v1.test.js +0 -19
- package/tests/unit/network/v1/v1ValidationSchema/broadcastTransactionRequest.test.js +0 -119
- package/tests/unit/network/v1/v1ValidationSchema/broadcastTransactionResponse.test.js +0 -136
- package/tests/unit/network/v1/v1ValidationSchema/common.test.js +0 -308
- package/tests/unit/network/v1/v1ValidationSchema/livenessRequest.test.js +0 -90
- package/tests/unit/network/v1/v1ValidationSchema/livenessResponse.test.js +0 -133
- package/tests/unit/state/State.test.js +0 -80
- package/tests/unit/state/apply/addAdmin/addAdminHappyPathScenario.js +0 -42
- package/tests/unit/state/apply/addAdmin/addAdminScenarioHelpers.js +0 -276
- package/tests/unit/state/apply/addAdmin/adminEntryEncodingFailureScenario.js +0 -30
- package/tests/unit/state/apply/addAdmin/adminEntryExistsScenario.js +0 -78
- package/tests/unit/state/apply/addAdmin/nodeEntryInitializationFailureScenario.js +0 -30
- package/tests/unit/state/apply/addAdmin/nonBootstrapNodeScenario.js +0 -68
- package/tests/unit/state/apply/addAdmin/state.apply.addAdmin.test.js +0 -159
- package/tests/unit/state/apply/addIndexer/addIndexerHappyPathScenario.js +0 -39
- package/tests/unit/state/apply/addIndexer/addIndexerMultipleIndexersInTheNetworkScenario.js +0 -167
- package/tests/unit/state/apply/addIndexer/addIndexerPretenderAlreadyIndexerScenario.js +0 -21
- package/tests/unit/state/apply/addIndexer/addIndexerPretenderNotWriterScenario.js +0 -21
- package/tests/unit/state/apply/addIndexer/addIndexerRemoveAndReAddScenario.js +0 -186
- package/tests/unit/state/apply/addIndexer/addIndexerScenarioHelpers.js +0 -443
- package/tests/unit/state/apply/addIndexer/addIndexerWriterKeyAlreadyRegisteredScenario.js +0 -32
- package/tests/unit/state/apply/addIndexer/state.apply.addIndexer.test.js +0 -297
- package/tests/unit/state/apply/addWriter/addWriterHappyPathScenario.js +0 -41
- package/tests/unit/state/apply/addWriter/addWriterInvalidValidatorSignatureScenario.js +0 -32
- package/tests/unit/state/apply/addWriter/addWriterNewWkScenario.js +0 -149
- package/tests/unit/state/apply/addWriter/addWriterRequesterAlreadyWriterScenario.js +0 -21
- package/tests/unit/state/apply/addWriter/addWriterRequesterBalanceInsufficientScenario.js +0 -21
- package/tests/unit/state/apply/addWriter/addWriterRequesterEntryDecodeFailureScenario.js +0 -19
- package/tests/unit/state/apply/addWriter/addWriterRequesterEntryMissingScenario.js +0 -19
- package/tests/unit/state/apply/addWriter/addWriterRequesterIndexerScenario.js +0 -21
- package/tests/unit/state/apply/addWriter/addWriterRequesterNotWhitelistedScenario.js +0 -21
- package/tests/unit/state/apply/addWriter/addWriterScenarioHelpers.js +0 -766
- package/tests/unit/state/apply/addWriter/addWriterStakeBalanceUpdateFailureScenario.js +0 -50
- package/tests/unit/state/apply/addWriter/addWriterStakeInsufficientBalanceScenario.js +0 -29
- package/tests/unit/state/apply/addWriter/addWriterStakeInvalidBalanceScenario.js +0 -29
- package/tests/unit/state/apply/addWriter/addWriterStakeInvalidEntryScenario.js +0 -21
- package/tests/unit/state/apply/addWriter/addWriterStakeStakedBalanceFailureScenario.js +0 -37
- package/tests/unit/state/apply/addWriter/addWriterStakeSubtractFailureScenario.js +0 -42
- package/tests/unit/state/apply/addWriter/addWriterValidatorRewardScenario.js +0 -106
- package/tests/unit/state/apply/addWriter/addWriterWriterKeyMismatchScenario.js +0 -54
- package/tests/unit/state/apply/addWriter/addWriterWriterKeyOwnershipScenario.js +0 -54
- package/tests/unit/state/apply/addWriter/addWriterZeroWriterKeyScenario.js +0 -29
- package/tests/unit/state/apply/addWriter/state.apply.addWriter.test.js +0 -309
- package/tests/unit/state/apply/adminRecovery/adminRecoveryHappyPathScenario.js +0 -30
- package/tests/unit/state/apply/adminRecovery/adminRecoveryScenarioHelpers.js +0 -881
- package/tests/unit/state/apply/adminRecovery/state.apply.adminRecovery.test.js +0 -435
- package/tests/unit/state/apply/appendWhitelist/appendWhitelistBanAndReapplyScenario.js +0 -78
- package/tests/unit/state/apply/appendWhitelist/appendWhitelistExistingReaderHappyPathScenario.js +0 -98
- package/tests/unit/state/apply/appendWhitelist/appendWhitelistFeeAfterDisableScenario.js +0 -66
- package/tests/unit/state/apply/appendWhitelist/appendWhitelistHappyPathScenario.js +0 -55
- package/tests/unit/state/apply/appendWhitelist/appendWhitelistInsufficientAdminBalanceScenario.js +0 -103
- package/tests/unit/state/apply/appendWhitelist/appendWhitelistNodeAlreadyWhitelistedScenario.js +0 -60
- package/tests/unit/state/apply/appendWhitelist/appendWhitelistScenarioHelpers.js +0 -189
- package/tests/unit/state/apply/appendWhitelist/state.apply.appendWhitelist.test.js +0 -220
- package/tests/unit/state/apply/balanceInitialization/balanceInitializationHappyPathScenario.js +0 -82
- package/tests/unit/state/apply/balanceInitialization/balanceInitializationScenarioHelpers.js +0 -111
- package/tests/unit/state/apply/balanceInitialization/invalidAmountScenario.js +0 -45
- package/tests/unit/state/apply/balanceInitialization/nodeEntryBalanceUpdateFailureScenario.js +0 -82
- package/tests/unit/state/apply/balanceInitialization/state.apply.balanceInitialization.test.js +0 -189
- package/tests/unit/state/apply/banValidator/banValidatorBanAndReWhitelistScenario.js +0 -156
- package/tests/unit/state/apply/banValidator/banValidatorHappyPathScenario.js +0 -36
- package/tests/unit/state/apply/banValidator/banValidatorScenarioHelpers.js +0 -531
- package/tests/unit/state/apply/banValidator/banValidatorSequentialBansScenario.js +0 -74
- package/tests/unit/state/apply/banValidator/banValidatorTargetDecodeFailureScenario.js +0 -19
- package/tests/unit/state/apply/banValidator/banValidatorTargetIndexerScenario.js +0 -32
- package/tests/unit/state/apply/banValidator/banValidatorTargetNodeEntryMissingScenario.js +0 -19
- package/tests/unit/state/apply/banValidator/banValidatorTargetRoleUpdateFailureScenario.js +0 -19
- package/tests/unit/state/apply/banValidator/banValidatorWhitelistedNonWriterScenario.js +0 -38
- package/tests/unit/state/apply/banValidator/banValidatorWhitelistedZeroBalanceScenario.js +0 -91
- package/tests/unit/state/apply/banValidator/banValidatorWithdrawFailureScenario.js +0 -19
- package/tests/unit/state/apply/banValidator/state.apply.banValidator.test.js +0 -266
- package/tests/unit/state/apply/bootstrapDeployment/bootstrapDeploymentDuplicateRegistrationScenario.js +0 -143
- package/tests/unit/state/apply/bootstrapDeployment/bootstrapDeploymentHappyPathScenario.js +0 -26
- package/tests/unit/state/apply/bootstrapDeployment/bootstrapDeploymentIncompleteOperationScenario.js +0 -94
- package/tests/unit/state/apply/bootstrapDeployment/bootstrapDeploymentInvalidDeploymentEntryScenario.js +0 -37
- package/tests/unit/state/apply/bootstrapDeployment/bootstrapDeploymentMultipleBootstrapScenario.js +0 -86
- package/tests/unit/state/apply/bootstrapDeployment/bootstrapDeploymentScenarioHelpers.js +0 -347
- package/tests/unit/state/apply/bootstrapDeployment/invalidValidatorNodeEntryScenario.js +0 -57
- package/tests/unit/state/apply/bootstrapDeployment/state.apply.bootstrapDeployment.test.js +0 -429
- package/tests/unit/state/apply/common/access-control/adminConsistencyMismatchScenario.js +0 -120
- package/tests/unit/state/apply/common/access-control/adminEntryDecodeFailureScenario.js +0 -130
- package/tests/unit/state/apply/common/access-control/adminEntryExistsScenario.js +0 -93
- package/tests/unit/state/apply/common/access-control/adminEntryMissingScenario.js +0 -108
- package/tests/unit/state/apply/common/access-control/adminOnlyGuardScenario.js +0 -126
- package/tests/unit/state/apply/common/access-control/adminPublicKeyDecodeFailureScenario.js +0 -121
- package/tests/unit/state/apply/common/access-control/roleAccessOperationValidationScenario.js +0 -50
- package/tests/unit/state/apply/common/adminControlOperationValidationScenario.js +0 -56
- package/tests/unit/state/apply/common/balances/adminEntryUpdateFailureScenario.js +0 -52
- package/tests/unit/state/apply/common/balances/base/requesterBalanceScenarioBase.js +0 -198
- package/tests/unit/state/apply/common/balances/feeDecodeFailureScenario.js +0 -52
- package/tests/unit/state/apply/common/balances/requesterBalanceDecodeFailureScenario.js +0 -15
- package/tests/unit/state/apply/common/balances/requesterBalanceFeeApplicationFailureScenario.js +0 -11
- package/tests/unit/state/apply/common/balances/requesterBalanceInsufficientScenario.js +0 -15
- package/tests/unit/state/apply/common/balances/requesterBalanceUpdateFailureScenario.js +0 -11
- package/tests/unit/state/apply/common/balances/validatorEntryRewardFailureScenario.js +0 -11
- package/tests/unit/state/apply/common/balances/validatorEntryUpdateFailureScenario.js +0 -11
- package/tests/unit/state/apply/common/balances/validatorNodeEntryDecodeFailureScenario.js +0 -40
- package/tests/unit/state/apply/common/base/OperationValidationScenarioBase.js +0 -114
- package/tests/unit/state/apply/common/commonScenarioHelper.js +0 -103
- package/tests/unit/state/apply/common/indexer/indexerNodeEntryDecodeFailureScenario.js +0 -36
- package/tests/unit/state/apply/common/indexer/indexerNodeEntryMissingScenario.js +0 -36
- package/tests/unit/state/apply/common/indexer/indexerRoleUpdateFailureScenario.js +0 -29
- package/tests/unit/state/apply/common/indexer/indexerSequenceStateInvalidScenario.js +0 -66
- package/tests/unit/state/apply/common/invalidMessageComponentValidationScenario.js +0 -84
- package/tests/unit/state/apply/common/nodeEntryInitializationFailureScenario.js +0 -47
- package/tests/unit/state/apply/common/operationAlreadyAppliedScenario.js +0 -85
- package/tests/unit/state/apply/common/payload-structure/addressWithInvalidPublicKeyScenario.js +0 -52
- package/tests/unit/state/apply/common/payload-structure/initializationDisabledScenario.js +0 -54
- package/tests/unit/state/apply/common/payload-structure/invalidAddressValidationScenario.js +0 -73
- package/tests/unit/state/apply/common/payload-structure/invalidHashValidationScenario.js +0 -71
- package/tests/unit/state/apply/common/payload-structure/invalidPayloadValidationScenario.js +0 -31
- package/tests/unit/state/apply/common/payload-structure/invalidSignatureValidationScenario.js +0 -142
- package/tests/unit/state/apply/common/payload-structure/partialOperationValidationScenario.js +0 -87
- package/tests/unit/state/apply/common/requester/requesterNodeEntryBufferMissingScenario.js +0 -71
- package/tests/unit/state/apply/common/requester/requesterNodeEntryDecodeFailureScenario.js +0 -73
- package/tests/unit/state/apply/common/requester/requesterNodeEntryMissingScenario.js +0 -36
- package/tests/unit/state/apply/common/requesterAddressValidationScenario.js +0 -44
- package/tests/unit/state/apply/common/requesterPublicKeyValidationScenario.js +0 -25
- package/tests/unit/state/apply/common/transactionValidityMismatchScenario.js +0 -98
- package/tests/unit/state/apply/common/validatorConsistency/base/validatorConsistencyScenarioBase.js +0 -202
- package/tests/unit/state/apply/common/validatorConsistency/validatorEntryDecodeFailureScenario.js +0 -17
- package/tests/unit/state/apply/common/validatorConsistency/validatorEntryMissingScenario.js +0 -44
- package/tests/unit/state/apply/common/validatorConsistency/validatorInactiveScenario.js +0 -19
- package/tests/unit/state/apply/common/validatorConsistency/validatorWriterKeyMismatchScenario.js +0 -18
- package/tests/unit/state/apply/common/validatorEntryValidation/base/validatorEntryValidationScenarioBase.js +0 -315
- package/tests/unit/state/apply/common/validatorEntryValidation/validatorEntryInvalidBalanceScenario.js +0 -18
- package/tests/unit/state/apply/common/writerKeyExistsValidationScenario.js +0 -43
- package/tests/unit/state/apply/disableInitialization/disableInitializationAlreadyDisabledScenario.js +0 -53
- package/tests/unit/state/apply/disableInitialization/disableInitializationHappyPathScenario.js +0 -24
- package/tests/unit/state/apply/disableInitialization/disableInitializationScenarioHelpers.js +0 -204
- package/tests/unit/state/apply/disableInitialization/state.apply.disableInitialization.test.js +0 -161
- package/tests/unit/state/apply/missing-tests.md +0 -18
- package/tests/unit/state/apply/removeIndexer/removeIndexerHappyPathScenario.js +0 -58
- package/tests/unit/state/apply/removeIndexer/removeIndexerReAddAndRemoveAgainScenario.js +0 -98
- package/tests/unit/state/apply/removeIndexer/removeIndexerRemoveMultipleIndexersScenario.js +0 -167
- package/tests/unit/state/apply/removeIndexer/removeIndexerScenarioHelpers.js +0 -429
- package/tests/unit/state/apply/removeIndexer/removeIndexerTargetNotIndexerScenario.js +0 -22
- package/tests/unit/state/apply/removeIndexer/removeIndexerWriterKeyMissingScenario.js +0 -20
- package/tests/unit/state/apply/removeIndexer/state.apply.removeIndexer.test.js +0 -291
- package/tests/unit/state/apply/removeWriter/removeWriterAndAddWriterAgainScenario.js +0 -87
- package/tests/unit/state/apply/removeWriter/removeWriterHappyPathScenario.js +0 -38
- package/tests/unit/state/apply/removeWriter/removeWriterInvalidValidatorSignatureScenario.js +0 -32
- package/tests/unit/state/apply/removeWriter/removeWriterRequesterBalanceInsufficientScenario.js +0 -21
- package/tests/unit/state/apply/removeWriter/removeWriterRequesterEntryDecodeFailureScenario.js +0 -19
- package/tests/unit/state/apply/removeWriter/removeWriterRequesterEntryMissingScenario.js +0 -19
- package/tests/unit/state/apply/removeWriter/removeWriterRequesterIndexerScenario.js +0 -21
- package/tests/unit/state/apply/removeWriter/removeWriterRequesterNotWriterScenario.js +0 -21
- package/tests/unit/state/apply/removeWriter/removeWriterRequesterRoleUpdateFailureScenario.js +0 -19
- package/tests/unit/state/apply/removeWriter/removeWriterScenarioHelpers.js +0 -348
- package/tests/unit/state/apply/removeWriter/removeWriterThroughWriterValidatorScenario.js +0 -113
- package/tests/unit/state/apply/removeWriter/removeWriterUnstakeFailureScenario.js +0 -33
- package/tests/unit/state/apply/removeWriter/removeWriterWriterKeyMismatchScenario.js +0 -21
- package/tests/unit/state/apply/removeWriter/removeWriterWriterKeyOwnershipScenario.js +0 -26
- package/tests/unit/state/apply/removeWriter/removeWriterWriterKeyRegistryMissingScenario.js +0 -22
- package/tests/unit/state/apply/removeWriter/state.apply.removeWriter.test.js +0 -307
- package/tests/unit/state/apply/state.apply.test.js +0 -24
- package/tests/unit/state/apply/transfer/state.apply.transfer.test.js +0 -819
- package/tests/unit/state/apply/transfer/transferContractSchemaValidationScenario.js +0 -22
- package/tests/unit/state/apply/transfer/transferDoubleSpendAcrossValidatorsScenario.js +0 -146
- package/tests/unit/state/apply/transfer/transferDoubleSpendSameBatchScenario.js +0 -63
- package/tests/unit/state/apply/transfer/transferDoubleSpendSingleValidatorScenario.js +0 -67
- package/tests/unit/state/apply/transfer/transferExistingRecipientAmountScenario.js +0 -31
- package/tests/unit/state/apply/transfer/transferExistingRecipientZeroAmountScenario.js +0 -31
- package/tests/unit/state/apply/transfer/transferHandlerGuardScenarios.js +0 -22
- package/tests/unit/state/apply/transfer/transferHappyPathScenario.js +0 -8
- package/tests/unit/state/apply/transfer/transferInvalidIncomingDataScenario.js +0 -66
- package/tests/unit/state/apply/transfer/transferNewRecipientAmountScenario.js +0 -31
- package/tests/unit/state/apply/transfer/transferNewRecipientZeroAmountScenario.js +0 -31
- package/tests/unit/state/apply/transfer/transferScenarioHelpers.js +0 -1170
- package/tests/unit/state/apply/transfer/transferSelfTransferAmountScenario.js +0 -38
- package/tests/unit/state/apply/transfer/transferSelfTransferZeroAmountScenario.js +0 -38
- package/tests/unit/state/apply/transfer/transferValidatorRecipientAmountScenario.js +0 -38
- package/tests/unit/state/apply/transfer/transferValidatorRecipientZeroAmountScenario.js +0 -38
- package/tests/unit/state/apply/txOperation/state.apply.txOperation.test.js +0 -318
- package/tests/unit/state/apply/txOperation/txOperationBootstrapNotRegisteredScenario.js +0 -70
- package/tests/unit/state/apply/txOperation/txOperationDifferentValidatorCreatorHappyPathScenario.js +0 -23
- package/tests/unit/state/apply/txOperation/txOperationInvalidDeploymentEntryScenario.js +0 -48
- package/tests/unit/state/apply/txOperation/txOperationInvalidFeeAmountScenario.js +0 -39
- package/tests/unit/state/apply/txOperation/txOperationInvalidSubnetCreatorAddressScenario.js +0 -46
- package/tests/unit/state/apply/txOperation/txOperationRequesterCreatorHappyPathScenario.js +0 -21
- package/tests/unit/state/apply/txOperation/txOperationScenarioHelpers.js +0 -432
- package/tests/unit/state/apply/txOperation/txOperationStandardHappyPathScenario.js +0 -21
- package/tests/unit/state/apply/txOperation/txOperationTransferFeeAddCreatorBalanceFailureScenario.js +0 -26
- package/tests/unit/state/apply/txOperation/txOperationTransferFeeAddValidatorBalanceFailureScenario.js +0 -25
- package/tests/unit/state/apply/txOperation/txOperationTransferFeeAddValidatorBonusFailureScenario.js +0 -27
- package/tests/unit/state/apply/txOperation/txOperationTransferFeeDecodeCreatorEntryScenario.js +0 -18
- package/tests/unit/state/apply/txOperation/txOperationTransferFeeDecodeRequesterEntryScenario.js +0 -17
- package/tests/unit/state/apply/txOperation/txOperationTransferFeeDecodeValidatorEntryScenario.js +0 -31
- package/tests/unit/state/apply/txOperation/txOperationTransferFeeGuardBypassScenario.js +0 -49
- package/tests/unit/state/apply/txOperation/txOperationTransferFeeGuardScenarioFactory.js +0 -93
- package/tests/unit/state/apply/txOperation/txOperationTransferFeeInsufficientRequesterBalanceScenario.js +0 -28
- package/tests/unit/state/apply/txOperation/txOperationTransferFeeInvalidCreatorBalanceScenario.js +0 -29
- package/tests/unit/state/apply/txOperation/txOperationTransferFeeInvalidRequesterBalanceScenario.js +0 -28
- package/tests/unit/state/apply/txOperation/txOperationTransferFeeInvalidRequesterEntryScenario.js +0 -17
- package/tests/unit/state/apply/txOperation/txOperationTransferFeeInvalidValidatorBalanceScenario.js +0 -33
- package/tests/unit/state/apply/txOperation/txOperationTransferFeeMissingCreatorEntryScenario.js +0 -18
- package/tests/unit/state/apply/txOperation/txOperationTransferFeeSubtractFailureScenario.js +0 -25
- package/tests/unit/state/apply/txOperation/txOperationTransferFeeUpdateCreatorBalanceFailureScenario.js +0 -26
- package/tests/unit/state/apply/txOperation/txOperationTransferFeeUpdateFailureScenario.js +0 -25
- package/tests/unit/state/apply/txOperation/txOperationTransferFeeUpdateValidatorBalanceFailureScenario.js +0 -26
- package/tests/unit/state/apply/txOperation/txOperationTransferFeeUpdateValidatorBonusFailureScenario.js +0 -27
- package/tests/unit/state/apply/txOperation/txOperationValidatorCreatorHappyPathScenario.js +0 -21
- package/tests/unit/state/stateModule.test.js +0 -23
- package/tests/unit/state/stateTestUtils.js +0 -32
- package/tests/unit/state/utils/address.test.js +0 -63
- package/tests/unit/state/utils/adminEntry.test.js +0 -52
- package/tests/unit/state/utils/balance.test.js +0 -320
- package/tests/unit/state/utils/lengthEntry.test.js +0 -54
- package/tests/unit/state/utils/nodeEntry.test.js +0 -298
- package/tests/unit/state/utils/roles.test.js +0 -44
- package/tests/unit/unit.test.js +0 -14
- package/tests/unit/utils/amountSerialization/amountSerialization.test.js +0 -237
- package/tests/unit/utils/buffer/buffer.test.js +0 -251
- package/tests/unit/utils/check/adminControlOperation.test.js +0 -156
- package/tests/unit/utils/check/balanceInitializationOperation.test.js +0 -54
- package/tests/unit/utils/check/bootstrapDeploymentOperation.test.js +0 -104
- package/tests/unit/utils/check/check.test.js +0 -17
- package/tests/unit/utils/check/common.test.js +0 -419
- package/tests/unit/utils/check/coreAdminOperation.test.js +0 -95
- package/tests/unit/utils/check/roleAccessOperation.test.js +0 -255
- package/tests/unit/utils/check/transactionOperation.test.js +0 -107
- package/tests/unit/utils/check/transferOperation.test.js +0 -102
- package/tests/unit/utils/deepEqualApplyPayload/deepEqualApplyPayload.test.js +0 -102
- package/tests/unit/utils/fileUtils/readAddressesFromWhitelistFile.test.js +0 -95
- package/tests/unit/utils/fileUtils/readBalanceMigrationFile.test.js +0 -149
- package/tests/unit/utils/helpers/helpers.test.js +0 -11
- package/tests/unit/utils/helpers/isHexString.test.js +0 -12
- package/tests/unit/utils/helpers/normalizeHex.test.js +0 -82
- package/tests/unit/utils/migrationUtils/validateAddressFromIncomingFile.test.js +0 -100
- package/tests/unit/utils/normalizers/normalizers.test.js +0 -469
- package/tests/unit/utils/protobuf/applyOperations.test.js +0 -91
- package/tests/unit/utils/protobuf/operationHelpers.test.js +0 -303
- package/tests/unit/utils/protobuf/protobuf.test.js +0 -12
- package/tests/unit/utils/type/type.test.js +0 -25
- package/tests/unit/utils/utils.test.js +0 -21
- package/whitelist/.gitkeep +0 -0
|
@@ -1,19 +1,10 @@
|
|
|
1
1
|
import {networkMessageFactory} from "../../../../../messages/network/v1/networkMessageFactory.js";
|
|
2
2
|
import {
|
|
3
3
|
NETWORK_CAPABILITIES,
|
|
4
|
-
OperationType,
|
|
5
4
|
ResultCode
|
|
6
5
|
} from "../../../../../utils/constants.js";
|
|
7
6
|
import {
|
|
8
7
|
getResultCode,
|
|
9
|
-
V1TxInvalidPayloadError,
|
|
10
|
-
V1NodeHasNoWriteAccess,
|
|
11
|
-
shouldEndConnection,
|
|
12
|
-
V1TxAcceptedProofUnavailable,
|
|
13
|
-
V1UnexpectedError,
|
|
14
|
-
V1NodeOverloadedError,
|
|
15
|
-
V1TxAlreadyPendingError,
|
|
16
|
-
V1TimeoutError,
|
|
17
8
|
V1ProtocolError
|
|
18
9
|
} from "../V1ProtocolError.js";
|
|
19
10
|
import V1BroadcastTransactionRequest from "../validators/V1BroadcastTransactionRequest.js";
|
|
@@ -21,7 +12,6 @@ import {
|
|
|
21
12
|
unsafeDecodeApplyOperation,
|
|
22
13
|
unsafeEncodeApplyOperation
|
|
23
14
|
} from "../../../../../utils/protobuf/operationHelpers.js";
|
|
24
|
-
import {isBootstrapDeployment, isRoleAccess, isTransaction, isTransfer} from '../../../../../utils/applyOperations.js';
|
|
25
15
|
import PartialRoleAccessValidator from "../../shared/validators/PartialRoleAccessValidator.js";
|
|
26
16
|
import PartialBootstrapDeploymentValidator from "../../shared/validators/PartialBootstrapDeploymentValidator.js";
|
|
27
17
|
import PartialTransactionValidator from "../../shared/validators/PartialTransactionValidator.js";
|
|
@@ -30,16 +20,20 @@ import {applyStateMessageFactory} from "../../../../../messages/state/applyState
|
|
|
30
20
|
import V1BroadcastTransactionResponse from "../validators/V1BroadcastTransactionResponse.js";
|
|
31
21
|
import V1BaseOperationHandler from "./V1BaseOperationHandler.js";
|
|
32
22
|
import {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
} from "../../../services/TransactionPoolService.js";
|
|
23
|
+
createBroadcastTransactionOperationStrategies,
|
|
24
|
+
resolveBroadcastTransactionOperationStrategy
|
|
25
|
+
} from "./broadcastTransaction/BroadcastTransactionOperationStrategies.js";
|
|
37
26
|
import {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
27
|
+
getTxHashFromDecodedTransaction,
|
|
28
|
+
sanitizeDecodedPartialTransaction
|
|
29
|
+
} from "./broadcastTransaction/BroadcastTransactionPayloadUtils.js";
|
|
30
|
+
import {
|
|
31
|
+
mapPendingCommitRegistrationError,
|
|
32
|
+
mapPendingCommitResolutionError,
|
|
33
|
+
mapTransactionEnqueueError,
|
|
34
|
+
mapTxPoolAvailabilityError
|
|
35
|
+
} from "./broadcastTransaction/BroadcastTransactionErrorMapper.js";
|
|
36
|
+
import {shouldEndConnection} from "../../connectionPolicies.js";
|
|
43
37
|
|
|
44
38
|
class V1BroadcastTransactionOperationHandler extends V1BaseOperationHandler {
|
|
45
39
|
#state;
|
|
@@ -52,6 +46,7 @@ class V1BroadcastTransactionOperationHandler extends V1BaseOperationHandler {
|
|
|
52
46
|
#partialTransactionValidator;
|
|
53
47
|
#partialTransferValidator;
|
|
54
48
|
#transactionCommitService;
|
|
49
|
+
#operationStrategies;
|
|
55
50
|
|
|
56
51
|
constructor(state, wallet, rateLimiterService, txPoolService, pendingRequestService, transactionCommitService, config) {
|
|
57
52
|
super(rateLimiterService, pendingRequestService, config);
|
|
@@ -65,66 +60,18 @@ class V1BroadcastTransactionOperationHandler extends V1BaseOperationHandler {
|
|
|
65
60
|
this.#partialTransferValidator = new PartialTransferValidator(state, this.#wallet.address, config);
|
|
66
61
|
this.#broadcastTransactionResponseValidator = new V1BroadcastTransactionResponse(state, config);
|
|
67
62
|
this.#transactionCommitService = transactionCommitService;
|
|
63
|
+
this.#operationStrategies = createBroadcastTransactionOperationStrategies({
|
|
64
|
+
partialRoleAccessValidator: this.#partialRoleAccessValidator,
|
|
65
|
+
partialBootstrapDeploymentValidator: this.#partialBootstrapDeploymentValidator,
|
|
66
|
+
partialTransactionValidator: this.#partialTransactionValidator,
|
|
67
|
+
partialTransferValidator: this.#partialTransferValidator,
|
|
68
|
+
createApplyStateMessageFactory: () => applyStateMessageFactory(this.#wallet, this.config)
|
|
69
|
+
});
|
|
68
70
|
}
|
|
69
71
|
|
|
70
72
|
async handleRequest(message, connection) {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
let proof = null
|
|
74
|
-
let timestamp = 0;
|
|
75
|
-
|
|
76
|
-
try {
|
|
77
|
-
this.applyRateLimit(connection);
|
|
78
|
-
await this.#broadcastTransactionRequestValidator.validate(message, connection.remotePublicKey);
|
|
79
|
-
await this.#validationCapability();
|
|
80
|
-
this.#isTxPoolFull();
|
|
81
|
-
const decodedTransaction = this.decodeApplyOperation(message.broadcast_transaction_request.data);
|
|
82
|
-
this.#sanitizeDecodedPartialTransaction(decodedTransaction);
|
|
83
|
-
const receipt = await this.dispatchTransaction(decodedTransaction);
|
|
84
|
-
proof = receipt.proof;
|
|
85
|
-
timestamp = receipt.timestamp;
|
|
86
|
-
} catch (error) {
|
|
87
|
-
const protocolError = error instanceof V1ProtocolError
|
|
88
|
-
? error
|
|
89
|
-
: new V1UnexpectedError(error?.message ?? 'Unexpected error', true);
|
|
90
|
-
resultCode = getResultCode(protocolError);
|
|
91
|
-
if (
|
|
92
|
-
resultCode === ResultCode.TX_ACCEPTED_PROOF_UNAVAILABLE &&
|
|
93
|
-
Number.isSafeInteger(protocolError.timestamp) &&
|
|
94
|
-
protocolError.timestamp > 0
|
|
95
|
-
) {
|
|
96
|
-
timestamp = protocolError.timestamp;
|
|
97
|
-
}
|
|
98
|
-
endConnection = shouldEndConnection(protocolError);
|
|
99
|
-
this.displayError(
|
|
100
|
-
"failed to process broadcast transaction request from sender",
|
|
101
|
-
connection.remotePublicKey,
|
|
102
|
-
protocolError
|
|
103
|
-
);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
try {
|
|
107
|
-
const response = await this.#buildBroadcastTransactionResponse(
|
|
108
|
-
message.id,
|
|
109
|
-
NETWORK_CAPABILITIES,
|
|
110
|
-
proof,
|
|
111
|
-
timestamp,
|
|
112
|
-
resultCode,
|
|
113
|
-
);
|
|
114
|
-
|
|
115
|
-
await this.sendResponseAndMaybeClose(
|
|
116
|
-
connection,
|
|
117
|
-
response,
|
|
118
|
-
endConnection
|
|
119
|
-
);
|
|
120
|
-
} catch (error) {
|
|
121
|
-
this.displayError(
|
|
122
|
-
"failed to build/send response to sender",
|
|
123
|
-
connection.remotePublicKey,
|
|
124
|
-
error
|
|
125
|
-
);
|
|
126
|
-
connection.end();
|
|
127
|
-
}
|
|
73
|
+
const outcome = await this.#processBroadcastTransactionRequest(message, connection);
|
|
74
|
+
await this.#sendBroadcastTransactionResponse(message.id, connection, outcome);
|
|
128
75
|
}
|
|
129
76
|
|
|
130
77
|
async handleResponse(message, connection) {
|
|
@@ -156,7 +103,7 @@ class V1BroadcastTransactionOperationHandler extends V1BaseOperationHandler {
|
|
|
156
103
|
timestamp
|
|
157
104
|
);
|
|
158
105
|
} catch (error) {
|
|
159
|
-
throw new
|
|
106
|
+
throw new V1ProtocolError(ResultCode.UNEXPECTED_ERROR, `Failed to build broadcast transaction response: ${error.message}`);
|
|
160
107
|
}
|
|
161
108
|
}
|
|
162
109
|
|
|
@@ -164,223 +111,159 @@ class V1BroadcastTransactionOperationHandler extends V1BaseOperationHandler {
|
|
|
164
111
|
try {
|
|
165
112
|
return unsafeDecodeApplyOperation(message);
|
|
166
113
|
} catch (error) {
|
|
167
|
-
throw new
|
|
114
|
+
throw new V1ProtocolError(ResultCode.UNEXPECTED_ERROR, `Failed to decode apply operation from message: ${error.message}`);
|
|
168
115
|
}
|
|
169
116
|
}
|
|
170
117
|
|
|
171
|
-
#
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
const type = decodedTransaction?.type;
|
|
176
|
-
const operationKey = this.#getOperationPayloadKey(type);
|
|
118
|
+
async #processBroadcastTransactionRequest(message, connection) {
|
|
119
|
+
let proof = null;
|
|
120
|
+
let timestamp = 0;
|
|
177
121
|
|
|
178
|
-
|
|
179
|
-
|
|
122
|
+
try {
|
|
123
|
+
this.applyRateLimit(connection);
|
|
124
|
+
await this.#broadcastTransactionRequestValidator.validate(message, connection.remotePublicKey);
|
|
125
|
+
await this.#validateWriteCapability();
|
|
126
|
+
this.#validateTxPoolAvailability();
|
|
127
|
+
const decodedTransaction = this.decodeApplyOperation(message.broadcast_transaction_request.data);
|
|
128
|
+
sanitizeDecodedPartialTransaction(decodedTransaction);
|
|
129
|
+
const receipt = await this.dispatchTransaction(decodedTransaction);
|
|
130
|
+
proof = receipt.proof;
|
|
131
|
+
timestamp = receipt.timestamp;
|
|
132
|
+
} catch (error) {
|
|
133
|
+
return this.#buildFailedRequestOutcome(error, connection);
|
|
180
134
|
}
|
|
181
135
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
136
|
+
return {
|
|
137
|
+
endConnection: false,
|
|
138
|
+
proof,
|
|
139
|
+
resultCode: ResultCode.OK,
|
|
140
|
+
timestamp
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
#buildFailedRequestOutcome(error, connection) {
|
|
145
|
+
const protocolError = error instanceof V1ProtocolError
|
|
146
|
+
? error
|
|
147
|
+
: new V1ProtocolError(ResultCode.UNEXPECTED_ERROR, error?.message ?? 'Unexpected error');
|
|
148
|
+
const resultCode = getResultCode(protocolError);
|
|
149
|
+
let timestamp = 0;
|
|
150
|
+
|
|
151
|
+
if (
|
|
152
|
+
resultCode === ResultCode.TX_ACCEPTED_PROOF_UNAVAILABLE &&
|
|
153
|
+
Number.isSafeInteger(protocolError.timestamp) &&
|
|
154
|
+
protocolError.timestamp > 0
|
|
155
|
+
) {
|
|
156
|
+
timestamp = protocolError.timestamp;
|
|
186
157
|
}
|
|
158
|
+
|
|
159
|
+
this.displayError(
|
|
160
|
+
"failed to process broadcast transaction request from sender",
|
|
161
|
+
connection.remotePublicKey,
|
|
162
|
+
protocolError
|
|
163
|
+
);
|
|
164
|
+
|
|
165
|
+
return {
|
|
166
|
+
endConnection: shouldEndConnection(resultCode),
|
|
167
|
+
proof: null,
|
|
168
|
+
resultCode,
|
|
169
|
+
timestamp
|
|
170
|
+
};
|
|
187
171
|
}
|
|
188
172
|
|
|
189
|
-
#
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
173
|
+
async #sendBroadcastTransactionResponse(messageId, connection, {proof, timestamp, resultCode, endConnection}) {
|
|
174
|
+
try {
|
|
175
|
+
const response = await this.#buildBroadcastTransactionResponse(
|
|
176
|
+
messageId,
|
|
177
|
+
NETWORK_CAPABILITIES,
|
|
178
|
+
proof,
|
|
179
|
+
timestamp,
|
|
180
|
+
resultCode,
|
|
181
|
+
);
|
|
182
|
+
|
|
183
|
+
await this.sendResponseAndMaybeClose(
|
|
184
|
+
connection,
|
|
185
|
+
response,
|
|
186
|
+
endConnection
|
|
187
|
+
);
|
|
188
|
+
} catch (error) {
|
|
189
|
+
this.displayError(
|
|
190
|
+
"failed to build/send response to sender",
|
|
191
|
+
connection.remotePublicKey,
|
|
192
|
+
error
|
|
193
|
+
);
|
|
194
|
+
connection.end();
|
|
195
|
+
}
|
|
195
196
|
}
|
|
196
197
|
|
|
197
|
-
#
|
|
198
|
+
#validateTxPoolAvailability() {
|
|
198
199
|
try {
|
|
199
200
|
this.#txPoolService.validateEnqueue();
|
|
200
201
|
} catch (error) {
|
|
201
|
-
|
|
202
|
-
throw new V1NodeOverloadedError('Transaction pool is full, ignoring incoming transaction.');
|
|
203
|
-
}
|
|
204
|
-
throw error;
|
|
202
|
+
throw mapTxPoolAvailabilityError(error);
|
|
205
203
|
}
|
|
206
204
|
}
|
|
207
205
|
|
|
208
|
-
async #
|
|
206
|
+
async #validateWriteCapability() {
|
|
209
207
|
const isAllowedToValidate = await this.#state.allowedToValidate(this.#wallet.address);
|
|
210
208
|
const isAdminAllowedToValidate = await this.#state.isAdminAllowedToValidate();
|
|
211
209
|
const canValidate = isAllowedToValidate || isAdminAllowedToValidate;
|
|
212
210
|
if (!canValidate) {
|
|
213
|
-
throw new
|
|
211
|
+
throw new V1ProtocolError(
|
|
212
|
+
ResultCode.NODE_HAS_NO_WRITE_ACCESS,
|
|
213
|
+
'State is not writable or is an indexer without admin privileges.'
|
|
214
|
+
);
|
|
214
215
|
}
|
|
215
216
|
}
|
|
216
217
|
|
|
217
218
|
async dispatchTransaction(decodedTransaction) {
|
|
218
219
|
if (!decodedTransaction || !Number.isInteger(decodedTransaction.type) || decodedTransaction.type === 0) {
|
|
219
|
-
throw new
|
|
220
|
+
throw new V1ProtocolError(ResultCode.TX_INVALID_PAYLOAD, 'Decoded transaction type is missing.');
|
|
220
221
|
}
|
|
221
222
|
if (!this.#transactionCommitService) {
|
|
222
|
-
throw new
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
const type = decodedTransaction.type;
|
|
226
|
-
let completeTransactionOperation;
|
|
227
|
-
|
|
228
|
-
// TODO: Consider moving logic below to strategy design pattern.
|
|
229
|
-
if (isRoleAccess(type)) {
|
|
230
|
-
await this.#partialRoleAccessValidator.validate(decodedTransaction);
|
|
231
|
-
completeTransactionOperation = await this.#buildCompleteRoleAccessOperation(decodedTransaction);
|
|
232
|
-
} else if (isTransaction(type)) {
|
|
233
|
-
await this.#partialTransactionValidator.validate(decodedTransaction);
|
|
234
|
-
completeTransactionOperation = await this.#buildCompleteTransactionOperation(decodedTransaction);
|
|
235
|
-
} else if (isBootstrapDeployment(type)) {
|
|
236
|
-
await this.#partialBootstrapDeploymentValidator.validate(decodedTransaction);
|
|
237
|
-
completeTransactionOperation = await this.#buildCompleteBootstrapDeploymentOperation(decodedTransaction);
|
|
238
|
-
} else if (isTransfer(type)) {
|
|
239
|
-
await this.#partialTransferValidator.validate(decodedTransaction);
|
|
240
|
-
completeTransactionOperation = await this.#buildCompleteTransferOperation(decodedTransaction);
|
|
241
|
-
} else {
|
|
242
|
-
throw new V1TxInvalidPayloadError(`Unsupported transaction type: ${type}`, false);
|
|
223
|
+
throw new V1ProtocolError(ResultCode.UNEXPECTED_ERROR, 'TransactionCommitService is not configured.');
|
|
243
224
|
}
|
|
244
225
|
|
|
245
|
-
const
|
|
246
|
-
|
|
247
|
-
|
|
226
|
+
const operationStrategy = resolveBroadcastTransactionOperationStrategy(
|
|
227
|
+
decodedTransaction.type,
|
|
228
|
+
this.#operationStrategies
|
|
229
|
+
);
|
|
230
|
+
const completeTransactionOperation = await operationStrategy.build(decodedTransaction);
|
|
231
|
+
const txHash = getTxHashFromDecodedTransaction(decodedTransaction, operationStrategy.payloadKey);
|
|
248
232
|
const encodedCompleteTransaction = unsafeEncodeApplyOperation(completeTransactionOperation);
|
|
249
|
-
|
|
233
|
+
const pendingCommit = this.#registerPendingCommit(txHash);
|
|
234
|
+
|
|
235
|
+
this.#enqueueTransaction(txHash, encodedCompleteTransaction);
|
|
236
|
+
return this.#resolvePendingCommit(pendingCommit);
|
|
237
|
+
}
|
|
250
238
|
|
|
239
|
+
#registerPendingCommit(txHash) {
|
|
251
240
|
try {
|
|
252
|
-
pendingCommit = this.#transactionCommitService.registerPendingCommit(txHash);
|
|
241
|
+
const pendingCommit = this.#transactionCommitService.registerPendingCommit(txHash);
|
|
253
242
|
pendingCommit.catch(() => {});
|
|
243
|
+
return pendingCommit;
|
|
254
244
|
} catch (error) {
|
|
255
|
-
|
|
256
|
-
throw new V1ProtocolError(ResultCode.TX_HASH_INVALID_FORMAT, error.message, false);
|
|
257
|
-
}
|
|
258
|
-
if (error instanceof PendingCommitAlreadyExistsError) {
|
|
259
|
-
throw new V1TxAlreadyPendingError(error.message);
|
|
260
|
-
}
|
|
261
|
-
if (error instanceof PendingCommitBufferFullError) {
|
|
262
|
-
throw new V1NodeOverloadedError(error.message);
|
|
263
|
-
}
|
|
264
|
-
throw error;
|
|
245
|
+
throw mapPendingCommitRegistrationError(error);
|
|
265
246
|
}
|
|
247
|
+
}
|
|
266
248
|
|
|
249
|
+
#enqueueTransaction(txHash, encodedCompleteTransaction) {
|
|
267
250
|
try {
|
|
268
251
|
this.#txPoolService.addTransaction(txHash, encodedCompleteTransaction);
|
|
269
252
|
} catch (error) {
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
} else if (error instanceof TransactionPoolAlreadyQueuedError) {
|
|
274
|
-
err = new V1TxAlreadyPendingError(error.message);
|
|
275
|
-
} else if (error instanceof TransactionPoolInvalidIncomingDataError) {
|
|
276
|
-
err = new V1ProtocolError(
|
|
277
|
-
ResultCode.INTERNAL_ENQUEUE_VALIDATION_FAILED,
|
|
278
|
-
`Internal enqueue validation failed: ${error.message}`,
|
|
279
|
-
false
|
|
280
|
-
);
|
|
281
|
-
}
|
|
282
|
-
this.#transactionCommitService.rejectPendingCommit(txHash, err);
|
|
283
|
-
throw err; // will be mapped anyway on lower level.
|
|
253
|
+
const mappedError = mapTransactionEnqueueError(error);
|
|
254
|
+
this.#transactionCommitService.rejectPendingCommit(txHash, mappedError);
|
|
255
|
+
throw mappedError;
|
|
284
256
|
}
|
|
257
|
+
}
|
|
285
258
|
|
|
286
|
-
|
|
259
|
+
async #resolvePendingCommit(pendingCommit) {
|
|
287
260
|
try {
|
|
288
|
-
|
|
261
|
+
return await pendingCommit;
|
|
289
262
|
} catch (error) {
|
|
290
|
-
|
|
291
|
-
throw new V1TxAcceptedProofUnavailable(error.message, false, error.timestamp);
|
|
292
|
-
}
|
|
293
|
-
if (error instanceof TransactionPoolMissingCommitReceiptError) {
|
|
294
|
-
throw new V1ProtocolError(ResultCode.TX_COMMITTED_RECEIPT_MISSING, error.message, false);
|
|
295
|
-
}
|
|
296
|
-
if (error instanceof PendingCommitTimeoutError) {
|
|
297
|
-
throw new V1TimeoutError(error.message);
|
|
298
|
-
}
|
|
299
|
-
throw error;
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
return receipt;
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
//TODO: Move responsibility to new class (next 4 functions)
|
|
307
|
-
async #buildCompleteRoleAccessOperation(decodedTransaction) {
|
|
308
|
-
const factory = applyStateMessageFactory(this.#wallet, this.config);
|
|
309
|
-
|
|
310
|
-
switch (decodedTransaction.type) {
|
|
311
|
-
case OperationType.ADD_WRITER:
|
|
312
|
-
return factory.buildCompleteAddWriterMessage(
|
|
313
|
-
decodedTransaction.address,
|
|
314
|
-
decodedTransaction.rao.tx,
|
|
315
|
-
decodedTransaction.rao.txv,
|
|
316
|
-
decodedTransaction.rao.iw,
|
|
317
|
-
decodedTransaction.rao.in,
|
|
318
|
-
decodedTransaction.rao.is
|
|
319
|
-
);
|
|
320
|
-
case OperationType.REMOVE_WRITER:
|
|
321
|
-
return factory.buildCompleteRemoveWriterMessage(
|
|
322
|
-
decodedTransaction.address,
|
|
323
|
-
decodedTransaction.rao.tx,
|
|
324
|
-
decodedTransaction.rao.txv,
|
|
325
|
-
decodedTransaction.rao.iw,
|
|
326
|
-
decodedTransaction.rao.in,
|
|
327
|
-
decodedTransaction.rao.is
|
|
328
|
-
);
|
|
329
|
-
case OperationType.ADMIN_RECOVERY:
|
|
330
|
-
return factory.buildCompleteAdminRecoveryMessage(
|
|
331
|
-
decodedTransaction.address,
|
|
332
|
-
decodedTransaction.rao.tx,
|
|
333
|
-
decodedTransaction.rao.txv,
|
|
334
|
-
decodedTransaction.rao.iw,
|
|
335
|
-
decodedTransaction.rao.in,
|
|
336
|
-
decodedTransaction.rao.is
|
|
337
|
-
);
|
|
338
|
-
default:
|
|
339
|
-
throw new V1TxInvalidPayloadError(`Unsupported role access transaction type: ${decodedTransaction.type}`, false);
|
|
263
|
+
throw mapPendingCommitResolutionError(error);
|
|
340
264
|
}
|
|
341
265
|
}
|
|
342
266
|
|
|
343
|
-
async #buildCompleteTransactionOperation(decodedTransaction) {
|
|
344
|
-
return applyStateMessageFactory(this.#wallet, this.config)
|
|
345
|
-
.buildCompleteTransactionOperationMessage(
|
|
346
|
-
decodedTransaction.address,
|
|
347
|
-
decodedTransaction.txo.tx,
|
|
348
|
-
decodedTransaction.txo.txv,
|
|
349
|
-
decodedTransaction.txo.iw,
|
|
350
|
-
decodedTransaction.txo.in,
|
|
351
|
-
decodedTransaction.txo.ch,
|
|
352
|
-
decodedTransaction.txo.is,
|
|
353
|
-
decodedTransaction.txo.bs,
|
|
354
|
-
decodedTransaction.txo.mbs
|
|
355
|
-
);
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
async #buildCompleteBootstrapDeploymentOperation(decodedTransaction) {
|
|
359
|
-
return applyStateMessageFactory(this.#wallet, this.config)
|
|
360
|
-
.buildCompleteBootstrapDeploymentMessage(
|
|
361
|
-
decodedTransaction.address,
|
|
362
|
-
decodedTransaction.bdo.tx,
|
|
363
|
-
decodedTransaction.bdo.txv,
|
|
364
|
-
decodedTransaction.bdo.bs,
|
|
365
|
-
decodedTransaction.bdo.ic,
|
|
366
|
-
decodedTransaction.bdo.in,
|
|
367
|
-
decodedTransaction.bdo.is
|
|
368
|
-
);
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
async #buildCompleteTransferOperation(decodedTransaction) {
|
|
372
|
-
return applyStateMessageFactory(this.#wallet, this.config)
|
|
373
|
-
.buildCompleteTransferOperationMessage(
|
|
374
|
-
decodedTransaction.address,
|
|
375
|
-
decodedTransaction.tro.tx,
|
|
376
|
-
decodedTransaction.tro.txv,
|
|
377
|
-
decodedTransaction.tro.in,
|
|
378
|
-
decodedTransaction.tro.to,
|
|
379
|
-
decodedTransaction.tro.am,
|
|
380
|
-
decodedTransaction.tro.is
|
|
381
|
-
);
|
|
382
|
-
}
|
|
383
|
-
|
|
384
267
|
#extractBroadcastResultCode(payload) {
|
|
385
268
|
return payload.broadcast_transaction_response.result;
|
|
386
269
|
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import {networkMessageFactory} from "../../../../../messages/network/v1/networkMessageFactory.js";
|
|
2
|
+
import {NETWORK_CAPABILITIES, ResultCode} from "../../../../../utils/constants.js";
|
|
3
3
|
import V1LivenessRequest from "../validators/V1LivenessRequest.js";
|
|
4
|
-
import {getResultCode,
|
|
4
|
+
import {getResultCode, V1ProtocolError} from "../V1ProtocolError.js";
|
|
5
5
|
import V1LivenessResponse from "../validators/V1LivenessResponse.js";
|
|
6
6
|
import V1BaseOperationHandler from "./V1BaseOperationHandler.js";
|
|
7
|
+
import {shouldEndConnection} from "../../connectionPolicies.js"
|
|
7
8
|
|
|
8
9
|
class V1LivenessOperationHandler extends V1BaseOperationHandler {
|
|
9
10
|
#wallet;
|
|
@@ -25,7 +26,7 @@ class V1LivenessOperationHandler extends V1BaseOperationHandler {
|
|
|
25
26
|
await this.#v1LivenessRequestValidator.validate(message, connection.remotePublicKey);
|
|
26
27
|
} catch (error) {
|
|
27
28
|
resultCode = getResultCode(error);
|
|
28
|
-
endConnection = shouldEndConnection(
|
|
29
|
+
endConnection = shouldEndConnection(resultCode);
|
|
29
30
|
this.displayError("failed to process liveness request from sender",
|
|
30
31
|
connection.remotePublicKey,
|
|
31
32
|
error
|
|
@@ -75,7 +76,7 @@ class V1LivenessOperationHandler extends V1BaseOperationHandler {
|
|
|
75
76
|
resultCode
|
|
76
77
|
);
|
|
77
78
|
} catch (error) {
|
|
78
|
-
throw new
|
|
79
|
+
throw new V1ProtocolError(ResultCode.UNEXPECTED_ERROR, `Failed to build liveness response: ${error.message}`);
|
|
79
80
|
}
|
|
80
81
|
}
|
|
81
82
|
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import {ResultCode} from "../../../../../../utils/constants.js";
|
|
2
|
+
import {V1ProtocolError} from "../../V1ProtocolError.js";
|
|
3
|
+
import {
|
|
4
|
+
TransactionPoolAlreadyQueuedError,
|
|
5
|
+
TransactionPoolFullError,
|
|
6
|
+
TransactionPoolInvalidIncomingDataError,
|
|
7
|
+
TransactionPoolMissingCommitReceiptError,
|
|
8
|
+
TransactionPoolProofUnavailableError
|
|
9
|
+
} from "../../../../services/TransactionPoolService.js";
|
|
10
|
+
import {
|
|
11
|
+
PendingCommitAlreadyExistsError,
|
|
12
|
+
PendingCommitBufferFullError,
|
|
13
|
+
PendingCommitInvalidTxHashError,
|
|
14
|
+
PendingCommitTimeoutError
|
|
15
|
+
} from "../../../../services/TransactionCommitService.js";
|
|
16
|
+
|
|
17
|
+
export function mapTxPoolAvailabilityError(error) {
|
|
18
|
+
if (error instanceof TransactionPoolFullError) {
|
|
19
|
+
return new V1ProtocolError(
|
|
20
|
+
ResultCode.NODE_OVERLOADED,
|
|
21
|
+
'Transaction pool is full, ignoring incoming transaction.'
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
return error;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function mapPendingCommitRegistrationError(error) {
|
|
29
|
+
if (error instanceof PendingCommitInvalidTxHashError) {
|
|
30
|
+
return new V1ProtocolError(ResultCode.TX_HASH_INVALID_FORMAT, error.message);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if (error instanceof PendingCommitAlreadyExistsError) {
|
|
34
|
+
return new V1ProtocolError(ResultCode.TX_ALREADY_PENDING, error.message);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if (error instanceof PendingCommitBufferFullError) {
|
|
38
|
+
return new V1ProtocolError(ResultCode.NODE_OVERLOADED, error.message);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return error;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function mapTransactionEnqueueError(error) {
|
|
45
|
+
if (error instanceof TransactionPoolFullError) {
|
|
46
|
+
return new V1ProtocolError(ResultCode.NODE_OVERLOADED, error.message);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (error instanceof TransactionPoolAlreadyQueuedError) {
|
|
50
|
+
return new V1ProtocolError(ResultCode.TX_ALREADY_PENDING, error.message);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (error instanceof TransactionPoolInvalidIncomingDataError) {
|
|
54
|
+
return new V1ProtocolError(
|
|
55
|
+
ResultCode.INTERNAL_ENQUEUE_VALIDATION_FAILED,
|
|
56
|
+
`Internal enqueue validation failed: ${error.message}`
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return error;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function mapPendingCommitResolutionError(error) {
|
|
64
|
+
if (error instanceof TransactionPoolProofUnavailableError) {
|
|
65
|
+
const protocolError = new V1ProtocolError(
|
|
66
|
+
ResultCode.TX_ACCEPTED_PROOF_UNAVAILABLE,
|
|
67
|
+
error.message
|
|
68
|
+
);
|
|
69
|
+
protocolError.timestamp = Number.isSafeInteger(error.timestamp) && error.timestamp > 0
|
|
70
|
+
? error.timestamp
|
|
71
|
+
: 0;
|
|
72
|
+
return protocolError;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (error instanceof TransactionPoolMissingCommitReceiptError) {
|
|
76
|
+
return new V1ProtocolError(ResultCode.TX_COMMITTED_RECEIPT_MISSING, error.message);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (error instanceof PendingCommitTimeoutError) {
|
|
80
|
+
return new V1ProtocolError(ResultCode.TIMEOUT, error.message);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return error;
|
|
84
|
+
}
|