trac-msb 0.2.18 → 0.2.19

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