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,356 +0,0 @@
1
- import test from 'brittle';
2
- import b4a from 'b4a';
3
- import PeerWallet from 'trac-wallet';
4
-
5
- import V1BaseOperation from '../../../../src/core/network/protocols/v1/validators/V1BaseOperation.js';
6
- import NetworkWalletFactory from '../../../../src/core/network/identity/NetworkWalletFactory.js';
7
- import NetworkMessageBuilder from '../../../../src/messages/network/v1/NetworkMessageBuilder.js';
8
- import {
9
- V1InvalidPayloadError,
10
- V1SignatureInvalidError,
11
- V1UnexpectedError
12
- } from '../../../../src/core/network/protocols/v1/V1ProtocolError.js';
13
- import {
14
- NetworkOperationType,
15
- ResultCode
16
- } from '../../../../src/utils/constants.js';
17
- import { testKeyPair1, testKeyPair2 } from '../../../fixtures/apply.fixtures.js';
18
- import { config } from '../../../helpers/config.js';
19
- import { errorMessageIncludes } from '../../../helpers/regexHelper.js';
20
-
21
- const createWallet = (fixture = testKeyPair1) => {
22
- const keyPair = {
23
- publicKey: b4a.from(fixture.publicKey, 'hex'),
24
- secretKey: b4a.from(fixture.secretKey, 'hex'),
25
- };
26
-
27
- return NetworkWalletFactory.provide({
28
- enableWallet: false,
29
- keyPair,
30
- networkPrefix: config.addressPrefix,
31
- });
32
- };
33
-
34
- const buildSignedPayload = async (wallet, type, options = {}) => {
35
- const builder = new NetworkMessageBuilder(wallet, config)
36
- .setType(type)
37
- .setId(`id-${type}-${Date.now()}-${Math.random()}`)
38
- .setTimestamp()
39
- .setCapabilities(['cap:a']);
40
-
41
- switch (type) {
42
- case NetworkOperationType.LIVENESS_REQUEST:
43
- break;
44
- case NetworkOperationType.LIVENESS_RESPONSE:
45
- builder.setResultCode(options.resultCode ?? ResultCode.OK);
46
- break;
47
- case NetworkOperationType.BROADCAST_TRANSACTION_REQUEST:
48
- builder.setData(options.data ?? b4a.from('abcd', 'hex'));
49
- break;
50
- case NetworkOperationType.BROADCAST_TRANSACTION_RESPONSE:
51
- builder
52
- .setResultCode(options.resultCode ?? ResultCode.OK)
53
- .setProof(options.proof ?? b4a.from('deadbeef', 'hex'))
54
- .setTimestampLedger(options.timestamp ?? Date.now());
55
- break;
56
- default:
57
- throw new Error(`Unsupported type in test helper: ${type}`);
58
- }
59
-
60
- await builder.buildPayload();
61
- return builder.getResult();
62
- };
63
-
64
- test('V1BaseOperation.validate throws "must be implemented" by default', async t => {
65
- const operation = new V1BaseOperation(config);
66
-
67
- await t.exception(
68
- async () => operation.validate({}, {}, {}),
69
- errorMessageIncludes('must be implemented')
70
- );
71
- });
72
-
73
- test('V1BaseOperation.isPayloadSchemaValid handles missing/invalid type cases', async t => {
74
- const operation = new V1BaseOperation(config);
75
-
76
- t.exception(
77
- () => operation.isPayloadSchemaValid(null),
78
- errorMessageIncludes('Payload or payload type is missing')
79
- );
80
-
81
- t.exception(
82
- () => operation.isPayloadSchemaValid({ type: null }),
83
- errorMessageIncludes('Payload or payload type is missing')
84
- );
85
-
86
- t.exception(
87
- () => operation.isPayloadSchemaValid({ type: 1.5 }),
88
- errorMessageIncludes('Operation type must be an integer')
89
- );
90
-
91
- t.exception(
92
- () => operation.isPayloadSchemaValid({ type: 0 }),
93
- errorMessageIncludes('Operation type is unspecified')
94
- );
95
-
96
- t.exception(
97
- () => operation.isPayloadSchemaValid({ type: 9999 }),
98
- errorMessageIncludes('Unknown operation type')
99
- );
100
- });
101
-
102
- test('V1BaseOperation.isPayloadSchemaValid accepts all supported message schemas', async t => {
103
- const operation = new V1BaseOperation(config);
104
- const wallet = createWallet();
105
-
106
- const payloads = [
107
- await buildSignedPayload(wallet, NetworkOperationType.LIVENESS_REQUEST),
108
- await buildSignedPayload(wallet, NetworkOperationType.LIVENESS_RESPONSE),
109
- await buildSignedPayload(wallet, NetworkOperationType.BROADCAST_TRANSACTION_REQUEST),
110
- await buildSignedPayload(wallet, NetworkOperationType.BROADCAST_TRANSACTION_RESPONSE),
111
- ];
112
-
113
- for (const payload of payloads) {
114
- operation.isPayloadSchemaValid(payload);
115
- }
116
-
117
- t.pass();
118
- });
119
-
120
- test('V1BaseOperation.validateSignature verifies valid signatures for all supported message types', async t => {
121
- const operation = new V1BaseOperation(config);
122
- const wallet = createWallet();
123
-
124
- const payloads = [
125
- await buildSignedPayload(wallet, NetworkOperationType.LIVENESS_REQUEST),
126
- await buildSignedPayload(wallet, NetworkOperationType.LIVENESS_RESPONSE),
127
- await buildSignedPayload(wallet, NetworkOperationType.BROADCAST_TRANSACTION_REQUEST),
128
- await buildSignedPayload(wallet, NetworkOperationType.BROADCAST_TRANSACTION_RESPONSE),
129
- ];
130
-
131
- for (const payload of payloads) {
132
- await operation.validateSignature(payload, wallet.publicKey);
133
- }
134
-
135
- t.pass();
136
- });
137
-
138
- test('V1BaseOperation.validateSignature throws V1SignatureInvalidError on wrong public key', async t => {
139
- const operation = new V1BaseOperation(config);
140
- const wallet = createWallet(testKeyPair1);
141
- const otherWallet = createWallet(testKeyPair2);
142
-
143
- const payload = await buildSignedPayload(wallet, NetworkOperationType.LIVENESS_REQUEST);
144
-
145
- await t.exception(
146
- async () => operation.validateSignature(payload, otherWallet.publicKey),
147
- errorMessageIncludes('signature verification failed')
148
- );
149
- });
150
-
151
- test('V1BaseOperation.validateSignature rethrows protocol-shaped build errors', async t => {
152
- const operation = new V1BaseOperation(config);
153
-
154
- const payload = {
155
- type: 0,
156
- id: 'id',
157
- timestamp: Date.now(),
158
- capabilities: [],
159
- };
160
-
161
- try {
162
- await operation.validateSignature(payload, b4a.alloc(32, 1));
163
- t.fail('expected validateSignature to throw');
164
- } catch (error) {
165
- t.ok(error instanceof V1InvalidPayloadError);
166
- t.is(error.resultCode, ResultCode.INVALID_PAYLOAD);
167
- t.ok(error.message.includes('Operation type is unspecified'));
168
- }
169
- });
170
-
171
- test('V1BaseOperation.validateSignature wraps non-protocol build errors as V1InvalidPayloadError', async t => {
172
- const operation = new V1BaseOperation(config);
173
-
174
- const payload = {
175
- type: NetworkOperationType.LIVENESS_REQUEST,
176
- id: 'id',
177
- timestamp: Date.now(),
178
- capabilities: [],
179
- };
180
-
181
- try {
182
- await operation.validateSignature(payload, b4a.alloc(32, 1));
183
- t.fail('expected validateSignature to throw');
184
- } catch (error) {
185
- t.ok(error instanceof V1InvalidPayloadError);
186
- t.is(error.resultCode, ResultCode.INVALID_PAYLOAD);
187
- t.ok(error.message.includes('Failed to build signature message'));
188
- }
189
- });
190
-
191
- test('V1BaseOperation.validateSignature throws V1InvalidPayloadError when hashing fails', async t => {
192
- const operation = new V1BaseOperation(config);
193
- const wallet = createWallet();
194
- const payload = await buildSignedPayload(wallet, NetworkOperationType.LIVENESS_REQUEST);
195
-
196
- const originalBlake3 = PeerWallet.blake3;
197
- PeerWallet.blake3 = async () => {
198
- throw new Error('hash fail');
199
- };
200
-
201
- t.teardown(() => {
202
- PeerWallet.blake3 = originalBlake3;
203
- });
204
-
205
- try {
206
- await operation.validateSignature(payload, wallet.publicKey);
207
- t.fail('expected validateSignature to throw');
208
- } catch (error) {
209
- t.ok(error instanceof V1InvalidPayloadError);
210
- t.ok(error.message.includes('Failed to hash signature message'));
211
- }
212
- });
213
-
214
- test('V1BaseOperation.validateSignature handles verify() throw as invalid signature', async t => {
215
- const operation = new V1BaseOperation(config);
216
- const wallet = createWallet();
217
- const payload = await buildSignedPayload(wallet, NetworkOperationType.LIVENESS_REQUEST);
218
-
219
- const originalVerify = PeerWallet.verify;
220
- PeerWallet.verify = () => {
221
- throw new Error('verify fail');
222
- };
223
-
224
- t.teardown(() => {
225
- PeerWallet.verify = originalVerify;
226
- });
227
-
228
- try {
229
- await operation.validateSignature(payload, wallet.publicKey);
230
- t.fail('expected validateSignature to throw');
231
- } catch (error) {
232
- t.ok(error instanceof V1SignatureInvalidError);
233
- t.is(error.resultCode, ResultCode.SIGNATURE_INVALID);
234
- }
235
- });
236
-
237
- test('V1BaseOperation.validateSignature enforces BROADCAST_TRANSACTION_RESPONSE proof/timestamp invariants', async t => {
238
- const operation = new V1BaseOperation(config);
239
- const wallet = createWallet();
240
-
241
- const validBase = await buildSignedPayload(wallet, NetworkOperationType.BROADCAST_TRANSACTION_RESPONSE);
242
-
243
- const cases = [
244
- {
245
- mutate: payload => {
246
- payload.broadcast_transaction_response.result = ResultCode.OK;
247
- payload.broadcast_transaction_response.proof = b4a.alloc(0);
248
- },
249
- match: 'Result code OK requires non-empty proof'
250
- },
251
- {
252
- mutate: payload => {
253
- payload.broadcast_transaction_response.result = ResultCode.TX_ACCEPTED_PROOF_UNAVAILABLE;
254
- payload.broadcast_transaction_response.proof = b4a.from('aa', 'hex');
255
- },
256
- match: 'TX_ACCEPTED_PROOF_UNAVAILABLE requires empty proof'
257
- },
258
- {
259
- mutate: payload => {
260
- payload.broadcast_transaction_response.result = ResultCode.TX_ACCEPTED_PROOF_UNAVAILABLE;
261
- payload.broadcast_transaction_response.proof = b4a.alloc(0);
262
- payload.broadcast_transaction_response.timestamp = 0;
263
- },
264
- match: 'TX_ACCEPTED_PROOF_UNAVAILABLE requires timestamp > 0'
265
- },
266
- {
267
- mutate: payload => {
268
- payload.broadcast_transaction_response.result = ResultCode.TIMEOUT;
269
- payload.broadcast_transaction_response.proof = b4a.from('aa', 'hex');
270
- payload.broadcast_transaction_response.timestamp = 0;
271
- },
272
- match: 'Non-OK result code requires empty proof'
273
- },
274
- {
275
- mutate: payload => {
276
- payload.broadcast_transaction_response.result = ResultCode.TIMEOUT;
277
- payload.broadcast_transaction_response.proof = b4a.alloc(0);
278
- payload.broadcast_transaction_response.timestamp = Date.now();
279
- },
280
- match: 'Non-OK result code requires timestamp to be 0'
281
- },
282
- ];
283
-
284
- for (const scenario of cases) {
285
- const payload = structuredClone(validBase);
286
- scenario.mutate(payload);
287
-
288
- await t.exception(
289
- async () => operation.validateSignature(payload, wallet.publicKey),
290
- errorMessageIncludes(scenario.match)
291
- );
292
- }
293
- });
294
-
295
- test('V1BaseOperation.validateSignature throws V1UnexpectedError for unknown operation type', async t => {
296
- const operation = new V1BaseOperation(config);
297
-
298
- const payload = {
299
- type: 9999,
300
- id: 'id',
301
- timestamp: Date.now(),
302
- capabilities: [],
303
- };
304
-
305
- await t.exception(
306
- async () => operation.validateSignature(payload, b4a.alloc(32, 1)),
307
- errorMessageIncludes('Unknown operation type')
308
- );
309
- });
310
-
311
- test('V1BaseOperation.validatePeerCorrectness validates response sender identity', t => {
312
- const operation = new V1BaseOperation(config);
313
- const remotePublicKey = b4a.alloc(32, 9);
314
-
315
- operation.validatePeerCorrectness(remotePublicKey, {
316
- requestedTo: b4a.toString(remotePublicKey, 'hex')
317
- });
318
-
319
- t.exception(
320
- () => operation.validatePeerCorrectness(remotePublicKey, { requestedTo: 'ff' }),
321
- errorMessageIncludes('Response sender mismatch')
322
- );
323
- });
324
-
325
- test('V1BaseOperation.validateResponseType supports expected mappings and rejects mismatches', t => {
326
- const operation = new V1BaseOperation(config);
327
-
328
- operation.validateResponseType(
329
- { type: NetworkOperationType.LIVENESS_RESPONSE },
330
- { id: '1', requestType: NetworkOperationType.LIVENESS_REQUEST }
331
- );
332
-
333
- operation.validateResponseType(
334
- { type: NetworkOperationType.BROADCAST_TRANSACTION_RESPONSE },
335
- { id: '2', requestType: NetworkOperationType.BROADCAST_TRANSACTION_REQUEST }
336
- );
337
-
338
- t.exception(
339
- () => operation.validateResponseType(
340
- { type: NetworkOperationType.BROADCAST_TRANSACTION_RESPONSE },
341
- { id: '3', requestType: NetworkOperationType.LIVENESS_REQUEST }
342
- ),
343
- errorMessageIncludes('Response type mismatch')
344
- );
345
-
346
- try {
347
- operation.validateResponseType(
348
- { type: NetworkOperationType.LIVENESS_RESPONSE },
349
- { id: '4', requestType: 9999 }
350
- );
351
- t.fail('expected validateResponseType to throw');
352
- } catch (error) {
353
- t.ok(error instanceof V1UnexpectedError);
354
- t.ok(error.message.includes('Unsupported pending request type'));
355
- }
356
- });
@@ -1,129 +0,0 @@
1
- import { test } from 'brittle';
2
- import b4a from 'b4a';
3
- import { TRAC_NETWORK_MSB_MAINNET_PREFIX } from 'trac-wallet/constants.js';
4
- import { config } from '../../../helpers/config.js';
5
- import { testKeyPair1, testKeyPair2 } from '../../../fixtures/apply.fixtures.js';
6
- import NetworkWalletFactory from '../../../../src/core/network/identity/NetworkWalletFactory.js';
7
- import V1BroadcastTransactionOperationHandler from '../../../../src/core/network/protocols/v1/handlers/V1BroadcastTransactionOperationHandler.js';
8
- import PartialTransactionValidator from '../../../../src/core/network/protocols/shared/validators/PartialTransactionValidator.js';
9
- import { TransactionPoolFullError } from '../../../../src/core/network/services/TransactionPoolService.js';
10
- import { V1NodeOverloadedError } from '../../../../src/core/network/protocols/v1/V1ProtocolError.js';
11
- import { applyStateMessageFactory } from '../../../../src/messages/state/applyStateMessageFactory.js';
12
-
13
- const createWallet = (keyPair) => {
14
- const normalizedKeyPair = {
15
- publicKey: b4a.from(keyPair.publicKey, 'hex'),
16
- secretKey: b4a.from(keyPair.secretKey, 'hex')
17
- };
18
-
19
- return NetworkWalletFactory.provide({
20
- enableWallet: false,
21
- keyPair: normalizedKeyPair,
22
- networkPrefix: TRAC_NETWORK_MSB_MAINNET_PREFIX
23
- });
24
- };
25
-
26
- test('V1BroadcastTransactionOperationHandler dispatchTransaction does not emit unhandledRejection when enqueue fails after pending commit registration', async t => {
27
- const originalValidate = PartialTransactionValidator.prototype.validate;
28
- PartialTransactionValidator.prototype.validate = async () => true;
29
-
30
- try {
31
- const txPoolService = {
32
- addTransaction() {
33
- throw new TransactionPoolFullError(1);
34
- }
35
- };
36
-
37
- const pendingRejectors = new Map();
38
- const transactionCommitService = {
39
- registerPendingCommit(txHash) {
40
- return new Promise((resolve, reject) => {
41
- pendingRejectors.set(txHash, reject);
42
- });
43
- },
44
- rejectPendingCommit(txHash, error) {
45
- const reject = pendingRejectors.get(txHash);
46
- if (!reject) return false;
47
- pendingRejectors.delete(txHash);
48
- reject(error);
49
- return true;
50
- }
51
- };
52
-
53
- const validatorWallet = createWallet(testKeyPair1);
54
- const requesterWallet = createWallet(testKeyPair2);
55
- const externalBootstrap = b4a.alloc(32, 0x11);
56
-
57
- const decodedTransaction = await applyStateMessageFactory(requesterWallet, config)
58
- .buildPartialTransactionOperationMessage(
59
- requesterWallet.address,
60
- b4a.alloc(32, 0x22),
61
- b4a.alloc(32, 0x33),
62
- b4a.alloc(32, 0x44),
63
- externalBootstrap,
64
- config.bootstrap,
65
- 'buffer'
66
- );
67
-
68
- const handler = new V1BroadcastTransactionOperationHandler(
69
- {},
70
- validatorWallet,
71
- { v1HandleRateLimit() {} },
72
- txPoolService,
73
- { getPendingRequest() { return null; } },
74
- transactionCommitService,
75
- config
76
- );
77
-
78
- let unhandled = null;
79
- const onUnhandled = (error) => {
80
- unhandled = error;
81
- };
82
-
83
- const detachUnhandled = (() => {
84
- const proc = globalThis.process;
85
- if (proc?.once && proc?.removeListener) {
86
- proc.once('unhandledRejection', onUnhandled);
87
- return () => proc.removeListener('unhandledRejection', onUnhandled);
88
- }
89
- if (typeof globalThis.addEventListener === 'function') {
90
- const listener = (event) => onUnhandled(event?.reason ?? event);
91
- globalThis.addEventListener('unhandledrejection', listener);
92
- return () => globalThis.removeEventListener('unhandledrejection', listener);
93
- }
94
- if ('onunhandledrejection' in globalThis) {
95
- const previous = globalThis.onunhandledrejection;
96
- globalThis.onunhandledrejection = (event) => {
97
- onUnhandled(event?.reason ?? event);
98
- if (typeof previous === 'function') {
99
- previous(event);
100
- }
101
- };
102
- return () => {
103
- globalThis.onunhandledrejection = previous;
104
- };
105
- }
106
- return null;
107
- })();
108
- try {
109
- let thrown = null;
110
- try {
111
- await handler.dispatchTransaction(decodedTransaction);
112
- } catch (error) {
113
- thrown = error;
114
- }
115
-
116
- t.ok(thrown, 'dispatchTransaction should throw when enqueue fails');
117
- t.ok(thrown instanceof V1NodeOverloadedError, 'should map tx pool full to V1NodeOverloadedError');
118
- await new Promise(resolve => setImmediate(resolve));
119
- } finally {
120
- if (detachUnhandled) {
121
- detachUnhandled();
122
- }
123
- }
124
-
125
- t.absent(unhandled, 'should not emit unhandledRejection');
126
- } finally {
127
- PartialTransactionValidator.prototype.validate = originalValidate;
128
- }
129
- });
@@ -1,53 +0,0 @@
1
- import test from 'brittle';
2
- import b4a from 'b4a';
3
-
4
- import V1BroadcastTransactionRequest from '../../../../src/core/network/protocols/v1/validators/V1BroadcastTransactionRequest.js';
5
- import { V1InvalidPayloadError } from '../../../../src/core/network/protocols/v1/V1ProtocolError.js';
6
- import { MAX_PARTIAL_TX_PAYLOAD_BYTE_SIZE } from '../../../../src/utils/constants.js';
7
- import { config } from '../../../helpers/config.js';
8
-
9
- test('V1BroadcastTransactionRequest.validate runs schema, size and signature validation', async t => {
10
- const validator = new V1BroadcastTransactionRequest(config);
11
- const calls = [];
12
-
13
- validator.isPayloadSchemaValid = () => calls.push('schema');
14
- validator.isDataPropertySizeValid = () => calls.push('size');
15
- validator.validateSignature = async () => calls.push('signature');
16
-
17
- const result = await validator.validate({}, b4a.alloc(32, 1));
18
-
19
- t.is(result, true);
20
- t.is(calls.length, 3);
21
- t.is(calls[0], 'schema');
22
- t.is(calls[1], 'size');
23
- t.is(calls[2], 'signature');
24
- });
25
-
26
- test('V1BroadcastTransactionRequest.isDataPropertySizeValid accepts max allowed payload size', t => {
27
- const validator = new V1BroadcastTransactionRequest(config);
28
- const payload = {
29
- broadcast_transaction_request: {
30
- data: b4a.alloc(MAX_PARTIAL_TX_PAYLOAD_BYTE_SIZE, 1)
31
- }
32
- };
33
-
34
- validator.isDataPropertySizeValid(payload);
35
- t.pass();
36
- });
37
-
38
- test('V1BroadcastTransactionRequest.isDataPropertySizeValid throws for oversized payload', t => {
39
- const validator = new V1BroadcastTransactionRequest(config);
40
- const payload = {
41
- broadcast_transaction_request: {
42
- data: b4a.alloc(MAX_PARTIAL_TX_PAYLOAD_BYTE_SIZE + 1, 1)
43
- }
44
- };
45
-
46
- try {
47
- validator.isDataPropertySizeValid(payload);
48
- t.fail('expected size validation to throw');
49
- } catch (error) {
50
- t.ok(error instanceof V1InvalidPayloadError);
51
- t.ok(error.message.includes('exceeds the maximum allowed byte size'));
52
- }
53
- });