diff --git a/package-lock.json b/package-lock.json index 51626528..f3044f62 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@multiversx/sdk-core", - "version": "15.2.2", + "version": "15.3.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@multiversx/sdk-core", - "version": "15.2.2", + "version": "15.3.0", "license": "MIT", "dependencies": { "@multiversx/sdk-transaction-decoder": "1.0.2", diff --git a/package.json b/package.json index b388b5dd..6492b598 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@multiversx/sdk-core", - "version": "15.2.2", + "version": "15.3.0", "description": "MultiversX SDK for JavaScript and TypeScript", "author": "MultiversX", "homepage": "https://multiversx.com", diff --git a/src/smartContracts/smartContractTransactionsFactory.spec.ts b/src/smartContracts/smartContractTransactionsFactory.spec.ts index 7e56c63d..2535a709 100644 --- a/src/smartContracts/smartContractTransactionsFactory.spec.ts +++ b/src/smartContracts/smartContractTransactionsFactory.spec.ts @@ -1,5 +1,5 @@ import { assert } from "chai"; -import { Abi, U32Value } from "../abi"; +import { Abi, BigUIntValue, U32Value } from "../abi"; import { Address, Err, Token, TokenTransfer, TransactionsFactoryConfig } from "../core"; import { loadAbiRegistry, loadContractCode } from "../testutils/utils"; import { SmartContractTransactionsFactory } from "./smartContractTransactionsFactory"; @@ -44,6 +44,54 @@ describe("test smart contract transactions factory", function () { } }); + it("should allow args of type 'TypedValue'", async function () { + const sender = Address.newFromBech32("erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th"); + const gasLimit = 6000000n; + const args = [new BigUIntValue(7)]; + + const transaction = await factory.createTransactionForDeploy(sender, { + bytecode: bytecode.valueOf(), + gasLimit: gasLimit, + arguments: args, + }); + + const bytecodeHex = Buffer.from(bytecode).toString("hex"); + assert.deepEqual(transaction.data, Buffer.from(`${bytecodeHex}@0500@0504@07`)); + }); + + it("should allow args of type bytes", async function () { + const sender = Address.newFromBech32("erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th"); + const gasLimit = 6000000n; + let args = [Buffer.from([7]), new Uint8Array([7])]; + const bytecodeHex = Buffer.from(bytecode).toString("hex"); + + let transaction = await factory.createTransactionForDeploy(sender, { + bytecode: bytecode.valueOf(), + gasLimit: gasLimit, + arguments: args, + }); + + assert.deepEqual(transaction.data, Buffer.from(`${bytecodeHex}@0500@0504@07@07`)); + + args = [new Uint8Array([7]), Buffer.from("6161626261", "hex")]; + transaction = await factory.createTransactionForDeploy(sender, { + bytecode: bytecode.valueOf(), + gasLimit: gasLimit, + arguments: args, + }); + + assert.deepEqual(transaction.data, Buffer.from(`${bytecodeHex}@0500@0504@07@6161626261`)); + + args = [new Uint8Array()]; + transaction = await factory.createTransactionForDeploy(sender, { + bytecode: bytecode.valueOf(), + gasLimit: gasLimit, + arguments: args, + }); + + assert.deepEqual(transaction.data, Buffer.from(`${bytecodeHex}@0500@0504@`)); + }); + it("should create 'Transaction' for deploy", async function () { const sender = Address.newFromBech32("erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th"); const gasLimit = 6000000n; diff --git a/src/smartContracts/smartContractTransactionsFactory.ts b/src/smartContracts/smartContractTransactionsFactory.ts index c95939f2..de8986d2 100644 --- a/src/smartContracts/smartContractTransactionsFactory.ts +++ b/src/smartContracts/smartContractTransactionsFactory.ts @@ -226,9 +226,23 @@ export class SmartContractTransactionsFactory extends BaseFactory { return new ArgSerializer().valuesToStrings(args); } + if (this.areArgsBuffers(args)) { + return args.map((arg) => Buffer.from(arg).toString("hex")); + } + throw new Err("Can't convert args to TypedValues"); } + private areArgsBuffers(args: any[]): boolean { + for (const arg of args) { + if (!ArrayBuffer.isView(arg)) { + return false; + } + } + + return true; + } + private areArgsOfTypedValue(args: any[]): boolean { return args.every((arg) => isTyped(arg)); }