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,443 +0,0 @@
1
- import b4a from 'b4a';
2
- import { applyStateMessageFactory } from '../../../../../src/messages/state/applyStateMessageFactory.js';
3
- import { safeEncodeApplyOperation } from '../../../../../src/utils/protobuf/operationHelpers.js';
4
- import { deriveIndexerSequenceState, eventFlush } from '../../../../helpers/autobaseTestHelpers.js';
5
- import {
6
- setupAddWriterScenario,
7
- selectWriterPeer,
8
- promotePeerToWriter
9
- } from '../addWriter/addWriterScenarioHelpers.js';
10
- import nodeEntryUtils from '../../../../../src/core/state/utils/nodeEntry.js';
11
- import { toBalance } from '../../../../../src/core/state/utils/balance.js';
12
- import transactionUtils from '../../../../../src/core/state/utils/transaction.js';
13
- import addressUtils from '../../../../../src/core/state/utils/address.js';
14
- import { safeDecodeApplyOperation } from '../../../../../src/utils/protobuf/operationHelpers.js';
15
- import nodeRoleUtils from '../../../../../src/core/state/utils/roles.js';
16
- import { config } from '../../../../helpers/config.js';
17
-
18
- export function selectIndexerCandidatePeer(context, offset = 0) {
19
- return selectWriterPeer(context, offset);
20
- }
21
-
22
- export async function setupAddIndexerScenario(t, options = {}) {
23
- const context = await setupAddWriterScenario(t, options);
24
- const candidatePeer = selectIndexerCandidatePeer(context);
25
- await promotePeerToWriter(t, context, { readerPeer: candidatePeer });
26
-
27
- const adminPeer = context.adminBootstrap;
28
- const writerEntryBefore = await adminPeer.base.view.get(candidatePeer.wallet.address);
29
- const adminEntryBefore = await adminPeer.base.view.get(adminPeer.wallet.address);
30
-
31
- context.addIndexerScenario = {
32
- ...(context.addIndexerScenario ?? {}),
33
- writerPeer: candidatePeer,
34
- writerEntryBefore: writerEntryBefore
35
- ? { value: b4a.from(writerEntryBefore.value) }
36
- : null,
37
- adminEntryBefore: adminEntryBefore ? { value: b4a.from(adminEntryBefore.value) } : null
38
- };
39
-
40
- return context;
41
- }
42
-
43
- export async function buildAddIndexerPayload(
44
- context,
45
- { writerPeer = selectIndexerCandidatePeer(context), adminPeer = context.adminBootstrap } = {}
46
- ) {
47
- if (!writerPeer) {
48
- throw new Error('buildAddIndexerPayload requires a writer peer.');
49
- }
50
- if (!adminPeer) {
51
- throw new Error('buildAddIndexerPayload requires an admin peer.');
52
- }
53
-
54
- const txValidity = await deriveIndexerSequenceState(adminPeer.base);
55
- return safeEncodeApplyOperation(
56
- await applyStateMessageFactory(adminPeer.wallet, config)
57
- .buildCompleteAddIndexerMessage(adminPeer.wallet.address, writerPeer.wallet.address, txValidity)
58
- );
59
- }
60
-
61
- export async function applyWithIndexerRoleUpdateFailure(context, invalidPayload) {
62
- const node = context.adminBootstrap ?? context.bootstrap ?? context.peers?.[0] ?? null;
63
- if (!node?.base) {
64
- throw new Error('Indexer role mutation failure scenario requires a writable node.');
65
- }
66
-
67
- const originalSetRole = nodeEntryUtils.setRole;
68
- let shouldFailNextCall = true;
69
-
70
- nodeEntryUtils.setRole = function patchedSetRole(...args) {
71
- if (shouldFailNextCall) {
72
- shouldFailNextCall = false;
73
- return null;
74
- }
75
- return originalSetRole(...args);
76
- };
77
-
78
- try {
79
- await node.base.append(invalidPayload);
80
- await node.base.update();
81
- await eventFlush();
82
- } finally {
83
- nodeEntryUtils.setRole = originalSetRole;
84
- }
85
- }
86
-
87
- export async function buildAddIndexerPayloadWithTxValidity(
88
- context,
89
- mutatedTxValidity,
90
- { writerPeer = selectIndexerCandidatePeer(context), adminPeer = context.adminBootstrap } = {}
91
- ) {
92
- if (!b4a.isBuffer(mutatedTxValidity)) {
93
- throw new Error('buildAddIndexerPayloadWithTxValidity requires a tx validity buffer.');
94
- }
95
- if (!writerPeer) {
96
- throw new Error('buildAddIndexerPayloadWithTxValidity requires a writer peer.');
97
- }
98
- if (!adminPeer) {
99
- throw new Error('buildAddIndexerPayloadWithTxValidity requires an admin peer.');
100
- }
101
-
102
- return safeEncodeApplyOperation(
103
- await applyStateMessageFactory(adminPeer.wallet, config)
104
- .buildCompleteAddIndexerMessage(adminPeer.wallet.address, writerPeer.wallet.address, mutatedTxValidity)
105
- );
106
- }
107
-
108
- export function ensureIndexerRegistration(base, writingKey) {
109
- return registerWriterKeyInSystemIndexers(base, writingKey);
110
- }
111
-
112
- export async function applyWithIndexerWriterKeyAlreadyRegistered(context, invalidPayload) {
113
- const adminPeer = context.adminBootstrap;
114
- const writerPeer = context.addIndexerScenario?.writerPeer ?? selectIndexerCandidatePeer(context);
115
- if (!adminPeer?.base || !writerPeer?.base?.local?.key) {
116
- throw new Error('Indexer writer key registration scenario requires admin and writer peers.');
117
- }
118
-
119
- let cleanup = context.addIndexerScenario?.writerKeyMembershipCleanup ?? null;
120
- if (cleanup) {
121
- context.addIndexerScenario.writerKeyMembershipCleanup = null;
122
- } else {
123
- cleanup = ensureIndexerRegistration(adminPeer.base, writerPeer.base.local.key);
124
- }
125
-
126
- try {
127
- await adminPeer.base.append(invalidPayload);
128
- await adminPeer.base.update();
129
- await eventFlush();
130
- } finally {
131
- if (typeof cleanup === 'function') {
132
- cleanup();
133
- }
134
- }
135
- }
136
-
137
- export async function buildRemoveIndexerPayload(
138
- context,
139
- { indexerPeer = selectIndexerCandidatePeer(context), adminPeer = context.adminBootstrap } = {}
140
- ) {
141
- if (!indexerPeer) {
142
- throw new Error('buildRemoveIndexerPayload requires an indexer peer.');
143
- }
144
- if (!adminPeer) {
145
- throw new Error('buildRemoveIndexerPayload requires an admin peer.');
146
- }
147
-
148
- const txValidity = await deriveIndexerSequenceState(adminPeer.base);
149
- return safeEncodeApplyOperation(
150
- await applyStateMessageFactory(adminPeer.wallet, config)
151
- .buildCompleteRemoveIndexerMessage(adminPeer.wallet.address, indexerPeer.wallet.address, txValidity)
152
- );
153
- }
154
-
155
- export async function buildRemoveIndexerPayloadWithTxValidity(
156
- context,
157
- mutatedTxValidity,
158
- { indexerPeer = selectIndexerCandidatePeer(context), adminPeer = context.adminBootstrap } = {}
159
- ) {
160
- if (!b4a.isBuffer(mutatedTxValidity)) {
161
- throw new Error('buildRemoveIndexerPayloadWithTxValidity requires a tx validity buffer.');
162
- }
163
- if (!indexerPeer) {
164
- throw new Error('buildRemoveIndexerPayloadWithTxValidity requires an indexer peer.');
165
- }
166
- if (!adminPeer) {
167
- throw new Error('buildRemoveIndexerPayloadWithTxValidity requires an admin peer.');
168
- }
169
-
170
- return safeEncodeApplyOperation(
171
- await applyStateMessageFactory(adminPeer.wallet, config)
172
- .buildCompleteRemoveIndexerMessage(adminPeer.wallet.address, indexerPeer.wallet.address, mutatedTxValidity)
173
- );
174
- }
175
-
176
- export async function assertAddIndexerSuccessState(
177
- t,
178
- context,
179
- {
180
- writerPeer = selectIndexerCandidatePeer(context),
181
- adminPeer = context.adminBootstrap,
182
- writerEntryBefore,
183
- adminEntryBefore,
184
- payload,
185
- skipSync = false
186
- } = {}
187
- ) {
188
- if (!writerEntryBefore?.value) {
189
- throw new Error('assertAddIndexerSuccessState requires writerEntryBefore.');
190
- }
191
- if (!adminEntryBefore?.value) {
192
- throw new Error('assertAddIndexerSuccessState requires adminEntryBefore.');
193
- }
194
- if (!payload) {
195
- throw new Error('assertAddIndexerSuccessState requires the processed payload.');
196
- }
197
-
198
- const writerAddress = writerPeer.wallet.address;
199
- const decodedWriterBefore = nodeEntryUtils.decode(b4a.from(writerEntryBefore.value));
200
- t.ok(decodedWriterBefore, 'writer entry before addIndexer decodes');
201
- if (!decodedWriterBefore) return;
202
-
203
- await assertIndexerNodeEntry(t, adminPeer.base, writerAddress, decodedWriterBefore, {
204
- verifyMembership: false
205
- });
206
-
207
- await assertAdminPaidFee(t, adminPeer.base, adminPeer.wallet.address, adminEntryBefore.value);
208
-
209
- await assertAddIndexerPayloadMetadata(
210
- t,
211
- adminPeer.base,
212
- payload,
213
- adminPeer.wallet.address,
214
- writerAddress
215
- );
216
-
217
- if (!skipSync) {
218
- await context.sync();
219
- await assertIndexerNodeEntry(t, writerPeer.base, writerAddress, decodedWriterBefore, {
220
- verifyMembership: true
221
- });
222
- }
223
- }
224
-
225
- export async function assertAddIndexerFailureState(
226
- t,
227
- context,
228
- { writerPeer = selectIndexerCandidatePeer(context), adminPeer = context.adminBootstrap, skipSync = false } = {}
229
- ) {
230
- await assertWriterRemainsNonIndexer(t, adminPeer.base, writerPeer);
231
-
232
- if (!skipSync) {
233
- await context.sync();
234
- await assertWriterRemainsNonIndexer(t, writerPeer.base, writerPeer);
235
- }
236
- }
237
-
238
- async function assertIndexerNodeEntry(t, base, address, referenceNodeEntry, { verifyMembership = true } = {}) {
239
- const entry = await base.view.get(address);
240
- t.ok(entry, 'indexer node entry exists');
241
- const decoded = nodeEntryUtils.decode(entry?.value);
242
- t.ok(decoded, 'indexer node entry decodes');
243
- if (!decoded) return;
244
-
245
- t.is(decoded.isWhitelisted, true, 'indexer remains whitelisted');
246
- t.is(decoded.isWriter, true, 'indexer retains writer role');
247
- t.is(decoded.isIndexer, true, 'indexer role assigned');
248
- t.ok(b4a.equals(decoded.wk, referenceNodeEntry.wk), 'indexer writing key preserved');
249
- t.ok(b4a.equals(decoded.balance, referenceNodeEntry.balance), 'indexer balance preserved');
250
- t.ok(
251
- b4a.equals(decoded.stakedBalance, referenceNodeEntry.stakedBalance),
252
- 'indexer staked balance preserved'
253
- );
254
- t.ok(b4a.equals(decoded.license, referenceNodeEntry.license), 'indexer license preserved');
255
- if (verifyMembership) {
256
- assertIndexerMembership(t, base, referenceNodeEntry.wk);
257
- }
258
- }
259
-
260
- async function assertAdminPaidFee(t, base, adminAddress, adminEntryBeforeValue) {
261
- const decodedBefore = nodeEntryUtils.decode(b4a.from(adminEntryBeforeValue));
262
- t.ok(decodedBefore, 'admin entry before addIndexer decodes');
263
- if (!decodedBefore) return;
264
-
265
- const adminEntryAfter = await base.view.get(adminAddress);
266
- t.ok(adminEntryAfter, 'admin entry exists after addIndexer');
267
- const decodedAfter = nodeEntryUtils.decode(adminEntryAfter?.value);
268
- t.ok(decodedAfter, 'admin entry decodes after addIndexer');
269
- if (!decodedAfter) return;
270
-
271
- const balanceBefore = toBalance(decodedBefore.balance);
272
- t.ok(balanceBefore, 'admin balance before addIndexer decodes');
273
- if (!balanceBefore) return;
274
-
275
- const feeAmount = toBalance(transactionUtils.FEE);
276
- t.ok(feeAmount, 'addIndexer fee decodes');
277
- if (!feeAmount) return;
278
-
279
- const expectedBalance = balanceBefore.sub(feeAmount);
280
- t.ok(expectedBalance, 'admin balance after fee computation succeeds');
281
- if (!expectedBalance) return;
282
-
283
- t.ok(
284
- b4a.equals(decodedAfter.balance, expectedBalance.value),
285
- 'admin balance reduced by addIndexer fee'
286
- );
287
- t.ok(
288
- b4a.equals(decodedAfter.stakedBalance, decodedBefore.stakedBalance),
289
- 'admin staked balance remains unchanged after addIndexer'
290
- );
291
- }
292
-
293
- async function assertAddIndexerPayloadMetadata(t, base, payload, expectedAdminAddress, expectedCandidate) {
294
- const decodedOperation = safeDecodeApplyOperation(payload);
295
- t.ok(decodedOperation, 'addIndexer payload decodes');
296
- if (!decodedOperation) return;
297
-
298
- const requesterAddressBuffer = decodedOperation.address;
299
- t.ok(requesterAddressBuffer, 'addIndexer payload contains requester address');
300
- const requesterAddress = addressUtils.bufferToAddress(requesterAddressBuffer, config.addressPrefix);
301
- t.ok(requesterAddress, 'addIndexer requester address decodes');
302
- if (requesterAddress) {
303
- t.is(requesterAddress, expectedAdminAddress, 'addIndexer payload signed by admin');
304
- }
305
-
306
- const candidateAddressBuffer = decodedOperation?.aco?.ia;
307
- t.ok(candidateAddressBuffer, 'addIndexer payload contains candidate address');
308
- const candidateAddress = addressUtils.bufferToAddress(candidateAddressBuffer, config.addressPrefix);
309
- t.ok(candidateAddress, 'addIndexer candidate address decodes');
310
- if (candidateAddress) {
311
- t.is(candidateAddress, expectedCandidate, 'addIndexer payload nominates expected writer');
312
- }
313
-
314
- const txHashBuffer = decodedOperation?.aco?.tx;
315
- t.ok(txHashBuffer, 'addIndexer tx hash extracted');
316
- if (txHashBuffer) {
317
- const txEntry = await base.view.get(txHashBuffer.toString('hex'));
318
- t.ok(txEntry, 'addIndexer transaction recorded for replay protection');
319
- }
320
- }
321
-
322
- async function assertWriterRemainsNonIndexer(t, base, writerPeer) {
323
- const entry = await base.view.get(writerPeer.wallet.address);
324
- t.ok(entry, 'writer entry exists after failed addIndexer');
325
- const decoded = nodeEntryUtils.decode(entry?.value);
326
- t.ok(decoded, 'writer entry decodes after failed addIndexer');
327
- if (!decoded) return;
328
- t.is(decoded.isIndexer, false, 'writer not promoted to indexer');
329
- assertIndexerMembershipAbsent(t, base, decoded.wk);
330
- }
331
-
332
- function assertIndexerMembership(t, base, writingKey) {
333
- const hasMembership = indexerMembershipIncludes(base, writingKey);
334
- t.ok(hasMembership, 'indexer writer key added to validator set');
335
- }
336
-
337
- function assertIndexerMembershipAbsent(t, base, writingKey) {
338
- const hasMembership = indexerMembershipIncludes(base, writingKey);
339
- t.is(hasMembership, false, 'writer key absent from validator set');
340
- }
341
-
342
- function indexerMembershipIncludes(base, writingKey) {
343
- const entries = base?.system?.indexers;
344
- if (!entries) return false;
345
- return Object.values(entries).some(entry => entry?.key && b4a.equals(entry.key, writingKey));
346
- }
347
-
348
- function registerWriterKeyInSystemIndexers(base, writingKey) {
349
- const system = base?.system;
350
- if (!system) return () => {};
351
-
352
- if (!Array.isArray(system.indexers)) {
353
- system.indexers = system.indexers ? Array.from(system.indexers) : [];
354
- }
355
-
356
- const membership = system.indexers;
357
- const existing = membership.find(entry => entry?.key && b4a.equals(entry.key, writingKey));
358
- if (existing) {
359
- return () => {};
360
- }
361
-
362
- const entry = { key: writingKey, length: 0 };
363
- membership.push(entry);
364
-
365
- if (system._indexerMap instanceof Map) {
366
- system._indexerMap.set(writingKey.toString('hex'), entry);
367
- }
368
-
369
- return () => {
370
- const index = membership.indexOf(entry);
371
- if (index !== -1) {
372
- membership.splice(index, 1);
373
- }
374
- if (system._indexerMap instanceof Map) {
375
- system._indexerMap.delete(writingKey.toString('hex'));
376
- }
377
- };
378
- }
379
-
380
- export async function applyWithPretenderRoleMutation(context, invalidPayload, role) {
381
- const adminPeer = context.adminBootstrap;
382
- const writerPeer = context.addIndexerScenario?.writerPeer ?? selectIndexerCandidatePeer(context);
383
- if (!adminPeer?.base || !writerPeer?.wallet?.address) {
384
- throw new Error('Pretender role mutation scenario requires admin and writer peers.');
385
- }
386
-
387
- const address = writerPeer.wallet.address;
388
- const originalApply = adminPeer.base._handlers.apply;
389
- const roleValue = typeof role === 'number' ? role : nodeRoleUtils.NodeRole.INDEXER;
390
-
391
- adminPeer.base._handlers.apply = async function patchedApply(nodes, view, baseCtx) {
392
- let mutatedOnce = false;
393
- const originalBatch = view.batch;
394
- view.batch = function patchedBatch(...args) {
395
- const batch = originalBatch.apply(this, args);
396
- if (!batch?.get) return batch;
397
-
398
- const originalGet = batch.get.bind(batch);
399
- batch.get = async key => {
400
- if (mutatedOnce) return originalGet(key);
401
- if (typeof key === 'string' ? key !== address : true) {
402
- // string path comparison; buffer path is unlikely for address entries here
403
- if (b4a.isBuffer(key)) {
404
- const addrBuf = addressUtils.addressToBuffer(address, config.addressPrefix);
405
- if (!addrBuf || !b4a.equals(addrBuf, key)) {
406
- return originalGet(key);
407
- }
408
- } else {
409
- return originalGet(key);
410
- }
411
- }
412
-
413
- const entry = await originalGet(key);
414
- if (!entry?.value) {
415
- throw new Error('Pretender role mutation scenario requires an existing writer entry.');
416
- }
417
-
418
- const mutated = nodeEntryUtils.setRole(b4a.from(entry.value), roleValue);
419
- if (!mutated) {
420
- throw new Error('Failed to mutate pretender node role.');
421
- }
422
- mutatedOnce = true;
423
- return { ...entry, value: mutated };
424
- };
425
-
426
- return batch;
427
- };
428
-
429
- try {
430
- return await originalApply.call(this, nodes, view, baseCtx);
431
- } finally {
432
- view.batch = originalBatch;
433
- }
434
- };
435
-
436
- try {
437
- await adminPeer.base.append(invalidPayload);
438
- await adminPeer.base.update();
439
- await eventFlush();
440
- } finally {
441
- adminPeer.base._handlers.apply = originalApply;
442
- }
443
- }
@@ -1,32 +0,0 @@
1
- import OperationValidationScenarioBase from '../common/base/OperationValidationScenarioBase.js';
2
- import {
3
- setupAddIndexerScenario,
4
- buildAddIndexerPayload,
5
- assertAddIndexerFailureState,
6
- applyWithIndexerWriterKeyAlreadyRegistered,
7
- ensureIndexerRegistration,
8
- selectIndexerCandidatePeer
9
- } from './addIndexerScenarioHelpers.js';
10
-
11
- export default function addIndexerWriterKeyAlreadyRegisteredScenario() {
12
- new OperationValidationScenarioBase({
13
- title: 'State.apply addIndexer rejects payloads when writer key already exists in indexer list',
14
- setupScenario: async t => {
15
- const context = await setupAddIndexerScenario(t);
16
- const writerPeer =
17
- context.addIndexerScenario?.writerPeer ?? selectIndexerCandidatePeer(context);
18
- const cleanup = ensureIndexerRegistration(context.adminBootstrap.base, writerPeer.base.local.key);
19
- context.addIndexerScenario = {
20
- ...(context.addIndexerScenario ?? {}),
21
- writerKeyMembershipCleanup: cleanup,
22
- writerPeer
23
- };
24
- return context;
25
- },
26
- buildValidPayload: context => buildAddIndexerPayload(context),
27
- mutatePayload: (_t, payload) => payload,
28
- applyInvalidPayload: applyWithIndexerWriterKeyAlreadyRegistered,
29
- assertStateUnchanged: (t, context) => assertAddIndexerFailureState(t, context, { skipSync: true }),
30
- expectedLogs: ['Writer key already exists in indexer list.']
31
- }).performScenario();
32
- }