From e5e947659779d27a1ee8c6e291ff46d3eb5ac498 Mon Sep 17 00:00:00 2001 From: "Sebastijan K." <58827427+sebastijankuzner@users.noreply.github.com> Date: Tue, 18 Aug 2026 10:08:42 +0200 Subject: [PATCH 1/2] feat(crypto-magistrate-transactions): disable all MagistrateTransactions from milestones (#4869) * Add enable magistrate * Rename * Add to crypto * Add tests * update `@arkecosystem/crypto-networks` to 1.9.0 * fix tests * update `@arkecosystem/crypto-networks` to 2.0.0 --- .../transaction-forging/__support__/index.ts | 9 ++++++++ .../core-api/handlers/transactions.test.ts | 21 ++----------------- .../handlers/entity.test.ts | 9 ++++++++ .../src/handlers/entity.ts | 3 ++- .../src/handlers/magistrate-handler.ts | 2 +- .../src/app/generators/crypto.ts | 1 + packages/crypto/package.json | 2 +- yarn.lock | 8 +++---- 8 files changed, 29 insertions(+), 26 deletions(-) diff --git a/__tests__/functional/transaction-forging/__support__/index.ts b/__tests__/functional/transaction-forging/__support__/index.ts index 3892eb540a..48c5c51a70 100644 --- a/__tests__/functional/transaction-forging/__support__/index.ts +++ b/__tests__/functional/transaction-forging/__support__/index.ts @@ -11,6 +11,7 @@ jest.setTimeout(1200000); import { StateBuilder } from "@arkecosystem/core-state/src/state-builder"; import { Sandbox } from "@packages/core-test-framework/src"; +import { snoozeForBlock } from "@packages/core-test-framework/src/utils"; const sandbox: Sandbox = new Sandbox(); @@ -63,6 +64,14 @@ export const setUp = async (): Promise => { Managers.configManager.getMilestone().aip11 = true; Managers.configManager.getMilestone().htlcEnabled = true; + Managers.configManager.getMilestone().blsPublicKeyRegistrationEnabled = true; + Managers.configManager.getMilestone().magistrateEnabled = true; + + // The flag above only covers the config that is live right now. TransactionFactory reloads + // the testnet preset on every transaction it builds, and there `magistrateEnabled` is only + // set from height 2 — so a Magistrate transaction sent at genesis is still rejected with + // "Transaction type 2/x is deactivated". Wait for the first block before any test runs. + await snoozeForBlock(1); }); return sandbox.app; diff --git a/__tests__/integration/core-api/handlers/transactions.test.ts b/__tests__/integration/core-api/handlers/transactions.test.ts index 180c1329d0..6271167750 100644 --- a/__tests__/integration/core-api/handlers/transactions.test.ts +++ b/__tests__/integration/core-api/handlers/transactions.test.ts @@ -474,16 +474,7 @@ describe("API 2.0 - Transactions", () => { HtlcClaim: 9, HtlcRefund: 10, }, - 2: { - // Marketplace stuff - BusinessRegistration: 0, - BusinessResignation: 1, - BusinessUpdate: 2, - BridgechainRegistration: 3, - BridgechainResignation: 4, - BridgechainUpdate: 5, - // Entity: 6, // no "Entity" because aip36 is not enabled - }, + // no typeGroup 2 (Magistrate) because magistrateEnabled is not set on this milestone }); }); }); @@ -637,15 +628,7 @@ describe("API 2.0 - Transactions", () => { transfer: "10000000", vote: "100000000", }, - "2": { - bridgechainRegistration: "5000000000", - bridgechainResignation: "5000000000", - bridgechainUpdate: "5000000000", - businessRegistration: "5000000000", - businessResignation: "5000000000", - businessUpdate: "5000000000", - // entity: "5000000000", // aip36 is disabled - }, + // no typeGroup 2 (Magistrate) because magistrateEnabled is not set on this milestone }); }); }); diff --git a/__tests__/unit/core-magistrate-transactions/handlers/entity.test.ts b/__tests__/unit/core-magistrate-transactions/handlers/entity.test.ts index 16624f5c2a..a828243145 100644 --- a/__tests__/unit/core-magistrate-transactions/handlers/entity.test.ts +++ b/__tests__/unit/core-magistrate-transactions/handlers/entity.test.ts @@ -136,6 +136,15 @@ describe("Entity handler", () => { const result = await entityHandler.isActivated(); expect(result).toBeTrue(); }); + + it("should return false if AIP36 is enabled but magistrate is not enabled", async () => { + Managers.configManager.setHeight(61); + Managers.configManager.getMilestone().magistrateEnabled = false; + + entityHandler = container.resolve(EntityTransactionHandler); + const result = await entityHandler.isActivated(); + expect(result).toBeFalse(); + }); }); describe("dynamicFee", () => { diff --git a/packages/core-magistrate-transactions/src/handlers/entity.ts b/packages/core-magistrate-transactions/src/handlers/entity.ts index c313c2b17d..5746ae4399 100644 --- a/packages/core-magistrate-transactions/src/handlers/entity.ts +++ b/packages/core-magistrate-transactions/src/handlers/entity.ts @@ -40,7 +40,8 @@ export class EntityTransactionHandler extends Handlers.TransactionHandler { } public async isActivated(): Promise { - return Managers.configManager.getMilestone().aip36 === true; + const milestone = Managers.configManager.getMilestone(); + return milestone.aip36 === true && milestone.magistrateEnabled === true; } public dynamicFee(context: Contracts.Shared.DynamicFeeContext): Utils.BigNumber { diff --git a/packages/core-magistrate-transactions/src/handlers/magistrate-handler.ts b/packages/core-magistrate-transactions/src/handlers/magistrate-handler.ts index a5b648ea4c..dbe76e9920 100644 --- a/packages/core-magistrate-transactions/src/handlers/magistrate-handler.ts +++ b/packages/core-magistrate-transactions/src/handlers/magistrate-handler.ts @@ -5,7 +5,7 @@ import { Interfaces as CryptoInterfaces, Managers, Utils } from "@arkecosystem/c export abstract class MagistrateTransactionHandler extends Handlers.TransactionHandler { public async isActivated(): Promise { const milestone = Managers.configManager.getMilestone(); - return milestone.aip11 === true && !milestone.aip36; + return milestone.aip11 === true && !milestone.aip36 && milestone.magistrateEnabled === true; } public async throwIfCannotBeApplied( diff --git a/packages/core-test-framework/src/app/generators/crypto.ts b/packages/core-test-framework/src/app/generators/crypto.ts index a51477bd63..29e72cc8b7 100644 --- a/packages/core-test-framework/src/app/generators/crypto.ts +++ b/packages/core-test-framework/src/app/generators/crypto.ts @@ -130,6 +130,7 @@ export class CryptoGenerator extends Generator { multiSignatureRegistrationEnabled: true, multiSignatureSendingEnabled: true, multiSignatureReceivingEnabled: true, + magistrateEnabled: true, }, { height: rewardHeight, diff --git a/packages/crypto/package.json b/packages/crypto/package.json index ca38440d97..7da9019da1 100644 --- a/packages/crypto/package.json +++ b/packages/crypto/package.json @@ -32,7 +32,7 @@ }, "dependencies": { "@arkecosystem/crypto-identities": "1.2.0", - "@arkecosystem/crypto-networks": "1.8.2", + "@arkecosystem/crypto-networks": "2.0.0", "@arkecosystem/utils": "1.3.1", "ajv": "6.12.6", "ajv-keywords": "3.4.1", diff --git a/yarn.lock b/yarn.lock index 94fa7cd23a..0d6a20d388 100644 --- a/yarn.lock +++ b/yarn.lock @@ -25,10 +25,10 @@ fast-memoize "^2.5.1" wif "^2.0.6" -"@arkecosystem/crypto-networks@1.8.2": - version "1.8.2" - resolved "https://registry.yarnpkg.com/@arkecosystem/crypto-networks/-/crypto-networks-1.8.2.tgz#80cf278d1838ff237bd987dc66d511b72471f1f0" - integrity sha512-yrx7m0+0CEX3Rztvj9yS9BYAsZY+of2nFb/e6yZKUhx9o+HoI44bzojcPCwu5vTsExG7ourRfG+6dvu8ylGHXQ== +"@arkecosystem/crypto-networks@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@arkecosystem/crypto-networks/-/crypto-networks-2.0.0.tgz#e878dc337b45f1020e6c9e58f0456ffbfa89d78f" + integrity sha512-YxQJbSrCLrgWDHbCoj2m/Baj5Qn5XLYhuvtEeAb8lVIHFxJTso5AXaaDoO2DDc/HSIQrTAhi5627zPoGq54BQQ== "@arkecosystem/utils@1.3.1": version "1.3.1" From b1df449212090d422748e8eb451d57fc91f53f1b Mon Sep 17 00:00:00 2001 From: oXtxNt9U <120286271+oXtxNt9U@users.noreply.github.com> Date: Wed, 19 Aug 2026 15:57:51 +0900 Subject: [PATCH 2/2] deps: update crypto-networks to 2.0.2 --- packages/crypto/package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/crypto/package.json b/packages/crypto/package.json index 7da9019da1..b747391da2 100644 --- a/packages/crypto/package.json +++ b/packages/crypto/package.json @@ -32,7 +32,7 @@ }, "dependencies": { "@arkecosystem/crypto-identities": "1.2.0", - "@arkecosystem/crypto-networks": "2.0.0", + "@arkecosystem/crypto-networks": "2.0.2", "@arkecosystem/utils": "1.3.1", "ajv": "6.12.6", "ajv-keywords": "3.4.1", diff --git a/yarn.lock b/yarn.lock index 0d6a20d388..54ff7cea99 100644 --- a/yarn.lock +++ b/yarn.lock @@ -25,10 +25,10 @@ fast-memoize "^2.5.1" wif "^2.0.6" -"@arkecosystem/crypto-networks@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@arkecosystem/crypto-networks/-/crypto-networks-2.0.0.tgz#e878dc337b45f1020e6c9e58f0456ffbfa89d78f" - integrity sha512-YxQJbSrCLrgWDHbCoj2m/Baj5Qn5XLYhuvtEeAb8lVIHFxJTso5AXaaDoO2DDc/HSIQrTAhi5627zPoGq54BQQ== +"@arkecosystem/crypto-networks@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@arkecosystem/crypto-networks/-/crypto-networks-2.0.2.tgz#9c8d2ca6c5ad778815e4df28817a89d79ee6bf14" + integrity sha512-sjzneWEu/DmzcZpD5LL8pKQrITdH23lgojPlnWyV5LayQUw242uN/taW++6UmP6nUkflIPsLmGndBgnxKTGhNg== "@arkecosystem/utils@1.3.1": version "1.3.1"