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
@@ -1,82 +0,0 @@
1
- import { test } from 'brittle';
2
- import b4a from 'b4a';
3
- import { eventFlush } from '../../../../helpers/autobaseTestHelpers.js';
4
- import nodeEntryUtils from '../../../../../src/core/state/utils/nodeEntry.js';
5
- import { toTerm } from '../../../../../src/core/state/utils/balance.js';
6
- import { ZERO_WK } from '../../../../../src/utils/buffer.js';
7
- import { safeDecodeApplyOperation } from '../../../../../src/utils/protobuf/operationHelpers.js';
8
- import setupBalanceInitializationScenario, {
9
- buildBalanceInitializationPayload
10
- } from './balanceInitializationScenarioHelpers.js';
11
-
12
- export default function balanceInitializationHappyPathScenario() {
13
- test('State.apply balanceInitialization credits reader nodes with requested balances - happy path', async t => {
14
- const recipientCount = 2;
15
- const networkContext = await setupBalanceInitializationScenario(t, recipientCount);
16
- const adminNode = networkContext.adminBootstrap;
17
- const readerNodes = networkContext.peers.slice(1);
18
- const recipients = [];
19
-
20
- for (let i = 0; i < recipientCount; i++) {
21
- const peer = readerNodes[i];
22
- recipients.push({
23
- peer,
24
- balance: i === 0 ? toTerm(25n) : toTerm(75n)
25
- });
26
- }
27
-
28
- const appliedTxHashes = [];
29
-
30
- for (const recipient of recipients) {
31
- const payload = await buildBalanceInitializationPayload(
32
- networkContext,
33
- recipient.peer.wallet.address,
34
- recipient.balance
35
- );
36
- const decodedPayload = safeDecodeApplyOperation(payload);
37
- appliedTxHashes.push(decodedPayload.bio.tx.toString('hex'));
38
-
39
- await adminNode.base.append(payload);
40
- await adminNode.base.update();
41
- await eventFlush();
42
- }
43
-
44
- for (const recipient of recipients) {
45
- await assertRecipientBalance(
46
- t,
47
- adminNode.base,
48
- recipient.peer.wallet.address,
49
- recipient.balance
50
- );
51
- }
52
-
53
- for (const txHashHex of appliedTxHashes) {
54
- const txEntry = await adminNode.base.view.get(txHashHex);
55
- t.ok(txEntry, 'operation hash stored to prevent replays');
56
- }
57
-
58
- await networkContext.sync();
59
-
60
- for (const recipient of recipients) {
61
- await assertRecipientBalance(
62
- t,
63
- recipient.peer.base,
64
- recipient.peer.wallet.address,
65
- recipient.balance
66
- );
67
- }
68
- });
69
- }
70
-
71
- async function assertRecipientBalance(t, base, address, expectedBalance) {
72
- const nodeEntryRecord = await base.view.get(address);
73
- t.ok(nodeEntryRecord, 'recipient node entry exists');
74
-
75
- const decodedEntry = nodeEntryUtils.decode(nodeEntryRecord.value);
76
- t.ok(decodedEntry, 'recipient node entry decodes');
77
- t.is(decodedEntry.isWriter, false, 'recipient not flagged as writer');
78
- t.is(decodedEntry.isIndexer, false, 'recipient not flagged as indexer');
79
- t.ok(b4a.equals(decodedEntry.wk, ZERO_WK), 'recipient writing key remains unset');
80
- t.ok(b4a.equals(decodedEntry.balance, expectedBalance), 'recipient balance is set');
81
- t.ok(b4a.equals(decodedEntry.stakedBalance, toTerm(0n)), 'recipient staked balance is zero');
82
- }
@@ -1,111 +0,0 @@
1
- import b4a from 'b4a';
2
- import { setupStateNetwork } from '../../../../helpers/StateNetworkFactory.js';
3
- import {
4
- seedBootstrapIndexer,
5
- defaultOpenHyperbeeView,
6
- deriveIndexerSequenceState,
7
- eventFlush
8
- } from '../../../../helpers/autobaseTestHelpers.js';
9
- import { applyStateMessageFactory } from '../../../../../src/messages/state/applyStateMessageFactory.js';
10
- import { AUTOBASE_VALUE_ENCODING } from '../../../../../src/utils/constants.js';
11
- import { toTerm } from '../../../../../src/core/state/utils/balance.js';
12
- import { safeDecodeApplyOperation, safeEncodeApplyOperation } from '../../../../../src/utils/protobuf/operationHelpers.js';
13
- import { buildAddAdminRequesterPayload } from '../addAdmin/addAdminScenarioHelpers.js';
14
- import { config } from '../../../../helpers/config.js';
15
-
16
- export async function setupBalanceInitializationScenario(t, { recipientCount = 2 } = {}) {
17
- const context = await setupStateNetwork({
18
- nodes: Math.max(recipientCount + 1, 2),
19
- valueEncoding: AUTOBASE_VALUE_ENCODING,
20
- open: defaultOpenHyperbeeView
21
- });
22
-
23
- seedBootstrapIndexer(context);
24
-
25
- t.teardown(async () => {
26
- await context.teardown();
27
- });
28
-
29
- await bootstrapAdmin(context);
30
- return context;
31
- }
32
-
33
- async function bootstrapAdmin(context) {
34
- const adminNode = context.adminBootstrap;
35
- const addAdminPayload = await buildAddAdminRequesterPayload(context);
36
-
37
- await adminNode.base.append(addAdminPayload);
38
- await adminNode.base.update();
39
- await eventFlush();
40
- }
41
-
42
- export async function buildBalanceInitializationPayload(context, recipientAddress, balanceBuffer) {
43
- const adminNode = context.adminBootstrap;
44
- const txValidity = await deriveIndexerSequenceState(adminNode.base);
45
- const payload = await applyStateMessageFactory(adminNode.wallet, config)
46
- .buildCompleteBalanceInitializationMessage(
47
- adminNode.wallet.address,
48
- recipientAddress,
49
- balanceBuffer,
50
- txValidity
51
- );
52
- return safeEncodeApplyOperation(payload);
53
- }
54
-
55
- export async function buildBalanceInitializationPayloadWithTxValidity({
56
- context,
57
- validPayload,
58
- mutatedTxValidity
59
- }) {
60
- const decoded = safeDecodeApplyOperation(validPayload);
61
- if (!decoded?.bio?.ia || !decoded?.bio?.am) {
62
- return validPayload;
63
- }
64
-
65
- const adminNode = context.adminBootstrap;
66
- const payload = await applyStateMessageFactory(adminNode.wallet, config)
67
- .buildCompleteBalanceInitializationMessage(
68
- adminNode.wallet.address,
69
- decoded.bio.ia,
70
- decoded.bio.am,
71
- mutatedTxValidity
72
- );
73
- return safeEncodeApplyOperation(payload);
74
- }
75
-
76
- export async function buildDefaultBalanceInitializationPayload(context) {
77
- const recipientPeer = selectRecipientPeer(context);
78
- return buildBalanceInitializationPayload(context, recipientPeer.wallet.address, toTerm(25n));
79
- }
80
-
81
- export async function assertBalanceInitializationFailureState(t, context, { skipSync = false } = {}) {
82
- const adminNode = context.adminBootstrap;
83
- const recipientPeer = selectRecipientPeer(context);
84
-
85
- await assertRecipientAbsent(t, adminNode.base, recipientPeer.wallet.address);
86
-
87
- if (!skipSync) {
88
- await context.sync();
89
- await assertRecipientAbsent(t, recipientPeer.base, recipientPeer.wallet.address);
90
- }
91
- }
92
-
93
- export function mutateBalanceInitializationPayloadForInvalidSchema(t, payload) {
94
- const decodedPayload = safeDecodeApplyOperation(payload);
95
- t.ok(decodedPayload, 'fixtures decode');
96
-
97
- decodedPayload.bio.tx = b4a.alloc(decodedPayload.bio.tx.length);
98
- return safeEncodeApplyOperation(decodedPayload);
99
- }
100
-
101
- function selectRecipientPeer(context, offset = 0) {
102
- const readerPeers = context.peers.slice(1);
103
- return readerPeers[Math.min(offset, readerPeers.length - 1)];
104
- }
105
-
106
- async function assertRecipientAbsent(t, base, address) {
107
- const nodeEntryRecord = await base.view.get(address);
108
- t.is(nodeEntryRecord, null, 'recipient node entry remains absent');
109
- }
110
-
111
- export default setupBalanceInitializationScenario;
@@ -1,45 +0,0 @@
1
- import { eventFlush } from '../../../../helpers/autobaseTestHelpers.js';
2
- import OperationValidationScenarioBase from '../common/base/OperationValidationScenarioBase.js';
3
- import { safeDecodeApplyOperation, safeEncodeApplyOperation } from '../../../../../src/utils/protobuf/operationHelpers.js';
4
- import setupBalanceInitializationScenario, {
5
- buildDefaultBalanceInitializationPayload,
6
- assertBalanceInitializationFailureState
7
- } from './balanceInitializationScenarioHelpers.js';
8
-
9
- export default function balanceInitializationInvalidAmountScenario() {
10
- new OperationValidationScenarioBase({
11
- title: 'State.apply balanceInitialization aborts when amount buffer is malformed',
12
- setupScenario: setupBalanceInitializationScenario,
13
- buildValidPayload: buildDefaultBalanceInitializationPayload,
14
- mutatePayload: truncateAmountBuffer,
15
- applyInvalidPayload: bypassSchemaAndApply,
16
- assertStateUnchanged: assertBalanceInitializationFailureState,
17
- expectedLogs: ['Invalid balance.']
18
- }).performScenario();
19
- }
20
-
21
- function truncateAmountBuffer(t, payload) {
22
- const decodedPayload = safeDecodeApplyOperation(payload);
23
- t.ok(decodedPayload, 'fixtures decode');
24
-
25
- decodedPayload.bio.am = decodedPayload.bio.am.slice(0, 8);
26
- return safeEncodeApplyOperation(decodedPayload);
27
- }
28
-
29
- async function bypassSchemaAndApply(context, invalidPayload) {
30
- const adminNode = context.adminBootstrap;
31
- if (!adminNode) {
32
- throw new Error('Invalid amount scenario requires admin bootstrap context.');
33
- }
34
-
35
- const originalValidator = adminNode.state.check.validateBalanceInitialization;
36
- adminNode.state.check.validateBalanceInitialization = () => true;
37
-
38
- try {
39
- await adminNode.base.append(invalidPayload);
40
- await adminNode.base.update();
41
- await eventFlush();
42
- } finally {
43
- adminNode.state.check.validateBalanceInitialization = originalValidator;
44
- }
45
- }
@@ -1,82 +0,0 @@
1
- import b4a from 'b4a';
2
- import OperationValidationScenarioBase from '../common/base/OperationValidationScenarioBase.js';
3
- import { eventFlush } from '../../../../helpers/autobaseTestHelpers.js';
4
- import { safeDecodeApplyOperation } from '../../../../../src/utils/protobuf/operationHelpers.js';
5
- import addressUtils from '../../../../../src/core/state/utils/address.js';
6
- import setupBalanceInitializationScenario, {
7
- buildDefaultBalanceInitializationPayload,
8
- assertBalanceInitializationFailureState
9
- } from './balanceInitializationScenarioHelpers.js';
10
- import { config } from '../../../../helpers/config.js';
11
-
12
- export default function balanceInitializationNodeEntryBalanceUpdateFailureScenario() {
13
- new OperationValidationScenarioBase({
14
- title: 'State.apply balanceInitialization aborts when updating existing node entry balance fails',
15
- setupScenario: setupBalanceInitializationScenario,
16
- buildValidPayload: buildDefaultBalanceInitializationPayload,
17
- mutatePayload: (_t, payload) => payload,
18
- applyInvalidPayload: applyWithCorruptExistingNodeEntry,
19
- assertStateUnchanged: (t, context) =>
20
- assertBalanceInitializationFailureState(t, context, { skipSync: true }),
21
- expectedLogs: ['Failed to set node entry balance.']
22
- }).performScenario();
23
- }
24
-
25
- async function applyWithCorruptExistingNodeEntry(context, payload, _t, validPayload) {
26
- const node = context.adminBootstrap;
27
- if (!node?.base) {
28
- throw new Error('Balance update failure scenario requires an admin bootstrap node.');
29
- }
30
-
31
- const decoded = safeDecodeApplyOperation(validPayload ?? payload);
32
- const targetAddressBuffer = decoded?.bio?.ia;
33
- const targetAddressString = targetAddressBuffer
34
- ? addressUtils.bufferToAddress(targetAddressBuffer, config.addressPrefix)
35
- : null;
36
- if (!targetAddressString || !targetAddressBuffer) {
37
- throw new Error('Failed to resolve recipient address for balance update failure scenario.');
38
- }
39
-
40
- const originalApply = node.base._handlers.apply;
41
- node.base._handlers.apply = async function patchedApply(nodes, view, baseCtx) {
42
- const originalBatch = view.batch;
43
- view.batch = function patchedBatch(...args) {
44
- const batch = originalBatch.apply(this, args);
45
- if (!batch?.get) return batch;
46
-
47
- const originalGet = batch.get.bind(batch);
48
- batch.get = async key => {
49
- if (isTargetKey(key, targetAddressString, targetAddressBuffer)) {
50
- return { key, value: b4a.alloc(1) };
51
- }
52
- return originalGet(key);
53
- };
54
-
55
- return batch;
56
- };
57
-
58
- try {
59
- return await originalApply.call(this, nodes, view, baseCtx);
60
- } finally {
61
- view.batch = originalBatch;
62
- }
63
- };
64
-
65
- try {
66
- await node.base.append(payload);
67
- await node.base.update();
68
- await eventFlush();
69
- } finally {
70
- node.base._handlers.apply = originalApply;
71
- }
72
- }
73
-
74
- function isTargetKey(key, targetAddressString, targetAddressBuffer) {
75
- if (typeof key === 'string') {
76
- return key === targetAddressString;
77
- }
78
- if (b4a.isBuffer(key) && targetAddressBuffer) {
79
- return b4a.equals(key, targetAddressBuffer);
80
- }
81
- return false;
82
- }
@@ -1,189 +0,0 @@
1
- import setupBalanceInitializationScenario, {
2
- buildDefaultBalanceInitializationPayload,
3
- assertBalanceInitializationFailureState,
4
- mutateBalanceInitializationPayloadForInvalidSchema,
5
- buildBalanceInitializationPayloadWithTxValidity
6
- } from './balanceInitializationScenarioHelpers.js';
7
- import balanceInitializationHappyPathScenario from './balanceInitializationHappyPathScenario.js';
8
- import balanceInitializationInvalidAmountScenario from './invalidAmountScenario.js';
9
- import balanceInitializationNodeEntryBalanceUpdateFailureScenario from './nodeEntryBalanceUpdateFailureScenario.js';
10
- import RequesterAddressValidationScenario from '../common/requesterAddressValidationScenario.js';
11
- import InvalidPayloadValidationScenario from '../common/payload-structure/invalidPayloadValidationScenario.js';
12
- import InvalidAddressValidationScenario from '../common/payload-structure/invalidAddressValidationScenario.js';
13
- import createAddressWithInvalidPublicKeyScenario from '../common/payload-structure/addressWithInvalidPublicKeyScenario.js';
14
- import createRequesterPublicKeyValidationScenario from '../common/requesterPublicKeyValidationScenario.js';
15
- import InvalidHashValidationScenario from '../common/payload-structure/invalidHashValidationScenario.js';
16
- import InvalidSignatureValidationScenario, { SignatureMutationStrategy } from '../common/payload-structure/invalidSignatureValidationScenario.js';
17
- import InvalidMessageComponentValidationScenario, { MessageComponentStrategy } from '../common/invalidMessageComponentValidationScenario.js';
18
- import InitializationDisabledScenario from '../common/payload-structure/initializationDisabledScenario.js';
19
- import AdminEntryDecodeFailureScenario from '../common/access-control/adminEntryDecodeFailureScenario.js';
20
- import AdminOnlyGuardScenario from '../common/access-control/adminOnlyGuardScenario.js';
21
- import AdminConsistencyMismatchScenario from '../common/access-control/adminConsistencyMismatchScenario.js';
22
- import IndexerSequenceStateInvalidScenario from '../common/indexer/indexerSequenceStateInvalidScenario.js';
23
- import TransactionValidityMismatchScenario from '../common/transactionValidityMismatchScenario.js';
24
-
25
- balanceInitializationHappyPathScenario();
26
-
27
- new InvalidPayloadValidationScenario({
28
- title: 'State.apply balanceInitialization rejects payloads that fail schema validation',
29
- setupScenario: setupBalanceInitializationScenario,
30
- buildValidPayload: buildDefaultBalanceInitializationPayload,
31
- mutatePayload: mutateBalanceInitializationPayloadForInvalidSchema,
32
- assertStateUnchanged: assertBalanceInitializationFailureState,
33
- expectedLogs: ['Contract schema validation failed.']
34
- }).performScenario();
35
-
36
- new RequesterAddressValidationScenario({
37
- title: 'State.apply balanceInitialization requester address is invalid',
38
- setupScenario: setupBalanceInitializationScenario,
39
- buildValidPayload: buildDefaultBalanceInitializationPayload,
40
- assertStateUnchanged: assertBalanceInitializationFailureState,
41
- expectedLogs: ['Requester address is invalid.']
42
- }).performScenario();
43
-
44
- createRequesterPublicKeyValidationScenario({
45
- title: 'State.apply balanceInitialization requester public key is invalid',
46
- setupScenario: setupBalanceInitializationScenario,
47
- buildValidPayload: buildDefaultBalanceInitializationPayload,
48
- assertStateUnchanged: assertBalanceInitializationFailureState,
49
- expectedLogs: ['Error while decoding requester public key.']
50
- }).performScenario();
51
-
52
- new InvalidAddressValidationScenario({
53
- title: 'State.apply balanceInitialization recipient address is invalid',
54
- setupScenario: setupBalanceInitializationScenario,
55
- buildValidPayload: buildDefaultBalanceInitializationPayload,
56
- assertStateUnchanged: assertBalanceInitializationFailureState,
57
- addressPath: ['bio', 'ia'],
58
- expectedLogs: ['Recipient address is invalid.']
59
- }).performScenario();
60
-
61
- createAddressWithInvalidPublicKeyScenario({
62
- title: 'State.apply balanceInitialization recipient public key is invalid',
63
- setupScenario: setupBalanceInitializationScenario,
64
- buildValidPayload: buildDefaultBalanceInitializationPayload,
65
- assertStateUnchanged: assertBalanceInitializationFailureState,
66
- addressPath: ['bio', 'ia'],
67
- expectedLogs: ['Failed to decode recipient public key.']
68
- }).performScenario();
69
-
70
- balanceInitializationInvalidAmountScenario();
71
-
72
- new InitializationDisabledScenario({
73
- title: 'State.apply balanceInitialization aborts when initialization is disabled',
74
- setupScenario: setupBalanceInitializationScenario,
75
- buildValidPayload: buildDefaultBalanceInitializationPayload,
76
- assertStateUnchanged: assertBalanceInitializationFailureState,
77
- expectedLogs: ['Balance initialization is disabled.']
78
- }).performScenario();
79
-
80
- new AdminEntryDecodeFailureScenario({
81
- title: 'State.apply balanceInitialization aborts when admin entry cannot be decoded',
82
- setupScenario: setupBalanceInitializationScenario,
83
- buildValidPayload: buildDefaultBalanceInitializationPayload,
84
- assertStateUnchanged: (t, context) =>
85
- assertBalanceInitializationFailureState(t, context, { skipSync: true }),
86
- expectedLogs: ['Failed to decode admin entry.']
87
- }).performScenario();
88
-
89
- new AdminOnlyGuardScenario({
90
- title: 'State.apply balanceInitialization rejects non-admin nodes',
91
- setupScenario: setupBalanceInitializationScenario,
92
- buildValidPayload: buildDefaultBalanceInitializationPayload,
93
- assertStateUnchanged: (t, context) =>
94
- assertBalanceInitializationFailureState(t, context, { skipSync: true }),
95
- expectedLogs: ['Node is not allowed to perform this operation. (ADMIN ONLY)']
96
- }).performScenario();
97
-
98
- new AdminConsistencyMismatchScenario({
99
- title: 'State.apply balanceInitialization rejects when admin key mismatch occurs',
100
- setupScenario: setupBalanceInitializationScenario,
101
- buildValidPayload: buildDefaultBalanceInitializationPayload,
102
- assertStateUnchanged: (t, context) =>
103
- assertBalanceInitializationFailureState(t, context, { skipSync: true }),
104
- expectedLogs: ['System admin and node public keys do not match.']
105
- }).performScenario();
106
-
107
-
108
- new InvalidHashValidationScenario({
109
- title: 'State.apply balanceInitialization requester message hash mismatch',
110
- setupScenario: setupBalanceInitializationScenario,
111
- buildValidPayload: buildDefaultBalanceInitializationPayload,
112
- assertStateUnchanged: assertBalanceInitializationFailureState,
113
- expectedLogs: ['Message hash does not match the tx_hash.']
114
- }).performScenario();
115
-
116
- new InvalidSignatureValidationScenario({
117
- title: 'State.apply balanceInitialization requester signature is invalid (foreign signature)',
118
- setupScenario: setupBalanceInitializationScenario,
119
- buildValidPayload: buildDefaultBalanceInitializationPayload,
120
- assertStateUnchanged: assertBalanceInitializationFailureState,
121
- expectedLogs: ['Failed to verify message signature.']
122
- }).performScenario();
123
-
124
- new InvalidSignatureValidationScenario({
125
- title: 'State.apply balanceInitialization requester signature is invalid (type mismatch)',
126
- setupScenario: setupBalanceInitializationScenario,
127
- buildValidPayload: buildDefaultBalanceInitializationPayload,
128
- assertStateUnchanged: assertBalanceInitializationFailureState,
129
- strategy: SignatureMutationStrategy.TYPE_MISMATCH,
130
- expectedLogs: ['Failed to verify message signature.']
131
- }).performScenario();
132
-
133
- new InvalidSignatureValidationScenario({
134
- title: 'State.apply balanceInitialization requester signature is invalid (zero fill)',
135
- setupScenario: setupBalanceInitializationScenario,
136
- buildValidPayload: buildDefaultBalanceInitializationPayload,
137
- assertStateUnchanged: assertBalanceInitializationFailureState,
138
- strategy: SignatureMutationStrategy.ZERO_FILL,
139
- expectedLogs: ['Failed to verify message signature.']
140
- }).performScenario();
141
-
142
- new InvalidSignatureValidationScenario({
143
- title: 'State.apply balanceInitialization amount signature is invalid',
144
- setupScenario: setupBalanceInitializationScenario,
145
- buildValidPayload: buildDefaultBalanceInitializationPayload,
146
- assertStateUnchanged: assertBalanceInitializationFailureState,
147
- strategy: SignatureMutationStrategy.AMOUNT_SIGNATURE,
148
- expectedLogs: ['Message hash does not match the tx_hash.']
149
- }).performScenario();
150
-
151
- new IndexerSequenceStateInvalidScenario({
152
- title: 'State.apply balanceInitialization rejects payloads when indexer sequence state is invalid',
153
- setupScenario: setupBalanceInitializationScenario,
154
- buildValidPayload: buildDefaultBalanceInitializationPayload,
155
- assertStateUnchanged: (t, context) =>
156
- assertBalanceInitializationFailureState(t, context, { skipSync: true }),
157
- expectedLogs: ['Indexer sequence state is invalid.']
158
- }).performScenario();
159
-
160
- new TransactionValidityMismatchScenario({
161
- title: 'State.apply balanceInitialization rejects payload when tx validity mismatches indexer state',
162
- setupScenario: setupBalanceInitializationScenario,
163
- buildValidPayload: buildDefaultBalanceInitializationPayload,
164
- assertStateUnchanged: assertBalanceInitializationFailureState,
165
- txValidityPath: ['bio', 'txv'],
166
- rebuildPayloadWithTxValidity: ({ context, validPayload, mutatedTxValidity }) =>
167
- buildBalanceInitializationPayloadWithTxValidity({ context, validPayload, mutatedTxValidity }),
168
- expectedLogs: ['Transaction was not executed.']
169
- }).performScenario();
170
-
171
- new InvalidMessageComponentValidationScenario({
172
- title: 'State.apply balanceInitialization transaction validity mismatch',
173
- setupScenario: setupBalanceInitializationScenario,
174
- buildValidPayload: buildDefaultBalanceInitializationPayload,
175
- assertStateUnchanged: assertBalanceInitializationFailureState,
176
- strategy: MessageComponentStrategy.TX_VALIDITY,
177
- expectedLogs: ['Message hash does not match the tx_hash.']
178
- }).performScenario();
179
-
180
- new InvalidMessageComponentValidationScenario({
181
- title: 'State.apply balanceInitialization requester nonce mismatch',
182
- setupScenario: setupBalanceInitializationScenario,
183
- buildValidPayload: buildDefaultBalanceInitializationPayload,
184
- assertStateUnchanged: assertBalanceInitializationFailureState,
185
- strategy: MessageComponentStrategy.NONCE,
186
- expectedLogs: ['Message hash does not match the tx_hash.']
187
- }).performScenario();
188
-
189
- balanceInitializationNodeEntryBalanceUpdateFailureScenario();
@@ -1,156 +0,0 @@
1
- import { test } from 'brittle';
2
- import b4a from 'b4a';
3
- import { eventFlush } from '../../../../helpers/autobaseTestHelpers.js';
4
- import {
5
- selectWriterPeer,
6
- buildAddWriterPayload,
7
- assertAddWriterSuccessState
8
- } from '../addWriter/addWriterScenarioHelpers.js';
9
- import {
10
- setupBanValidatorScenario,
11
- buildBanValidatorPayload,
12
- assertBanValidatorSuccessState
13
- } from './banValidatorScenarioHelpers.js';
14
- import {
15
- buildAppendWhitelistPayload
16
- } from '../appendWhitelist/appendWhitelistScenarioHelpers.js';
17
- import nodeEntryUtils, { ZERO_LICENSE } from '../../../../../src/core/state/utils/nodeEntry.js';
18
- import addressUtils from '../../../../../src/core/state/utils/address.js';
19
- import { EntryType } from '../../../../../src/utils/constants.js';
20
- import { BALANCE_ZERO, toBalance } from '../../../../../src/core/state/utils/balance.js';
21
- import lengthEntryUtils from '../../../../../src/core/state/utils/lengthEntry.js';
22
- import { config } from '../../../../helpers/config.js';
23
-
24
- export default function banValidatorBanAndReWhitelistScenario() {
25
- test('State.apply banValidator allows re-whitelisting without changing license', async t => {
26
- const context = await setupBanValidatorScenario(t);
27
- const adminPeer = context.adminBootstrap;
28
- const validatorPeer = context.banValidatorScenario?.validatorPeer ?? selectWriterPeer(context);
29
-
30
- const validatorEntryBefore = await adminPeer.base.view.get(validatorPeer.wallet.address);
31
- t.ok(validatorEntryBefore, 'validator entry exists before banValidator');
32
- const decodedBefore = nodeEntryUtils.decode(validatorEntryBefore?.value);
33
- t.ok(decodedBefore, 'validator entry decodes before banValidator');
34
- if (!decodedBefore) return;
35
-
36
- const adminEntryBefore = await adminPeer.base.view.get(adminPeer.wallet.address);
37
- t.ok(adminEntryBefore, 'admin entry exists before banValidator');
38
-
39
- const banPayload = await buildBanValidatorPayload(context, { adminPeer, validatorPeer });
40
-
41
- await adminPeer.base.append(banPayload);
42
- await adminPeer.base.update();
43
- await eventFlush();
44
-
45
- await assertBanValidatorSuccessState(t, context, {
46
- validatorPeer,
47
- adminPeer,
48
- validatorEntryBefore,
49
- adminEntryBefore,
50
- payload: banPayload
51
- });
52
-
53
- const bannedEntry = await adminPeer.base.view.get(validatorPeer.wallet.address);
54
- t.ok(bannedEntry, 'validator entry exists after ban');
55
- const decodedBanned = nodeEntryUtils.decode(bannedEntry?.value);
56
- t.ok(decodedBanned, 'validator entry decodes after ban');
57
- if (!decodedBanned) return;
58
- const bannedBalance = toBalance(decodedBanned.balance);
59
- t.ok(bannedBalance, 'balance decodes after ban');
60
-
61
- const whitelistPayload = await buildAppendWhitelistPayload(
62
- context,
63
- validatorPeer.wallet.address
64
- );
65
-
66
- await adminPeer.base.append(whitelistPayload);
67
- await adminPeer.base.update();
68
- await eventFlush();
69
-
70
- const rewhitelistedEntry = await adminPeer.base.view.get(validatorPeer.wallet.address);
71
- t.ok(rewhitelistedEntry, 'validator entry exists after re-whitelist');
72
- const decodedRewhitelisted = nodeEntryUtils.decode(rewhitelistedEntry?.value);
73
- t.ok(decodedRewhitelisted, 'validator entry decodes after re-whitelist');
74
- if (!decodedRewhitelisted || !bannedBalance) return;
75
-
76
- t.is(decodedRewhitelisted.isWhitelisted, true, 'node marked whitelisted after reapply');
77
- t.is(decodedRewhitelisted.isWriter, false, 'writer flag remains cleared after reapply');
78
- t.is(decodedRewhitelisted.isIndexer, false, 'indexer flag remains cleared after reapply');
79
- t.ok(b4a.equals(decodedRewhitelisted.wk, decodedBefore.wk), 'writing key preserved');
80
- t.ok(
81
- b4a.equals(decodedRewhitelisted.balance, bannedBalance.value),
82
- 'balance unchanged by re-whitelist'
83
- );
84
- t.ok(
85
- b4a.equals(decodedRewhitelisted.stakedBalance, BALANCE_ZERO.value),
86
- 'staked balance remains zero after re-whitelist'
87
- );
88
- t.ok(!b4a.equals(decodedRewhitelisted.license, ZERO_LICENSE), 'license retained after reapply');
89
- t.ok(
90
- b4a.equals(decodedRewhitelisted.license, decodedBefore.license),
91
- 'license unchanged after ban and re-whitelist'
92
- );
93
-
94
- const licenseId = decodedBefore.license.readUInt32BE();
95
- const licenseIndexEntry = await adminPeer.base.view.get(`${EntryType.LICENSE_INDEX}${licenseId}`);
96
- t.ok(licenseIndexEntry, 'license index entry persists after re-whitelist');
97
- const addressBuffer = addressUtils.addressToBuffer(validatorPeer.wallet.address, config.addressPrefix);
98
- if (licenseIndexEntry?.value && addressBuffer) {
99
- t.ok(
100
- b4a.equals(licenseIndexEntry.value, addressBuffer),
101
- 'license index still maps to validator address'
102
- );
103
- }
104
-
105
- const writersLengthEntry = await adminPeer.base.view.get(EntryType.WRITERS_LENGTH);
106
- const writersLengthBefore = writersLengthEntry
107
- ? lengthEntryUtils.decodeBE(writersLengthEntry.value)
108
- : 0;
109
-
110
- const addWriterPayload = await buildAddWriterPayload(context, {
111
- readerPeer: validatorPeer,
112
- validatorPeer: adminPeer
113
- });
114
-
115
- await adminPeer.base.append(addWriterPayload);
116
- await adminPeer.base.update();
117
- await eventFlush();
118
-
119
- await assertAddWriterSuccessState(t, context, {
120
- readerPeer: validatorPeer,
121
- validatorPeer: adminPeer,
122
- writerInitialBalance: decodedRewhitelisted.balance,
123
- expectedWriterIndex: writersLengthBefore,
124
- payload: addWriterPayload,
125
- skipSync: true
126
- });
127
-
128
- const repromotedEntry = await adminPeer.base.view.get(validatorPeer.wallet.address);
129
- t.ok(repromotedEntry, 'validator entry exists after re-promotion to writer');
130
- const decodedRepromoted = nodeEntryUtils.decode(repromotedEntry?.value);
131
- t.ok(decodedRepromoted, 'validator entry decodes after re-promotion to writer');
132
- if (decodedRepromoted) {
133
- t.is(decodedRepromoted.isWhitelisted, true, 'node remains whitelisted after re-promotion');
134
- t.is(decodedRepromoted.isWriter, true, 'writer role reassigned after re-promotion');
135
- t.is(decodedRepromoted.isIndexer, false, 'indexer flag stays cleared after re-promotion');
136
- t.ok(
137
- b4a.equals(decodedRepromoted.license, decodedBefore.license),
138
- 'license unchanged after re-promotion'
139
- );
140
- }
141
-
142
- await context.sync();
143
- const replicatedEntry = await validatorPeer.base.view.get(validatorPeer.wallet.address);
144
- t.ok(replicatedEntry, 'replicated entry exists after re-whitelist and re-promotion');
145
- const decodedReplicated = nodeEntryUtils.decode(replicatedEntry?.value);
146
- t.ok(decodedReplicated, 'replicated entry decodes after re-whitelist and re-promotion');
147
- if (decodedReplicated) {
148
- t.is(decodedReplicated.isWhitelisted, true, 'replicated entry whitelisted');
149
- t.is(decodedReplicated.isWriter, true, 'replicated entry writer flag set');
150
- t.ok(
151
- b4a.equals(decodedReplicated.license, decodedBefore.license),
152
- 'replicated entry license unchanged'
153
- );
154
- }
155
- });
156
- }