diff --git a/src/api/embedded/plasma.ts b/src/api/embedded/plasma.ts index de3c98f..a47e61e 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, + BigInt(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..f017560 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..53fd170 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")); + }); + }); });