trac-msb 0.2.17 → 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 (365) 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 +33 -11
  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 +163 -14
  16. package/src/config/env.js +57 -25
  17. package/src/core/network/Network.js +121 -56
  18. package/src/core/network/protocols/LegacyProtocol.js +21 -11
  19. package/src/core/network/protocols/NetworkMessages.js +38 -17
  20. package/src/core/network/protocols/ProtocolInterface.js +15 -3
  21. package/src/core/network/protocols/ProtocolSession.js +144 -17
  22. package/src/core/network/protocols/V1Protocol.js +37 -18
  23. package/src/core/network/protocols/connectionPolicies.js +174 -0
  24. package/src/core/network/protocols/legacy/NetworkMessageRouter.js +26 -20
  25. package/src/core/network/protocols/{shared/handlers/base/BaseOperationHandler.js → legacy/handlers/BaseStateOperationHandler.js} +25 -14
  26. package/src/core/network/protocols/legacy/handlers/{GetRequestHandler.js → LegacyGetRequestHandler.js} +9 -9
  27. package/src/core/network/protocols/legacy/handlers/LegacyResponseHandler.js +23 -0
  28. package/src/core/network/protocols/{shared/handlers/RoleOperationHandler.js → legacy/handlers/LegacyRoleOperationHandler.js} +19 -12
  29. package/src/core/network/protocols/{shared/handlers/SubnetworkOperationHandler.js → legacy/handlers/LegacySubnetworkOperationHandler.js} +29 -18
  30. package/src/core/network/protocols/{shared/handlers/TransferOperationHandler.js → legacy/handlers/LegacyTransferOperationHandler.js} +18 -12
  31. package/src/core/network/protocols/legacy/validators/base/BaseResponse.js +7 -10
  32. package/src/core/network/protocols/shared/validators/{PartialBootstrapDeployment.js → PartialBootstrapDeploymentValidator.js} +9 -4
  33. package/src/core/network/protocols/shared/validators/{base/PartialOperation.js → PartialOperationValidator.js} +53 -31
  34. package/src/core/network/protocols/shared/validators/{PartialRoleAccess.js → PartialRoleAccessValidator.js} +51 -17
  35. package/src/core/network/protocols/shared/validators/{PartialTransaction.js → PartialTransactionValidator.js} +21 -7
  36. package/src/core/network/protocols/shared/validators/{PartialTransfer.js → PartialTransferValidator.js} +32 -14
  37. package/src/core/network/protocols/v1/NetworkMessageRouter.js +91 -7
  38. package/src/core/network/protocols/v1/V1ProtocolError.js +27 -0
  39. package/src/core/network/protocols/v1/handlers/V1BaseOperationHandler.js +66 -0
  40. package/src/core/network/protocols/v1/handlers/V1BroadcastTransactionOperationHandler.js +272 -0
  41. package/src/core/network/protocols/v1/handlers/V1LivenessOperationHandler.js +88 -0
  42. package/src/core/network/protocols/v1/handlers/broadcastTransaction/BroadcastTransactionErrorMapper.js +84 -0
  43. package/src/core/network/protocols/v1/handlers/broadcastTransaction/BroadcastTransactionOperationStrategies.js +128 -0
  44. package/src/core/network/protocols/v1/handlers/broadcastTransaction/BroadcastTransactionPayloadUtils.js +26 -0
  45. package/src/core/network/protocols/v1/validators/V1BaseOperation.js +212 -0
  46. package/src/core/network/protocols/v1/validators/V1BroadcastTransactionRequest.js +28 -0
  47. package/src/core/network/protocols/v1/validators/V1BroadcastTransactionResponse.js +260 -0
  48. package/src/core/network/protocols/v1/validators/V1LivenessRequest.js +15 -0
  49. package/src/core/network/protocols/v1/validators/V1LivenessResponse.js +17 -0
  50. package/src/core/network/protocols/v1/validators/V1ValidationSchema.js +210 -0
  51. package/src/core/network/services/ConnectionManager.js +149 -96
  52. package/src/core/network/services/MessageOrchestrator.js +197 -37
  53. package/src/core/network/services/PendingRequestService.js +175 -0
  54. package/src/core/network/services/TransactionCommitService.js +149 -0
  55. package/src/core/network/services/TransactionPoolService.js +129 -18
  56. package/src/core/network/services/TransactionRateLimiterService.js +57 -35
  57. package/src/core/network/services/ValidatorHealthCheckService.js +127 -0
  58. package/src/core/network/services/ValidatorObserverService.js +400 -121
  59. package/src/core/state/State.js +259 -156
  60. package/src/core/state/utils/address.js +4 -9
  61. package/src/core/state/utils/balance.js +7 -7
  62. package/src/core/state/utils/roles.js +1 -1
  63. package/src/index.js +320 -278
  64. package/src/messages/network/v1/NetworkMessageBuilder.js +71 -100
  65. package/src/messages/network/v1/NetworkMessageDirector.js +16 -50
  66. package/src/messages/network/v1/networkMessageFactory.js +1 -1
  67. package/src/messages/state/ApplyStateMessageBuilder.js +6 -6
  68. package/src/messages/state/applyStateMessageFactory.js +1 -1
  69. package/src/utils/Scheduler.js +0 -8
  70. package/src/utils/buffer.js +1 -1
  71. package/src/utils/check.js +12 -13
  72. package/src/utils/constants.js +78 -5
  73. package/src/utils/deepEqualApplyPayload.js +40 -0
  74. package/src/utils/errors.js +20 -0
  75. package/src/utils/fileUtils.js +12 -3
  76. package/src/utils/helpers.js +10 -1
  77. package/src/utils/logger.js +25 -0
  78. package/src/utils/migrationUtils.js +3 -3
  79. package/src/utils/normalizers.js +38 -0
  80. package/src/utils/protobuf/networkV1.generated.cjs +2460 -0
  81. package/src/utils/protobuf/operationHelpers.js +24 -3
  82. package/.dockerignore +0 -16
  83. package/.github/workflows/acceptance-tests.yml +0 -38
  84. package/.github/workflows/lint-pr-title.yml +0 -26
  85. package/.github/workflows/publish.yml +0 -33
  86. package/.github/workflows/unit-tests.yml +0 -34
  87. package/CODE_OF_CONDUCT.md +0 -128
  88. package/docker-compose.yml +0 -17
  89. package/dockerfile +0 -41
  90. package/docs/fee_distribution.md +0 -89
  91. package/docs/trac_network_http_api.openapi.yaml +0 -889
  92. package/migration/.gitkeep +0 -0
  93. package/proto/applyOperations.proto +0 -117
  94. package/proto/network.proto +0 -74
  95. package/rpc/rpc_services.js +0 -163
  96. package/scripts/generate-protobufs.js +0 -42
  97. package/src/core/network/identity/NetworkWalletFactory.js +0 -77
  98. package/src/core/network/protocols/legacy/handlers/ResponseHandler.js +0 -37
  99. package/src/utils/cli.js +0 -130
  100. package/src/utils/cliCommands.js +0 -280
  101. package/src/utils/protobuf/network.cjs +0 -840
  102. package/tests/acceptance/v1/account/account.test.mjs +0 -123
  103. package/tests/acceptance/v1/balance/balance.test.mjs +0 -54
  104. package/tests/acceptance/v1/broadcast-transaction/broadcast-transaction.test.mjs +0 -116
  105. package/tests/acceptance/v1/confirmed-length/confirmed-length.test.mjs +0 -19
  106. package/tests/acceptance/v1/fee/fee.test.mjs +0 -11
  107. package/tests/acceptance/v1/health/health.test.mjs +0 -33
  108. package/tests/acceptance/v1/rpc.test.mjs +0 -95
  109. package/tests/acceptance/v1/tx/tx.test.mjs +0 -111
  110. package/tests/acceptance/v1/tx-details/tx-details.test.mjs +0 -213
  111. package/tests/acceptance/v1/tx-hashes/tx-hashes.test.mjs +0 -72
  112. package/tests/acceptance/v1/tx-payloads-bulk/tx-payloads-bulk.test.mjs +0 -27
  113. package/tests/acceptance/v1/txv/txv.test.mjs +0 -11
  114. package/tests/acceptance/v1/unconfirmed-length/unconfirmed-length.test.mjs +0 -11
  115. package/tests/fixtures/apply.fixtures.js +0 -77
  116. package/tests/fixtures/assembleMessage.fixtures.js +0 -41
  117. package/tests/fixtures/check.fixtures.js +0 -428
  118. package/tests/fixtures/networkV1.fixtures.js +0 -85
  119. package/tests/fixtures/protobuf.fixtures.js +0 -388
  120. package/tests/helpers/StateNetworkFactory.js +0 -155
  121. package/tests/helpers/address.js +0 -6
  122. package/tests/helpers/autobaseTestHelpers.js +0 -419
  123. package/tests/helpers/config.js +0 -4
  124. package/tests/helpers/createTestSignature.js +0 -13
  125. package/tests/helpers/regexHelper.js +0 -3
  126. package/tests/helpers/setupApplyTests.js +0 -587
  127. package/tests/helpers/transactionPayloads.mjs +0 -92
  128. package/tests/helpers/wrapper.js +0 -28
  129. package/tests/unit/messages/messages.test.js +0 -12
  130. package/tests/unit/messages/network/NetworkMessageBuilder.test.js +0 -276
  131. package/tests/unit/messages/network/NetworkMessageDirector.test.js +0 -201
  132. package/tests/unit/messages/state/applyStateMessageBuilder.complete.test.js +0 -525
  133. package/tests/unit/messages/state/applyStateMessageBuilder.partial.test.js +0 -237
  134. package/tests/unit/network/ConnectionManager.test.js +0 -191
  135. package/tests/unit/network/NetworkWalletFactory.test.js +0 -156
  136. package/tests/unit/network/networkModule.test.js +0 -10
  137. package/tests/unit/state/State.test.js +0 -80
  138. package/tests/unit/state/apply/addAdmin/addAdminHappyPathScenario.js +0 -42
  139. package/tests/unit/state/apply/addAdmin/addAdminScenarioHelpers.js +0 -276
  140. package/tests/unit/state/apply/addAdmin/adminEntryEncodingFailureScenario.js +0 -30
  141. package/tests/unit/state/apply/addAdmin/adminEntryExistsScenario.js +0 -78
  142. package/tests/unit/state/apply/addAdmin/nodeEntryInitializationFailureScenario.js +0 -30
  143. package/tests/unit/state/apply/addAdmin/nonBootstrapNodeScenario.js +0 -68
  144. package/tests/unit/state/apply/addAdmin/state.apply.addAdmin.test.js +0 -159
  145. package/tests/unit/state/apply/addIndexer/addIndexerHappyPathScenario.js +0 -39
  146. package/tests/unit/state/apply/addIndexer/addIndexerMultipleIndexersInTheNetworkScenario.js +0 -167
  147. package/tests/unit/state/apply/addIndexer/addIndexerPretenderAlreadyIndexerScenario.js +0 -21
  148. package/tests/unit/state/apply/addIndexer/addIndexerPretenderNotWriterScenario.js +0 -21
  149. package/tests/unit/state/apply/addIndexer/addIndexerRemoveAndReAddScenario.js +0 -186
  150. package/tests/unit/state/apply/addIndexer/addIndexerScenarioHelpers.js +0 -443
  151. package/tests/unit/state/apply/addIndexer/addIndexerWriterKeyAlreadyRegisteredScenario.js +0 -32
  152. package/tests/unit/state/apply/addIndexer/state.apply.addIndexer.test.js +0 -297
  153. package/tests/unit/state/apply/addWriter/addWriterHappyPathScenario.js +0 -41
  154. package/tests/unit/state/apply/addWriter/addWriterInvalidValidatorSignatureScenario.js +0 -32
  155. package/tests/unit/state/apply/addWriter/addWriterNewWkScenario.js +0 -149
  156. package/tests/unit/state/apply/addWriter/addWriterRequesterAlreadyWriterScenario.js +0 -21
  157. package/tests/unit/state/apply/addWriter/addWriterRequesterBalanceInsufficientScenario.js +0 -21
  158. package/tests/unit/state/apply/addWriter/addWriterRequesterEntryDecodeFailureScenario.js +0 -19
  159. package/tests/unit/state/apply/addWriter/addWriterRequesterEntryMissingScenario.js +0 -19
  160. package/tests/unit/state/apply/addWriter/addWriterRequesterIndexerScenario.js +0 -21
  161. package/tests/unit/state/apply/addWriter/addWriterRequesterNotWhitelistedScenario.js +0 -21
  162. package/tests/unit/state/apply/addWriter/addWriterScenarioHelpers.js +0 -766
  163. package/tests/unit/state/apply/addWriter/addWriterStakeBalanceUpdateFailureScenario.js +0 -50
  164. package/tests/unit/state/apply/addWriter/addWriterStakeInsufficientBalanceScenario.js +0 -29
  165. package/tests/unit/state/apply/addWriter/addWriterStakeInvalidBalanceScenario.js +0 -29
  166. package/tests/unit/state/apply/addWriter/addWriterStakeInvalidEntryScenario.js +0 -21
  167. package/tests/unit/state/apply/addWriter/addWriterStakeStakedBalanceFailureScenario.js +0 -37
  168. package/tests/unit/state/apply/addWriter/addWriterStakeSubtractFailureScenario.js +0 -42
  169. package/tests/unit/state/apply/addWriter/addWriterValidatorRewardScenario.js +0 -106
  170. package/tests/unit/state/apply/addWriter/addWriterWriterKeyMismatchScenario.js +0 -54
  171. package/tests/unit/state/apply/addWriter/addWriterWriterKeyOwnershipScenario.js +0 -54
  172. package/tests/unit/state/apply/addWriter/addWriterZeroWriterKeyScenario.js +0 -29
  173. package/tests/unit/state/apply/addWriter/state.apply.addWriter.test.js +0 -309
  174. package/tests/unit/state/apply/adminRecovery/adminRecoveryHappyPathScenario.js +0 -30
  175. package/tests/unit/state/apply/adminRecovery/adminRecoveryScenarioHelpers.js +0 -881
  176. package/tests/unit/state/apply/adminRecovery/state.apply.adminRecovery.test.js +0 -435
  177. package/tests/unit/state/apply/appendWhitelist/appendWhitelistBanAndReapplyScenario.js +0 -78
  178. package/tests/unit/state/apply/appendWhitelist/appendWhitelistExistingReaderHappyPathScenario.js +0 -98
  179. package/tests/unit/state/apply/appendWhitelist/appendWhitelistFeeAfterDisableScenario.js +0 -66
  180. package/tests/unit/state/apply/appendWhitelist/appendWhitelistHappyPathScenario.js +0 -55
  181. package/tests/unit/state/apply/appendWhitelist/appendWhitelistInsufficientAdminBalanceScenario.js +0 -103
  182. package/tests/unit/state/apply/appendWhitelist/appendWhitelistNodeAlreadyWhitelistedScenario.js +0 -60
  183. package/tests/unit/state/apply/appendWhitelist/appendWhitelistScenarioHelpers.js +0 -189
  184. package/tests/unit/state/apply/appendWhitelist/state.apply.appendWhitelist.test.js +0 -220
  185. package/tests/unit/state/apply/balanceInitialization/balanceInitializationHappyPathScenario.js +0 -82
  186. package/tests/unit/state/apply/balanceInitialization/balanceInitializationScenarioHelpers.js +0 -111
  187. package/tests/unit/state/apply/balanceInitialization/invalidAmountScenario.js +0 -45
  188. package/tests/unit/state/apply/balanceInitialization/nodeEntryBalanceUpdateFailureScenario.js +0 -82
  189. package/tests/unit/state/apply/balanceInitialization/state.apply.balanceInitialization.test.js +0 -189
  190. package/tests/unit/state/apply/banValidator/banValidatorBanAndReWhitelistScenario.js +0 -156
  191. package/tests/unit/state/apply/banValidator/banValidatorHappyPathScenario.js +0 -36
  192. package/tests/unit/state/apply/banValidator/banValidatorScenarioHelpers.js +0 -531
  193. package/tests/unit/state/apply/banValidator/banValidatorSequentialBansScenario.js +0 -74
  194. package/tests/unit/state/apply/banValidator/banValidatorTargetDecodeFailureScenario.js +0 -19
  195. package/tests/unit/state/apply/banValidator/banValidatorTargetIndexerScenario.js +0 -32
  196. package/tests/unit/state/apply/banValidator/banValidatorTargetNodeEntryMissingScenario.js +0 -19
  197. package/tests/unit/state/apply/banValidator/banValidatorTargetRoleUpdateFailureScenario.js +0 -19
  198. package/tests/unit/state/apply/banValidator/banValidatorWhitelistedNonWriterScenario.js +0 -38
  199. package/tests/unit/state/apply/banValidator/banValidatorWhitelistedZeroBalanceScenario.js +0 -91
  200. package/tests/unit/state/apply/banValidator/banValidatorWithdrawFailureScenario.js +0 -19
  201. package/tests/unit/state/apply/banValidator/state.apply.banValidator.test.js +0 -266
  202. package/tests/unit/state/apply/bootstrapDeployment/bootstrapDeploymentDuplicateRegistrationScenario.js +0 -143
  203. package/tests/unit/state/apply/bootstrapDeployment/bootstrapDeploymentHappyPathScenario.js +0 -26
  204. package/tests/unit/state/apply/bootstrapDeployment/bootstrapDeploymentIncompleteOperationScenario.js +0 -94
  205. package/tests/unit/state/apply/bootstrapDeployment/bootstrapDeploymentInvalidDeploymentEntryScenario.js +0 -37
  206. package/tests/unit/state/apply/bootstrapDeployment/bootstrapDeploymentMultipleBootstrapScenario.js +0 -86
  207. package/tests/unit/state/apply/bootstrapDeployment/bootstrapDeploymentScenarioHelpers.js +0 -347
  208. package/tests/unit/state/apply/bootstrapDeployment/invalidValidatorNodeEntryScenario.js +0 -57
  209. package/tests/unit/state/apply/bootstrapDeployment/state.apply.bootstrapDeployment.test.js +0 -429
  210. package/tests/unit/state/apply/common/access-control/adminConsistencyMismatchScenario.js +0 -120
  211. package/tests/unit/state/apply/common/access-control/adminEntryDecodeFailureScenario.js +0 -130
  212. package/tests/unit/state/apply/common/access-control/adminEntryExistsScenario.js +0 -93
  213. package/tests/unit/state/apply/common/access-control/adminEntryMissingScenario.js +0 -108
  214. package/tests/unit/state/apply/common/access-control/adminOnlyGuardScenario.js +0 -126
  215. package/tests/unit/state/apply/common/access-control/adminPublicKeyDecodeFailureScenario.js +0 -121
  216. package/tests/unit/state/apply/common/access-control/roleAccessOperationValidationScenario.js +0 -50
  217. package/tests/unit/state/apply/common/adminControlOperationValidationScenario.js +0 -56
  218. package/tests/unit/state/apply/common/balances/adminEntryUpdateFailureScenario.js +0 -52
  219. package/tests/unit/state/apply/common/balances/base/requesterBalanceScenarioBase.js +0 -198
  220. package/tests/unit/state/apply/common/balances/feeDecodeFailureScenario.js +0 -52
  221. package/tests/unit/state/apply/common/balances/requesterBalanceDecodeFailureScenario.js +0 -15
  222. package/tests/unit/state/apply/common/balances/requesterBalanceFeeApplicationFailureScenario.js +0 -11
  223. package/tests/unit/state/apply/common/balances/requesterBalanceInsufficientScenario.js +0 -15
  224. package/tests/unit/state/apply/common/balances/requesterBalanceUpdateFailureScenario.js +0 -11
  225. package/tests/unit/state/apply/common/balances/validatorEntryRewardFailureScenario.js +0 -11
  226. package/tests/unit/state/apply/common/balances/validatorEntryUpdateFailureScenario.js +0 -11
  227. package/tests/unit/state/apply/common/balances/validatorNodeEntryDecodeFailureScenario.js +0 -40
  228. package/tests/unit/state/apply/common/base/OperationValidationScenarioBase.js +0 -114
  229. package/tests/unit/state/apply/common/commonScenarioHelper.js +0 -103
  230. package/tests/unit/state/apply/common/indexer/indexerNodeEntryDecodeFailureScenario.js +0 -36
  231. package/tests/unit/state/apply/common/indexer/indexerNodeEntryMissingScenario.js +0 -36
  232. package/tests/unit/state/apply/common/indexer/indexerRoleUpdateFailureScenario.js +0 -29
  233. package/tests/unit/state/apply/common/indexer/indexerSequenceStateInvalidScenario.js +0 -66
  234. package/tests/unit/state/apply/common/invalidMessageComponentValidationScenario.js +0 -84
  235. package/tests/unit/state/apply/common/nodeEntryInitializationFailureScenario.js +0 -47
  236. package/tests/unit/state/apply/common/operationAlreadyAppliedScenario.js +0 -85
  237. package/tests/unit/state/apply/common/payload-structure/addressWithInvalidPublicKeyScenario.js +0 -52
  238. package/tests/unit/state/apply/common/payload-structure/initializationDisabledScenario.js +0 -54
  239. package/tests/unit/state/apply/common/payload-structure/invalidAddressValidationScenario.js +0 -73
  240. package/tests/unit/state/apply/common/payload-structure/invalidHashValidationScenario.js +0 -71
  241. package/tests/unit/state/apply/common/payload-structure/invalidPayloadValidationScenario.js +0 -31
  242. package/tests/unit/state/apply/common/payload-structure/invalidSignatureValidationScenario.js +0 -142
  243. package/tests/unit/state/apply/common/payload-structure/partialOperationValidationScenario.js +0 -87
  244. package/tests/unit/state/apply/common/requester/requesterNodeEntryBufferMissingScenario.js +0 -71
  245. package/tests/unit/state/apply/common/requester/requesterNodeEntryDecodeFailureScenario.js +0 -73
  246. package/tests/unit/state/apply/common/requester/requesterNodeEntryMissingScenario.js +0 -36
  247. package/tests/unit/state/apply/common/requesterAddressValidationScenario.js +0 -44
  248. package/tests/unit/state/apply/common/requesterPublicKeyValidationScenario.js +0 -25
  249. package/tests/unit/state/apply/common/transactionValidityMismatchScenario.js +0 -98
  250. package/tests/unit/state/apply/common/validatorConsistency/base/validatorConsistencyScenarioBase.js +0 -202
  251. package/tests/unit/state/apply/common/validatorConsistency/validatorEntryDecodeFailureScenario.js +0 -17
  252. package/tests/unit/state/apply/common/validatorConsistency/validatorEntryMissingScenario.js +0 -44
  253. package/tests/unit/state/apply/common/validatorConsistency/validatorInactiveScenario.js +0 -19
  254. package/tests/unit/state/apply/common/validatorConsistency/validatorWriterKeyMismatchScenario.js +0 -18
  255. package/tests/unit/state/apply/common/validatorEntryValidation/base/validatorEntryValidationScenarioBase.js +0 -315
  256. package/tests/unit/state/apply/common/validatorEntryValidation/validatorEntryInvalidBalanceScenario.js +0 -18
  257. package/tests/unit/state/apply/common/writerKeyExistsValidationScenario.js +0 -43
  258. package/tests/unit/state/apply/disableInitialization/disableInitializationAlreadyDisabledScenario.js +0 -53
  259. package/tests/unit/state/apply/disableInitialization/disableInitializationHappyPathScenario.js +0 -24
  260. package/tests/unit/state/apply/disableInitialization/disableInitializationScenarioHelpers.js +0 -204
  261. package/tests/unit/state/apply/disableInitialization/state.apply.disableInitialization.test.js +0 -161
  262. package/tests/unit/state/apply/missing-tests.md +0 -18
  263. package/tests/unit/state/apply/removeIndexer/removeIndexerHappyPathScenario.js +0 -58
  264. package/tests/unit/state/apply/removeIndexer/removeIndexerReAddAndRemoveAgainScenario.js +0 -98
  265. package/tests/unit/state/apply/removeIndexer/removeIndexerRemoveMultipleIndexersScenario.js +0 -167
  266. package/tests/unit/state/apply/removeIndexer/removeIndexerScenarioHelpers.js +0 -429
  267. package/tests/unit/state/apply/removeIndexer/removeIndexerTargetNotIndexerScenario.js +0 -22
  268. package/tests/unit/state/apply/removeIndexer/removeIndexerWriterKeyMissingScenario.js +0 -20
  269. package/tests/unit/state/apply/removeIndexer/state.apply.removeIndexer.test.js +0 -291
  270. package/tests/unit/state/apply/removeWriter/removeWriterAndAddWriterAgainScenario.js +0 -87
  271. package/tests/unit/state/apply/removeWriter/removeWriterHappyPathScenario.js +0 -38
  272. package/tests/unit/state/apply/removeWriter/removeWriterInvalidValidatorSignatureScenario.js +0 -32
  273. package/tests/unit/state/apply/removeWriter/removeWriterRequesterBalanceInsufficientScenario.js +0 -21
  274. package/tests/unit/state/apply/removeWriter/removeWriterRequesterEntryDecodeFailureScenario.js +0 -19
  275. package/tests/unit/state/apply/removeWriter/removeWriterRequesterEntryMissingScenario.js +0 -19
  276. package/tests/unit/state/apply/removeWriter/removeWriterRequesterIndexerScenario.js +0 -21
  277. package/tests/unit/state/apply/removeWriter/removeWriterRequesterNotWriterScenario.js +0 -21
  278. package/tests/unit/state/apply/removeWriter/removeWriterRequesterRoleUpdateFailureScenario.js +0 -19
  279. package/tests/unit/state/apply/removeWriter/removeWriterScenarioHelpers.js +0 -348
  280. package/tests/unit/state/apply/removeWriter/removeWriterThroughWriterValidatorScenario.js +0 -113
  281. package/tests/unit/state/apply/removeWriter/removeWriterUnstakeFailureScenario.js +0 -33
  282. package/tests/unit/state/apply/removeWriter/removeWriterWriterKeyMismatchScenario.js +0 -21
  283. package/tests/unit/state/apply/removeWriter/removeWriterWriterKeyOwnershipScenario.js +0 -26
  284. package/tests/unit/state/apply/removeWriter/removeWriterWriterKeyRegistryMissingScenario.js +0 -22
  285. package/tests/unit/state/apply/removeWriter/state.apply.removeWriter.test.js +0 -307
  286. package/tests/unit/state/apply/state.apply.test.js +0 -24
  287. package/tests/unit/state/apply/transfer/state.apply.transfer.test.js +0 -819
  288. package/tests/unit/state/apply/transfer/transferContractSchemaValidationScenario.js +0 -22
  289. package/tests/unit/state/apply/transfer/transferDoubleSpendAcrossValidatorsScenario.js +0 -146
  290. package/tests/unit/state/apply/transfer/transferDoubleSpendSameBatchScenario.js +0 -63
  291. package/tests/unit/state/apply/transfer/transferDoubleSpendSingleValidatorScenario.js +0 -67
  292. package/tests/unit/state/apply/transfer/transferExistingRecipientAmountScenario.js +0 -31
  293. package/tests/unit/state/apply/transfer/transferExistingRecipientZeroAmountScenario.js +0 -31
  294. package/tests/unit/state/apply/transfer/transferHandlerGuardScenarios.js +0 -22
  295. package/tests/unit/state/apply/transfer/transferHappyPathScenario.js +0 -8
  296. package/tests/unit/state/apply/transfer/transferInvalidIncomingDataScenario.js +0 -66
  297. package/tests/unit/state/apply/transfer/transferNewRecipientAmountScenario.js +0 -31
  298. package/tests/unit/state/apply/transfer/transferNewRecipientZeroAmountScenario.js +0 -31
  299. package/tests/unit/state/apply/transfer/transferScenarioHelpers.js +0 -1170
  300. package/tests/unit/state/apply/transfer/transferSelfTransferAmountScenario.js +0 -38
  301. package/tests/unit/state/apply/transfer/transferSelfTransferZeroAmountScenario.js +0 -38
  302. package/tests/unit/state/apply/transfer/transferValidatorRecipientAmountScenario.js +0 -38
  303. package/tests/unit/state/apply/transfer/transferValidatorRecipientZeroAmountScenario.js +0 -38
  304. package/tests/unit/state/apply/txOperation/state.apply.txOperation.test.js +0 -318
  305. package/tests/unit/state/apply/txOperation/txOperationBootstrapNotRegisteredScenario.js +0 -70
  306. package/tests/unit/state/apply/txOperation/txOperationDifferentValidatorCreatorHappyPathScenario.js +0 -23
  307. package/tests/unit/state/apply/txOperation/txOperationInvalidDeploymentEntryScenario.js +0 -48
  308. package/tests/unit/state/apply/txOperation/txOperationInvalidFeeAmountScenario.js +0 -39
  309. package/tests/unit/state/apply/txOperation/txOperationInvalidSubnetCreatorAddressScenario.js +0 -46
  310. package/tests/unit/state/apply/txOperation/txOperationRequesterCreatorHappyPathScenario.js +0 -21
  311. package/tests/unit/state/apply/txOperation/txOperationScenarioHelpers.js +0 -432
  312. package/tests/unit/state/apply/txOperation/txOperationStandardHappyPathScenario.js +0 -21
  313. package/tests/unit/state/apply/txOperation/txOperationTransferFeeAddCreatorBalanceFailureScenario.js +0 -26
  314. package/tests/unit/state/apply/txOperation/txOperationTransferFeeAddValidatorBalanceFailureScenario.js +0 -25
  315. package/tests/unit/state/apply/txOperation/txOperationTransferFeeAddValidatorBonusFailureScenario.js +0 -27
  316. package/tests/unit/state/apply/txOperation/txOperationTransferFeeDecodeCreatorEntryScenario.js +0 -18
  317. package/tests/unit/state/apply/txOperation/txOperationTransferFeeDecodeRequesterEntryScenario.js +0 -17
  318. package/tests/unit/state/apply/txOperation/txOperationTransferFeeDecodeValidatorEntryScenario.js +0 -31
  319. package/tests/unit/state/apply/txOperation/txOperationTransferFeeGuardBypassScenario.js +0 -49
  320. package/tests/unit/state/apply/txOperation/txOperationTransferFeeGuardScenarioFactory.js +0 -93
  321. package/tests/unit/state/apply/txOperation/txOperationTransferFeeInsufficientRequesterBalanceScenario.js +0 -28
  322. package/tests/unit/state/apply/txOperation/txOperationTransferFeeInvalidCreatorBalanceScenario.js +0 -29
  323. package/tests/unit/state/apply/txOperation/txOperationTransferFeeInvalidRequesterBalanceScenario.js +0 -28
  324. package/tests/unit/state/apply/txOperation/txOperationTransferFeeInvalidRequesterEntryScenario.js +0 -17
  325. package/tests/unit/state/apply/txOperation/txOperationTransferFeeInvalidValidatorBalanceScenario.js +0 -33
  326. package/tests/unit/state/apply/txOperation/txOperationTransferFeeMissingCreatorEntryScenario.js +0 -18
  327. package/tests/unit/state/apply/txOperation/txOperationTransferFeeSubtractFailureScenario.js +0 -25
  328. package/tests/unit/state/apply/txOperation/txOperationTransferFeeUpdateCreatorBalanceFailureScenario.js +0 -26
  329. package/tests/unit/state/apply/txOperation/txOperationTransferFeeUpdateFailureScenario.js +0 -25
  330. package/tests/unit/state/apply/txOperation/txOperationTransferFeeUpdateValidatorBalanceFailureScenario.js +0 -26
  331. package/tests/unit/state/apply/txOperation/txOperationTransferFeeUpdateValidatorBonusFailureScenario.js +0 -27
  332. package/tests/unit/state/apply/txOperation/txOperationValidatorCreatorHappyPathScenario.js +0 -21
  333. package/tests/unit/state/stateModule.test.js +0 -23
  334. package/tests/unit/state/stateTestUtils.js +0 -32
  335. package/tests/unit/state/utils/address.test.js +0 -63
  336. package/tests/unit/state/utils/adminEntry.test.js +0 -52
  337. package/tests/unit/state/utils/balance.test.js +0 -320
  338. package/tests/unit/state/utils/lengthEntry.test.js +0 -54
  339. package/tests/unit/state/utils/nodeEntry.test.js +0 -298
  340. package/tests/unit/state/utils/roles.test.js +0 -44
  341. package/tests/unit/unit.test.js +0 -14
  342. package/tests/unit/utils/amountSerialization/amountSerialization.test.js +0 -237
  343. package/tests/unit/utils/buffer/buffer.test.js +0 -251
  344. package/tests/unit/utils/check/adminControlOperation.test.js +0 -156
  345. package/tests/unit/utils/check/balanceInitializationOperation.test.js +0 -54
  346. package/tests/unit/utils/check/bootstrapDeploymentOperation.test.js +0 -104
  347. package/tests/unit/utils/check/check.test.js +0 -17
  348. package/tests/unit/utils/check/common.test.js +0 -419
  349. package/tests/unit/utils/check/coreAdminOperation.test.js +0 -95
  350. package/tests/unit/utils/check/roleAccessOperation.test.js +0 -255
  351. package/tests/unit/utils/check/transactionOperation.test.js +0 -107
  352. package/tests/unit/utils/check/transferOperation.test.js +0 -102
  353. package/tests/unit/utils/fileUtils/readAddressesFromWhitelistFile.test.js +0 -95
  354. package/tests/unit/utils/fileUtils/readBalanceMigrationFile.test.js +0 -149
  355. package/tests/unit/utils/helpers/helpers.test.js +0 -11
  356. package/tests/unit/utils/helpers/isHexString.test.js +0 -12
  357. package/tests/unit/utils/helpers/normalizeHex.test.js +0 -82
  358. package/tests/unit/utils/migrationUtils/validateAddressFromIncomingFile.test.js +0 -100
  359. package/tests/unit/utils/normalizers/normalizers.test.js +0 -469
  360. package/tests/unit/utils/protobuf/applyOperations.test.js +0 -91
  361. package/tests/unit/utils/protobuf/operationHelpers.test.js +0 -305
  362. package/tests/unit/utils/protobuf/protobuf.test.js +0 -12
  363. package/tests/unit/utils/type/type.test.js +0 -25
  364. package/tests/unit/utils/utils.test.js +0 -20
  365. package/whitelist/.gitkeep +0 -0
