trac-msb 0.2.18 → 0.2.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 +130 -34
  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
package/src/config/env.js CHANGED
@@ -1,7 +1,7 @@
1
- import { TRAC_NETWORK_MSB_MAINNET_PREFIX, TRAC_NETWORK_MSB_TESTNET1_PREFIX } from 'trac-wallet/constants.js';
1
+ import { TRAC_NETWORK_MSB_MAINNET_PREFIX, TRAC_NETWORK_MSB_TESTNET1_PREFIX } from 'trac-wallet';
2
2
  import { TRAC_NETWORK_TESTNET_ID, TRAC_NETWORK_MAINNET_ID } from 'trac-crypto-api/constants.js';
3
- import { address } from 'trac-crypto-api';
4
3
  import { Config } from './config.js';
4
+ import { address } from 'trac-crypto-api';
5
5
 
6
6
  export const ENV = {
7
7
  MAINNET: 'mainnet',
@@ -18,16 +18,23 @@ const configData = {
18
18
  bech32mHrpLength: TRAC_NETWORK_MSB_TESTNET1_PREFIX.length + 1, // len(addressPrefix + separator)
19
19
  bootstrap: 'c184f4ad8e9cf5e911f9415b60e7dcfb30aed73ebd8a402ef68e1b154624f5ef',
20
20
  channel: '1111trac1network1msb1testnet1111',
21
- dhtBootstrap: ['116.202.214.149:10001', '157.180.12.214:10001', 'node1.hyperdht.org:49737', 'node2.hyperdht.org:49737', 'node3.hyperdht.org:49737'], // these are used to peer discovery
21
+ dhtBootstrap: ['116.202.214.149:10001','157.180.12.214:10001','node1.hyperdht.org:49737','node2.hyperdht.org:49737','node3.hyperdht.org:49737'], // these are used to peer discovery
22
22
  derivationPath: address.TESNET_DERIVATION_PATH,
23
+ enableValidatorObserver: true,
24
+ pollInterval: 500, // Validator observer poll interval
25
+ adminCacheTTL: 10_000, // Admin cache TTL ms
26
+ validatorConnectionAttemptDelay: 5, // Delay between validator connection attempts (ms)
27
+ bootstrapTimeout: 60_000, // time used (ms) to connect to new validators at bootstrap
28
+ writersShortCacheTTL: 10_000, // short TTL during bootstrap
29
+ writersLongCacheTTL: 120_000, // long TTL after bootstrap
30
+ maxValidators: 50,
31
+ maxWritersForAdminIndexerConnection: 10, // Connectivity constants
23
32
  disableRateLimit: false,
24
33
  enableErrorApplyLogs: true,
25
34
  enableInteractiveMode: true,
26
35
  enableRoleRequester: false,
27
36
  enableTxApplyLogs: true,
28
- enableValidatorObserver: true,
29
37
  enableWallet: true,
30
- maxValidators: 50,
31
38
  maxRetries: 3,
32
39
  messageThreshold: 3,
33
40
  messageValidatorRetryDelay: 1000, //How long to wait before retrying (ms) MESSAGE_VALIDATOR_RETRY_DELAY_MS
@@ -39,7 +46,6 @@ const configData = {
39
46
  maxParallel: 64, // Connectivity constants
40
47
  maxServerConnections: Infinity, // Connectivity constants
41
48
  maxClientConnections: Infinity, // Connectivity constants
42
- maxWritersForAdminIndexerConnection: 10, // Connectivity constants
43
49
  processIntervalMs: 50, // Pool constants
44
50
  transactionPoolSize: 1000, // Operation handler constants
45
51
  rateLimitCleanupIntervalMs: 120_000, // Rate limiting constants
@@ -61,16 +67,23 @@ const configData = {
61
67
  bech32mHrpLength: TRAC_NETWORK_MSB_MAINNET_PREFIX.length + 1, // len(addressPrefix + separator)
62
68
  bootstrap: 'acbc3a4344d3a804101d40e53db1dda82b767646425af73599d4cd6577d69685',
63
69
  channel: '0000trac0network0msb0mainnet0000',
64
- dhtBootstrap: ['116.202.214.149:10001', '157.180.12.214:10001', 'node1.hyperdht.org:49737', 'node2.hyperdht.org:49737', 'node3.hyperdht.org:49737'],
70
+ dhtBootstrap: ['116.202.214.149:10001','157.180.12.214:10001','node1.hyperdht.org:49737','node2.hyperdht.org:49737','node3.hyperdht.org:49737'],
65
71
  derivationPath: address.MAINNET_DERIVATION_PATH,
72
+ enableValidatorObserver: true,
73
+ pollInterval: 500, // Validator observer poll interval
74
+ adminCacheTTL: 3_600_000, // Admin cache TTL ms
75
+ validatorConnectionAttemptDelay: 5, // Delay between validator connection attempts (ms)
76
+ bootstrapTimeout: 120_000, // time used (ms) to connect to new validators at bootstrap
77
+ writersShortCacheTTL: 2_000, // short TTL during bootstrap
78
+ writersLongCacheTTL: 120_000, // long TTL after bootstrap
79
+ maxValidators: 50,
80
+ maxWritersForAdminIndexerConnection: 10, // Connectivity constants
66
81
  disableRateLimit: false,
67
82
  enableErrorApplyLogs: false,
68
83
  enableInteractiveMode: true,
69
84
  enableRoleRequester: false,
70
85
  enableTxApplyLogs: false,
71
- enableValidatorObserver: true,
72
86
  enableWallet: true,
73
- maxValidators: 50,
74
87
  maxRetries: 3,
75
88
  messageThreshold: 3,
76
89
  messageValidatorRetryDelay: 1000, //How long to wait before retrying (ms) MESSAGE_VALIDATOR_RETRY_DELAY_MS
@@ -82,7 +95,6 @@ const configData = {
82
95
  maxParallel: 64, // Connectivity constants
83
96
  maxServerConnections: Infinity, // Connectivity constants
84
97
  maxClientConnections: Infinity, // Connectivity constants
85
- maxWritersForAdminIndexerConnection: 10, // Connectivity constants
86
98
  processIntervalMs: 50, // Pool constants
87
99
  transactionPoolSize: 1000, // Operation handler constants
88
100
  rateLimitCleanupIntervalMs: 120_000, // Rate limiting constants
@@ -97,23 +109,30 @@ const configData = {
97
109
  storeName: 'mainnet',
98
110
  },
99
111
  [ENV.DEVELOPMENT]: {
100
- debug: true,
112
+ debug: false,
101
113
  addressLength: 63,
102
114
  addressPrefix: TRAC_NETWORK_MSB_MAINNET_PREFIX,
103
115
  addressPrefixLength: TRAC_NETWORK_MSB_MAINNET_PREFIX.length,
104
116
  bech32mHrpLength: TRAC_NETWORK_MSB_MAINNET_PREFIX.length + 1, // len(addressPrefix + separator)
105
- bootstrap: 'e90cca53847a12a82f3bf0f67401e45e2ccc1698ee163e61414c2894eb3c6b12',
117
+ bootstrap: '12f7f1668eac2e691e17cbc6a53e509c5cee78cdcac562313091c64e5fd077d6',
106
118
  channel: '12312313123123',
107
- dhtBootstrap: ['116.202.214.149:10001', '157.180.12.214:10001', 'node1.hyperdht.org:49737', 'node2.hyperdht.org:49737', 'node3.hyperdht.org:49737'],
119
+ dhtBootstrap: ['116.202.214.149:10001','157.180.12.214:10001','node1.hyperdht.org:49737','node2.hyperdht.org:49737','node3.hyperdht.org:49737'],
108
120
  derivationPath: address.MAINNET_DERIVATION_PATH,
121
+ enableValidatorObserver: true,
122
+ pollInterval: 500, // Validator observer poll interval
123
+ adminCacheTTL: 60_000, // Admin cache TTL ms
124
+ validatorConnectionAttemptDelay: 5, // Delay between validator connection attempts (ms)
125
+ bootstrapTimeout: 30_000, // time used (ms) to connect to new validators at bootstrap
126
+ writersShortCacheTTL: 1_000, // short TTL during bootstrap
127
+ writersLongCacheTTL: 2_000, // long TTL after bootstrap
128
+ maxValidators: 10,
129
+ maxWritersForAdminIndexerConnection: 10, // Connectivity constants
109
130
  disableRateLimit: false,
110
131
  enableErrorApplyLogs: true,
111
132
  enableInteractiveMode: true,
112
133
  enableRoleRequester: false,
113
134
  enableTxApplyLogs: true,
114
- enableValidatorObserver: true,
115
135
  enableWallet: true,
116
- maxValidators: 6,
117
136
  maxRetries: 3,
118
137
  messageThreshold: 1000,
119
138
  messageValidatorRetryDelay: 1000, //How long to wait before retrying (ms) MESSAGE_VALIDATOR_RETRY_DELAY_MS
@@ -125,7 +144,6 @@ const configData = {
125
144
  maxParallel: 64, // Connectivity constants
126
145
  maxServerConnections: Infinity, // Connectivity constants
127
146
  maxClientConnections: Infinity, // Connectivity constants
128
- maxWritersForAdminIndexerConnection: 10, // Connectivity constants
129
147
  processIntervalMs: 50, // Pool constants
130
148
  transactionPoolSize: 1000, // Operation handler constants
131
149
  rateLimitCleanupIntervalMs: 120_000, // Rate limiting constants
@@ -135,7 +153,7 @@ const configData = {
135
153
  pendingRequestTimeout: 3000, // constant after which time the transaction will be considered invalid
136
154
  txCommitTimeout: 2200,
137
155
  txPoolSize: 1000, // size of transaction pool
138
- validatorHealthCheckInterval: 5 * 60 * 1000, // How often to check validator health (ms)
156
+ validatorHealthCheckInterval: 1_000, // How often to check validator health (ms)
139
157
  storesDirectory: 'stores/',
140
158
  storeName: 'development',
141
159
  }
@@ -143,4 +161,4 @@ const configData = {
143
161
 
144
162
  export const createConfig = (environment, options) => {
145
163
  return new Config(options, configData[environment])
146
- }
164
+ }
@@ -8,16 +8,17 @@ import NetworkMessages from './protocols/NetworkMessages.js';
8
8
  import { sleep } from '../../utils/helpers.js';
9
9
  import {
10
10
  TRAC_NAMESPACE,
11
- EventType
11
+ EventType,
12
+ CONNECTION_STATUS
12
13
  } from '../../utils/constants.js';
13
14
  import ConnectionManager from './services/ConnectionManager.js';
14
15
  import MessageOrchestrator from './services/MessageOrchestrator.js';
15
- import NetworkWalletFactory from './identity/NetworkWalletFactory.js';
16
16
  import TransactionRateLimiterService from './services/TransactionRateLimiterService.js';
17
17
  import PendingRequestService from './services/PendingRequestService.js';
18
18
  import TransactionCommitService from "./services/TransactionCommitService.js";
19
19
  import ValidatorHealthCheckService from './services/ValidatorHealthCheckService.js';
20
20
  import { Logger } from '../../utils/logger.js';
21
+ import { WalletProvider } from 'trac-wallet';
21
22
 
22
23
  const wakeup = new w();
23
24
 
@@ -29,7 +30,6 @@ class Network extends ReadyResource {
29
30
  #validatorConnectionManager;
30
31
  #validatorMessageOrchestrator;
31
32
  #config;
32
- #identityProvider = null;
33
33
  #pendingConnections;
34
34
  #connectTimeoutMs;
35
35
  #maxPendingConnections;
@@ -39,6 +39,7 @@ class Network extends ReadyResource {
39
39
  #wallet;
40
40
  #validatorHealthCheckService;
41
41
  #logger;
42
+ #closing = false;
42
43
 
43
44
  /**
44
45
  * @param {State} state
@@ -82,6 +83,7 @@ class Network extends ReadyResource {
82
83
 
83
84
  async _open() {
84
85
  this.#logger.info('Network initialization...');
86
+ this.#closing = false;
85
87
 
86
88
  this.setupNetworkListeners();
87
89
 
@@ -91,6 +93,7 @@ class Network extends ReadyResource {
91
93
 
92
94
  async _close() {
93
95
  this.#logger.info('Network: closing gracefully...');
96
+ this.#closing = true;
94
97
  await this.transactionPoolService.stopPool();
95
98
  await sleep(100);
96
99
  await this.#validatorObserverService.stopValidatorObserver();
@@ -104,8 +107,15 @@ class Network extends ReadyResource {
104
107
  this.#pendingRequestsService.close();
105
108
  this.#transactionCommitService.close();
106
109
 
107
- if (this.#swarm !== null) {
108
- this.#swarm.destroy();
110
+ const swarm = this.#swarm;
111
+ if (swarm !== null) {
112
+ if (typeof swarm.removeAllListeners === 'function') {
113
+ swarm.removeAllListeners('connection');
114
+ }
115
+ await swarm.destroy();
116
+ if (this.#swarm === swarm) {
117
+ this.#swarm = null;
118
+ }
109
119
  }
110
120
  }
111
121
 
@@ -126,7 +136,7 @@ class Network extends ReadyResource {
126
136
 
127
137
  if (type === 'validator') {
128
138
  try {
129
- await connection.protocolSession.probe();
139
+ if (!connection.protocolSession.isProbed()) await connection.protocolSession.probe();
130
140
  } catch (err) {
131
141
  this.#logger.debug(`failed to probe peer with publicKey ${publicKey}: ${err?.message ?? err}`);
132
142
  }
@@ -167,9 +177,13 @@ class Network extends ReadyResource {
167
177
  store,
168
178
  wallet,
169
179
  ) {
180
+ this.#assertCanReplicate();
181
+
170
182
  if (!this.#swarm) {
171
- const keyPair = await this.initializeNetworkingKeyPair(store, wallet);
172
- this.#wallet = this.#getNetworkWalletWrapper(wallet, keyPair);
183
+ const { wallet: wrappedWallet, keyPair } = await this.#getOrGenerateWallet(store, wallet);
184
+ this.#assertCanReplicate();
185
+
186
+ this.#wallet = wrappedWallet
173
187
  this.#validatorMessageOrchestrator.setWallet(this.#wallet);
174
188
 
175
189
  this.#swarm = new Hyperswarm({
@@ -193,19 +207,49 @@ class Network extends ReadyResource {
193
207
  );
194
208
  this.#validatorHealthCheckService = new ValidatorHealthCheckService(this.#config);
195
209
  await this.#validatorHealthCheckService.ready();
210
+ this.#assertCanReplicate();
211
+
196
212
  this.#validatorConnectionManager.subscribeToHealthChecks(this.#validatorHealthCheckService);
197
213
 
198
214
  this.#logger.info(`Channel: ${b4a.toString(this.#config.channel)}`);
199
215
 
200
216
  this.#swarm.on('connection', async (connection) => {
201
- // Per-peer connection initialization:
202
- // - attach Protomux (legacy + v1 channels/messages)
203
- // - attach connection.protocolSession (used later by tryConnect / orchestrators to send messages)
204
- await this.#networkMessages.setupProtomuxMessages(connection);
217
+ if (this.#closing) {
218
+ this.#destroyConnection(connection);
219
+ return;
220
+ }
221
+
222
+ try {
223
+ // Per-peer connection initialization:
224
+ // - attach Protomux (legacy + v1 channels/messages)
225
+ // - attach connection.protocolSession (used later by tryConnect / orchestrators to send messages)
226
+ await this.#networkMessages.setupProtomuxMessages(connection);
227
+
228
+ // Pear v3 can deliver a late swarm connection while shutdown is
229
+ // already closing the Corestore. Do not replicate a connection
230
+ // after close has begun; store.replicate would otherwise throw.
231
+ if (this.#closing || this.#swarm === null) {
232
+ this.#destroyConnection(connection);
233
+ return;
234
+ }
205
235
 
206
- // ATTENTION: Must be called AFTER the protomux init above
207
- const stream = store.replicate(connection);
208
- wakeup.addStream(stream);
236
+ // ATTENTION: Must be called AFTER the protomux init above
237
+ const stream = store.replicate(connection);
238
+ wakeup.addStream(stream);
239
+ } catch (error) {
240
+ const publicKey = connection.remotePublicKey
241
+ ? b4a.toString(connection.remotePublicKey, 'hex')
242
+ : 'unknown';
243
+ this.#pendingRequestsService.rejectPendingRequestsForPeer(
244
+ publicKey,
245
+ error ?? new Error('Connection setup failed')
246
+ );
247
+ this.#destroyConnection(connection);
248
+ if (!this.#closing) {
249
+ this.#logger.error(error?.message ?? 'Unknown network connection setup error');
250
+ }
251
+ return;
252
+ }
209
253
 
210
254
  const publicKey = b4a.toString(connection.remotePublicKey, 'hex');
211
255
  if (this.#pendingConnections.has(publicKey)) {
@@ -218,9 +262,13 @@ class Network extends ReadyResource {
218
262
  publicKey,
219
263
  new Error('Connection closed before response')
220
264
  );
221
- this.#swarm.leavePeer(connection.remotePublicKey);
265
+ this.#swarm?.leavePeer(connection.remotePublicKey);
222
266
  this.#validatorConnectionManager.remove(publicKey);
223
- connection.protocolSession.close();
267
+ if (connection.protocolSession) {
268
+ try {
269
+ connection.protocolSession.close();
270
+ } catch {}
271
+ }
224
272
  });
225
273
 
226
274
  connection.on('error', (error) => {
@@ -255,14 +303,36 @@ class Network extends ReadyResource {
255
303
  return this.#pendingConnections.size;
256
304
  }
257
305
 
258
- async initializeNetworkingKeyPair(store, wallet) {
306
+ disconnectValidatorPeer(publicKey, reason = 'validator peer invalidated') {
307
+ const publicKeyHex = this.#normalizePublicKey(publicKey);
308
+ if (!publicKeyHex) return false;
309
+
310
+ const hadPendingValidatorConnection = this.#clearPendingValidatorConnection(publicKeyHex);
311
+ const isTrackedValidator = this.#validatorConnectionManager.exists(publicKeyHex);
312
+
313
+ const shouldLeavePeer = hadPendingValidatorConnection || isTrackedValidator;
314
+
315
+ if (shouldLeavePeer && this.#swarm?.peers?.has(publicKeyHex)) {
316
+ this.#logger.debug(`Network.disconnectValidatorPeer: leaving peer ${publicKeyHex}. Reason: ${reason}`);
317
+ this.#swarm.leavePeer(b4a.from(publicKeyHex, 'hex'));
318
+ }
319
+
320
+ if (isTrackedValidator) {
321
+ this.#logger.debug(`Network.disconnectValidatorPeer: detaching tracked validator ${publicKeyHex}. Reason: ${reason}`);
322
+ this.#validatorConnectionManager.remove(publicKeyHex, { endConnection: false });
323
+ }
324
+
325
+ return hadPendingValidatorConnection || isTrackedValidator;
326
+ }
327
+
328
+ async #getOrGenerateWallet(store, wallet) {
259
329
  if (!this.#config.enableWallet) {
260
- return await store.createKeyPair(TRAC_NAMESPACE);
330
+ const keyPair = await store.createKeyPair(TRAC_NAMESPACE);
331
+ const wallet = await new WalletProvider(this.#config).fromSecretKey(keyPair.secretKey)
332
+ return { keyPair, wallet }
261
333
  } else {
262
- return {
263
- publicKey: wallet.publicKey,
264
- secretKey: wallet.secretKey
265
- };
334
+ const keyPair = { publicKey: wallet.publicKey, secretKey: wallet.secretKey }
335
+ return { keyPair, wallet }
266
336
  }
267
337
  }
268
338
 
@@ -270,7 +340,7 @@ class Network extends ReadyResource {
270
340
  if (this.#swarm === null) throw new Error('Network swarm is not initialized');
271
341
  if (this.#pendingConnections.has(publicKey) || this.#pendingConnections.size >= this.#maxPendingConnections) {
272
342
  this.#logger.debug(`Network.tryConnect: Connection to peer: ${publicKey} as type: ${type} is already pending or max pending connections reached.`);
273
- return;
343
+ return CONNECTION_STATUS.IGNORED;
274
344
  }
275
345
 
276
346
  const timeoutId = setTimeout(() => {
@@ -290,12 +360,14 @@ class Network extends ReadyResource {
290
360
 
291
361
  if (connection &&
292
362
  connection.protocolSession &&
293
- !connection.protocolSession.isProbed() &&
294
363
  !this.#pendingRequestsService.isProbePending(connection.remotePublicKey.toString('hex'))
295
364
  ) {
296
365
  await this.#finalizeConnection(publicKey, type, connection);
366
+ return CONNECTION_STATUS.CONNECTED;
297
367
  }
298
368
  }
369
+
370
+ return CONNECTION_STATUS.PENDING;
299
371
  }
300
372
 
301
373
  async #finalizeConnection(publicKey, type, connection) {
@@ -304,18 +376,42 @@ class Network extends ReadyResource {
304
376
  this.#logger.debug(`Network.finalizeConnection: Connected to peer: ${publicKey} as type: ${type}`);
305
377
  }
306
378
 
307
- #getNetworkWalletWrapper(wallet, keyPair) {
308
- if (!this.#identityProvider) {
309
- this.#identityProvider = NetworkWalletFactory.provide({
310
- enableWallet: this.#config.enableWallet,
311
- wallet,
312
- keyPair,
313
- networkPrefix: this.#config.addressPrefix
314
- });
379
+ #normalizePublicKey(publicKey) {
380
+ if (typeof publicKey === 'string') return publicKey;
381
+ if (b4a.isBuffer(publicKey)) return b4a.toString(publicKey, 'hex');
382
+ return null;
383
+ }
384
+
385
+ #clearPendingValidatorConnection(publicKeyHex) {
386
+ if (!this.#pendingConnections.has(publicKeyHex)) return false;
387
+
388
+ const { timeoutId, type } = this.#pendingConnections.get(publicKeyHex);
389
+ if (type !== 'validator') return false;
390
+
391
+ clearTimeout(timeoutId);
392
+ this.#pendingConnections.delete(publicKeyHex);
393
+ return true;
394
+ }
395
+
396
+ #assertCanReplicate() {
397
+ if (this.#closing || this.closed) {
398
+ throw new Error('Network is closing or already closed');
315
399
  }
316
- return this.#identityProvider;
317
400
  }
318
401
 
402
+ #destroyConnection(connection) {
403
+ if (!connection) return;
404
+ if (connection.protocolSession) {
405
+ try {
406
+ connection.protocolSession.close();
407
+ } catch {}
408
+ }
409
+ if (typeof connection.destroy === 'function') {
410
+ connection.destroy();
411
+ } else if (typeof connection.end === 'function') {
412
+ connection.end();
413
+ }
414
+ }
319
415
  }
320
416
 
321
417
  export default Network;
@@ -6,30 +6,30 @@
6
6
  class ProtocolInterface {
7
7
 
8
8
  // TODO: Refactor this so we don't need to pass a reference for the whole network instance
9
- constructor(router, connection, pendingRequestService, config) {
9
+ constructor(_router, _connection, _pendingRequestService, _config) {
10
10
  if (new.target === ProtocolInterface) {
11
11
  throw new Error('ProtocolInterface cannot be instantiated directly');
12
12
  }
13
13
  }
14
14
 
15
- init(connection) {
15
+ init(_connection) {
16
16
  // Abstract method. Need to be implemented by subclasses.
17
17
  throw new Error('init() method must be implemented by subclass');
18
18
  }
19
19
 
20
20
  // TODO: This method is only kept here because of v1, but it should be probably removed from the interface
21
21
  // Remove it after we finish refactoring v1 protocol
22
- decode(message) {
22
+ decode(_message) {
23
23
  // Abstract method. Need to be implemented by subclasses.
24
24
  throw new Error('decode() method must be implemented by subclass');
25
25
  }
26
26
 
27
- async send(message) {
27
+ async send(_message) {
28
28
  // Abstract method. Need to be implemented by subclasses.
29
29
  throw new Error('send() method must be implemented by subclass');
30
30
  }
31
31
 
32
- sendAndForget(message) {
32
+ sendAndForget(_message) {
33
33
  // Abstract method. Need to be implemented by subclasses.
34
34
  throw new Error('sendAndForget() method must be implemented by subclass');
35
35
  }
@@ -2,6 +2,11 @@ import { ResultCode } from '../../../utils/constants.js';
2
2
 
3
3
  // TODO: Consider how to behave with ResultCode.UNSPECIFIED
4
4
 
5
+ /**
6
+ * Sender actions are consumed by the message orchestrator after a validator responds.
7
+ * They define whether the validator should be treated as successful, rotated out, or kept
8
+ * in the pool without rotation for the current result code.
9
+ */
5
10
  export const SENDER_ACTION = Object.freeze({
6
11
  UNDEFINED: 'UNDEFINED',
7
12
  SUCCESS: 'SUCCESS',
@@ -9,10 +14,14 @@ export const SENDER_ACTION = Object.freeze({
9
14
  NO_ROTATE: 'NO_ROTATE',
10
15
  });
11
16
 
17
+ // Result codes that mean the validator completed the request successfully.
12
18
  const SUCCESS_CODES = new Set([
13
19
  ResultCode.OK,
14
20
  ]);
15
21
 
22
+ // Result codes that should rotate the validator out of the sender pool after the response.
23
+ // In practice these are transport, protocol, validation, or validator-side failures that make
24
+ // the current peer unsuitable to keep as the next sender candidate.
16
25
  const ROTATE_CODES = new Set([
17
26
  ResultCode.UNSPECIFIED,
18
27
  ResultCode.INVALID_PAYLOAD,
@@ -86,3 +95,80 @@ export function resultToValidatorAction(resultCode) {
86
95
  if (NO_ROTATE_CODES.has(resultCode)) return SENDER_ACTION.NO_ROTATE;
87
96
  return SENDER_ACTION.UNDEFINED;
88
97
  }
98
+
99
+ /**
100
+ * Keep connection result codes:
101
+ * - ResultCode.OK
102
+ * - ResultCode.TIMEOUT
103
+ * - ResultCode.TX_ACCEPTED_PROOF_UNAVAILABLE
104
+ * - ResultCode.TX_ALREADY_PENDING
105
+ * - ResultCode.TX_HASH_INVALID_FORMAT
106
+ * - ResultCode.INTERNAL_ENQUEUE_VALIDATION_FAILED
107
+ * - ResultCode.TX_COMMITTED_RECEIPT_MISSING
108
+ * - ResultCode.VALIDATOR_RESPONSE_TX_TYPE_INVALID
109
+ * - ResultCode.VALIDATOR_RESPONSE_TX_TYPE_UNKNOWN
110
+ * - ResultCode.VALIDATOR_RESPONSE_TX_TYPE_UNSUPPORTED
111
+ * - ResultCode.VALIDATOR_RESPONSE_SCHEMA_INVALID
112
+ * - ResultCode.PENDING_REQUEST_MISSING_TX_DATA
113
+ * - ResultCode.PROOF_PAYLOAD_MISMATCH
114
+ * - ResultCode.VALIDATOR_WRITER_KEY_NOT_REGISTERED
115
+ * - ResultCode.VALIDATOR_ADDRESS_MISMATCH
116
+ * - ResultCode.VALIDATOR_NODE_ENTRY_NOT_FOUND
117
+ * - ResultCode.VALIDATOR_NODE_NOT_WRITER
118
+ * - ResultCode.VALIDATOR_WRITER_KEY_MISMATCH
119
+ * - ResultCode.VALIDATOR_TX_OBJECT_INVALID
120
+ * - ResultCode.VALIDATOR_VA_MISSING
121
+ */
122
+ const VALIDATOR_SIDE_END_CONNECTION_CODES = new Set([
123
+ // BASE_TRANSPORT_AND_VALIDATOR_STATUS
124
+ ResultCode.UNSPECIFIED,
125
+ ResultCode.INVALID_PAYLOAD,
126
+ ResultCode.RATE_LIMITED,
127
+ ResultCode.SIGNATURE_INVALID,
128
+ ResultCode.UNEXPECTED_ERROR,
129
+ ResultCode.NODE_HAS_NO_WRITE_ACCESS,
130
+ ResultCode.NODE_OVERLOADED,
131
+
132
+ // SHARED_VALIDATORS_REQUEST_PAYLOAD
133
+ ResultCode.OPERATION_TYPE_UNKNOWN,
134
+ ResultCode.SCHEMA_VALIDATION_FAILED,
135
+ ResultCode.REQUESTER_ADDRESS_INVALID,
136
+ ResultCode.REQUESTER_PUBLIC_KEY_INVALID,
137
+ ResultCode.TX_HASH_MISMATCH,
138
+ ResultCode.TX_SIGNATURE_INVALID,
139
+ ResultCode.TX_EXPIRED,
140
+ ResultCode.TX_ALREADY_EXISTS,
141
+ ResultCode.OPERATION_ALREADY_COMPLETED,
142
+ ResultCode.REQUESTER_NOT_FOUND,
143
+ ResultCode.INSUFFICIENT_FEE_BALANCE,
144
+ ResultCode.EXTERNAL_BOOTSTRAP_EQUALS_MSB_BOOTSTRAP,
145
+ ResultCode.SELF_VALIDATION_FORBIDDEN,
146
+ ResultCode.ROLE_NODE_ENTRY_NOT_FOUND,
147
+ ResultCode.ROLE_NODE_ALREADY_WRITER,
148
+ ResultCode.ROLE_NODE_NOT_WHITELISTED,
149
+ ResultCode.ROLE_NODE_NOT_WRITER,
150
+ ResultCode.ROLE_NODE_IS_INDEXER,
151
+ ResultCode.ROLE_ADMIN_ENTRY_MISSING,
152
+ ResultCode.ROLE_INVALID_RECOVERY_CASE,
153
+ ResultCode.ROLE_UNKNOWN_OPERATION,
154
+ ResultCode.ROLE_INVALID_WRITER_KEY,
155
+ ResultCode.ROLE_INSUFFICIENT_FEE_BALANCE,
156
+ ResultCode.MSB_BOOTSTRAP_MISMATCH,
157
+ ResultCode.EXTERNAL_BOOTSTRAP_NOT_DEPLOYED,
158
+ ResultCode.EXTERNAL_BOOTSTRAP_TX_MISSING,
159
+ ResultCode.EXTERNAL_BOOTSTRAP_MISMATCH,
160
+ ResultCode.BOOTSTRAP_ALREADY_EXISTS,
161
+ ResultCode.TRANSFER_RECIPIENT_ADDRESS_INVALID,
162
+ ResultCode.TRANSFER_RECIPIENT_PUBLIC_KEY_INVALID,
163
+ ResultCode.TRANSFER_AMOUNT_TOO_LARGE,
164
+ ResultCode.TRANSFER_SENDER_NOT_FOUND,
165
+ ResultCode.TRANSFER_INSUFFICIENT_BALANCE,
166
+ ResultCode.TRANSFER_RECIPIENT_BALANCE_OVERFLOW,
167
+
168
+ // VALIDATOR_RESPONSE_PROOF_AND_IDENTITY_VALIDATION
169
+ ResultCode.TX_INVALID_PAYLOAD,
170
+ ]);
171
+
172
+ export function shouldEndConnection(resultCode) {
173
+ return VALIDATOR_SIDE_END_CONNECTION_CODES.has(resultCode);
174
+ }
@@ -14,7 +14,7 @@ class NetworkMessageRouter {
14
14
 
15
15
  /**
16
16
  * @param {State} state
17
- * @param {PeerWallet} wallet
17
+ * @param {IWallet} wallet
18
18
  * @param {TransactionRateLimiterService} rateLimiterService
19
19
  * @param {TransactionPoolService} txPoolService
20
20
  * @param {Config} config
@@ -10,7 +10,7 @@ class BaseStateOperationHandler {
10
10
 
11
11
  /**
12
12
  * @param {State} state
13
- * @param {PeerWallet} wallet
13
+ * @param {IWallet} wallet
14
14
  * @param {TransactionRateLimiterService} rateLimiter
15
15
  * @param {TransactionPoolService} txPoolService
16
16
  * @param {Config} config
@@ -69,7 +69,7 @@ class BaseStateOperationHandler {
69
69
  }
70
70
  }
71
71
 
72
- async handleOperation(payload, connection) {
72
+ async handleOperation(_payload, _connection) {
73
73
  throw new Error('handleOperation must be implemented by child class');
74
74
  }
75
75
 
@@ -1,5 +1,5 @@
1
1
  import { NETWORK_MESSAGE_TYPES } from '../../../../../utils/constants.js';
2
- import PeerWallet from 'trac-wallet';
2
+ import tracCryptoApi from 'trac-crypto-api';
3
3
  import b4a from 'b4a';
4
4
 
5
5
  class LegacyGetRequestHandler {
@@ -26,7 +26,7 @@ class LegacyGetRequestHandler {
26
26
  }
27
27
 
28
28
  async handleGetValidatorResponse(connection, channelString) {
29
- const nonce = PeerWallet.generateNonce().toString('hex');
29
+ const nonce = b4a.toString(tracCryptoApi.nonce.generate(), 'hex');
30
30
  const payload = {
31
31
  op: 'validatorResponse',
32
32
  wk: this.state.writingKey.toString('hex'),
@@ -39,7 +39,7 @@ class LegacyGetRequestHandler {
39
39
 
40
40
 
41
41
  const hashInput = b4a.from(JSON.stringify(payload), 'utf8');
42
- const hash = await PeerWallet.blake3(hashInput);
42
+ const hash = await tracCryptoApi.hash.blake3(hashInput);
43
43
  const sig = this.#wallet.sign(hash);
44
44
 
45
45
  const responseMessage = {
@@ -14,7 +14,7 @@ class LegacyRoleOperationHandler extends BaseStateOperationHandler {
14
14
 
15
15
  /**
16
16
  * @param {State} state
17
- * @param {PeerWallet} wallet
17
+ * @param {IWallet} wallet
18
18
  * @param {TransactionRateLimiterService} rateLimiter
19
19
  * @param {TransactionPoolService} txPoolService
20
20
  * @param {Config} config
@@ -22,7 +22,7 @@ class LegacySubnetworkOperationHandler extends BaseStateOperationHandler {
22
22
 
23
23
  /**
24
24
  * @param {State} state
25
- * @param {PeerWallet} wallet
25
+ * @param {IWallet} wallet
26
26
  * @param {TransactionRateLimiterService} rateLimiter
27
27
  * @param {TransactionPoolService} txPoolService
28
28
  * @param {Config} config
@@ -14,7 +14,7 @@ class LegacyTransferOperationHandler extends BaseStateOperationHandler {
14
14
 
15
15
  /**
16
16
  * @param {State} state
17
- * @param {PeerWallet} wallet
17
+ * @param {IWallet} wallet
18
18
  * @param {TransactionRateLimiterService} rateLimiter
19
19
  * @param {TransactionPoolService} txPoolService
20
20
  * @param {Config} config