trac-msb 0.2.18 → 0.2.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (381) hide show
  1. package/README.md +62 -2
  2. package/SECURITY.md +9 -6
  3. package/cli/commandHandler.js +272 -0
  4. package/cli/handlers.js +210 -0
  5. package/cli/interactive.js +182 -0
  6. package/msb.mjs +7 -8
  7. package/package.json +25 -8
  8. package/rpc/create_server.js +44 -44
  9. package/rpc/handlers.js +43 -56
  10. package/rpc/routes/index.js +8 -8
  11. package/rpc/rpc_server.js +6 -2
  12. package/rpc/utils/helpers.js +46 -66
  13. package/scripts/pear-runner.js +170 -0
  14. package/src/config/args.js +60 -13
  15. package/src/config/config.js +138 -10
  16. package/src/config/env.js +36 -18
  17. package/src/core/network/Network.js +130 -34
  18. package/src/core/network/protocols/ProtocolInterface.js +5 -5
  19. package/src/core/network/protocols/connectionPolicies.js +86 -0
  20. package/src/core/network/protocols/legacy/NetworkMessageRouter.js +1 -1
  21. package/src/core/network/protocols/legacy/handlers/BaseStateOperationHandler.js +2 -2
  22. package/src/core/network/protocols/legacy/handlers/LegacyGetRequestHandler.js +3 -3
  23. package/src/core/network/protocols/legacy/handlers/LegacyRoleOperationHandler.js +1 -1
  24. package/src/core/network/protocols/legacy/handlers/LegacySubnetworkOperationHandler.js +1 -1
  25. package/src/core/network/protocols/legacy/handlers/LegacyTransferOperationHandler.js +1 -1
  26. package/src/core/network/protocols/legacy/validators/base/BaseResponse.js +7 -10
  27. package/src/core/network/protocols/shared/validators/PartialBootstrapDeploymentValidator.js +2 -2
  28. package/src/core/network/protocols/shared/validators/PartialOperationValidator.js +23 -23
  29. package/src/core/network/protocols/shared/validators/PartialRoleAccessValidator.js +14 -14
  30. package/src/core/network/protocols/shared/validators/PartialTransactionValidator.js +5 -5
  31. package/src/core/network/protocols/shared/validators/PartialTransferValidator.js +12 -11
  32. package/src/core/network/protocols/v1/V1ProtocolError.js +5 -69
  33. package/src/core/network/protocols/v1/handlers/V1BaseOperationHandler.js +3 -2
  34. package/src/core/network/protocols/v1/handlers/V1BroadcastTransactionOperationHandler.js +130 -247
  35. package/src/core/network/protocols/v1/handlers/V1LivenessOperationHandler.js +6 -5
  36. package/src/core/network/protocols/v1/handlers/broadcastTransaction/BroadcastTransactionErrorMapper.js +84 -0
  37. package/src/core/network/protocols/v1/handlers/broadcastTransaction/BroadcastTransactionOperationStrategies.js +128 -0
  38. package/src/core/network/protocols/v1/handlers/broadcastTransaction/BroadcastTransactionPayloadUtils.js +26 -0
  39. package/src/core/network/protocols/v1/validators/V1BaseOperation.js +32 -31
  40. package/src/core/network/protocols/v1/validators/V1BroadcastTransactionRequest.js +5 -3
  41. package/src/core/network/protocols/v1/validators/V1BroadcastTransactionResponse.js +34 -50
  42. package/src/core/network/protocols/v1/validators/V1ValidationSchema.js +1 -1
  43. package/src/core/network/services/ConnectionManager.js +11 -10
  44. package/src/core/network/services/MessageOrchestrator.js +53 -17
  45. package/src/core/network/services/PendingRequestService.js +22 -19
  46. package/src/core/network/services/TransactionCommitService.js +36 -36
  47. package/src/core/network/services/TransactionPoolService.js +39 -39
  48. package/src/core/network/services/TransactionRateLimiterService.js +8 -4
  49. package/src/core/network/services/ValidatorObserverService.js +397 -110
  50. package/src/core/state/State.js +190 -138
  51. package/src/core/state/utils/address.js +4 -9
  52. package/src/core/state/utils/balance.js +7 -7
  53. package/src/core/state/utils/roles.js +1 -1
  54. package/src/index.js +316 -275
  55. package/src/messages/network/v1/NetworkMessageBuilder.js +12 -21
  56. package/src/messages/network/v1/networkMessageFactory.js +1 -1
  57. package/src/messages/state/ApplyStateMessageBuilder.js +6 -6
  58. package/src/messages/state/applyStateMessageFactory.js +1 -1
  59. package/src/utils/buffer.js +1 -1
  60. package/src/utils/check.js +12 -13
  61. package/src/utils/constants.js +7 -0
  62. package/src/utils/errors.js +20 -0
  63. package/src/utils/fileUtils.js +12 -3
  64. package/src/utils/helpers.js +2 -2
  65. package/src/utils/migrationUtils.js +3 -3
  66. package/.dockerignore +0 -16
  67. package/CODE_OF_CONDUCT.md +0 -128
  68. package/docker-compose.yml +0 -17
  69. package/dockerfile +0 -41
  70. package/docs/fee_distribution.md +0 -89
  71. package/docs/trac_network_http_api.openapi.yaml +0 -889
  72. package/migration/.gitkeep +0 -0
  73. package/proto/applyOperations.proto +0 -117
  74. package/proto/network/v1/enums/message_type.proto +0 -16
  75. package/proto/network/v1/enums/result_code.proto +0 -84
  76. package/proto/network/v1/messages/broadcast_transaction_request.proto +0 -9
  77. package/proto/network/v1/messages/broadcast_transaction_response.proto +0 -13
  78. package/proto/network/v1/messages/liveness_request.proto +0 -8
  79. package/proto/network/v1/messages/liveness_response.proto +0 -11
  80. package/proto/network/v1/network_message.proto +0 -22
  81. package/rpc/rpc_services.js +0 -181
  82. package/scripts/generate-protobufs.js +0 -67
  83. package/src/core/network/identity/NetworkWalletFactory.js +0 -77
  84. package/src/core/network/protocols/shared/errors/SharedValidatorRejectionError.js +0 -27
  85. package/src/utils/cli.js +0 -130
  86. package/src/utils/cliCommands.js +0 -280
  87. package/tests/acceptance/v1/account/account.test.mjs +0 -129
  88. package/tests/acceptance/v1/balance/balance.test.mjs +0 -54
  89. package/tests/acceptance/v1/broadcast-transaction/broadcast-transaction.test.mjs +0 -116
  90. package/tests/acceptance/v1/confirmed-length/confirmed-length.test.mjs +0 -19
  91. package/tests/acceptance/v1/fee/fee.test.mjs +0 -11
  92. package/tests/acceptance/v1/health/health.test.mjs +0 -33
  93. package/tests/acceptance/v1/rpc.test.mjs +0 -95
  94. package/tests/acceptance/v1/tx/tx.test.mjs +0 -133
  95. package/tests/acceptance/v1/tx-details/tx-details.test.mjs +0 -241
  96. package/tests/acceptance/v1/tx-hashes/tx-hashes.test.mjs +0 -72
  97. package/tests/acceptance/v1/tx-payloads-bulk/tx-payloads-bulk.test.mjs +0 -27
  98. package/tests/acceptance/v1/txv/txv.test.mjs +0 -11
  99. package/tests/acceptance/v1/unconfirmed-length/unconfirmed-length.test.mjs +0 -11
  100. package/tests/fixtures/apply.fixtures.js +0 -77
  101. package/tests/fixtures/assembleMessage.fixtures.js +0 -41
  102. package/tests/fixtures/check.fixtures.js +0 -428
  103. package/tests/fixtures/networkV1.fixtures.js +0 -59
  104. package/tests/fixtures/protobuf.fixtures.js +0 -388
  105. package/tests/helpers/StateNetworkFactory.js +0 -155
  106. package/tests/helpers/address.js +0 -6
  107. package/tests/helpers/autobaseTestHelpers.js +0 -419
  108. package/tests/helpers/config.js +0 -4
  109. package/tests/helpers/createTestSignature.js +0 -13
  110. package/tests/helpers/regexHelper.js +0 -3
  111. package/tests/helpers/setupApplyTests.js +0 -587
  112. package/tests/helpers/transactionPayloads.mjs +0 -92
  113. package/tests/helpers/wrapper.js +0 -28
  114. package/tests/unit/messages/messages.test.js +0 -12
  115. package/tests/unit/messages/network/NetworkMessageBuilder.test.js +0 -436
  116. package/tests/unit/messages/network/NetworkMessageDirector.test.js +0 -347
  117. package/tests/unit/messages/state/applyStateMessageBuilder.complete.test.js +0 -525
  118. package/tests/unit/messages/state/applyStateMessageBuilder.partial.test.js +0 -237
  119. package/tests/unit/network/LegacyNetworkMessageRouter.test.js +0 -54
  120. package/tests/unit/network/NetworkWalletFactory.test.js +0 -156
  121. package/tests/unit/network/ProtocolSession.test.js +0 -127
  122. package/tests/unit/network/networkModule.test.js +0 -13
  123. package/tests/unit/network/services/ConnectionManager.test.js +0 -450
  124. package/tests/unit/network/services/MessageOrchestrator.test.js +0 -445
  125. package/tests/unit/network/services/PendingRequestService.test.js +0 -431
  126. package/tests/unit/network/services/TransactionCommitService.test.js +0 -246
  127. package/tests/unit/network/services/TransactionPoolService.test.js +0 -489
  128. package/tests/unit/network/services/TransactionRateLimiterService.test.js +0 -139
  129. package/tests/unit/network/services/ValidatorHealthCheckService.test.js +0 -115
  130. package/tests/unit/network/services/services.test.js +0 -17
  131. package/tests/unit/network/utils/v1TestUtils.js +0 -153
  132. package/tests/unit/network/v1/NetworkMessageRouterV1.test.js +0 -151
  133. package/tests/unit/network/v1/V1BaseOperation.test.js +0 -356
  134. package/tests/unit/network/v1/V1BroadcastTransactionOperationHandler.test.js +0 -129
  135. package/tests/unit/network/v1/V1BroadcastTransactionRequest.test.js +0 -53
  136. package/tests/unit/network/v1/V1BroadcastTransactionResponse.test.js +0 -512
  137. package/tests/unit/network/v1/V1LivenessRequest.test.js +0 -32
  138. package/tests/unit/network/v1/V1LivenessResponse.test.js +0 -45
  139. package/tests/unit/network/v1/V1ResultCode.test.js +0 -84
  140. package/tests/unit/network/v1/V1ValidationSchema.test.js +0 -13
  141. package/tests/unit/network/v1/connectionPolicies.test.js +0 -49
  142. package/tests/unit/network/v1/handlers/V1BaseOperationHandler.test.js +0 -284
  143. package/tests/unit/network/v1/handlers/V1BroadcastTransactionOperationHandler.test.js +0 -794
  144. package/tests/unit/network/v1/handlers/V1LivenessOperationHandler.test.js +0 -193
  145. package/tests/unit/network/v1/v1.handlers.test.js +0 -15
  146. package/tests/unit/network/v1/v1.test.js +0 -19
  147. package/tests/unit/network/v1/v1ValidationSchema/broadcastTransactionRequest.test.js +0 -119
  148. package/tests/unit/network/v1/v1ValidationSchema/broadcastTransactionResponse.test.js +0 -136
  149. package/tests/unit/network/v1/v1ValidationSchema/common.test.js +0 -308
  150. package/tests/unit/network/v1/v1ValidationSchema/livenessRequest.test.js +0 -90
  151. package/tests/unit/network/v1/v1ValidationSchema/livenessResponse.test.js +0 -133
  152. package/tests/unit/state/State.test.js +0 -80
  153. package/tests/unit/state/apply/addAdmin/addAdminHappyPathScenario.js +0 -42
  154. package/tests/unit/state/apply/addAdmin/addAdminScenarioHelpers.js +0 -276
  155. package/tests/unit/state/apply/addAdmin/adminEntryEncodingFailureScenario.js +0 -30
  156. package/tests/unit/state/apply/addAdmin/adminEntryExistsScenario.js +0 -78
  157. package/tests/unit/state/apply/addAdmin/nodeEntryInitializationFailureScenario.js +0 -30
  158. package/tests/unit/state/apply/addAdmin/nonBootstrapNodeScenario.js +0 -68
  159. package/tests/unit/state/apply/addAdmin/state.apply.addAdmin.test.js +0 -159
  160. package/tests/unit/state/apply/addIndexer/addIndexerHappyPathScenario.js +0 -39
  161. package/tests/unit/state/apply/addIndexer/addIndexerMultipleIndexersInTheNetworkScenario.js +0 -167
  162. package/tests/unit/state/apply/addIndexer/addIndexerPretenderAlreadyIndexerScenario.js +0 -21
  163. package/tests/unit/state/apply/addIndexer/addIndexerPretenderNotWriterScenario.js +0 -21
  164. package/tests/unit/state/apply/addIndexer/addIndexerRemoveAndReAddScenario.js +0 -186
  165. package/tests/unit/state/apply/addIndexer/addIndexerScenarioHelpers.js +0 -443
  166. package/tests/unit/state/apply/addIndexer/addIndexerWriterKeyAlreadyRegisteredScenario.js +0 -32
  167. package/tests/unit/state/apply/addIndexer/state.apply.addIndexer.test.js +0 -297
  168. package/tests/unit/state/apply/addWriter/addWriterHappyPathScenario.js +0 -41
  169. package/tests/unit/state/apply/addWriter/addWriterInvalidValidatorSignatureScenario.js +0 -32
  170. package/tests/unit/state/apply/addWriter/addWriterNewWkScenario.js +0 -149
  171. package/tests/unit/state/apply/addWriter/addWriterRequesterAlreadyWriterScenario.js +0 -21
  172. package/tests/unit/state/apply/addWriter/addWriterRequesterBalanceInsufficientScenario.js +0 -21
  173. package/tests/unit/state/apply/addWriter/addWriterRequesterEntryDecodeFailureScenario.js +0 -19
  174. package/tests/unit/state/apply/addWriter/addWriterRequesterEntryMissingScenario.js +0 -19
  175. package/tests/unit/state/apply/addWriter/addWriterRequesterIndexerScenario.js +0 -21
  176. package/tests/unit/state/apply/addWriter/addWriterRequesterNotWhitelistedScenario.js +0 -21
  177. package/tests/unit/state/apply/addWriter/addWriterScenarioHelpers.js +0 -766
  178. package/tests/unit/state/apply/addWriter/addWriterStakeBalanceUpdateFailureScenario.js +0 -50
  179. package/tests/unit/state/apply/addWriter/addWriterStakeInsufficientBalanceScenario.js +0 -29
  180. package/tests/unit/state/apply/addWriter/addWriterStakeInvalidBalanceScenario.js +0 -29
  181. package/tests/unit/state/apply/addWriter/addWriterStakeInvalidEntryScenario.js +0 -21
  182. package/tests/unit/state/apply/addWriter/addWriterStakeStakedBalanceFailureScenario.js +0 -37
  183. package/tests/unit/state/apply/addWriter/addWriterStakeSubtractFailureScenario.js +0 -42
  184. package/tests/unit/state/apply/addWriter/addWriterValidatorRewardScenario.js +0 -106
  185. package/tests/unit/state/apply/addWriter/addWriterWriterKeyMismatchScenario.js +0 -54
  186. package/tests/unit/state/apply/addWriter/addWriterWriterKeyOwnershipScenario.js +0 -54
  187. package/tests/unit/state/apply/addWriter/addWriterZeroWriterKeyScenario.js +0 -29
  188. package/tests/unit/state/apply/addWriter/state.apply.addWriter.test.js +0 -309
  189. package/tests/unit/state/apply/adminRecovery/adminRecoveryHappyPathScenario.js +0 -30
  190. package/tests/unit/state/apply/adminRecovery/adminRecoveryScenarioHelpers.js +0 -881
  191. package/tests/unit/state/apply/adminRecovery/state.apply.adminRecovery.test.js +0 -435
  192. package/tests/unit/state/apply/appendWhitelist/appendWhitelistBanAndReapplyScenario.js +0 -78
  193. package/tests/unit/state/apply/appendWhitelist/appendWhitelistExistingReaderHappyPathScenario.js +0 -98
  194. package/tests/unit/state/apply/appendWhitelist/appendWhitelistFeeAfterDisableScenario.js +0 -66
  195. package/tests/unit/state/apply/appendWhitelist/appendWhitelistHappyPathScenario.js +0 -55
  196. package/tests/unit/state/apply/appendWhitelist/appendWhitelistInsufficientAdminBalanceScenario.js +0 -103
  197. package/tests/unit/state/apply/appendWhitelist/appendWhitelistNodeAlreadyWhitelistedScenario.js +0 -60
  198. package/tests/unit/state/apply/appendWhitelist/appendWhitelistScenarioHelpers.js +0 -189
  199. package/tests/unit/state/apply/appendWhitelist/state.apply.appendWhitelist.test.js +0 -220
  200. package/tests/unit/state/apply/balanceInitialization/balanceInitializationHappyPathScenario.js +0 -82
  201. package/tests/unit/state/apply/balanceInitialization/balanceInitializationScenarioHelpers.js +0 -111
  202. package/tests/unit/state/apply/balanceInitialization/invalidAmountScenario.js +0 -45
  203. package/tests/unit/state/apply/balanceInitialization/nodeEntryBalanceUpdateFailureScenario.js +0 -82
  204. package/tests/unit/state/apply/balanceInitialization/state.apply.balanceInitialization.test.js +0 -189
  205. package/tests/unit/state/apply/banValidator/banValidatorBanAndReWhitelistScenario.js +0 -156
  206. package/tests/unit/state/apply/banValidator/banValidatorHappyPathScenario.js +0 -36
  207. package/tests/unit/state/apply/banValidator/banValidatorScenarioHelpers.js +0 -531
  208. package/tests/unit/state/apply/banValidator/banValidatorSequentialBansScenario.js +0 -74
  209. package/tests/unit/state/apply/banValidator/banValidatorTargetDecodeFailureScenario.js +0 -19
  210. package/tests/unit/state/apply/banValidator/banValidatorTargetIndexerScenario.js +0 -32
  211. package/tests/unit/state/apply/banValidator/banValidatorTargetNodeEntryMissingScenario.js +0 -19
  212. package/tests/unit/state/apply/banValidator/banValidatorTargetRoleUpdateFailureScenario.js +0 -19
  213. package/tests/unit/state/apply/banValidator/banValidatorWhitelistedNonWriterScenario.js +0 -38
  214. package/tests/unit/state/apply/banValidator/banValidatorWhitelistedZeroBalanceScenario.js +0 -91
  215. package/tests/unit/state/apply/banValidator/banValidatorWithdrawFailureScenario.js +0 -19
  216. package/tests/unit/state/apply/banValidator/state.apply.banValidator.test.js +0 -266
  217. package/tests/unit/state/apply/bootstrapDeployment/bootstrapDeploymentDuplicateRegistrationScenario.js +0 -143
  218. package/tests/unit/state/apply/bootstrapDeployment/bootstrapDeploymentHappyPathScenario.js +0 -26
  219. package/tests/unit/state/apply/bootstrapDeployment/bootstrapDeploymentIncompleteOperationScenario.js +0 -94
  220. package/tests/unit/state/apply/bootstrapDeployment/bootstrapDeploymentInvalidDeploymentEntryScenario.js +0 -37
  221. package/tests/unit/state/apply/bootstrapDeployment/bootstrapDeploymentMultipleBootstrapScenario.js +0 -86
  222. package/tests/unit/state/apply/bootstrapDeployment/bootstrapDeploymentScenarioHelpers.js +0 -347
  223. package/tests/unit/state/apply/bootstrapDeployment/invalidValidatorNodeEntryScenario.js +0 -57
  224. package/tests/unit/state/apply/bootstrapDeployment/state.apply.bootstrapDeployment.test.js +0 -429
  225. package/tests/unit/state/apply/common/access-control/adminConsistencyMismatchScenario.js +0 -120
  226. package/tests/unit/state/apply/common/access-control/adminEntryDecodeFailureScenario.js +0 -130
  227. package/tests/unit/state/apply/common/access-control/adminEntryExistsScenario.js +0 -93
  228. package/tests/unit/state/apply/common/access-control/adminEntryMissingScenario.js +0 -108
  229. package/tests/unit/state/apply/common/access-control/adminOnlyGuardScenario.js +0 -126
  230. package/tests/unit/state/apply/common/access-control/adminPublicKeyDecodeFailureScenario.js +0 -121
  231. package/tests/unit/state/apply/common/access-control/roleAccessOperationValidationScenario.js +0 -50
  232. package/tests/unit/state/apply/common/adminControlOperationValidationScenario.js +0 -56
  233. package/tests/unit/state/apply/common/balances/adminEntryUpdateFailureScenario.js +0 -52
  234. package/tests/unit/state/apply/common/balances/base/requesterBalanceScenarioBase.js +0 -198
  235. package/tests/unit/state/apply/common/balances/feeDecodeFailureScenario.js +0 -52
  236. package/tests/unit/state/apply/common/balances/requesterBalanceDecodeFailureScenario.js +0 -15
  237. package/tests/unit/state/apply/common/balances/requesterBalanceFeeApplicationFailureScenario.js +0 -11
  238. package/tests/unit/state/apply/common/balances/requesterBalanceInsufficientScenario.js +0 -15
  239. package/tests/unit/state/apply/common/balances/requesterBalanceUpdateFailureScenario.js +0 -11
  240. package/tests/unit/state/apply/common/balances/validatorEntryRewardFailureScenario.js +0 -11
  241. package/tests/unit/state/apply/common/balances/validatorEntryUpdateFailureScenario.js +0 -11
  242. package/tests/unit/state/apply/common/balances/validatorNodeEntryDecodeFailureScenario.js +0 -40
  243. package/tests/unit/state/apply/common/base/OperationValidationScenarioBase.js +0 -114
  244. package/tests/unit/state/apply/common/commonScenarioHelper.js +0 -103
  245. package/tests/unit/state/apply/common/indexer/indexerNodeEntryDecodeFailureScenario.js +0 -36
  246. package/tests/unit/state/apply/common/indexer/indexerNodeEntryMissingScenario.js +0 -36
  247. package/tests/unit/state/apply/common/indexer/indexerRoleUpdateFailureScenario.js +0 -29
  248. package/tests/unit/state/apply/common/indexer/indexerSequenceStateInvalidScenario.js +0 -66
  249. package/tests/unit/state/apply/common/invalidMessageComponentValidationScenario.js +0 -84
  250. package/tests/unit/state/apply/common/nodeEntryInitializationFailureScenario.js +0 -47
  251. package/tests/unit/state/apply/common/operationAlreadyAppliedScenario.js +0 -85
  252. package/tests/unit/state/apply/common/payload-structure/addressWithInvalidPublicKeyScenario.js +0 -52
  253. package/tests/unit/state/apply/common/payload-structure/initializationDisabledScenario.js +0 -54
  254. package/tests/unit/state/apply/common/payload-structure/invalidAddressValidationScenario.js +0 -73
  255. package/tests/unit/state/apply/common/payload-structure/invalidHashValidationScenario.js +0 -71
  256. package/tests/unit/state/apply/common/payload-structure/invalidPayloadValidationScenario.js +0 -31
  257. package/tests/unit/state/apply/common/payload-structure/invalidSignatureValidationScenario.js +0 -142
  258. package/tests/unit/state/apply/common/payload-structure/partialOperationValidationScenario.js +0 -87
  259. package/tests/unit/state/apply/common/requester/requesterNodeEntryBufferMissingScenario.js +0 -71
  260. package/tests/unit/state/apply/common/requester/requesterNodeEntryDecodeFailureScenario.js +0 -73
  261. package/tests/unit/state/apply/common/requester/requesterNodeEntryMissingScenario.js +0 -36
  262. package/tests/unit/state/apply/common/requesterAddressValidationScenario.js +0 -44
  263. package/tests/unit/state/apply/common/requesterPublicKeyValidationScenario.js +0 -25
  264. package/tests/unit/state/apply/common/transactionValidityMismatchScenario.js +0 -98
  265. package/tests/unit/state/apply/common/validatorConsistency/base/validatorConsistencyScenarioBase.js +0 -202
  266. package/tests/unit/state/apply/common/validatorConsistency/validatorEntryDecodeFailureScenario.js +0 -17
  267. package/tests/unit/state/apply/common/validatorConsistency/validatorEntryMissingScenario.js +0 -44
  268. package/tests/unit/state/apply/common/validatorConsistency/validatorInactiveScenario.js +0 -19
  269. package/tests/unit/state/apply/common/validatorConsistency/validatorWriterKeyMismatchScenario.js +0 -18
  270. package/tests/unit/state/apply/common/validatorEntryValidation/base/validatorEntryValidationScenarioBase.js +0 -315
  271. package/tests/unit/state/apply/common/validatorEntryValidation/validatorEntryInvalidBalanceScenario.js +0 -18
  272. package/tests/unit/state/apply/common/writerKeyExistsValidationScenario.js +0 -43
  273. package/tests/unit/state/apply/disableInitialization/disableInitializationAlreadyDisabledScenario.js +0 -53
  274. package/tests/unit/state/apply/disableInitialization/disableInitializationHappyPathScenario.js +0 -24
  275. package/tests/unit/state/apply/disableInitialization/disableInitializationScenarioHelpers.js +0 -204
  276. package/tests/unit/state/apply/disableInitialization/state.apply.disableInitialization.test.js +0 -161
  277. package/tests/unit/state/apply/missing-tests.md +0 -18
  278. package/tests/unit/state/apply/removeIndexer/removeIndexerHappyPathScenario.js +0 -58
  279. package/tests/unit/state/apply/removeIndexer/removeIndexerReAddAndRemoveAgainScenario.js +0 -98
  280. package/tests/unit/state/apply/removeIndexer/removeIndexerRemoveMultipleIndexersScenario.js +0 -167
  281. package/tests/unit/state/apply/removeIndexer/removeIndexerScenarioHelpers.js +0 -429
  282. package/tests/unit/state/apply/removeIndexer/removeIndexerTargetNotIndexerScenario.js +0 -22
  283. package/tests/unit/state/apply/removeIndexer/removeIndexerWriterKeyMissingScenario.js +0 -20
  284. package/tests/unit/state/apply/removeIndexer/state.apply.removeIndexer.test.js +0 -291
  285. package/tests/unit/state/apply/removeWriter/removeWriterAndAddWriterAgainScenario.js +0 -87
  286. package/tests/unit/state/apply/removeWriter/removeWriterHappyPathScenario.js +0 -38
  287. package/tests/unit/state/apply/removeWriter/removeWriterInvalidValidatorSignatureScenario.js +0 -32
  288. package/tests/unit/state/apply/removeWriter/removeWriterRequesterBalanceInsufficientScenario.js +0 -21
  289. package/tests/unit/state/apply/removeWriter/removeWriterRequesterEntryDecodeFailureScenario.js +0 -19
  290. package/tests/unit/state/apply/removeWriter/removeWriterRequesterEntryMissingScenario.js +0 -19
  291. package/tests/unit/state/apply/removeWriter/removeWriterRequesterIndexerScenario.js +0 -21
  292. package/tests/unit/state/apply/removeWriter/removeWriterRequesterNotWriterScenario.js +0 -21
  293. package/tests/unit/state/apply/removeWriter/removeWriterRequesterRoleUpdateFailureScenario.js +0 -19
  294. package/tests/unit/state/apply/removeWriter/removeWriterScenarioHelpers.js +0 -348
  295. package/tests/unit/state/apply/removeWriter/removeWriterThroughWriterValidatorScenario.js +0 -113
  296. package/tests/unit/state/apply/removeWriter/removeWriterUnstakeFailureScenario.js +0 -33
  297. package/tests/unit/state/apply/removeWriter/removeWriterWriterKeyMismatchScenario.js +0 -21
  298. package/tests/unit/state/apply/removeWriter/removeWriterWriterKeyOwnershipScenario.js +0 -26
  299. package/tests/unit/state/apply/removeWriter/removeWriterWriterKeyRegistryMissingScenario.js +0 -22
  300. package/tests/unit/state/apply/removeWriter/state.apply.removeWriter.test.js +0 -307
  301. package/tests/unit/state/apply/state.apply.test.js +0 -24
  302. package/tests/unit/state/apply/transfer/state.apply.transfer.test.js +0 -819
  303. package/tests/unit/state/apply/transfer/transferContractSchemaValidationScenario.js +0 -22
  304. package/tests/unit/state/apply/transfer/transferDoubleSpendAcrossValidatorsScenario.js +0 -146
  305. package/tests/unit/state/apply/transfer/transferDoubleSpendSameBatchScenario.js +0 -63
  306. package/tests/unit/state/apply/transfer/transferDoubleSpendSingleValidatorScenario.js +0 -67
  307. package/tests/unit/state/apply/transfer/transferExistingRecipientAmountScenario.js +0 -31
  308. package/tests/unit/state/apply/transfer/transferExistingRecipientZeroAmountScenario.js +0 -31
  309. package/tests/unit/state/apply/transfer/transferHandlerGuardScenarios.js +0 -22
  310. package/tests/unit/state/apply/transfer/transferHappyPathScenario.js +0 -8
  311. package/tests/unit/state/apply/transfer/transferInvalidIncomingDataScenario.js +0 -66
  312. package/tests/unit/state/apply/transfer/transferNewRecipientAmountScenario.js +0 -31
  313. package/tests/unit/state/apply/transfer/transferNewRecipientZeroAmountScenario.js +0 -31
  314. package/tests/unit/state/apply/transfer/transferScenarioHelpers.js +0 -1170
  315. package/tests/unit/state/apply/transfer/transferSelfTransferAmountScenario.js +0 -38
  316. package/tests/unit/state/apply/transfer/transferSelfTransferZeroAmountScenario.js +0 -38
  317. package/tests/unit/state/apply/transfer/transferValidatorRecipientAmountScenario.js +0 -38
  318. package/tests/unit/state/apply/transfer/transferValidatorRecipientZeroAmountScenario.js +0 -38
  319. package/tests/unit/state/apply/txOperation/state.apply.txOperation.test.js +0 -318
  320. package/tests/unit/state/apply/txOperation/txOperationBootstrapNotRegisteredScenario.js +0 -70
  321. package/tests/unit/state/apply/txOperation/txOperationDifferentValidatorCreatorHappyPathScenario.js +0 -23
  322. package/tests/unit/state/apply/txOperation/txOperationInvalidDeploymentEntryScenario.js +0 -48
  323. package/tests/unit/state/apply/txOperation/txOperationInvalidFeeAmountScenario.js +0 -39
  324. package/tests/unit/state/apply/txOperation/txOperationInvalidSubnetCreatorAddressScenario.js +0 -46
  325. package/tests/unit/state/apply/txOperation/txOperationRequesterCreatorHappyPathScenario.js +0 -21
  326. package/tests/unit/state/apply/txOperation/txOperationScenarioHelpers.js +0 -432
  327. package/tests/unit/state/apply/txOperation/txOperationStandardHappyPathScenario.js +0 -21
  328. package/tests/unit/state/apply/txOperation/txOperationTransferFeeAddCreatorBalanceFailureScenario.js +0 -26
  329. package/tests/unit/state/apply/txOperation/txOperationTransferFeeAddValidatorBalanceFailureScenario.js +0 -25
  330. package/tests/unit/state/apply/txOperation/txOperationTransferFeeAddValidatorBonusFailureScenario.js +0 -27
  331. package/tests/unit/state/apply/txOperation/txOperationTransferFeeDecodeCreatorEntryScenario.js +0 -18
  332. package/tests/unit/state/apply/txOperation/txOperationTransferFeeDecodeRequesterEntryScenario.js +0 -17
  333. package/tests/unit/state/apply/txOperation/txOperationTransferFeeDecodeValidatorEntryScenario.js +0 -31
  334. package/tests/unit/state/apply/txOperation/txOperationTransferFeeGuardBypassScenario.js +0 -49
  335. package/tests/unit/state/apply/txOperation/txOperationTransferFeeGuardScenarioFactory.js +0 -93
  336. package/tests/unit/state/apply/txOperation/txOperationTransferFeeInsufficientRequesterBalanceScenario.js +0 -28
  337. package/tests/unit/state/apply/txOperation/txOperationTransferFeeInvalidCreatorBalanceScenario.js +0 -29
  338. package/tests/unit/state/apply/txOperation/txOperationTransferFeeInvalidRequesterBalanceScenario.js +0 -28
  339. package/tests/unit/state/apply/txOperation/txOperationTransferFeeInvalidRequesterEntryScenario.js +0 -17
  340. package/tests/unit/state/apply/txOperation/txOperationTransferFeeInvalidValidatorBalanceScenario.js +0 -33
  341. package/tests/unit/state/apply/txOperation/txOperationTransferFeeMissingCreatorEntryScenario.js +0 -18
  342. package/tests/unit/state/apply/txOperation/txOperationTransferFeeSubtractFailureScenario.js +0 -25
  343. package/tests/unit/state/apply/txOperation/txOperationTransferFeeUpdateCreatorBalanceFailureScenario.js +0 -26
  344. package/tests/unit/state/apply/txOperation/txOperationTransferFeeUpdateFailureScenario.js +0 -25
  345. package/tests/unit/state/apply/txOperation/txOperationTransferFeeUpdateValidatorBalanceFailureScenario.js +0 -26
  346. package/tests/unit/state/apply/txOperation/txOperationTransferFeeUpdateValidatorBonusFailureScenario.js +0 -27
  347. package/tests/unit/state/apply/txOperation/txOperationValidatorCreatorHappyPathScenario.js +0 -21
  348. package/tests/unit/state/stateModule.test.js +0 -23
  349. package/tests/unit/state/stateTestUtils.js +0 -32
  350. package/tests/unit/state/utils/address.test.js +0 -63
  351. package/tests/unit/state/utils/adminEntry.test.js +0 -52
  352. package/tests/unit/state/utils/balance.test.js +0 -320
  353. package/tests/unit/state/utils/lengthEntry.test.js +0 -54
  354. package/tests/unit/state/utils/nodeEntry.test.js +0 -298
  355. package/tests/unit/state/utils/roles.test.js +0 -44
  356. package/tests/unit/unit.test.js +0 -14
  357. package/tests/unit/utils/amountSerialization/amountSerialization.test.js +0 -237
  358. package/tests/unit/utils/buffer/buffer.test.js +0 -251
  359. package/tests/unit/utils/check/adminControlOperation.test.js +0 -156
  360. package/tests/unit/utils/check/balanceInitializationOperation.test.js +0 -54
  361. package/tests/unit/utils/check/bootstrapDeploymentOperation.test.js +0 -104
  362. package/tests/unit/utils/check/check.test.js +0 -17
  363. package/tests/unit/utils/check/common.test.js +0 -419
  364. package/tests/unit/utils/check/coreAdminOperation.test.js +0 -95
  365. package/tests/unit/utils/check/roleAccessOperation.test.js +0 -255
  366. package/tests/unit/utils/check/transactionOperation.test.js +0 -107
  367. package/tests/unit/utils/check/transferOperation.test.js +0 -102
  368. package/tests/unit/utils/deepEqualApplyPayload/deepEqualApplyPayload.test.js +0 -102
  369. package/tests/unit/utils/fileUtils/readAddressesFromWhitelistFile.test.js +0 -95
  370. package/tests/unit/utils/fileUtils/readBalanceMigrationFile.test.js +0 -149
  371. package/tests/unit/utils/helpers/helpers.test.js +0 -11
  372. package/tests/unit/utils/helpers/isHexString.test.js +0 -12
  373. package/tests/unit/utils/helpers/normalizeHex.test.js +0 -82
  374. package/tests/unit/utils/migrationUtils/validateAddressFromIncomingFile.test.js +0 -100
  375. package/tests/unit/utils/normalizers/normalizers.test.js +0 -469
  376. package/tests/unit/utils/protobuf/applyOperations.test.js +0 -91
  377. package/tests/unit/utils/protobuf/operationHelpers.test.js +0 -303
  378. package/tests/unit/utils/protobuf/protobuf.test.js +0 -12
  379. package/tests/unit/utils/type/type.test.js +0 -25
  380. package/tests/unit/utils/utils.test.js +0 -21
  381. package/whitelist/.gitkeep +0 -0