package/rpc/rpc_server.js CHANGED
@@ -1,8 +1,12 @@
1
1
  import { createServer } from "./create_server.js";
2
+ import { MainSettlementBus } from "../src/index.js";
2
3
 
3
4
  // Called by msb.mjs file
4
- export function startRpcServer(msbInstance, config) {
5
- const server = createServer(msbInstance, config)
5
+ export async function startRpcServer(config) {
6
+ console.log('Starting RPC server...');
7
+ const msb = new MainSettlementBus(config);
8
+ await msb.ready()
9
+ const server = createServer(msb, config)
6
10
 
7
11
  return server.listen(config.port, config.host, () => {
8
12
  console.log(`Running RPC with http at http://${config.host}:${config.port}`);
@@ -1,99 +1,79 @@
1
1
  import b4a from "b4a"
2
2
  import { operationToPayload } from "../../src/utils/applyOperations.js"
3
3
  import { isHexString } from "../../src/utils/helpers.js";
4
-
5
- export class ValidationError extends Error {
6
- constructor(message) {
7
- super(message);
8
- this.name = "ValidationError";
9
- }
10
- }
11
-
12
- export class BroadcastError extends Error {
13
- constructor(message) {
14
- super(message);
15
- this.name = "BroadcastError";
16
- }
17
- }
18
-
19
- export class NotFoundError extends Error {
20
- constructor(message) {
21
- super(message);
22
- this.name = "NotFoundError";
23
- }
24
- }
4
+ import { ValidationError } from "../../src/utils/errors.js";
25
5
 
26
6
  export function decodeBase64Payload(base64) {
27
- let decodedPayloadString
28
- try {
29
- decodedPayloadString = b4a.from(base64, "base64").toString("utf-8")
30
- } catch (err) {
31
- throw new ValidationError("Failed to decode base64 payload.")
32
- }
7
+ let decodedPayloadString
8
+ try {
9
+ decodedPayloadString = b4a.from(base64, "base64").toString("utf-8")
10
+ } catch {
11
+ throw new ValidationError("Failed to decode base64 payload.")
12
+ }
33
13
 
34
- try {
35
- return JSON.parse(decodedPayloadString)
36
- } catch (err) {
37
- throw new ValidationError("Decoded payload is not valid JSON.")
38
- }
14
+ try {
15
+ return JSON.parse(decodedPayloadString)
16
+ } catch {
17
+ throw new ValidationError("Decoded payload is not valid JSON.")
18
+ }
39
19
  }
40
20
 
41
21
  export function isBase64(str) {
42
- const base64Regex =
22
+ const base64Regex =
43
23
  /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/
44
- return base64Regex.test(str)
24
+ return base64Regex.test(str)
45
25
  }
46
26
 
47
27
  export function validatePayloadStructure(payload) {
48
- if (
49
- typeof payload !== "object" ||
28
+ if (
29
+ typeof payload !== "object" ||
50
30
  payload === null ||
51
31
  typeof payload.type !== "number" ||
52
32
  typeof payload.address !== "string" ||
53
33
  !["txo", "tro"].some((key) => key in payload && typeof payload[key] === "object")
54
- ) {
55
- throw new ValidationError("Invalid payload structure.")
56
- }
34
+ ) {
35
+ throw new ValidationError("Invalid payload structure.")
36
+ }
57
37
  }
58
38
 
59
39
  export function sanitizeTransferPayload(payload) {
60
- const operationKey = operationToPayload(payload.type);
40
+ const operationKey = operationToPayload(payload.type);
61
41
 
62
- if (operationKey !== 'tro' && operationKey !== 'txo') {
63
- throw new ValidationError('Payload is not a transfer/transaction operation.');
64
- }
42
+ if (operationKey !== 'tro' && operationKey !== 'txo') {
43
+ throw new ValidationError('Payload is not a transfer/transaction operation.');
44
+ }
65
45
 
66
- const operation = payload[operationKey];
67
- if (payload.address && typeof payload.address === "string") {
68
- payload.address = payload.address.trim()
69
- }
46
+ const operation = payload[operationKey];
47
+ if (payload.address && typeof payload.address === "string") {
48
+ payload.address = payload.address.trim()
49
+ }
70
50
 
71
- if (operation && typeof operation === "object") {
72
- for (const [key, value] of Object.entries(operation)) {
73
- if (typeof value === "string") {
74
- let sanitized = value.trim()
51
+ if (operation && typeof operation === "object") {
52
+ for (const [key, value] of Object.entries(operation)) {
53
+ if (typeof value === "string") {
54
+ let sanitized = value.trim()
75
55
 
76
- // normalize hex-like strings
77
- if (/^[0-9A-F]+$/i.test(sanitized)) {
78
- sanitized = sanitized.toLowerCase()
79
- }
56
+ // normalize hex-like strings
57
+ if (/^[0-9A-F]+$/i.test(sanitized)) {
58
+ sanitized = sanitized.toLowerCase()
59
+ }
80
60
 
81
- payload[operationKey][key] = sanitized
82
- }
61
+ payload[operationKey][key] = sanitized
62
+ }
63
+ }
83
64
  }
84
- }
85
65
 
86
- return payload
66
+ return payload
87
67
  }
88
68
 
89
69
  export function sanitizeBulkPayloadsRequestBody(body) {
90
- const cleanBody = body
91
- .replace(/^\uFEFF/, '')
92
- .replace(/\r/g, '')
93
- .replace(/\0/g, '')
94
- .trim();
70
+ const cleanBody = body
71
+ .replace(/^\uFEFF/, '')
72
+ .replace(/\r/g, '')
73
+ .replace(/\0/g, '')
74
+ .trim();
95
75
 
96
- return JSON.parse(cleanBody);
76
+ return JSON.parse(cleanBody);
97
77
  }
98
78
 
99
79
  export function isValidTxHash(hash) {
@@ -102,4 +82,4 @@ export function isValidTxHash(hash) {
102
82
 
103
83
  export function hasSpacesInUrl(url) {
104
84
  return url.includes('%20') || url.includes(' ');
105
- }
85
+ }
@@ -0,0 +1,170 @@
1
+ import { spawn, spawnSync } from 'node:child_process';
2
+ import path from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+
5
+ const SIGNAL_EXIT_CODES = new Map([
6
+ ['SIGHUP', 129],
7
+ ['SIGINT', 130],
8
+ ['SIGQUIT', 131],
9
+ ['SIGTERM', 143]
10
+ ]);
11
+
12
+ const projectDirectory = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
13
+ const workerEntrypoint = path.join(projectDirectory, 'msb.mjs');
14
+
15
+ export const parsePearMajor = output => {
16
+ const semver = output.match(/\bSemVer\s*=\s*(\d+)\.\d+\.\d+\b/i);
17
+ if (semver) {
18
+ return Number(semver[1]);
19
+ }
20
+
21
+ const summary = output.match(/\/\s*v(\d+)\.\d+\.\d+\b/i);
22
+ return summary ? Number(summary[1]) : null;
23
+ };
24
+
25
+ export const detectPearMajor = (runCommand = spawnSync) => {
26
+ const result = runCommand('pear', ['-v'], {
27
+ encoding: 'utf8',
28
+ stdio: ['ignore', 'pipe', 'pipe']
29
+ });
30
+
31
+ if (result.error?.code === 'ENOENT') {
32
+ return null;
33
+ }
34
+
35
+ if (result.error) {
36
+ throw new Error(`Could not check the installed Pear version: ${result.error.message}`);
37
+ }
38
+
39
+ const output = `${result.stdout ?? ''}\n${result.stderr ?? ''}`;
40
+
41
+ if (result.status !== 0) {
42
+ throw new Error('Could not determine the installed Pear major version from `pear -v`.');
43
+ }
44
+
45
+ return parsePearMajor(output);
46
+ };
47
+
48
+ const exitCodeFor = (code, signal) => {
49
+ if (Number.isInteger(code)) {
50
+ return code;
51
+ }
52
+
53
+ return SIGNAL_EXIT_CODES.get(signal) ?? 1;
54
+ };
55
+
56
+ export const runWithPearV2 = (
57
+ args,
58
+ spawnProcess = spawn
59
+ ) => new Promise((resolve, reject) => {
60
+ const child = spawnProcess('pear', ['run', '.', ...args], {
61
+ cwd: projectDirectory,
62
+ env: process.env,
63
+ stdio: 'inherit'
64
+ });
65
+
66
+ child.once('error', reject);
67
+ child.once('exit', (code, signal) => resolve(exitCodeFor(code, signal)));
68
+ });
69
+
70
+ const pipeWorkerStdio = (worker, hostProcess) => {
71
+ if (worker.stdin && hostProcess.stdin?.pipe) {
72
+ hostProcess.stdin.pipe(worker.stdin);
73
+ }
74
+ if (worker.stdout?.pipe && hostProcess.stdout) {
75
+ worker.stdout.pipe(hostProcess.stdout);
76
+ }
77
+ if (worker.stderr?.pipe && hostProcess.stderr) {
78
+ worker.stderr.pipe(hostProcess.stderr);
79
+ }
80
+ };
81
+
82
+ export const runWithPearV3 = async (
83
+ args,
84
+ {
85
+ loadPearRuntime = () => import('pear-runtime'),
86
+ hostProcess = process
87
+ } = {}
88
+ ) => {
89
+ let PearRuntime;
90
+
91
+ try {
92
+ const pearRuntimeModule = await loadPearRuntime();
93
+ PearRuntime = pearRuntimeModule.default ?? pearRuntimeModule;
94
+ } catch (error) {
95
+ throw new Error(
96
+ 'Pear v3 requires the pear-runtime dependency. Run npm install before starting MSB.',
97
+ { cause: error }
98
+ );
99
+ }
100
+
101
+ const worker = PearRuntime.run(workerEntrypoint, args);
102
+ pipeWorkerStdio(worker, hostProcess);
103
+
104
+ return new Promise((resolve, reject) => {
105
+ let requestedSignal = null;
106
+ const signalListeners = [];
107
+
108
+ const cleanup = () => {
109
+ for (const [signal, listener] of signalListeners) {
110
+ hostProcess.removeListener(signal, listener);
111
+ }
112
+
113
+ if (worker.stdin && hostProcess.stdin?.unpipe) {
114
+ hostProcess.stdin.unpipe(worker.stdin);
115
+ }
116
+ };
117
+
118
+ for (const signal of SIGNAL_EXIT_CODES.keys()) {
119
+ const listener = () => {
120
+ if (requestedSignal !== null) {
121
+ return;
122
+ }
123
+
124
+ requestedSignal = signal;
125
+ worker.destroy();
126
+ };
127
+
128
+ signalListeners.push([signal, listener]);
129
+ hostProcess.once(signal, listener);
130
+ }
131
+
132
+ worker.once('error', error => {
133
+ cleanup();
134
+ reject(error);
135
+ });
136
+ worker.once('exit', (code, signal) => {
137
+ cleanup();
138
+ resolve(exitCodeFor(code, requestedSignal ?? signal));
139
+ });
140
+ });
141
+ };
142
+
143
+ export const run = async (
144
+ args = process.argv.slice(2),
145
+ {
146
+ detectVersion = detectPearMajor,
147
+ runPearV2 = runWithPearV2,
148
+ runPearV3 = runWithPearV3
149
+ } = {}
150
+ ) => {
151
+ const major = detectVersion();
152
+
153
+ if (major !== null && major < 3) {
154
+ return runPearV2(args);
155
+ }
156
+
157
+ return runPearV3(args);
158
+ };
159
+
160
+ const isMainModule = process.argv[1] &&
161
+ path.resolve(process.argv[1]) === fileURLToPath(import.meta.url);
162
+
163
+ if (isMainModule) {
164
+ try {
165
+ process.exitCode = await run();
166
+ } catch (error) {
167
+ console.error(`MainSettlementBus Pear runner: ${error.message}`);
168
+ process.exitCode = 1;
169
+ }
170
+ }
@@ -1,19 +1,69 @@
1
1
  import { createConfig, ENV } from './env.js';
2
2
 
3
- const getArguments = () => {
4
- const pearApp = typeof Pear !== 'undefined' ? (Pear.app ?? Pear.config) : undefined;
5
- const runtimeArgs = typeof process !== 'undefined' ? process.argv.slice(2) : [];
6
- return pearApp?.args ?? runtimeArgs;
3
+ export const getArguments = (runtime = globalThis) => {
4
+ const pearRuntime = runtime.Pear;
5
+ const pearApp = pearRuntime?.app ?? pearRuntime?.config;
6
+ const bareArgs = runtime.Bare?.argv?.slice(2);
7
+ const processArgs = runtime.process?.argv?.slice(2) ?? [];
8
+ return pearApp?.args ?? bareArgs ?? processArgs;
9
+ };
10
+
11
+ const getOptionValue = (args, flag) => {
12
+ const index = args.indexOf(flag);
13
+ if (index === -1) {
14
+ return undefined;
15
+ }
16
+
17
+ const value = args[index + 1];
18
+ if (value === undefined || String(value).startsWith('--')) {
19
+ throw new Error(`MainSettlementBus CLI: ${flag} requires a value.`);
20
+ }
21
+
22
+ return value;
23
+ };
24
+
25
+ const parseNonEmptyStringOption = (args, flag) => {
26
+ const value = getOptionValue(args, flag);
27
+ if (value === undefined) {
28
+ return undefined;
29
+ }
30
+
31
+ if (typeof value !== 'string' || value.trim().length === 0) {
32
+ throw new Error(`MainSettlementBus CLI: ${flag} must be a non-empty string.`);
33
+ }
34
+
35
+ return value;
36
+ };
37
+
38
+ const parsePortOption = (args) => {
39
+ const value = getOptionValue(args, '--port');
40
+ if (value === undefined) {
41
+ return undefined;
42
+ }
43
+
44
+ if (!/^\d+$/.test(value)) {
45
+ throw new Error('MainSettlementBus CLI: --port must be an integer in range 1-65535.');
46
+ }
47
+
48
+ const port = Number(value);
49
+ if (!Number.isInteger(port) || port < 1 || port > 65535) {
50
+ throw new Error('MainSettlementBus CLI: --port must be an integer in range 1-65535.');
51
+ }
52
+
53
+ return port;
7
54
  };
8
55
 
9
56
  export const resolveEnvironment = (args = []) => {
10
- const networkIndex = args.indexOf('--network');
11
- const network = (networkIndex !== -1 && args[networkIndex + 1]) ? args[networkIndex + 1] : undefined;
57
+ const network = getOptionValue(args, '--network');
58
+ if (network === undefined) {
59
+ return ENV.MAINNET;
60
+ }
12
61
 
13
62
  if (network === ENV.MAINNET) return ENV.MAINNET;
14
63
  if (network === ENV.DEVELOPMENT) return ENV.DEVELOPMENT;
15
64
  if (network === ENV.TESTNET1 || network === 'testnet') return ENV.TESTNET1;
16
- return ENV.MAINNET;
65
+
66
+ throw new Error('MainSettlementBus CLI: --network must be one of: mainnet, development, testnet.');
17
67
  };
18
68
 
19
69
  export const isRpcEnabled = () => {
@@ -25,12 +75,9 @@ export const resolveConfig = () => {
25
75
  const args = getArguments();
26
76
  const runRpc = isRpcEnabled();
27
77
  const selectedEnv = resolveEnvironment(args);
28
- const storesDirectoryIndex = args.indexOf('--stores-directory');
29
- const storesDirectory = (storesDirectoryIndex !== -1 && args[storesDirectoryIndex + 1]) ? args[storesDirectoryIndex + 1] : undefined;
30
- const hostIndex = args.indexOf('--host');
31
- const host = (hostIndex !== -1 && args[hostIndex + 1]) ? args[hostIndex + 1] : undefined;
32
- const portIndex = args.indexOf('--port');
33
- const port = (portIndex !== -1 && args[portIndex + 1]) ? parseInt(args[portIndex + 1], 10) : undefined;
78
+ const storesDirectory = parseNonEmptyStringOption(args, '--stores-directory');
79
+ const host = runRpc ? parseNonEmptyStringOption(args, '--host') : undefined;
80
+ const port = runRpc ? parsePortOption(args) : undefined;
34
81
 
35
82
  const rpc = {
36
83
  storesDirectory,
@@ -12,9 +12,12 @@ export class Config {
12
12
  this.#validate(options, config)
13
13
  this.#options = options
14
14
  this.#config = config
15
- this.#bootstrap = b4a.from(this.#options.bootstrap || this.#config.bootstrap, 'hex')
16
- // Ensure a 32-byte channel buffer (repeat-fill from string/Buffer if provided)
17
- this.#channel = b4a.alloc(32).fill(this.#options.channel || this.#config.channel)
15
+ this.#bootstrap = this.#normalizeBootstrap(
16
+ isDefined(options.bootstrap) ? options.bootstrap : config.bootstrap
17
+ )
18
+ this.#channel = this.#normalizeChannel(
19
+ isDefined(options.channel) ? options.channel : config.channel
20
+ )
18
21
  }
19
22
 
20
23
  get addressLength() {
@@ -46,10 +49,6 @@ export class Config {
46
49
  return this.#config.dhtBootstrap
47
50
  }
48
51
 
49
- get derivationPath() {
50
- return this.#config.derivationPath
51
- }
52
-
53
52
  get disableRateLimit() {
54
53
  if (this.#isOverriden('disableRateLimit')) return !!this.#options.disableRateLimit
55
54
  return !!this.#config.disableRateLimit
@@ -89,8 +88,12 @@ export class Config {
89
88
  return _.endsWith(this.storesDirectory, '/admin')
90
89
  }
91
90
 
91
+ get keyPairDirectoryPath() {
92
+ return `${this.storesFullPath}/db`
93
+ }
94
+
92
95
  get keyPairPath() {
93
- return `${this.storesFullPath}/db/keypair.json`
96
+ return `${this.keyPairDirectoryPath}/keypair.json`
94
97
  }
95
98
 
96
99
  get maxRetries() {
@@ -133,11 +136,6 @@ export class Config {
133
136
  return this.#config.processIntervalMs
134
137
  }
135
138
 
136
- get maxPartialTxPayloadByteSize() {
137
- if (this.#isOverriden('maxPartialTxPayloadByteSize')) return this.#options.maxPartialTxPayloadByteSize
138
- return this.#config.maxPartialTxPayloadByteSize
139
- }
140
-
141
139
  get transactionPoolSize() {
142
140
  if (this.#isOverriden('transactionPoolSize')) return this.#options.transactionPoolSize
143
141
  return this.#config.transactionPoolSize
@@ -198,17 +196,168 @@ export class Config {
198
196
  if (this.#isOverriden('rateLimitMaxTransactionsPerSecond')) return this.#options.rateLimitMaxTransactionsPerSecond
199
197
  return this.#config.rateLimitMaxTransactionsPerSecond
200
198
  }
199
+
200
+ get pendingRequestTimeout() {
201
+ return this.#config.pendingRequestTimeout
202
+ }
203
+
204
+ get txCommitTimeout() {
205
+ return this.#config.txCommitTimeout
206
+ }
207
+
208
+ get txPoolSize() {
209
+ return this.#config.txPoolSize
210
+ }
211
+
212
+ get validatorHealthCheckInterval() {
213
+ if (this.#isOverriden('validatorHealthCheckInterval')) return this.#options.validatorHealthCheckInterval
214
+ return this.#config.validatorHealthCheckInterval
215
+ }
216
+
217
+ get maxPendingRequestsInPendingRequestsService() {
218
+ return this.#config.maxPendingRequestsInPendingRequestsService
219
+ }
220
+
221
+ get debug() {
222
+ return this.#config.debug
223
+ }
224
+
225
+ get derivationPath() {
226
+ return this.#config.derivationPath
227
+ }
228
+
229
+ get pollInterval() {
230
+ if (this.#isOverriden('pollInterval')) return this.#options.pollInterval
231
+ return this.#config.pollInterval
232
+ }
233
+
234
+ get adminCacheTTL() {
235
+ if (this.#isOverriden('adminCacheTTL')) return this.#options.adminCacheTTL
236
+ return this.#config.adminCacheTTL
237
+ }
238
+
239
+ get bootstrapTimeout() {
240
+ if (this.#isOverriden('bootstrapTimeout')) return this.#options.bootstrapTimeout
241
+ return this.#config.bootstrapTimeout
242
+ }
243
+
244
+ get writersShortCacheTTL() {
245
+ if (this.#isOverriden('writersShortCacheTTL')) return this.#options.writersShortCacheTTL
246
+ return this.#config.writersShortCacheTTL
247
+ }
248
+
249
+ get writersLongCacheTTL() {
250
+ if (this.#isOverriden('writersLongCacheTTL')) return this.#options.writersLongCacheTTL
251
+ return this.#config.writersLongCacheTTL
252
+ }
253
+
254
+ get validatorConnectionAttemptDelay() {
255
+ if (this.#isOverriden('validatorConnectionAttemptDelay')) return this.#options.validatorConnectionAttemptDelay
256
+ return this.#config.validatorConnectionAttemptDelay
257
+ }
201
258
 
202
- // Most of these properties are boolean
203
259
  #isOverriden(prop) {
204
260
  return this.#options.hasOwnProperty(prop) && isDefined(this.#options[prop])
205
261
  }
206
262
 
263
+ #normalizeBootstrap(bootstrap) {
264
+ if (b4a.isBuffer(bootstrap)) {
265
+ return b4a.from(bootstrap)
266
+ }
267
+
268
+ return b4a.from(bootstrap, 'hex')
269
+ }
270
+
271
+ #normalizeChannel(channel) {
272
+ return b4a.alloc(32).fill(channel)
273
+ }
274
+
275
+ #validateStringOverride(field, value) {
276
+ if (typeof value !== 'string' || value.trim().length === 0) {
277
+ throw new Error(`MainSettlementBus Config: ${field} must be a non-empty string.`);
278
+ }
279
+ }
280
+
281
+ #validatePortOverride(port) {
282
+ if (!Number.isInteger(port) || port < 1 || port > 65535) {
283
+ throw new Error('MainSettlementBus Config: port must be an integer in range 1-65535.');
284
+ }
285
+ }
286
+
287
+ #validateBootstrapOverride(bootstrap) {
288
+ if (b4a.isBuffer(bootstrap)) {
289
+ if (bootstrap.length !== 32) {
290
+ throw new Error('MainSettlementBus Config: bootstrap must be a 32-byte hex string or Buffer.');
291
+ }
292
+ return;
293
+ }
294
+
295
+ if (typeof bootstrap !== 'string' || !/^[0-9a-fA-F]{64}$/.test(bootstrap)) {
296
+ throw new Error('MainSettlementBus Config: bootstrap must be a 32-byte hex string or Buffer.');
297
+ }
298
+ }
299
+
300
+ #validateChannelOverride(channel) {
301
+ if (!(typeof channel === 'string' || b4a.isBuffer(channel))) {
302
+ throw new Error('MainSettlementBus Config: channel must be a string or Buffer.');
303
+ }
304
+
305
+ const length = b4a.isBuffer(channel) ? channel.length : b4a.from(channel).length
306
+
307
+ if (length === 0 || length > 32) {
308
+ throw new Error('MainSettlementBus Config: channel must be 1-32 bytes long.');
309
+ }
310
+ }
311
+
312
+ #validateDhtBootstrapOverride(dhtBootstrap) {
313
+ if (!Array.isArray(dhtBootstrap) || dhtBootstrap.length === 0) {
314
+ throw new Error('MainSettlementBus Config: dhtBootstrap must be a non-empty array of strings.');
315
+ }
316
+
317
+ for (const entry of dhtBootstrap) {
318
+ if (typeof entry !== 'string' || entry.trim().length === 0) {
319
+ throw new Error('MainSettlementBus Config: dhtBootstrap entries must be non-empty strings.');
320
+ }
321
+ }
322
+ }
323
+
207
324
  #validate(options, config) {
325
+ if (options === null || typeof options !== 'object') {
326
+ throw new Error('MainSettlementBus Config: options must be an object.');
327
+ }
328
+
329
+ if (config === null || typeof config !== 'object') {
330
+ throw new Error('MainSettlementBus Config: config must be an object.');
331
+ }
332
+
208
333
  if (!options.channel && !config.channel) {
209
334
  throw new Error(
210
335
  "MainSettlementBus: Channel is required. Application cannot start without channel."
211
336
  );
212
337
  }
338
+
339
+ if (isDefined(options.bootstrap)) {
340
+ this.#validateBootstrapOverride(options.bootstrap);
341
+ }
342
+
343
+ if (isDefined(options.channel)) {
344
+ this.#validateChannelOverride(options.channel);
345
+ }
346
+
347
+ if (isDefined(options.storesDirectory)) {
348
+ this.#validateStringOverride('storesDirectory', options.storesDirectory);
349
+ }
350
+
351
+ if (isDefined(options.host)) {
352
+ this.#validateStringOverride('host', options.host);
353
+ }
354
+
355
+ if (isDefined(options.port)) {
356
+ this.#validatePortOverride(options.port);
357
+ }
358
+
359
+ if (isDefined(options.dhtBootstrap)) {
360
+ this.#validateDhtBootstrapOverride(options.dhtBootstrap);
361
+ }
213
362
  }
214
363
  }