From a91d6d251035a4ee8930f0468917b8af4310724f Mon Sep 17 00:00:00 2001 From: digitalSloth Date: Thu, 21 May 2026 16:21:10 +0100 Subject: [PATCH 1/5] feat: support dynamic plasma --- src/api/embedded/plasma.ts | 28 +++++++++++++++++- src/embedded/plasma.ts | 14 +++++++++ src/model/embedded/plasma.ts | 23 +++++++++++++++ src/model/nom/momentum.ts | 12 ++++++-- test/api/embedded/plasma.spec.ts | 50 ++++++++++++++++++++++++++++++-- 5 files changed, 120 insertions(+), 7 deletions(-) diff --git a/src/api/embedded/plasma.ts b/src/api/embedded/plasma.ts index de3c98f..dcb5f76 100644 --- a/src/api/embedded/plasma.ts +++ b/src/api/embedded/plasma.ts @@ -2,7 +2,7 @@ import { BigNumberish } from "../../utilities/bignumber.js"; import { MEMORY_POOL_PAGE_SIZE, RPC_MAX_PAGE_SIZE } from "../../zenon.js"; import { Api } from "../base.js"; import { Plasma } from "../../embedded/plasma.js"; -import { FusionEntryList, GetRequiredPowParam, GetRequiredPowResponse, PlasmaInfo } from "../../model/embedded/plasma.js"; +import { FusionEntryList, GetRequiredPowParam, GetRequiredPowResponse, PlasmaInfo, PlasmaVariables } from "../../model/embedded/plasma.js"; import { AccountBlockTemplate } from "../../model/nom/accountBlock.js"; import { Address, PLASMA_ADDRESS, Hash, QSR_ZTS } from "../../model/primitives/index.js"; @@ -42,6 +42,11 @@ export class PlasmaApi extends Api { return GetRequiredPowResponse.fromJson(response); } + async getVariables(): Promise { + const response = await this.client.sendRequest("embedded.plasma.getVariables", []); + return PlasmaVariables.fromJson(response!); + } + // // Contract methods @@ -66,4 +71,25 @@ export class PlasmaApi extends Api { ]) ); } + + setVariables( + maxBasePlasmaInMomentum: number, + fusedPlasmaTarget: number, + powPlasmaTarget: number, + maxPriceChangePercent: number, + priceChangeDenominator: number + ): AccountBlockTemplate { + return AccountBlockTemplate.callContract( + PLASMA_ADDRESS, + QSR_ZTS, + BigNumber.from(0), + Plasma.abi.encodeFunctionData("SetVariables", [ + maxBasePlasmaInMomentum, + fusedPlasmaTarget, + powPlasmaTarget, + maxPriceChangePercent, + priceChangeDenominator + ]) + ); + } } diff --git a/src/embedded/plasma.ts b/src/embedded/plasma.ts index 364b19e..8e9e1a0 100644 --- a/src/embedded/plasma.ts +++ b/src/embedded/plasma.ts @@ -9,6 +9,13 @@ export class Plasma extends EmbeddedContract { {"type":"function","name":"CancelFuse","inputs":[ {"name":"id","type":"hash"} ]}, + {"type":"function","name":"SetVariables", "inputs":[ + {"name":"maxBasePlasmaInMomentum","type":"uint64"}, + {"name":"fusedPlasmaTarget","type":"uint64"}, + {"name":"powPlasmaTarget","type":"uint64"}, + {"name":"maxPriceChangePercent","type":"uint8"}, + {"name":"priceChangeDenominator","type":"uint8"} + ]}, {"type":"variable","name":"fusionInfo","inputs":[ {"name":"amount","type":"uint256"}, @@ -17,6 +24,13 @@ export class Plasma extends EmbeddedContract { ]}, {"type":"variable","name":"fusedAmount","inputs":[ {"name":"amount","type":"uint256"} + ]}, + {"type":"variable","name":"plasmaVariables","inputs":[ + {"name":"maxBasePlasmaInMomentum","type":"uint64"}, + {"name":"fusedPlasmaTarget","type":"uint64"}, + {"name":"powPlasmaTarget","type":"uint64"}, + {"name":"maxPriceChangePercent","type":"uint8"}, + {"name":"priceChangeDenominator","type":"uint8"} ]} ]`; } diff --git a/src/model/embedded/plasma.ts b/src/model/embedded/plasma.ts index a7ddb0b..93d6e06 100644 --- a/src/model/embedded/plasma.ts +++ b/src/model/embedded/plasma.ts @@ -107,3 +107,26 @@ export class GetRequiredPowResponse extends Model { ); } } + +export class PlasmaVariables extends Model { + constructor( + public maxBasePlasmaInMomentum: number, + public fusedPlasmaTarget: number, + public powPlasmaTarget: number, + public maxPriceChangePercent: number, + public priceChangeDenominator: number + ) { + super() + } + + static fromJson(json: {[key: string]: any}): PlasmaVariables { + return new PlasmaVariables( + json.maxBasePlasmaInMomentum, + json.fusedPlasmaTarget, + json.powPlasmaTarget, + json.maxPriceChangePercent, + json.priceChangeDenominator + ); + } +} + diff --git a/src/model/nom/momentum.ts b/src/model/nom/momentum.ts index f2ff740..86cf9f6 100644 --- a/src/model/nom/momentum.ts +++ b/src/model/nom/momentum.ts @@ -16,7 +16,9 @@ export class Momentum extends Model { public changesHash: Hash, public publicKey: string, public signature: string, - public producer: Address + public producer: Address, + public nextFusionPrice?: number, + public nextWorkPrice?: number ){ super() } @@ -34,7 +36,9 @@ export class Momentum extends Model { Hash.parse(json.changesHash), json.publicKey || "", json.signature || "", - Address.parse(json.producer) + Address.parse(json.producer), + json.nextFusionPrice, + json.nextWorkPrice ); } @@ -51,7 +55,9 @@ export class Momentum extends Model { changesHash: this.changesHash?.toString(), publicKey: this.publicKey, signature: this.signature, - producer: this.producer.toString() + producer: this.producer.toString(), + nextFusionPrice: this.nextFusionPrice, + nextWorkPrice: this.nextWorkPrice }; } } diff --git a/test/api/embedded/plasma.spec.ts b/test/api/embedded/plasma.spec.ts index a129c17..5c16259 100644 --- a/test/api/embedded/plasma.spec.ts +++ b/test/api/embedded/plasma.spec.ts @@ -6,7 +6,8 @@ import { FusionEntryList, GetRequiredPowParam, GetRequiredPowResponse, - PlasmaInfo + PlasmaInfo, + PlasmaVariables } from "../../../src/model/embedded/plasma.js"; import { AccountBlockTemplate } from "../../../src/model/nom/index.js"; import { @@ -36,8 +37,7 @@ const makeFusionEntryListJson = (overrides: Record = {}) => ({ qsrAmount: "100", beneficiary: ADDRESS, expirationHeight: 123, - id: HASH_A, - isRevocable: true + id: HASH_A }], ...overrides }); @@ -143,4 +143,48 @@ describe("PlasmaApi", () => { .to.equal(Buffer.from(arrayify(expectedData)).toString("hex")); }); }); + + describe("getVariables", () => { + it("should fetch and parse plasma variables", async () => { + const mockResponse = { + maxBasePlasmaInMomentum: 4200000, + fusedPlasmaTarget: 1050000, + powPlasmaTarget: 1050000, + maxPriceChangePercent: 10, + priceChangeDenominator: 20 + }; + mockClient.setMockResponse("embedded.plasma.getVariables", mockResponse); + + const result = await plasmaApi.getVariables(); + + const lastCall = mockClient.getLastCall(); + expect(lastCall).to.exist; + expect(lastCall!.method).to.equal("embedded.plasma.getVariables"); + expect(lastCall!.parameters).to.deep.equal([]); + + expect(result).to.be.instanceOf(PlasmaVariables); + expect(result.maxBasePlasmaInMomentum).to.equal(4200000); + expect(result.fusedPlasmaTarget).to.equal(1050000); + expect(result.powPlasmaTarget).to.equal(1050000); + expect(result.maxPriceChangePercent).to.equal(10); + expect(result.priceChangeDenominator).to.equal(20); + }); + }); + + describe("setVariables", () => { + it("should build a set variables block", async () => { + const template = await plasmaApi.setVariables(4200000, 1050000, 1050000, 10, 20); + + const expectedData = PlasmaContract.abi.encodeFunctionData("SetVariables", [ + 4200000, 1050000, 1050000, 10, 20 + ]); + + expect(template).to.be.instanceOf(AccountBlockTemplate); + expect(template.toAddress.toString()).to.equal(PLASMA_ADDRESS.toString()); + expect(template.tokenStandard.toString()).to.equal(QSR_ZTS.toString()); + expect(template.amount.toString()).to.equal("0"); + expect(template.data.toString("hex")) + .to.equal(Buffer.from(arrayify(expectedData)).toString("hex")); + }); + }); }); From ba539195cbc0d537942a668e9e08214608968f29 Mon Sep 17 00:00:00 2001 From: digitalSloth Date: Mon, 25 May 2026 21:31:21 +0100 Subject: [PATCH 2/5] fix: rename vars to match go --- src/model/embedded/plasma.ts | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/model/embedded/plasma.ts b/src/model/embedded/plasma.ts index 93d6e06..4107272 100644 --- a/src/model/embedded/plasma.ts +++ b/src/model/embedded/plasma.ts @@ -110,22 +110,22 @@ export class GetRequiredPowResponse extends Model { export class PlasmaVariables extends Model { constructor( - public maxBasePlasmaInMomentum: number, - public fusedPlasmaTarget: number, - public powPlasmaTarget: number, - public maxPriceChangePercent: number, - public priceChangeDenominator: number + public MaxBasePlasmaInMomentum: number, + public FusedPlasmaTarget: number, + public PowPlasmaTarget: number, + public MaxPriceChangePercent: number, + public PriceChangeDenominator: number ) { super() } static fromJson(json: {[key: string]: any}): PlasmaVariables { return new PlasmaVariables( - json.maxBasePlasmaInMomentum, - json.fusedPlasmaTarget, - json.powPlasmaTarget, - json.maxPriceChangePercent, - json.priceChangeDenominator + json.MaxBasePlasmaInMomentum, + json.FusedPlasmaTarget, + json.PowPlasmaTarget, + json.MaxPriceChangePercent, + json.PriceChangeDenominator ); } } From ccfcead4eabfd434824fe5665e2ae27694d2d1eb Mon Sep 17 00:00:00 2001 From: digitalSloth Date: Mon, 25 May 2026 22:02:16 +0100 Subject: [PATCH 3/5] fix: variable casing --- src/model/embedded/plasma.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/model/embedded/plasma.ts b/src/model/embedded/plasma.ts index 4107272..f017560 100644 --- a/src/model/embedded/plasma.ts +++ b/src/model/embedded/plasma.ts @@ -110,11 +110,11 @@ export class GetRequiredPowResponse extends Model { export class PlasmaVariables extends Model { constructor( - public MaxBasePlasmaInMomentum: number, - public FusedPlasmaTarget: number, - public PowPlasmaTarget: number, - public MaxPriceChangePercent: number, - public PriceChangeDenominator: number + public maxBasePlasmaInMomentum: number, + public fusedPlasmaTarget: number, + public powPlasmaTarget: number, + public maxPriceChangePercent: number, + public priceChangeDenominator: number ) { super() } From 90bfeee61f7af306adf70b70441d01c29aac712a Mon Sep 17 00:00:00 2001 From: digitalSloth Date: Tue, 2 Jun 2026 09:53:23 +0100 Subject: [PATCH 4/5] fix: update plasma variable names --- test/api/embedded/plasma.spec.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/api/embedded/plasma.spec.ts b/test/api/embedded/plasma.spec.ts index 5c16259..53fd170 100644 --- a/test/api/embedded/plasma.spec.ts +++ b/test/api/embedded/plasma.spec.ts @@ -147,11 +147,11 @@ describe("PlasmaApi", () => { describe("getVariables", () => { it("should fetch and parse plasma variables", async () => { const mockResponse = { - maxBasePlasmaInMomentum: 4200000, - fusedPlasmaTarget: 1050000, - powPlasmaTarget: 1050000, - maxPriceChangePercent: 10, - priceChangeDenominator: 20 + MaxBasePlasmaInMomentum: 4200000, + FusedPlasmaTarget: 1050000, + PowPlasmaTarget: 1050000, + MaxPriceChangePercent: 10, + PriceChangeDenominator: 20 }; mockClient.setMockResponse("embedded.plasma.getVariables", mockResponse); From 0f6e7a2cbf2cb6340d7aecef94960285f37eded5 Mon Sep 17 00:00:00 2001 From: digitalSloth Date: Fri, 18 Sep 2026 18:55:53 +0100 Subject: [PATCH 5/5] fix: update bignumber usage to BigInt --- src/api/embedded/plasma.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api/embedded/plasma.ts b/src/api/embedded/plasma.ts index dcb5f76..a47e61e 100644 --- a/src/api/embedded/plasma.ts +++ b/src/api/embedded/plasma.ts @@ -82,7 +82,7 @@ export class PlasmaApi extends Api { return AccountBlockTemplate.callContract( PLASMA_ADDRESS, QSR_ZTS, - BigNumber.from(0), + BigInt(0), Plasma.abi.encodeFunctionData("SetVariables", [ maxBasePlasmaInMomentum, fusedPlasmaTarget,