@@ -1,167 +0,0 @@
1
- import b4a from 'b4a';
2
- import { test } from 'brittle';
3
- import nodeEntryUtils from '../../../../../src/core/state/utils/nodeEntry.js';
4
- import {
5
- setupAddIndexerScenario,
6
- selectIndexerCandidatePeer,
7
- buildAddIndexerPayload,
8
- assertAddIndexerSuccessState
9
- } from './addIndexerScenarioHelpers.js';
10
- import { promotePeerToWriter } from '../addWriter/addWriterScenarioHelpers.js';
11
- import { initializeBalances, whitelistAddress } from '../common/commonScenarioHelper.js';
12
- import { eventFlush } from '../../../../helpers/autobaseTestHelpers.js';
13
- import lengthEntryUtils from '../../../../../src/core/state/utils/lengthEntry.js';
14
- import { EntryType } from '../../../../../src/utils/constants.js';
15
-
16
- export default function addIndexerMultipleIndexersInTheNetworkScenario() {
17
- test('State.apply addIndexer adds multiple indexers sequentially', async t => {
18
- const context = await setupAddIndexerScenario(t, { nodes: 4 });
19
- const adminPeer = context.adminBootstrap;
20
- const initialIndexerCount = getIndexerCount(adminPeer.base);
21
- t.comment(`Network peers: ${context.peers.length}`);
22
-
23
- const candidates = [
24
- selectIndexerCandidatePeer(context, 0),
25
- selectIndexerCandidatePeer(context, 1),
26
- selectIndexerCandidatePeer(context, 2)
27
- ];
28
- t.comment(
29
- `Indexer candidates: ${candidates.map(peer => peer.wallet.address).join(', ')}`
30
- );
31
-
32
- for (const peer of candidates.slice(1)) {
33
- await prepareWriterCandidate(t, context, peer);
34
- }
35
-
36
- const trackedIndexers = [];
37
- for (const candidate of candidates) {
38
- t.comment(`Promoting writer ${candidate.wallet.address} to indexer...`);
39
- await promoteWriterToIndexer(t, context, candidate, trackedIndexers);
40
- }
41
-
42
- await context.sync();
43
- await assertNetworkSeesIndexers(
44
- t,
45
- context,
46
- trackedIndexers,
47
- initialIndexerCount + trackedIndexers.length
48
- );
49
- });
50
- }
51
-
52
- async function prepareWriterCandidate(t, context, peer) {
53
- const funding = context.addWriterScenario?.writerInitialBalance;
54
- if (!funding) {
55
- throw new Error('addIndexer scenarios require writerInitialBalance buffer.');
56
- }
57
- const expectedWriterIndex = await deriveNextWriterIndex(context.adminBootstrap.base);
58
- await initializeBalances(context, [[peer.wallet.address, funding]]);
59
- await whitelistAddress(context, peer.wallet.address);
60
- await promotePeerToWriter(t, context, { readerPeer: peer, expectedWriterIndex });
61
- }
62
-
63
- async function promoteWriterToIndexer(t, context, writerPeer, trackedIndexers) {
64
- const adminPeer = context.adminBootstrap;
65
- const writerAddress = writerPeer.wallet.address;
66
-
67
- const writerEntryBefore = await adminPeer.base.view.get(writerAddress);
68
- t.ok(writerEntryBefore, 'writer entry exists before addIndexer');
69
- const adminEntryBefore = await adminPeer.base.view.get(adminPeer.wallet.address);
70
- t.ok(adminEntryBefore, 'admin entry exists before addIndexer');
71
-
72
- const payload = await buildAddIndexerPayload(context, {
73
- writerPeer,
74
- adminPeer
75
- });
76
- t.comment(`Built addIndexer payload for ${writerAddress}`);
77
-
78
- await adminPeer.base.append(payload);
79
- await adminPeer.base.update();
80
- await eventFlush();
81
- t.comment(`Applied addIndexer payload for ${writerAddress}`);
82
-
83
- await assertAddIndexerSuccessState(t, context, {
84
- writerPeer,
85
- adminPeer,
86
- writerEntryBefore: { value: b4a.from(writerEntryBefore.value) },
87
- adminEntryBefore: { value: b4a.from(adminEntryBefore.value) },
88
- payload,
89
- skipSync: true
90
- });
91
-
92
- const decodedBefore = nodeEntryUtils.decode(writerEntryBefore.value);
93
- if (!decodedBefore) {
94
- throw new Error('Failed to decode writer entry before addIndexer.');
95
- }
96
- trackedIndexers.push({
97
- address: writerAddress,
98
- writingKey: b4a.from(writerPeer.base.local.key),
99
- balance: b4a.from(decodedBefore.balance),
100
- stakedBalance: b4a.from(decodedBefore.stakedBalance),
101
- license: b4a.from(decodedBefore.license)
102
- });
103
-
104
- t.comment(`Completed promotion for ${writerAddress}`);
105
- }
106
-
107
- async function assertNetworkSeesIndexers(t, context, trackedIndexers, expectedIndexerCount) {
108
- for (const node of context.peers) {
109
- await assertPeerObservesIndexers(t, node, trackedIndexers, expectedIndexerCount);
110
- }
111
- }
112
-
113
- async function assertPeerObservesIndexers(t, node, trackedIndexers, expectedIndexerCount) {
114
- const base = node.base;
115
- const membership = Object.values(base.system.indexers ?? {});
116
- t.is(
117
- membership.length,
118
- expectedIndexerCount,
119
- `${node.name} observes expected indexer count`
120
- );
121
-
122
- for (const indexer of trackedIndexers) {
123
- const entry = await base.view.get(indexer.address);
124
- t.ok(entry, `${node.name} sees indexer entry for ${indexer.address}`);
125
- const decoded = nodeEntryUtils.decode(entry.value);
126
- t.ok(decoded, `${node.name} decodes indexer entry for ${indexer.address}`);
127
- if (!decoded) continue;
128
-
129
- t.is(decoded.isWhitelisted, true, `${node.name} keeps ${indexer.address} whitelisted`);
130
- t.is(decoded.isWriter, true, `${node.name} keeps ${indexer.address} as writer`);
131
- t.is(decoded.isIndexer, true, `${node.name} marks ${indexer.address} as indexer`);
132
- t.ok(
133
- b4a.equals(decoded.wk, indexer.writingKey),
134
- `${node.name} sees unchanged writing key for ${indexer.address}`
135
- );
136
- t.ok(
137
- b4a.equals(decoded.balance, indexer.balance),
138
- `${node.name} sees unchanged balance for ${indexer.address}`
139
- );
140
- t.ok(
141
- b4a.equals(decoded.stakedBalance, indexer.stakedBalance),
142
- `${node.name} sees unchanged staked balance for ${indexer.address}`
143
- );
144
- t.ok(
145
- b4a.equals(decoded.license, indexer.license),
146
- `${node.name} sees unchanged license for ${indexer.address}`
147
- );
148
-
149
- const hasWritingKey = membership.some(entry => entry?.key && b4a.equals(entry.key, indexer.writingKey));
150
- t.ok(
151
- hasWritingKey,
152
- `${node.name} records ${indexer.address} in validator set`
153
- );
154
- }
155
- }
156
-
157
- function getIndexerCount(base) {
158
- return Object.values(base.system.indexers ?? {}).length;
159
- }
160
-
161
- async function deriveNextWriterIndex(base) {
162
- const entry = await base.view.get(EntryType.WRITERS_LENGTH);
163
- if (!entry?.value) {
164
- return 0;
165
- }
166
- return lengthEntryUtils.decodeBE(entry.value);
167
- }
@@ -1,21 +0,0 @@
1
- import OperationValidationScenarioBase from '../common/base/OperationValidationScenarioBase.js';
2
- import nodeRoleUtils from '../../../../../src/core/state/utils/roles.js';
3
- import {
4
- setupAddIndexerScenario,
5
- buildAddIndexerPayload,
6
- assertAddIndexerFailureState,
7
- applyWithPretenderRoleMutation
8
- } from './addIndexerScenarioHelpers.js';
9
-
10
- export default function addIndexerPretenderAlreadyIndexerScenario() {
11
- new OperationValidationScenarioBase({
12
- title: 'State.apply addIndexer rejects payloads when target is already an indexer',
13
- setupScenario: setupAddIndexerScenario,
14
- buildValidPayload: context => buildAddIndexerPayload(context),
15
- mutatePayload: (_t, payload) => payload,
16
- applyInvalidPayload: (context, invalidPayload) =>
17
- applyWithPretenderRoleMutation(context, invalidPayload, nodeRoleUtils.NodeRole.INDEXER),
18
- assertStateUnchanged: (t, context) => assertAddIndexerFailureState(t, context, { skipSync: true }),
19
- expectedLogs: ['Node must be a writer, and cannot already be an indexer.']
20
- }).performScenario();
21
- }
@@ -1,21 +0,0 @@
1
- import OperationValidationScenarioBase from '../common/base/OperationValidationScenarioBase.js';
2
- import nodeRoleUtils from '../../../../../src/core/state/utils/roles.js';
3
- import {
4
- setupAddIndexerScenario,
5
- buildAddIndexerPayload,
6
- assertAddIndexerFailureState,
7
- applyWithPretenderRoleMutation
8
- } from './addIndexerScenarioHelpers.js';
9
-
10
- export default function addIndexerPretenderNotWriterScenario() {
11
- new OperationValidationScenarioBase({
12
- title: 'State.apply addIndexer rejects payloads when target is not a writer',
13
- setupScenario: setupAddIndexerScenario,
14
- buildValidPayload: context => buildAddIndexerPayload(context),
15
- mutatePayload: (_t, payload) => payload,
16
- applyInvalidPayload: (context, invalidPayload) =>
17
- applyWithPretenderRoleMutation(context, invalidPayload, nodeRoleUtils.NodeRole.READER),
18
- assertStateUnchanged: (t, context) => assertAddIndexerFailureState(t, context, { skipSync: true }),
19
- expectedLogs: ['Node must be a writer, and cannot already be an indexer.']
20
- }).performScenario();
21
- }
@@ -1,186 +0,0 @@
1
- import b4a from 'b4a';
2
- import { test } from 'brittle';
3
- import nodeEntryUtils from '../../../../../src/core/state/utils/nodeEntry.js';
4
- import { EntryType } from '../../../../../src/utils/constants.js';
5
- import {
6
- setupAddIndexerScenario,
7
- selectIndexerCandidatePeer,
8
- buildAddIndexerPayload,
9
- buildRemoveIndexerPayload,
10
- assertAddIndexerSuccessState,
11
- ensureIndexerRegistration
12
- } from './addIndexerScenarioHelpers.js';
13
- import { eventFlush } from '../../../../helpers/autobaseTestHelpers.js';
14
- import { toBalance } from '../../../../../src/core/state/utils/balance.js';
15
- import transactionUtils from '../../../../../src/core/state/utils/transaction.js';
16
- import { safeDecodeApplyOperation } from '../../../../../src/utils/protobuf/operationHelpers.js';
17
-
18
- export default function addIndexerRemoveAndReAddScenario() {
19
- test('State.apply addIndexer re-promotes writer after removeIndexer cycle', async t => {
20
- const context = await setupAddIndexerScenario(t, { nodes: 4 });
21
- const adminPeer = context.adminBootstrap;
22
- const writerPeer = selectIndexerCandidatePeer(context);
23
-
24
- // Initial promotion to indexer
25
- const writerEntryBefore = await adminPeer.base.view.get(writerPeer.wallet.address);
26
- const initialAdminEntry = await adminPeer.base.view.get(adminPeer.wallet.address);
27
- const initialAdminBalance = readBalance(initialAdminEntry);
28
-
29
- const firstAddPayload = await buildAddIndexerPayload(context, { writerPeer, adminPeer });
30
- await adminPeer.base.append(firstAddPayload);
31
- await adminPeer.base.update();
32
- await eventFlush();
33
-
34
- await assertAddIndexerSuccessState(t, context, {
35
- writerPeer,
36
- adminPeer,
37
- writerEntryBefore: { value: b4a.from(writerEntryBefore.value) },
38
- adminEntryBefore: { value: b4a.from(initialAdminEntry.value) },
39
- payload: firstAddPayload,
40
- skipSync: true
41
- });
42
- const adminBalanceAfterInitialAdd = await readAdminBalance(adminPeer);
43
- t.ok(
44
- adminBalanceAfterInitialAdd && initialAdminBalance,
45
- 'admin balance decodes after initial add'
46
- );
47
- ensureIndexerRegistration(adminPeer.base, writerPeer.base.local.key);
48
- t.is(
49
- readIndexerMembership(adminPeer.base, writerPeer.base.local.key),
50
- true,
51
- 'writer key registered before removeIndexer'
52
- );
53
-
54
- // Remove indexer
55
- const writersLengthBeforeRemove = await readWritersLength(adminPeer);
56
-
57
- const removePayload = await buildRemoveIndexerPayload(context, {
58
- indexerPeer: writerPeer,
59
- adminPeer
60
- });
61
- await adminPeer.base.append(removePayload);
62
- await adminPeer.base.update();
63
- await eventFlush();
64
-
65
- await assertWriterDemotedToWriter(t, adminPeer.base, writerPeer);
66
-
67
- const adminBalanceAfterRemove = await readAdminBalance(adminPeer);
68
- assertFeeDeducted(
69
- t,
70
- adminBalanceAfterInitialAdd,
71
- adminBalanceAfterRemove,
72
- 'admin balance reduced by removeIndexer fee'
73
- );
74
-
75
- const writersLengthAfterRemove = await readWritersLength(adminPeer);
76
- t.is(
77
- writersLengthAfterRemove,
78
- writersLengthBeforeRemove + 1,
79
- 'writers length increments after removeIndexer'
80
- );
81
- t.is(
82
- readIndexerMembership(adminPeer.base, writerPeer.base.local.key),
83
- false,
84
- 'writer key removed from validator set after removeIndexer'
85
- );
86
-
87
- // Re-add as indexer
88
- const reAddPayload = await buildAddIndexerPayload(context, { writerPeer, adminPeer });
89
- await adminPeer.base.append(reAddPayload);
90
- await adminPeer.base.update();
91
- await eventFlush();
92
-
93
- const adminBalanceAfterReAdd = await readAdminBalance(adminPeer);
94
- assertFeeDeducted(
95
- t,
96
- adminBalanceAfterRemove,
97
- adminBalanceAfterReAdd,
98
- 'admin balance reduced by re-add fee'
99
- );
100
-
101
- const writersLengthAfterReAdd = await readWritersLength(adminPeer);
102
- t.is(
103
- writersLengthAfterReAdd,
104
- writersLengthAfterRemove,
105
- 'writers length remains stable after re-adding indexer'
106
- );
107
- ensureIndexerRegistration(adminPeer.base, writerPeer.base.local.key);
108
- t.is(
109
- readIndexerMembership(adminPeer.base, writerPeer.base.local.key),
110
- true,
111
- 'writer key restored in validator set after re-add'
112
- );
113
- await assertIndexerEntry(t, adminPeer.base, writerPeer);
114
- await assertReplayRecorded(t, adminPeer.base, reAddPayload);
115
- });
116
- }
117
-
118
- async function assertWriterDemotedToWriter(t, base, writerPeer) {
119
- const entry = await base.view.get(writerPeer.wallet.address);
120
- t.ok(entry, 'writer entry exists after removeIndexer');
121
- const decoded = nodeEntryUtils.decode(entry?.value);
122
- t.ok(decoded, 'writer entry decodes after removeIndexer');
123
- if (!decoded) return;
124
-
125
- t.is(decoded.isWhitelisted, true, 'writer stays whitelisted after removeIndexer');
126
- t.is(decoded.isWriter, true, 'writer role remains assigned after removeIndexer');
127
- t.is(decoded.isIndexer, false, 'writer no longer an indexer after removeIndexer');
128
- t.ok(b4a.equals(decoded.wk, writerPeer.base.local.key), 'writer key preserved after removeIndexer');
129
- }
130
-
131
- async function readWritersLength(adminPeer) {
132
- const entry = await adminPeer.base.view.get(EntryType.WRITERS_LENGTH);
133
- if (!entry?.value) return 0;
134
- return entry.value.readUInt32BE();
135
- }
136
-
137
- function readIndexerMembership(base, writingKey) {
138
- return Object.values(base.system.indexers ?? {}).some(entry => entry?.key && b4a.equals(entry.key, writingKey));
139
- }
140
-
141
- async function readAdminBalance(adminPeer) {
142
- const entry = await adminPeer.base.view.get(adminPeer.wallet.address);
143
- return readBalance(entry);
144
- }
145
-
146
- function readBalance(entry) {
147
- if (!entry?.value) return null;
148
- const decoded = nodeEntryUtils.decode(entry.value);
149
- if (!decoded) return null;
150
- return toBalance(decoded.balance);
151
- }
152
-
153
- function assertFeeDeducted(t, before, after, message) {
154
- const feeBalance = toBalance(transactionUtils.FEE);
155
- if (!before || !after || !feeBalance) {
156
- t.fail('Balance values missing for fee assertion.');
157
- return;
158
- }
159
- const expected = before.sub(feeBalance);
160
- t.ok(expected, 'expected balance computed');
161
- if (!expected) return;
162
- t.ok(
163
- b4a.equals(after.value, expected.value),
164
- message
165
- );
166
- }
167
-
168
- async function assertIndexerEntry(t, base, writerPeer) {
169
- const entry = await base.view.get(writerPeer.wallet.address);
170
- t.ok(entry, 'writer entry exists after re-adding indexer');
171
- const decoded = nodeEntryUtils.decode(entry?.value);
172
- t.ok(decoded, 'writer entry decodes after re-adding indexer');
173
- if (!decoded) return;
174
- t.is(decoded.isIndexer, true, 'writer flagged as indexer after re-adding');
175
- }
176
-
177
- async function assertReplayRecorded(t, base, payload) {
178
- const decodedOperation = safeDecodeApplyOperation(payload);
179
- t.ok(decodedOperation, 're-add payload decodes');
180
- if (!decodedOperation) return;
181
- const txBuffer = decodedOperation?.aco?.tx;
182
- t.ok(txBuffer, 're-add payload contains tx hash');
183
- if (!txBuffer) return;
184
- const entry = await base.view.get(txBuffer.toString('hex'));
185
- t.ok(entry, 're-add tx recorded for replay protection');
186
- }