From 01fc7b6d24e03acef8e91cf1628d8ad0ecc46d9a Mon Sep 17 00:00:00 2001 From: Lucas Willems Date: Sun, 1 Sep 2024 14:04:08 +0200 Subject: [PATCH 1/8] Export sysAcc for FSWorld --- xsuite/src/world/fsworld.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/xsuite/src/world/fsworld.ts b/xsuite/src/world/fsworld.ts index 1dfe3319..21ccc248 100644 --- a/xsuite/src/world/fsworld.ts +++ b/xsuite/src/world/fsworld.ts @@ -1,5 +1,6 @@ import { ChildProcess, spawn } from "node:child_process"; import { fsproxyBinaryPath, fsproxyConfigsPath } from "@xsuite/full-simulnet"; +import { fullU8AAddress } from "../data/address"; import { AddressLike, isAddressLike } from "../data/addressLike"; import { EncodableAccount, @@ -27,6 +28,7 @@ import { export class FSWorld extends World { proxy: FSProxy; server?: ChildProcess; + sysAcc: FSContract; constructor({ proxy, @@ -42,6 +44,7 @@ export class FSWorld extends World { super({ chainId: "chain", proxy, gasPrice, explorerUrl }); this.proxy = proxy; this.server = server; + this.sysAcc = this.newContract(fullU8AAddress); } static new(options: FSWorldNewOptions) { From 3670f9629bb637ee73d50246e2cda1eba15f171c Mon Sep 17 00:00:00 2001 From: Lucas Willems Date: Sun, 1 Sep 2024 14:11:47 +0200 Subject: [PATCH 2/8] Release xsuite@0.0.86 --- xsuite/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xsuite/package.json b/xsuite/package.json index c3000af7..4d4dfa2e 100644 --- a/xsuite/package.json +++ b/xsuite/package.json @@ -1,6 +1,6 @@ { "name": "xsuite", - "version": "0.0.85", + "version": "0.0.86", "license": "MIT", "bin": { "xsuite": "cli.js" From d41753d2e52ca1c197c659e64e40ec7b34192ca9 Mon Sep 17 00:00:00 2001 From: Lucas Willems Date: Sun, 13 Oct 2024 10:07:21 +0200 Subject: [PATCH 3/8] Allow updateAccount to remove keys --- xsuite/src/data/encoding.ts | 74 ++++++++++++++++++-------------- xsuite/src/proxy/fsproxy.ts | 7 +-- xsuite/src/proxy/lsproxy.ts | 6 +-- xsuite/src/world/fsworld.test.ts | 27 ++++++++++++ xsuite/src/world/lsworld.test.ts | 27 ++++++++++++ 5 files changed, 103 insertions(+), 38 deletions(-) diff --git a/xsuite/src/data/encoding.ts b/xsuite/src/data/encoding.ts index f6e85212..038baea0 100644 --- a/xsuite/src/data/encoding.ts +++ b/xsuite/src/data/encoding.ts @@ -215,11 +215,7 @@ export const e = { return encodableVs.map(bytesLikeToHex); }, kvs: Object.assign( - (encodableKvs: EncodableKvs): Kvs => { - const kvs = eKvsUnfiltered(encodableKvs); - for (const k in kvs) if (kvs[k] === "") delete kvs[k]; - return kvs; - }, + (encodableKvs: EncodableKvs) => filterKvs(eKvsUnfiltered(encodableKvs)), { Mapper: (...args: EncodableMapperKeyArgs) => ({ Value: curryEKvsMapper(eKvsMapperValue)(args), @@ -232,34 +228,12 @@ export const e = { Esdts: (esdts: EncodableEsdt[]) => eKvsEsdts(esdts), }, ), - account: ( - encodableAccount: T, - ): Prettify> => { - const account: Account = { - address: addressLikeToBechAddress(encodableAccount.address), - }; - if (encodableAccount.nonce !== undefined) { - account.nonce = safeBigintToNumber(BigInt(encodableAccount.nonce)); - } - if (encodableAccount.balance !== undefined) { - account.balance = encodableAccount.balance.toString(); - } - if (encodableAccount.code !== undefined) { - account.code = encodableAccount.code; - } - if (encodableAccount.codeHash !== undefined) { - account.codeHash = encodableAccount.codeHash; - } - if (encodableAccount.codeMetadata !== undefined) { - account.codeMetadata = eCodeMetadata(encodableAccount.codeMetadata); + account: (encodableAccount: T) => { + const account = eAccountUnfiltered(encodableAccount); + if (account.kvs !== undefined) { + account.kvs = filterKvs(account.kvs); } - if (encodableAccount.kvs !== undefined) { - account.kvs = e.kvs(encodableAccount.kvs); - } - if (encodableAccount.owner !== undefined) { - account.owner = addressLikeToBechAddress(encodableAccount.owner); - } - return account as PreserveDefinedness; + return account; }, /** * @deprecated Use `.TopBuffer` instead. @@ -333,6 +307,12 @@ export const eKvsUnfiltered = (kvs: EncodableKvs): Kvs => { } }; +const filterKvs = (unfilteredKvs: Kvs): Kvs => { + const kvs = { ...unfilteredKvs }; + for (const k in kvs) if (kvs[k] === "") delete kvs[k]; + return kvs; +}; + const eKvsMappers = (mappers: EncodableMapper[]): Kvs => { let kvs: Kvs = {}; for (const { key, ...rest } of mappers) { @@ -573,6 +553,36 @@ export const eCodeMetadata = (codeMetadata: EncodableCodeMetadata): string => { return e.Buffer(new Uint8Array(bytes)).toTopHex(); }; +export const eAccountUnfiltered = ( + encodableAccount: T, +): Prettify> => { + const account: Account = { + address: addressLikeToBechAddress(encodableAccount.address), + }; + if (encodableAccount.nonce !== undefined) { + account.nonce = safeBigintToNumber(BigInt(encodableAccount.nonce)); + } + if (encodableAccount.balance !== undefined) { + account.balance = encodableAccount.balance.toString(); + } + if (encodableAccount.code !== undefined) { + account.code = encodableAccount.code; + } + if (encodableAccount.codeHash !== undefined) { + account.codeHash = encodableAccount.codeHash; + } + if (encodableAccount.codeMetadata !== undefined) { + account.codeMetadata = eCodeMetadata(encodableAccount.codeMetadata); + } + if (encodableAccount.kvs !== undefined) { + account.kvs = eKvsUnfiltered(encodableAccount.kvs); + } + if (encodableAccount.owner !== undefined) { + account.owner = addressLikeToBechAddress(encodableAccount.owner); + } + return account as PreserveDefinedness; +}; + const newEncodable = ( toTop: () => Uint8Array, toNest?: () => Uint8Array, diff --git a/xsuite/src/proxy/fsproxy.ts b/xsuite/src/proxy/fsproxy.ts index ed54a81f..c71ce49f 100644 --- a/xsuite/src/proxy/fsproxy.ts +++ b/xsuite/src/proxy/fsproxy.ts @@ -1,4 +1,4 @@ -import { EncodableAccount, e } from "../data/encoding"; +import { EncodableAccount, eAccountUnfiltered } from "../data/encoding"; import { hexToBase64 } from "../data/utils"; import { getValuesInOrder, Proxy } from "./proxy"; @@ -63,13 +63,14 @@ export class FSProxy extends Proxy { } const encodableAccountToSettableAccount = (account: EncodableAccount) => { - const { codeHash, codeMetadata, kvs, owner, ...rAcc } = e.account(account); + const { codeHash, codeMetadata, kvs, owner, ...rAcc } = + eAccountUnfiltered(account); return { ...rAcc, codeHash: codeHash !== undefined ? hexToBase64(codeHash) : undefined, codeMetadata: codeMetadata !== undefined ? hexToBase64(codeMetadata) : undefined, - keys: kvs !== undefined ? e.kvs(kvs) : undefined, // TODO-MvX: better if called "pairs" + keys: kvs, // TODO-MvX: better if called "pairs" ownerAddress: owner, }; }; diff --git a/xsuite/src/proxy/lsproxy.ts b/xsuite/src/proxy/lsproxy.ts index a6202f62..1dc51a62 100644 --- a/xsuite/src/proxy/lsproxy.ts +++ b/xsuite/src/proxy/lsproxy.ts @@ -1,4 +1,4 @@ -import { e, EncodableAccount } from "../data/encoding"; +import { EncodableAccount, eAccountUnfiltered } from "../data/encoding"; import { getSerializableAccount, Proxy } from "./proxy"; export class LSProxy extends Proxy { @@ -12,7 +12,7 @@ export class LSProxy extends Proxy { setAccounts(accounts: EncodableAccount[]) { return this.fetch( "/admin/set-accounts", - accounts.map((a) => e.account(a)), + accounts.map((a) => eAccountUnfiltered(a)), ).then(() => {}); } @@ -23,7 +23,7 @@ export class LSProxy extends Proxy { updateAccounts(accounts: EncodableAccount[]) { return this.fetch( "/admin/update-accounts", - accounts.map((a) => e.account(a)), + accounts.map((a) => eAccountUnfiltered(a)), ).then(() => {}); } diff --git a/xsuite/src/world/fsworld.test.ts b/xsuite/src/world/fsworld.test.ts index c88eed3d..af2c3db3 100644 --- a/xsuite/src/world/fsworld.test.ts +++ b/xsuite/src/world/fsworld.test.ts @@ -356,6 +356,33 @@ test.concurrent("FSWorld.updateAccount", async () => { expect(after).toEqual({ ...before, balance: 10n ** 17n }); }); +test.concurrent("FSWorld.updateAccount - remove key", async () => { + using world = await FSWorld.start(); + const wallet = await world.createWallet({ + kvs: { + esdts: [{ id: fftId, amount: 1 }], + mappers: [{ key: "mapper", value: e.U(1) }], + extraKvs: { "1234": "01" }, + }, + }); + assertAccount(await wallet.getAccount(), { + kvs: { + esdts: [{ id: fftId, amount: 1 }], + mappers: [{ key: "mapper", value: e.U(1) }], + extraKvs: { "1234": "01" }, + }, + }); + await world.updateAccount({ + address: wallet, + kvs: { + esdts: [{ id: fftId, amount: 0 }], + mappers: [{ key: "mapper", value: null }], + extraKvs: { "1234": "" }, + }, + }); + assertAccount(await wallet.getAccount(), { kvs: {} }); +}); + test.concurrent("FSWorld.query - basic", async () => { using world = await FSWorld.start(); const { contract } = await createAccounts(world); diff --git a/xsuite/src/world/lsworld.test.ts b/xsuite/src/world/lsworld.test.ts index 68d61c03..a58347de 100644 --- a/xsuite/src/world/lsworld.test.ts +++ b/xsuite/src/world/lsworld.test.ts @@ -360,6 +360,33 @@ test.concurrent("LSWorld.updateAccount", async () => { expect(after).toEqual({ ...before, balance: 10n ** 17n }); }); +test.concurrent("LSWorld.updateAccount - remove key", async () => { + using world = await LSWorld.start(); + const wallet = await world.createWallet({ + kvs: { + esdts: [{ id: fftId, amount: 1 }], + mappers: [{ key: "mapper", value: e.U(1) }], + extraKvs: { "1234": "01" }, + }, + }); + assertAccount(await wallet.getAccount(), { + kvs: { + esdts: [{ id: fftId, amount: 1 }], + mappers: [{ key: "mapper", value: e.U(1) }], + extraKvs: { "1234": "01" }, + }, + }); + await world.updateAccount({ + address: wallet, + kvs: { + esdts: [{ id: fftId, amount: 0 }], + mappers: [{ key: "mapper", value: null }], + extraKvs: { "1234": "" }, + }, + }); + assertAccount(await wallet.getAccount(), { kvs: {} }); +}); + test.concurrent("LSWorld.setCurrentBlockInfo", async () => { using world = await LSWorld.start(); const { contract } = await createAccounts(world); From ccccf7d5bc2bba32db53a36f6e8cedccd7e905c4 Mon Sep 17 00:00:00 2001 From: Lucas Willems Date: Sun, 13 Oct 2024 10:30:35 +0200 Subject: [PATCH 4/8] Increase timeouts --- xsuite/src/cli/cli.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/xsuite/src/cli/cli.test.ts b/xsuite/src/cli/cli.test.ts index 70980208..af15ea1e 100644 --- a/xsuite/src/cli/cli.test.ts +++ b/xsuite/src/cli/cli.test.ts @@ -433,7 +433,7 @@ test.concurrent( "", ]); }, - 100_000, + 200_000, ); test.concurrent( @@ -469,7 +469,7 @@ test.concurrent( "", ]); }, - 100_000, + 200_000, ); test.concurrent("new contract | error: already exists", async () => { @@ -505,7 +505,7 @@ test.concurrent( "", ]); }, - 180_000, + 200_000, ); test.concurrent("verify-reproducible", async () => { From a33abdde6030e1af44118ac0f5da9148ffc8f995 Mon Sep 17 00:00:00 2001 From: Lucas Willems Date: Sun, 13 Oct 2024 12:32:34 +0200 Subject: [PATCH 5/8] Support proxyUrl with non-empty path --- xsuite/src/proxy/proxy.test.ts | 56 ++++++++++++++++++++++++++++++++ xsuite/src/proxy/proxy.ts | 45 +++++++++++++------------ xsuite/src/world/fsworld.test.ts | 36 ++++++++++---------- 3 files changed, 99 insertions(+), 38 deletions(-) create mode 100644 xsuite/src/proxy/proxy.test.ts diff --git a/xsuite/src/proxy/proxy.test.ts b/xsuite/src/proxy/proxy.test.ts new file mode 100644 index 00000000..a14ba36c --- /dev/null +++ b/xsuite/src/proxy/proxy.test.ts @@ -0,0 +1,56 @@ +import http from "node:http"; +import { expect, test } from "vitest"; +import { Proxy } from "./proxy"; + +test.concurrent("Proxy.fetchRaw - proxyUrl without path", async () => { + using server = await createServer(); + const proxy = new Proxy(server.url); + const url = await proxy.fetchRaw("/request"); + expect(url).toEqual(`${server.url}/request`); +}); + +test.concurrent("Proxy.fetchRaw - proxyUrl with non-empty path", async () => { + using server = await createServer(); + const proxy = new Proxy(`${server.url}/path`); + const url = await proxy.fetchRaw("/request"); + expect(url).toEqual(`${server.url}/path/request`); +}); + +test.concurrent("Proxy.fetchRaw - path not starting with slash", async () => { + using server = await createServer(); + const proxy = new Proxy(`${server.url}/path`); + expect(() => proxy.fetchRaw(`${server.url}/request`)).toThrow( + "Invalid path.", + ); +}); + +const createServer = async () => { + const server = http.createServer((req, res) => { + res.end(`"${getServerUrl(server)}${req.url}"`); + }); + + const url = await new Promise((resolve) => { + server.listen(0, () => { + const address = server.address(); + if (address === null || typeof address === "string") { + throw new Error("Invalid address."); + } + resolve(getServerUrl(server)); + }); + }); + + return { + url, + [Symbol.dispose]() { + server.close(); + }, + }; +}; + +const getServerUrl = (server: http.Server) => { + const address = server.address(); + if (address === null || typeof address === "string") { + throw new Error("Invalid address."); + } + return `http://localhost:${address.port}`; +}; diff --git a/xsuite/src/proxy/proxy.ts b/xsuite/src/proxy/proxy.ts index 071a9fb1..bb2f5699 100644 --- a/xsuite/src/proxy/proxy.ts +++ b/xsuite/src/proxy/proxy.ts @@ -32,19 +32,6 @@ export class Proxy { this.pauseAfterSend = params.pauseAfterSend; } - private makeUrl( - path: string, - params: Record string } | undefined> = {}, - ) { - const url = new URL(path, this.proxyUrl); - for (const [k, v] of Object.entries(params)) { - if (v !== undefined && v !== null) { - url.searchParams.set(k, v.toString()); - } - } - return url.toString(); - } - fetchRaw(path: string, data?: any) { const init: RequestInit = { headers: this.headers }; if (data !== undefined) { @@ -52,7 +39,7 @@ export class Proxy { init.body = JSON.stringify(data); } return fetch( - this.makeUrl(path, { blockNonce: this.blockNonce }), + this.proxyUrl + makePath(path, { blockNonce: this.blockNonce }), init, ).then((r) => r.json()); } @@ -333,7 +320,7 @@ export class Proxy { private async _getTx(txHash: string, { withResults }: GetTxRawOptions = {}) { const res = await this.fetch( - this.makeUrl(`/transaction/${txHash}`, { withResults }), + makePath(`/transaction/${txHash}`, { withResults }), ); return res.transaction as Record; } @@ -348,7 +335,7 @@ export class Proxy { { shardId }: GetAccountOptions = {}, ) { const res = await this.fetch( - this.makeUrl(`/address/${addressLikeToBechAddress(address)}/nonce`, { + makePath(`/address/${addressLikeToBechAddress(address)}/nonce`, { "forced-shard-id": shardId, }), ); @@ -360,7 +347,7 @@ export class Proxy { { shardId }: GetAccountOptions = {}, ) { const res = await this.fetch( - this.makeUrl(`/address/${addressLikeToBechAddress(address)}/balance`, { + makePath(`/address/${addressLikeToBechAddress(address)}/balance`, { "forced-shard-id": shardId, }), ); @@ -373,7 +360,7 @@ export class Proxy { { shardId }: GetAccountOptions = {}, ): Promise { const res = await this.fetch( - this.makeUrl( + makePath( `/address/${addressLikeToBechAddress(address)}/key/${bytesLikeToHex( key, )}`, @@ -390,7 +377,7 @@ export class Proxy { { shardId }: GetAccountOptions = {}, ) { const res = await this.fetch( - this.makeUrl(`/address/${addressLikeToBechAddress(address)}/keys`, { + makePath(`/address/${addressLikeToBechAddress(address)}/keys`, { "forced-shard-id": shardId, }), ); @@ -402,7 +389,7 @@ export class Proxy { options?: GetAccountOptions, ) { const res = await this.fetch( - this.makeUrl(`/address/${addressLikeToBechAddress(address)}`, options), + makePath(`/address/${addressLikeToBechAddress(address)}`, options), ); return getSerializableAccount(res.account); } @@ -449,6 +436,24 @@ export class Proxy { } } +const makePath = ( + path: string, + params: Record string } | undefined> = {}, +) => { + if (!path.startsWith("/")) { + throw new Error("Invalid path."); + } + const [basePath, existingQuery] = path.split("?"); + const searchParams = new URLSearchParams(existingQuery); + for (const [k, v] of Object.entries(params)) { + if (v != null) { + searchParams.append(k, v.toString()); + } + } + const newQuery = searchParams.toString(); + return newQuery ? `${basePath}?${newQuery}` : basePath; +}; + export class InteractionError extends Error { interaction: string; code: number | string; diff --git a/xsuite/src/world/fsworld.test.ts b/xsuite/src/world/fsworld.test.ts index af2c3db3..953e5611 100644 --- a/xsuite/src/world/fsworld.test.ts +++ b/xsuite/src/world/fsworld.test.ts @@ -26,6 +26,24 @@ const emptyAccount = { }; const baseExplorerUrl = "http://explorer.local"; +test.concurrent("FSWorld.proxy.blockNonce", async () => { + using world = await FSWorld.start(); + const wallet = await world.createWallet({ + balance: 10n ** 18n, + }); + await wallet.setAccount({ + balance: 2n * 10n ** 18n, + }); + const proxy = new FSProxy({ proxyUrl: world.proxy.proxyUrl, blockNonce: 2 }); + assertAccount(await proxy.getAccount(wallet), { + balance: 10n ** 18n, + }); + proxy.blockNonce = undefined; + assertAccount(await proxy.getAccount(wallet), { + balance: 2n * 10n ** 18n, + }); +}); + test.concurrent("FSWorld.start - port 3000", async () => { using world = await FSWorld.start({ binaryPort: 3000 }); expect(world.proxy.proxyUrl).toEqual("http://localhost:3000"); @@ -88,24 +106,6 @@ test.concurrent("FSWorld.getAccount on empty U8A address", async () => { assertAccount(await world.getAccount(zeroU8AAddress), emptyAccount); }); -test.concurrent("FSWorld.proxy.blockNonce", async () => { - using world = await FSWorld.start(); - const wallet = await world.createWallet({ - balance: 10n ** 18n, - }); - await wallet.setAccount({ - balance: 2n * 10n ** 18n, - }); - const proxy = new FSProxy({ proxyUrl: world.proxy.proxyUrl, blockNonce: 2 }); - assertAccount(await proxy.getAccount(wallet), { - balance: 10n ** 18n, - }); - proxy.blockNonce = undefined; - assertAccount(await proxy.getAccount(wallet), { - balance: 2n * 10n ** 18n, - }); -}); - test.concurrent("FSWorld.new with defined chainId", () => { expect(() => FSWorld.new({ chainId: "D" })).toThrow( "chainId is not undefined.", From d7d5e26d40b1b44853d7ddbe143330c85775b004 Mon Sep 17 00:00:00 2001 From: Lucas Willems Date: Sun, 13 Oct 2024 12:39:35 +0200 Subject: [PATCH 6/8] Release xsuite@0.0.87 --- xsuite/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xsuite/package.json b/xsuite/package.json index 4d4dfa2e..5d0ee3bd 100644 --- a/xsuite/package.json +++ b/xsuite/package.json @@ -1,6 +1,6 @@ { "name": "xsuite", - "version": "0.0.86", + "version": "0.0.87", "license": "MIT", "bin": { "xsuite": "cli.js" From 70123b7f5a964efaf811ad5a2a3d01235a6bc4b4 Mon Sep 17 00:00:00 2001 From: Lucas Willems Date: Mon, 21 Oct 2024 13:04:33 +0200 Subject: [PATCH 7/8] Upgrade fullsimulnet to fix setting huge statest --- xsuite-fullsimulnet/build-binary.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xsuite-fullsimulnet/build-binary.mjs b/xsuite-fullsimulnet/build-binary.mjs index 7625f7f8..cfd5bf1a 100644 --- a/xsuite-fullsimulnet/build-binary.mjs +++ b/xsuite-fullsimulnet/build-binary.mjs @@ -10,5 +10,5 @@ if (process.env.CI) { ]); } -await $`GOBIN="$(pwd)" go install -ldflags ${argv.ldflags} github.com/multiversx/mx-chain-simulator-go/cmd/chainsimulator@v1.7.13-patch1-fix2`; +await $`GOBIN="$(pwd)" go install -ldflags ${argv.ldflags} github.com/multiversx/mx-chain-simulator-go/cmd/chainsimulator@v1.7.13-patch2-fix1`; await $`mv ./chainsimulator ../xsuite-fullsimulnet-${argv.os}-${argv.arch}/bin/fsproxy`; From bc49c223f68af2f5a668dff0cd77f8ed3bde82db Mon Sep 17 00:00:00 2001 From: Lucas Willems Date: Mon, 21 Oct 2024 13:18:15 +0200 Subject: [PATCH 8/8] Release @xsuite/full-simulnet@0.0.15 xsuite@0.0.88 --- xsuite-fullsimulnet-darwin-amd64/package.json | 2 +- xsuite-fullsimulnet-linux-amd64/package.json | 2 +- xsuite-fullsimulnet/package.json | 2 +- xsuite/package.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/xsuite-fullsimulnet-darwin-amd64/package.json b/xsuite-fullsimulnet-darwin-amd64/package.json index 08159af9..d68a672e 100644 --- a/xsuite-fullsimulnet-darwin-amd64/package.json +++ b/xsuite-fullsimulnet-darwin-amd64/package.json @@ -1,6 +1,6 @@ { "name": "@xsuite/full-simulnet-darwin-amd64", - "version": "0.0.14", + "version": "0.0.15", "os": [ "darwin" ], diff --git a/xsuite-fullsimulnet-linux-amd64/package.json b/xsuite-fullsimulnet-linux-amd64/package.json index 4955a508..110af384 100644 --- a/xsuite-fullsimulnet-linux-amd64/package.json +++ b/xsuite-fullsimulnet-linux-amd64/package.json @@ -1,6 +1,6 @@ { "name": "@xsuite/full-simulnet-linux-amd64", - "version": "0.0.14", + "version": "0.0.15", "os": [ "linux" ], diff --git a/xsuite-fullsimulnet/package.json b/xsuite-fullsimulnet/package.json index 5fc669c8..1a5b1f47 100644 --- a/xsuite-fullsimulnet/package.json +++ b/xsuite-fullsimulnet/package.json @@ -1,6 +1,6 @@ { "name": "@xsuite/full-simulnet", - "version": "0.0.14", + "version": "0.0.15", "license": "MIT", "scripts": { "build": "run-script-os", diff --git a/xsuite/package.json b/xsuite/package.json index 5d0ee3bd..de2d033e 100644 --- a/xsuite/package.json +++ b/xsuite/package.json @@ -1,6 +1,6 @@ { "name": "xsuite", - "version": "0.0.87", + "version": "0.0.88", "license": "MIT", "bin": { "xsuite": "cli.js"