From f12245c27c4daee5d082477ceac1f3c56ceb3795 Mon Sep 17 00:00:00 2001 From: danielailie Date: Mon, 21 Oct 2024 12:38:51 +0300 Subject: [PATCH 1/2] Remove relay v3 code --- src/converters/transactionsConverter.ts | 8 -- src/converters/transactionsConverters.spec.ts | 79 ------------------- src/interface.ts | 4 - src/proto/compiled.js | 77 ------------------ src/proto/serializer.spec.ts | 39 --------- src/proto/serializer.ts | 6 -- src/proto/transaction.proto | 2 - src/transaction.ts | 15 ---- src/transactionComputer.ts | 4 - .../relayedTransactionsFactory.spec.ts | 65 --------------- .../relayedTransactionsFactory.ts | 30 ------- 11 files changed, 329 deletions(-) diff --git a/src/converters/transactionsConverter.ts b/src/converters/transactionsConverter.ts index d94cb11f..966ec86e 100644 --- a/src/converters/transactionsConverter.ts +++ b/src/converters/transactionsConverter.ts @@ -28,10 +28,6 @@ export class TransactionsConverter { guardian: transaction.guardian ? transaction.guardian : undefined, signature: this.toHexOrUndefined(transaction.signature), guardianSignature: this.toHexOrUndefined(transaction.guardianSignature), - relayer: transaction.relayer ? transaction.relayer : undefined, - innerTransactions: transaction.innerTransactions.length - ? transaction.innerTransactions.map((tx) => this.transactionToPlainObject(tx)) - : undefined, }; return plainObject; @@ -62,10 +58,6 @@ export class TransactionsConverter { options: Number(object.options), signature: this.bufferFromHex(object.signature), guardianSignature: this.bufferFromHex(object.guardianSignature), - relayer: object.relayer, - innerTransactions: object.innerTransactions - ? object.innerTransactions.map((tx) => this.plainObjectToTransaction(tx)) - : undefined, }); return transaction; diff --git a/src/converters/transactionsConverters.spec.ts b/src/converters/transactionsConverters.spec.ts index 12d26271..e491ab57 100644 --- a/src/converters/transactionsConverters.spec.ts +++ b/src/converters/transactionsConverters.spec.ts @@ -59,85 +59,6 @@ describe("test transactions converter", async () => { guardian: undefined, signature: undefined, guardianSignature: undefined, - relayer: undefined, - innerTransactions: undefined, - }); - }); - - it("converts relayedV3 transaction to plain object and back", () => { - const converter = new TransactionsConverter(); - - const innerTx = new Transaction({ - nonce: 90, - value: BigInt("123456789000000000000000000000"), - sender: "erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th", - receiver: "erd1spyavw0956vq68xj8y4tenjpq2wd5a9p2c6j8gsz7ztyrnpxrruqzu66jx", - senderUsername: "alice", - receiverUsername: "bob", - gasPrice: 1000000000, - gasLimit: 80000, - data: Buffer.from("hello"), - chainID: "localnet", - version: 2, - relayer: "erd1k2s324ww2g0yj38qn2ch2jwctdy8mnfxep94q9arncc6xecg3xaq6mjse8", - }); - - const relayedTx = new Transaction({ - nonce: 77, - value: BigInt("0"), - sender: "erd1k2s324ww2g0yj38qn2ch2jwctdy8mnfxep94q9arncc6xecg3xaq6mjse8", - receiver: "erd1k2s324ww2g0yj38qn2ch2jwctdy8mnfxep94q9arncc6xecg3xaq6mjse8", - gasPrice: 1000000000, - gasLimit: 50000, - chainID: "localnet", - version: 2, - innerTransactions: [innerTx], - }); - - const plainObject = converter.transactionToPlainObject(relayedTx); - const restoredTransaction = converter.plainObjectToTransaction(plainObject); - - assert.deepEqual(plainObject, relayedTx.toPlainObject()); - assert.deepEqual(restoredTransaction, Transaction.fromPlainObject(plainObject)); - assert.deepEqual(restoredTransaction, relayedTx); - assert.deepEqual(plainObject, { - nonce: 77, - value: "0", - sender: "erd1k2s324ww2g0yj38qn2ch2jwctdy8mnfxep94q9arncc6xecg3xaq6mjse8", - receiver: "erd1k2s324ww2g0yj38qn2ch2jwctdy8mnfxep94q9arncc6xecg3xaq6mjse8", - senderUsername: undefined, - receiverUsername: undefined, - gasPrice: 1000000000, - gasLimit: 50000, - data: undefined, - chainID: "localnet", - version: 2, - options: undefined, - guardian: undefined, - signature: undefined, - guardianSignature: undefined, - relayer: undefined, - innerTransactions: [ - { - nonce: 90, - value: "123456789000000000000000000000", - sender: "erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th", - receiver: "erd1spyavw0956vq68xj8y4tenjpq2wd5a9p2c6j8gsz7ztyrnpxrruqzu66jx", - senderUsername: "YWxpY2U=", - receiverUsername: "Ym9i", - gasPrice: 1000000000, - gasLimit: 80000, - data: "aGVsbG8=", - chainID: "localnet", - version: 2, - options: undefined, - guardian: undefined, - signature: undefined, - guardianSignature: undefined, - relayer: "erd1k2s324ww2g0yj38qn2ch2jwctdy8mnfxep94q9arncc6xecg3xaq6mjse8", - innerTransactions: undefined, - }, - ], }); }); diff --git a/src/interface.ts b/src/interface.ts index 1a1bc632..97c86a54 100644 --- a/src/interface.ts +++ b/src/interface.ts @@ -24,8 +24,6 @@ export interface IPlainTransactionObject { options?: number; signature?: string; guardianSignature?: string; - relayer?: string; - innerTransactions?: IPlainTransactionObject[]; } export interface ISignature { @@ -106,6 +104,4 @@ export interface ITransaction { guardian: string; signature: Uint8Array; guardianSignature: Uint8Array; - relayer: string; - innerTransactions: ITransaction[]; } diff --git a/src/proto/compiled.js b/src/proto/compiled.js index 2d02a251..feed796f 100644 --- a/src/proto/compiled.js +++ b/src/proto/compiled.js @@ -46,8 +46,6 @@ * @property {number|null} [Options] Transaction Options * @property {Uint8Array|null} [GuardianAddr] Transaction GuardianAddr * @property {Uint8Array|null} [GuardianSignature] Transaction GuardianSignature - * @property {Uint8Array|null} [Relayer] Transaction Relayer - * @property {Array.|null} [InnerTransactions] Transaction InnerTransactions */ /** @@ -59,7 +57,6 @@ * @param {proto.ITransaction=} [properties] Properties to set */ function Transaction(properties) { - this.InnerTransactions = []; if (properties) for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) if (properties[keys[i]] != null) @@ -186,22 +183,6 @@ */ Transaction.prototype.GuardianSignature = $util.newBuffer([]); - /** - * Transaction Relayer. - * @member {Uint8Array} Relayer - * @memberof proto.Transaction - * @instance - */ - Transaction.prototype.Relayer = $util.newBuffer([]); - - /** - * Transaction InnerTransactions. - * @member {Array.} InnerTransactions - * @memberof proto.Transaction - * @instance - */ - Transaction.prototype.InnerTransactions = $util.emptyArray; - /** * Creates a new Transaction instance using the specified properties. * @function create @@ -256,11 +237,6 @@ writer.uint32(/* id 14, wireType 2 =*/114).bytes(message.GuardianAddr); if (message.GuardianSignature != null && Object.hasOwnProperty.call(message, "GuardianSignature")) writer.uint32(/* id 15, wireType 2 =*/122).bytes(message.GuardianSignature); - if (message.Relayer != null && Object.hasOwnProperty.call(message, "Relayer")) - writer.uint32(/* id 16, wireType 2 =*/130).bytes(message.Relayer); - if (message.InnerTransactions != null && message.InnerTransactions.length) - for (var i = 0; i < message.InnerTransactions.length; ++i) - $root.proto.Transaction.encode(message.InnerTransactions[i], writer.uint32(/* id 17, wireType 2 =*/138).fork()).ldelim(); return writer; }; @@ -355,16 +331,6 @@ message.GuardianSignature = reader.bytes(); break; } - case 16: { - message.Relayer = reader.bytes(); - break; - } - case 17: { - if (!(message.InnerTransactions && message.InnerTransactions.length)) - message.InnerTransactions = []; - message.InnerTransactions.push($root.proto.Transaction.decode(reader, reader.uint32())); - break; - } default: reader.skipType(tag & 7); break; @@ -445,18 +411,6 @@ if (message.GuardianSignature != null && message.hasOwnProperty("GuardianSignature")) if (!(message.GuardianSignature && typeof message.GuardianSignature.length === "number" || $util.isString(message.GuardianSignature))) return "GuardianSignature: buffer expected"; - if (message.Relayer != null && message.hasOwnProperty("Relayer")) - if (!(message.Relayer && typeof message.Relayer.length === "number" || $util.isString(message.Relayer))) - return "Relayer: buffer expected"; - if (message.InnerTransactions != null && message.hasOwnProperty("InnerTransactions")) { - if (!Array.isArray(message.InnerTransactions)) - return "InnerTransactions: array expected"; - for (var i = 0; i < message.InnerTransactions.length; ++i) { - var error = $root.proto.Transaction.verify(message.InnerTransactions[i]); - if (error) - return "InnerTransactions." + error; - } - } return null; }; @@ -553,21 +507,6 @@ $util.base64.decode(object.GuardianSignature, message.GuardianSignature = $util.newBuffer($util.base64.length(object.GuardianSignature)), 0); else if (object.GuardianSignature.length >= 0) message.GuardianSignature = object.GuardianSignature; - if (object.Relayer != null) - if (typeof object.Relayer === "string") - $util.base64.decode(object.Relayer, message.Relayer = $util.newBuffer($util.base64.length(object.Relayer)), 0); - else if (object.Relayer.length >= 0) - message.Relayer = object.Relayer; - if (object.InnerTransactions) { - if (!Array.isArray(object.InnerTransactions)) - throw TypeError(".proto.Transaction.InnerTransactions: array expected"); - message.InnerTransactions = []; - for (var i = 0; i < object.InnerTransactions.length; ++i) { - if (typeof object.InnerTransactions[i] !== "object") - throw TypeError(".proto.Transaction.InnerTransactions: object expected"); - message.InnerTransactions[i] = $root.proto.Transaction.fromObject(object.InnerTransactions[i]); - } - } return message; }; @@ -584,8 +523,6 @@ if (!options) options = {}; var object = {}; - if (options.arrays || options.defaults) - object.InnerTransactions = []; if (options.defaults) { if ($util.Long) { var long = new $util.Long(0, 0, true); @@ -674,13 +611,6 @@ if (options.bytes !== Array) object.GuardianSignature = $util.newBuffer(object.GuardianSignature); } - if (options.bytes === String) - object.Relayer = ""; - else { - object.Relayer = []; - if (options.bytes !== Array) - object.Relayer = $util.newBuffer(object.Relayer); - } } if (message.Nonce != null && message.hasOwnProperty("Nonce")) if (typeof message.Nonce === "number") @@ -721,13 +651,6 @@ object.GuardianAddr = options.bytes === String ? $util.base64.encode(message.GuardianAddr, 0, message.GuardianAddr.length) : options.bytes === Array ? Array.prototype.slice.call(message.GuardianAddr) : message.GuardianAddr; if (message.GuardianSignature != null && message.hasOwnProperty("GuardianSignature")) object.GuardianSignature = options.bytes === String ? $util.base64.encode(message.GuardianSignature, 0, message.GuardianSignature.length) : options.bytes === Array ? Array.prototype.slice.call(message.GuardianSignature) : message.GuardianSignature; - if (message.Relayer != null && message.hasOwnProperty("Relayer")) - object.Relayer = options.bytes === String ? $util.base64.encode(message.Relayer, 0, message.Relayer.length) : options.bytes === Array ? Array.prototype.slice.call(message.Relayer) : message.Relayer; - if (message.InnerTransactions && message.InnerTransactions.length) { - object.InnerTransactions = []; - for (var j = 0; j < message.InnerTransactions.length; ++j) - object.InnerTransactions[j] = $root.proto.Transaction.toObject(message.InnerTransactions[j], options); - } return object; }; diff --git a/src/proto/serializer.spec.ts b/src/proto/serializer.spec.ts index 53ecfbb6..97a88b5c 100644 --- a/src/proto/serializer.spec.ts +++ b/src/proto/serializer.spec.ts @@ -7,7 +7,6 @@ import { TokenTransfer } from "../tokens"; import { Transaction } from "../transaction"; import { TransactionPayload } from "../transactionPayload"; import { ProtoSerializer } from "./serializer"; -import { TransactionComputer } from "../transactionComputer"; describe("serialize transactions", () => { let wallets: Record; @@ -146,42 +145,4 @@ describe("serialize transactions", () => { "08cc011209000de0b6b3a76400001a200139472eff6886771a982f3083da5d421f24c29181e63888228dc81ca60d69e12205616c6963652a20b2a11555ce521e4944e09ab17549d85b487dcd26c84b5017a39e31a3670889ba32056361726f6c388094ebdc0340d086035201545802624051e6cd78fb3ab4b53ff7ad6864df27cb4a56d70603332869d47a5cf6ea977c30e696103e41e8dddf2582996ad335229fdf4acb726564dbc1a0bc9e705b511f06", ); }); - - it("serialize with inner transactions", async () => { - const innerTransaction = new Transaction({ - nonce: 204, - value: "1000000000000000000", - sender: Address.fromBech32("erd1k2s324ww2g0yj38qn2ch2jwctdy8mnfxep94q9arncc6xecg3xaq6mjse8"), - receiver: Address.fromBech32("erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th"), - senderUsername: "carol", - receiverUsername: "alice", - gasLimit: 50000, - chainID: "T", - }); - - const signer = wallets.carol.signer; - const txComputer = new TransactionComputer(); - innerTransaction.signature = await signer.sign(txComputer.computeBytesForSigning(innerTransaction)); - - const relayedTransaction = new Transaction({ - nonce: 204, - value: "1000000000000000000", - sender: Address.fromBech32("erd1k2s324ww2g0yj38qn2ch2jwctdy8mnfxep94q9arncc6xecg3xaq6mjse8"), - receiver: Address.fromBech32("erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th"), - senderUsername: "carol", - receiverUsername: "alice", - gasLimit: 50000, - chainID: "T", - relayer: wallets["carol"].address.toBech32(), - innerTransactions: [innerTransaction], - }); - - relayedTransaction.signature = await signer.sign(txComputer.computeBytesForSigning(relayedTransaction)); - - const serializedTransaction = serializer.serializeTransaction(relayedTransaction); - assert.equal( - serializedTransaction.toString("hex"), - "08cc011209000de0b6b3a76400001a200139472eff6886771a982f3083da5d421f24c29181e63888228dc81ca60d69e12205616c6963652a20b2a11555ce521e4944e09ab17549d85b487dcd26c84b5017a39e31a3670889ba32056361726f6c388094ebdc0340d0860352015458026240901a6a974d6ab36546e7881c6e0364ec4c61a891aa70e5eb60f818d6c92a39cfa0beac6fab73f503853cfe8fe6149b4be207ddb93788f8450d75a07fa8759d06820120b2a11555ce521e4944e09ab17549d85b487dcd26c84b5017a39e31a3670889ba8a01b10108cc011209000de0b6b3a76400001a200139472eff6886771a982f3083da5d421f24c29181e63888228dc81ca60d69e12205616c6963652a20b2a11555ce521e4944e09ab17549d85b487dcd26c84b5017a39e31a3670889ba32056361726f6c388094ebdc0340d086035201545802624051e6cd78fb3ab4b53ff7ad6864df27cb4a56d70603332869d47a5cf6ea977c30e696103e41e8dddf2582996ad335229fdf4acb726564dbc1a0bc9e705b511f06", - ); - }); }); diff --git a/src/proto/serializer.ts b/src/proto/serializer.ts index 2fff28ff..2f46ee42 100644 --- a/src/proto/serializer.ts +++ b/src/proto/serializer.ts @@ -60,12 +60,6 @@ export class ProtoSerializer { protoTransaction.GuardianSignature = transaction.guardianSignature; } - if (transaction.relayer) { - protoTransaction.Relayer = new Address(transaction.relayer).getPublicKey(); - } - - protoTransaction.InnerTransactions = transaction.innerTransactions.map((tx) => this.convertToProtoMessage(tx)); - return protoTransaction; } diff --git a/src/proto/transaction.proto b/src/proto/transaction.proto index 90f4feec..b3b7dfd1 100644 --- a/src/proto/transaction.proto +++ b/src/proto/transaction.proto @@ -25,6 +25,4 @@ message Transaction { uint32 Options = 13; bytes GuardianAddr = 14; bytes GuardianSignature = 15; - bytes Relayer = 16; - repeated Transaction InnerTransactions = 17; } diff --git a/src/transaction.ts b/src/transaction.ts index a602cca1..a8fad0a9 100644 --- a/src/transaction.ts +++ b/src/transaction.ts @@ -102,16 +102,6 @@ export class Transaction { */ public guardianSignature: Uint8Array; - /** - * The relayer in case it is a relayedV3 Transaction. - */ - public relayer: string; - - /** - * The inner transactions in case it is a relayedV3 Transaction. - */ - public innerTransactions: ITransaction[]; - /** * Creates a new Transaction object. */ @@ -131,8 +121,6 @@ export class Transaction { guardian?: IAddress | string; signature?: Uint8Array; guardianSignature?: Uint8Array; - relayer?: string; - innerTransactions?: ITransaction[]; }) { this.nonce = BigInt(options.nonce?.valueOf() || 0n); // We still rely on "bigNumber" for value, because client code might be passing a BigNumber object as a legacy "ITransactionValue", @@ -152,9 +140,6 @@ export class Transaction { this.signature = options.signature || Buffer.from([]); this.guardianSignature = options.guardianSignature || Buffer.from([]); - - this.relayer = options.relayer || ""; - this.innerTransactions = options.innerTransactions || []; } private addressAsBech32(address: IAddress | string): string { diff --git a/src/transactionComputer.ts b/src/transactionComputer.ts index 1a835b04..da365e7b 100644 --- a/src/transactionComputer.ts +++ b/src/transactionComputer.ts @@ -122,10 +122,6 @@ export class TransactionComputer { obj.version = transaction.version; obj.options = transaction.options ? transaction.options : undefined; obj.guardian = transaction.guardian ? transaction.guardian : undefined; - obj.relayer = transaction.relayer ? transaction.relayer : undefined; - obj.innerTransactions = transaction.innerTransactions.length - ? transaction.innerTransactions.map((tx) => this.toPlainObject(tx, true)) - : undefined; return obj; } diff --git a/src/transactionsFactories/relayedTransactionsFactory.spec.ts b/src/transactionsFactories/relayedTransactionsFactory.spec.ts index f45fac44..6c61d331 100644 --- a/src/transactionsFactories/relayedTransactionsFactory.spec.ts +++ b/src/transactionsFactories/relayedTransactionsFactory.spec.ts @@ -275,69 +275,4 @@ describe("test relayed transactions factory", function () { "relayedTxV2@000000000000000000010000000000000000000000000000000000000002ffff@0f@676574436f6e7472616374436f6e666967@fc3ed87a51ee659f937c1a1ed11c1ae677e99629fae9cc289461f033e6514d1a8cfad1144ae9c1b70f28554d196bd6ba1604240c1c1dc19c959e96c1c3b62d0c", ); }); - - it("should create relayed v3 transaction", async function () { - let innerTransaction = new Transaction({ - sender: bob.address.toBech32(), - receiver: bob.address.toBech32(), - gasLimit: 50000n, - chainID: config.chainID, - nonce: 0n, - version: 2, - relayer: alice.address.toBech32(), - }); - - const serializedInnerTransaction = transactionComputer.computeBytesForSigning(innerTransaction); - innerTransaction.signature = await bob.signer.sign(serializedInnerTransaction); - - const relayedTransaction = factory.createRelayedV3Transaction({ - relayerAddress: alice.address, - innerTransactions: [innerTransaction], - }); - - const serializedRelayedTransaction = transactionComputer.computeBytesForSigning(relayedTransaction); - relayedTransaction.signature = await alice.signer.sign(serializedRelayedTransaction); - - assert.equal( - Buffer.from(relayedTransaction.signature).toString("hex"), - "88b9bce6fe62a641fca593f95c12ad09032a44b34c9e5cf16d070f0563b1695bf9d452a9df52bce3373fd5e10ed96c3d65cd189f5873e3a3184a89f4980c9e0c", - ); - assert.equal(relayedTransaction.gasLimit, 100000n); - }); - - it("should fail to create relayed v3 transaction", async function () { - assert.throws(() => { - factory.createRelayedV3Transaction({ - relayerAddress: alice.address, - innerTransactions: [], - }); - }, "No inner transctions provided"); - - const innerTransaction = new Transaction({ - sender: bob.address.toBech32(), - receiver: bob.address.toBech32(), - gasLimit: 50000n, - chainID: config.chainID, - nonce: 0n, - version: 2, - relayer: carol.address.toBech32(), - }); - - assert.throws(() => { - factory.createRelayedV3Transaction({ - relayerAddress: alice.address, - innerTransactions: [innerTransaction], - }); - }, "Inner transaction is not signed"); - - const serializedInnerTransaction = transactionComputer.computeBytesForSigning(innerTransaction); - innerTransaction.signature = await bob.signer.sign(serializedInnerTransaction); - - assert.throws(() => { - factory.createRelayedV3Transaction({ - relayerAddress: alice.address, - innerTransactions: [innerTransaction], - }); - }, "The inner transaction has an incorrect relayer address"); - }); }); diff --git a/src/transactionsFactories/relayedTransactionsFactory.ts b/src/transactionsFactories/relayedTransactionsFactory.ts index 7464fc25..b6974102 100644 --- a/src/transactionsFactories/relayedTransactionsFactory.ts +++ b/src/transactionsFactories/relayedTransactionsFactory.ts @@ -84,36 +84,6 @@ export class RelayedTransactionsFactory { }); } - createRelayedV3Transaction(options: { relayerAddress: IAddress; innerTransactions: ITransaction[] }): Transaction { - if (!options.innerTransactions.length) { - throw new ErrInvalidInnerTransaction("No inner transctions provided"); - } - - let innerTransactionsGasLimit = 0n; - for (const innerTx of options.innerTransactions) { - if (!innerTx.signature.length) { - throw new ErrInvalidInnerTransaction("Inner transaction is not signed"); - } - - if (innerTx.relayer !== options.relayerAddress.bech32()) { - throw new ErrInvalidInnerTransaction("The inner transaction has an incorrect relayer address"); - } - - innerTransactionsGasLimit += innerTx.gasLimit; - } - - const moveBalanceGas = this.config.minGasLimit * BigInt(options.innerTransactions.length); - const gasLimit = moveBalanceGas + innerTransactionsGasLimit; - - return new Transaction({ - sender: options.relayerAddress.bech32(), - receiver: options.relayerAddress.bech32(), - chainID: this.config.chainID, - gasLimit: gasLimit, - innerTransactions: options.innerTransactions, - }); - } - private prepareInnerTransactionForRelayedV1(innerTransaction: ITransaction): string { const txObject = { nonce: innerTransaction.nonce, From 3ce39e15141df1da445cdd86437d329845ff18be Mon Sep 17 00:00:00 2001 From: danielailie Date: Mon, 21 Oct 2024 12:59:51 +0300 Subject: [PATCH 2/2] Bump version --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7a3ce04f..12309342 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@multiversx/sdk-core", - "version": "13.9.0", + "version": "13.11.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@multiversx/sdk-core", - "version": "13.9.0", + "version": "13.11.0", "license": "MIT", "dependencies": { "@multiversx/sdk-transaction-decoder": "1.0.2", diff --git a/package.json b/package.json index 985a883c..041873e0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@multiversx/sdk-core", - "version": "13.9.0", + "version": "13.11.0", "description": "MultiversX SDK for JavaScript and TypeScript", "author": "MultiversX", "homepage": "https://multiversx.com",