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,431 +0,0 @@
1
- import { test } from 'brittle';
2
- import b4a from 'b4a';
3
- import { v7 as uuidv7 } from 'uuid';
4
- import sinon from 'sinon';
5
-
6
- import PendingRequestService from '../../../../src/core/network/services/PendingRequestService.js';
7
- import NetworkWalletFactory from '../../../../src/core/network/identity/NetworkWalletFactory.js';
8
- import NetworkMessageBuilder from '../../../../src/messages/network/v1/NetworkMessageBuilder.js';
9
- import { V1UnexpectedError } from '../../../../src/core/network/protocols/v1/V1ProtocolError.js';
10
- import { NetworkOperationType, ResultCode } from '../../../../src/utils/constants.js';
11
- import { errorMessageIncludes } from '../../../helpers/regexHelper.js';
12
- import { config } from '../../../helpers/config.js';
13
- import { testKeyPair1, testKeyPair2 } from '../../../fixtures/apply.fixtures.js';
14
- import SharedValidatorRejectionError from '../../../../src/core/network/protocols/shared/errors/SharedValidatorRejectionError.js';
15
-
16
- const validPeerA = testKeyPair1.publicKey;
17
- const validPeerB = testKeyPair2.publicKey;
18
-
19
- async function buildV1Request({ id = uuidv7() } = {}) {
20
- const wallet = createWallet();
21
- const builder = new NetworkMessageBuilder(wallet, config);
22
- await builder
23
- .setType(NetworkOperationType.LIVENESS_REQUEST)
24
- .setId(id)
25
- .setTimestamp()
26
- .setCapabilities([])
27
- .buildPayload();
28
- return builder.getResult();
29
- }
30
-
31
- async function buildV1BroadcastRequest({ id = uuidv7(), data = b4a.from('deadbeef', 'hex') } = {}) {
32
- const wallet = createWallet();
33
- const builder = new NetworkMessageBuilder(wallet, config);
34
- await builder
35
- .setType(NetworkOperationType.BROADCAST_TRANSACTION_REQUEST)
36
- .setId(id)
37
- .setTimestamp()
38
- .setData(data)
39
- .setCapabilities([])
40
- .buildPayload();
41
- return builder.getResult();
42
- }
43
-
44
- function createWallet() {
45
- const keyPair = {
46
- publicKey: b4a.from(testKeyPair1.publicKey, 'hex'),
47
- secretKey: b4a.from(testKeyPair1.secretKey, 'hex')
48
- };
49
- return NetworkWalletFactory.provide({
50
- enableWallet: false,
51
- keyPair,
52
- networkPrefix: config.addressPrefix
53
- });
54
- }
55
-
56
- test('PendingRequestService registers and resolves v1 request', async t => {
57
- const service = new PendingRequestService(config);
58
- const peer = validPeerA;
59
- const request = await buildV1Request();
60
-
61
- const promise = service.registerPendingRequest(peer, request);
62
- t.ok(service.has(request.id));
63
-
64
- t.ok(service.resolvePendingRequest(request.id));
65
- t.is(service.has(request.id), false);
66
- await promise;
67
-
68
- t.is(service.resolvePendingRequest(request.id), false);
69
- });
70
-
71
- test('PendingRequestService rejects and removes pending request', async t => {
72
- const service = new PendingRequestService(config);
73
- const peer = validPeerA;
74
- const request = await buildV1Request();
75
-
76
- const promise = service.registerPendingRequest(peer, request);
77
- const expectedError = new Error('test');
78
-
79
- t.ok(service.rejectPendingRequest(request.id, expectedError));
80
- t.is(service.has(request.id), false);
81
-
82
- try {
83
- await promise;
84
- t.fail('Expected pending request promise to reject');
85
- } catch (error) {
86
- t.ok(error instanceof V1UnexpectedError);
87
- t.is(error.message, expectedError.message);
88
- t.is(error.endConnection, true);
89
- }
90
-
91
- t.is(service.rejectPendingRequest('missing', new Error('missing')), false);
92
- });
93
-
94
- test('PendingRequestService preserves typed result-coded errors', async t => {
95
- const service = new PendingRequestService(config);
96
- const peer = validPeerA;
97
- const request = await buildV1Request();
98
-
99
- const promise = service.registerPendingRequest(peer, request);
100
- const expectedError = new SharedValidatorRejectionError(ResultCode.TX_INVALID_PAYLOAD, 'domain-invalid', true);
101
-
102
- t.ok(service.rejectPendingRequest(request.id, expectedError));
103
-
104
- try {
105
- await promise;
106
- t.fail('Expected pending request promise to reject');
107
- } catch (error) {
108
- t.is(error, expectedError);
109
- t.is(error.resultCode, ResultCode.TX_INVALID_PAYLOAD);
110
- t.is(error.message, 'domain-invalid');
111
- t.is(error.endConnection, true);
112
- }
113
- });
114
-
115
- test('PendingRequestService throws on duplicate request id', async t => {
116
- const service = new PendingRequestService(config);
117
- const peer = validPeerA;
118
- const request = await buildV1Request();
119
-
120
- const promise = service.registerPendingRequest(peer, request);
121
-
122
- t.exception(
123
- () => service.registerPendingRequest(peer, request),
124
- errorMessageIncludes('already exists')
125
- );
126
-
127
- t.ok(service.resolvePendingRequest(request.id));
128
- await promise;
129
- });
130
-
131
- test('PendingRequestService rejects pending request on timeout', async t => {
132
- const clock = sinon.useFakeTimers({ now: 1 });
133
- try {
134
- const pendingRequestTimeout = 123;
135
- const service = new PendingRequestService({
136
- pendingRequestTimeout,
137
- maxPendingRequestsInPendingRequestsService: 10
138
- });
139
- const peer = validPeerA;
140
- const request = await buildV1Request();
141
-
142
- const promise = service.registerPendingRequest(peer, request);
143
- promise.catch(() => {});
144
- t.ok(service.has(request.id));
145
-
146
- await clock.runAllAsync();
147
-
148
- try {
149
- await promise;
150
- t.fail('Expected pending request to time out');
151
- } catch (error) {
152
- t.ok(error?.message?.includes(`timed out after ${pendingRequestTimeout} ms`));
153
- }
154
-
155
- t.is(service.has(request.id), false);
156
- } finally {
157
- clock.restore();
158
- sinon.restore();
159
- }
160
- });
161
-
162
- test('PendingRequestService.close rejects all pending requests', async t => {
163
- const service = new PendingRequestService(config);
164
- const peer = validPeerA;
165
- const request1 = await buildV1Request();
166
- const request2 = await buildV1Request();
167
-
168
- const promise1 = service.registerPendingRequest(peer, request1);
169
- const promise2 = service.registerPendingRequest(peer, request2);
170
-
171
- service.close();
172
- t.is(service.has(request1.id), false);
173
- t.is(service.has(request2.id), false);
174
-
175
- const results = await Promise.allSettled([promise1, promise2]);
176
- t.is(results[0].status, 'rejected');
177
- t.ok(results[0]?.reason?.message?.includes(`Pending request ${request1.id} cancelled (shutdown).`));
178
- t.is(results[1].status, 'rejected');
179
- t.ok(results[1]?.reason?.message?.includes(`Pending request ${request2.id} cancelled (shutdown).`));
180
- });
181
-
182
- test('PendingRequestService rejects all pending requests for a specific peer', async t => {
183
- const service = new PendingRequestService(config);
184
- const peerA = validPeerA;
185
- const peerB = validPeerB;
186
- const requestA1 = await buildV1Request();
187
- const requestA2 = await buildV1Request();
188
- const requestB1 = await buildV1Request();
189
-
190
- const promiseA1 = service.registerPendingRequest(peerA, requestA1);
191
- const promiseA2 = service.registerPendingRequest(peerA, requestA2);
192
- const promiseB1 = service.registerPendingRequest(peerB, requestB1);
193
-
194
- const rejectedCount = service.rejectPendingRequestsForPeer(peerA, new Error('peer disconnected'));
195
- t.is(rejectedCount, 2);
196
- t.is(service.has(requestA1.id), false);
197
- t.is(service.has(requestA2.id), false);
198
- t.is(service.has(requestB1.id), true);
199
-
200
- const results = await Promise.allSettled([promiseA1, promiseA2]);
201
- t.is(results[0].status, 'rejected');
202
- t.is(results[0].reason.message, 'peer disconnected');
203
- t.is(results[1].status, 'rejected');
204
- t.is(results[1].reason.message, 'peer disconnected');
205
-
206
- t.ok(service.resolvePendingRequest(requestB1.id));
207
- await promiseB1;
208
- });
209
-
210
- test('PendingRequestService stores only transaction data for broadcast requests', async t => {
211
- const service = new PendingRequestService(config);
212
- const peer = validPeerA;
213
- const livenessRequest = await buildV1Request();
214
- const broadcastRequest = await buildV1BroadcastRequest();
215
-
216
- const livenessPromise = service.registerPendingRequest(peer, livenessRequest);
217
- const broadcastPromise = service.registerPendingRequest(peer, broadcastRequest);
218
-
219
- const livenessEntry = service.getPendingRequest(livenessRequest.id);
220
- const broadcastEntry = service.getPendingRequest(broadcastRequest.id);
221
-
222
- t.is(livenessEntry.requestTxData, null);
223
- t.ok(b4a.isBuffer(broadcastEntry.requestTxData));
224
- t.alike(broadcastEntry.requestTxData, broadcastRequest.broadcast_transaction_request.data);
225
- t.is(Object.prototype.hasOwnProperty.call(livenessEntry, 'requestMessage'), false);
226
- t.is(Object.prototype.hasOwnProperty.call(broadcastEntry, 'requestMessage'), false);
227
-
228
- t.ok(service.resolvePendingRequest(livenessRequest.id));
229
- t.ok(service.resolvePendingRequest(broadcastRequest.id));
230
- await Promise.all([livenessPromise, broadcastPromise]);
231
- });
232
-
233
- test('PendingRequestService.isProbePending matches peer and liveness type', async t => {
234
- const service = new PendingRequestService(config);
235
- const peerA = validPeerA;
236
- const peerB = validPeerB;
237
-
238
- t.is(service.isProbePending(peerA), false);
239
- t.is(service.isProbePending(peerB), false);
240
-
241
- const broadcastRequestA = await buildV1BroadcastRequest();
242
- const livenessRequestA = await buildV1Request();
243
- const livenessRequestB = await buildV1Request();
244
-
245
- const broadcastPromiseA = service.registerPendingRequest(peerA, broadcastRequestA);
246
- t.is(service.isProbePending(peerA), false);
247
-
248
- const livenessPromiseA = service.registerPendingRequest(peerA, livenessRequestA);
249
- const livenessPromiseB = service.registerPendingRequest(peerB, livenessRequestB);
250
-
251
- t.is(service.isProbePending(peerA), true);
252
- t.is(service.isProbePending(peerB), true);
253
-
254
- t.ok(service.resolvePendingRequest(livenessRequestA.id));
255
- await livenessPromiseA;
256
- t.is(service.isProbePending(peerA), false);
257
- t.is(service.isProbePending(peerB), true);
258
-
259
- t.ok(service.resolvePendingRequest(livenessRequestB.id));
260
- await livenessPromiseB;
261
- t.is(service.isProbePending(peerB), false);
262
-
263
- t.ok(service.resolvePendingRequest(broadcastRequestA.id));
264
- await broadcastPromiseA;
265
- });
266
-
267
- test('PendingRequestService enforces global pending request limit', async t => {
268
- const service = new PendingRequestService({
269
- pendingRequestTimeout: config.pendingRequestTimeout,
270
- maxPendingRequestsInPendingRequestsService: 3
271
- });
272
- const peer = validPeerA;
273
-
274
- const request0 = await buildV1Request({ id: 'limit-0' });
275
- const request1 = await buildV1Request({ id: 'limit-1' });
276
- const request2 = await buildV1Request({ id: 'limit-2' });
277
- const overflowRequest = await buildV1Request({ id: 'limit-overflow' });
278
-
279
- service.registerPendingRequest(peer, request0).catch(() => {});
280
- service.registerPendingRequest(peer, request1).catch(() => {});
281
- service.registerPendingRequest(peer, request2).catch(() => {});
282
-
283
- t.exception(
284
- () => service.registerPendingRequest(peer, overflowRequest),
285
- errorMessageIncludes('Maximum number of pending requests reached.')
286
- );
287
-
288
- service.close();
289
- });
290
-
291
- test('PendingRequestService.stopPendingRequestTimeout stops timeout and handles missing id', async t => {
292
- const clock = sinon.useFakeTimers({ now: 1 });
293
- try {
294
- const service = new PendingRequestService(config);
295
- const peer = validPeerA;
296
- const request = await buildV1Request();
297
-
298
- const promise = service.registerPendingRequest(peer, request);
299
- t.is(service.stopPendingRequestTimeout('missing-id'), false);
300
- t.is(service.stopPendingRequestTimeout(request.id), true);
301
- t.is(service.getPendingRequest(request.id)?.timeoutId, null);
302
-
303
- let settled = false;
304
- promise.then(
305
- () => { settled = true; },
306
- () => { settled = true; }
307
- );
308
-
309
- await clock.runAllAsync();
310
- await Promise.resolve();
311
- t.is(settled, false);
312
-
313
- t.ok(service.resolvePendingRequest(request.id));
314
- await promise;
315
- } finally {
316
- clock.restore();
317
- sinon.restore();
318
- }
319
- });
320
-
321
-
322
- test('PendingRequestService.getPendingRequest returns null for missing id', t => {
323
- const service = new PendingRequestService(config);
324
- t.is(service.getPendingRequest('missing-id'), null);
325
- });
326
-
327
-
328
- test('PendingRequestService rejects invalid registerPendingRequest input', async t => {
329
- const service = new PendingRequestService(config);
330
- const peer = validPeerA;
331
- const validLivenessRequest = await buildV1Request({ id: 'invalid-peer' });
332
-
333
- t.exception(
334
- () => service.registerPendingRequest(peer, 'not-an-object'),
335
- errorMessageIncludes('Pending request message must be an object.')
336
- );
337
-
338
- t.exception(
339
- () => service.registerPendingRequest(peer, {
340
- id: '',
341
- type: NetworkOperationType.LIVENESS_REQUEST
342
- }),
343
- errorMessageIncludes('Pending request ID must be a non-empty string.')
344
- );
345
-
346
- t.exception(
347
- () => service.registerPendingRequest(peer, {
348
- id: 'invalid-type',
349
- type: 'LIVENESS_REQUEST'
350
- }),
351
- errorMessageIncludes('Unsupported pending request type.')
352
- );
353
-
354
- t.exception(
355
- () => service.registerPendingRequest(peer, {
356
- id: 'unsupported-type',
357
- type: 999
358
- }),
359
- errorMessageIncludes('Unsupported pending request type.')
360
- );
361
-
362
- t.exception(
363
- () => service.registerPendingRequest('deadbeef', validLivenessRequest),
364
- errorMessageIncludes('Invalid peer public key. Expected 32-byte hex string.')
365
- );
366
-
367
- t.is(service.getPendingRequest('unsupported-type'), null);
368
- t.is(service.getPendingRequest('invalid-type'), null);
369
- });
370
-
371
- test('PendingRequestService.rejectPendingRequest falls back to Unexpected error message', async t => {
372
- const service = new PendingRequestService(config);
373
- const peer = validPeerA;
374
- const request = await buildV1Request();
375
- const promise = service.registerPendingRequest(peer, request);
376
-
377
- t.ok(service.rejectPendingRequest(request.id, {}));
378
-
379
- try {
380
- await promise;
381
- t.fail('Expected pending request promise to reject');
382
- } catch (error) {
383
- t.ok(error instanceof V1UnexpectedError);
384
- t.is(error.message, 'Unexpected error');
385
- t.is(error.endConnection, true);
386
- }
387
- });
388
-
389
- test('PendingRequestService.close catches reject errors and continues cleanup', async t => {
390
- const service = new PendingRequestService(config);
391
- const peer = validPeerA;
392
- const request = await buildV1Request();
393
- const promise = service.registerPendingRequest(peer, request);
394
- const entry = service.getPendingRequest(request.id);
395
- const originalReject = entry.reject;
396
- const logs = [];
397
- const originalConsoleError = console.error;
398
-
399
- console.error = (...args) => {
400
- logs.push(args);
401
- };
402
- t.teardown(() => {
403
- console.error = originalConsoleError;
404
- });
405
-
406
- entry.reject = error => {
407
- originalReject(error);
408
- throw new Error('forced reject failure');
409
- };
410
-
411
- service.close();
412
- t.is(service.has(request.id), false);
413
- t.is(logs.length, 1);
414
- t.ok(String(logs[0][0]).includes('PendingRequestService.close: failed to reject pending request'));
415
-
416
- const result = await Promise.allSettled([promise]);
417
- t.is(result[0].status, 'rejected');
418
- t.ok(result[0]?.reason?.message?.includes(`Pending request ${request.id} cancelled (shutdown).`));
419
- });
420
-
421
- test('PendingRequestService throws when registerPendingRequest receives null message', t => {
422
- const service = new PendingRequestService(config);
423
- const peer = validPeerA;
424
- try {
425
- service.registerPendingRequest(peer, null);
426
- t.fail('Expected registerPendingRequest to throw for null message');
427
- } catch (error) {
428
- t.ok(error?.message?.includes('Pending request message must be an object.'));
429
- }
430
- });
431
-
@@ -1,246 +0,0 @@
1
- import { test } from 'brittle';
2
- import b4a from 'b4a';
3
- import sinon from 'sinon';
4
-
5
- import TransactionCommitService, {
6
- PendingCommitAlreadyExistsError,
7
- PendingCommitBufferFullError,
8
- PendingCommitCancelledError,
9
- PendingCommitInvalidTxHashError,
10
- PendingCommitTimeoutError,
11
- PendingCommitUnexpectedError
12
- } from '../../../../src/core/network/services/TransactionCommitService.js';
13
- import { TRANSACTION_COMMIT_SERVICE_BUFFER_SIZE } from '../../../../src/utils/constants.js';
14
- import { errorMessageIncludes } from '../../../helpers/regexHelper.js';
15
- import { config } from '../../../helpers/config.js';
16
-
17
- function buildTxHashFromIndex(index) {
18
- const buffer = b4a.alloc(32);
19
- buffer.writeUInt32BE(index, 28);
20
- return buffer.toString('hex');
21
- }
22
-
23
- test('TransactionCommitService registers and resolves pending commit', async t => {
24
- const service = new TransactionCommitService(config);
25
- const txHash = buildTxHashFromIndex(1);
26
- const receipt = {
27
- txHash,
28
- blockNumber: 123,
29
- proof: b4a.from('abcd', 'hex')
30
- };
31
-
32
- const promise = service.registerPendingCommit(txHash);
33
- t.ok(service.has(txHash));
34
-
35
- t.ok(service.resolvePendingCommit(txHash, receipt));
36
- t.is(service.has(txHash), false);
37
- t.alike(await promise, receipt);
38
-
39
- t.is(service.resolvePendingCommit(txHash), false);
40
- });
41
-
42
- test('TransactionCommitService rejects pending commit with provided Error', async t => {
43
- const service = new TransactionCommitService(config);
44
- const txHash = buildTxHashFromIndex(2);
45
- const promise = service.registerPendingCommit(txHash);
46
- const expectedError = new Error('commit failed');
47
-
48
- t.ok(service.rejectPendingCommit(txHash, expectedError));
49
- t.is(service.has(txHash), false);
50
-
51
- try {
52
- await promise;
53
- t.fail('Expected pending commit promise to reject');
54
- } catch (error) {
55
- t.is(error, expectedError);
56
- }
57
-
58
- t.is(service.rejectPendingCommit(txHash, new Error('missing')), false);
59
- });
60
-
61
- test('TransactionCommitService rejects pending commit with fallback unexpected error', async t => {
62
- const service = new TransactionCommitService(config);
63
- const txHash = buildTxHashFromIndex(3);
64
- const promise = service.registerPendingCommit(txHash);
65
-
66
- t.ok(service.rejectPendingCommit(txHash, { reason: 'not-error-instance' }));
67
-
68
- try {
69
- await promise;
70
- t.fail('Expected pending commit promise to reject');
71
- } catch (error) {
72
- t.ok(error instanceof PendingCommitUnexpectedError);
73
- t.is(error.message, 'Unexpected commit error');
74
- }
75
- });
76
-
77
- test('TransactionCommitService throws on duplicate txHash', async t => {
78
- const service = new TransactionCommitService(config);
79
- const txHash = buildTxHashFromIndex(4);
80
- const promise = service.registerPendingCommit(txHash);
81
-
82
- t.exception(
83
- () => service.registerPendingCommit(txHash),
84
- PendingCommitAlreadyExistsError
85
- );
86
-
87
- t.ok(service.resolvePendingCommit(txHash));
88
- await promise;
89
- });
90
-
91
- test('TransactionCommitService validates txHash in all public methods', t => {
92
- const service = new TransactionCommitService(config);
93
- const invalidTxHashes = [
94
- undefined,
95
- null,
96
- '',
97
- 'abc',
98
- 'g'.repeat(64),
99
- 'a'.repeat(62),
100
- 'a'.repeat(66),
101
- b4a.alloc(32)
102
- ];
103
-
104
- for (const invalidTxHash of invalidTxHashes) {
105
- t.exception(
106
- () => service.has(invalidTxHash),
107
- PendingCommitInvalidTxHashError
108
- );
109
- t.exception(
110
- () => service.registerPendingCommit(invalidTxHash),
111
- PendingCommitInvalidTxHashError
112
- );
113
- t.exception(
114
- () => service.getAndDeletePendingCommit(invalidTxHash),
115
- PendingCommitInvalidTxHashError
116
- );
117
- t.exception(
118
- () => service.resolvePendingCommit(invalidTxHash),
119
- PendingCommitInvalidTxHashError
120
- );
121
- t.exception(
122
- () => service.rejectPendingCommit(invalidTxHash, new Error('invalid')),
123
- PendingCommitInvalidTxHashError
124
- );
125
- }
126
- });
127
-
128
- test('TransactionCommitService returns null/false for missing valid txHash', t => {
129
- const service = new TransactionCommitService(config);
130
- const missingTxHash = buildTxHashFromIndex(5);
131
-
132
- t.is(service.has(missingTxHash), false);
133
- t.is(service.getAndDeletePendingCommit(missingTxHash), null);
134
- t.is(service.resolvePendingCommit(missingTxHash), false);
135
- t.is(service.rejectPendingCommit(missingTxHash, new Error('missing')), false);
136
- });
137
-
138
- test('TransactionCommitService getAndDeletePendingCommit clears pending entry', async t => {
139
- const clock = sinon.useFakeTimers({ now: 1 });
140
- try {
141
- const service = new TransactionCommitService(config);
142
- const txHash = buildTxHashFromIndex(6);
143
- const promise = service.registerPendingCommit(txHash);
144
- const entry = service.getAndDeletePendingCommit(txHash);
145
-
146
- t.ok(entry);
147
- t.is(entry.txHash, txHash);
148
- t.is(service.has(txHash), false);
149
- t.is(service.getAndDeletePendingCommit(txHash), null);
150
-
151
- let settled = false;
152
- promise.then(
153
- () => {
154
- settled = true;
155
- },
156
- () => {
157
- settled = true;
158
- }
159
- );
160
-
161
- await clock.runAllAsync();
162
- await Promise.resolve();
163
- t.is(settled, false);
164
-
165
- entry.resolve('manual-resolution');
166
- t.is(await promise, 'manual-resolution');
167
- } finally {
168
- clock.restore();
169
- sinon.restore();
170
- }
171
- });
172
-
173
- test('TransactionCommitService rejects pending commit on timeout', async t => {
174
- const clock = sinon.useFakeTimers({ now: 1 });
175
- try {
176
- const timeoutMs = config.txCommitTimeout;
177
- const service = new TransactionCommitService(config);
178
- const txHash = buildTxHashFromIndex(7);
179
- const promise = service.registerPendingCommit(txHash);
180
- promise.catch(() => {});
181
-
182
- t.ok(service.has(txHash));
183
-
184
- await clock.runAllAsync();
185
-
186
- try {
187
- await promise;
188
- t.fail('Expected pending commit to time out');
189
- } catch (error) {
190
- t.ok(error instanceof PendingCommitTimeoutError);
191
- t.ok(error.message.includes(`timed out after ${timeoutMs} ms`));
192
- }
193
-
194
- t.is(service.has(txHash), false);
195
- } finally {
196
- clock.restore();
197
- sinon.restore();
198
- }
199
- });
200
-
201
- test('TransactionCommitService enforces pending commit buffer size limit', async t => {
202
- const service = new TransactionCommitService(config);
203
- const promises = [];
204
-
205
- for (let i = 0; i < TRANSACTION_COMMIT_SERVICE_BUFFER_SIZE; i++) {
206
- const txHash = buildTxHashFromIndex(10_000 + i);
207
- const promise = service.registerPendingCommit(txHash);
208
- promise.catch(() => {});
209
- promises.push(promise);
210
- }
211
-
212
- t.exception(
213
- () => service.registerPendingCommit(buildTxHashFromIndex(10_000 + TRANSACTION_COMMIT_SERVICE_BUFFER_SIZE)),
214
- errorMessageIncludes(`limit=${TRANSACTION_COMMIT_SERVICE_BUFFER_SIZE}`)
215
- );
216
- t.exception(
217
- () => service.registerPendingCommit(buildTxHashFromIndex(20_000)),
218
- PendingCommitBufferFullError
219
- );
220
-
221
- service.close();
222
- const results = await Promise.allSettled(promises);
223
- t.is(results.length, TRANSACTION_COMMIT_SERVICE_BUFFER_SIZE);
224
- });
225
-
226
- test('TransactionCommitService.close rejects all pending commits', async t => {
227
- const service = new TransactionCommitService(config);
228
- const txHashA = buildTxHashFromIndex(9);
229
- const txHashB = buildTxHashFromIndex(10);
230
-
231
- const promiseA = service.registerPendingCommit(txHashA);
232
- const promiseB = service.registerPendingCommit(txHashB);
233
-
234
- service.close();
235
- t.is(service.has(txHashA), false);
236
- t.is(service.has(txHashB), false);
237
-
238
- const results = await Promise.allSettled([promiseA, promiseB]);
239
- t.is(results[0].status, 'rejected');
240
- t.ok(results[0].reason instanceof PendingCommitCancelledError);
241
- t.ok(results[0].reason.message.includes(txHashA));
242
- t.is(results[1].status, 'rejected');
243
- t.ok(results[1].reason instanceof PendingCommitCancelledError);
244
- t.ok(results[1].reason.message.includes(txHashB));
245
- });
246
-