diff --git a/package-lock.json b/package-lock.json index e73a837d..c692de46 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@multiversx/sdk-core", - "version": "14.1.0", + "version": "14.1.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@multiversx/sdk-core", - "version": "14.1.0", + "version": "14.1.1", "license": "MIT", "dependencies": { "@multiversx/sdk-transaction-decoder": "1.0.2", diff --git a/package.json b/package.json index f0bec114..ba81a678 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@multiversx/sdk-core", - "version": "14.1.0", + "version": "14.1.1", "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 217d2b51..15363f55 100644 --- a/src/smartContracts/smartContractTransactionsFactory.spec.ts +++ b/src/smartContracts/smartContractTransactionsFactory.spec.ts @@ -188,6 +188,51 @@ describe("test smart contract transactions factory", function () { assert.deepEqual(transaction, transactionAbiAware); }); + it("should create 'Transaction' for execute and transfer with EGLD as single token tranfer", async function () { + const sender = Address.newFromBech32("erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th"); + const contract = Address.newFromBech32("erd1qqqqqqqqqqqqqpgqhy6nl6zq07rnzry8uyh6rtyq0uzgtk3e69fqgtz9l4"); + const func = "add"; + const gasLimit = 6000000n; + const args = [new U32Value(7)]; + const token = new Token({ identifier: "EGLD-000000", nonce: 0n }); + const transfer = new TokenTransfer({ token, amount: 10n }); + + const transaction = factory.createTransactionForExecute(sender, { + contract: contract, + function: func, + gasLimit: gasLimit, + arguments: args, + tokenTransfers: [transfer], + }); + + const transactionAbiAware = abiAwareFactory.createTransactionForExecute(sender, { + contract: contract, + function: func, + gasLimit: gasLimit, + arguments: args, + tokenTransfers: [transfer], + }); + + assert.deepEqual( + transaction.sender, + Address.newFromBech32("erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th"), + ); + assert.deepEqual( + transaction.receiver, + Address.newFromBech32("erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th"), + ); + assert.deepEqual( + transaction.data, + Buffer.from( + "MultiESDTNFTTransfer@00000000000000000500b9353fe8407f87310c87e12fa1ac807f0485da39d152@01@45474c442d303030303030@@0a@616464@07", + ), + ); + assert.equal(transaction.gasLimit, gasLimit); + assert.equal(transaction.value, 0n); + + assert.deepEqual(transaction, transactionAbiAware); + }); + it("should create 'Transaction' for execute and transfer multiple esdts", async function () { const sender = Address.newFromBech32("erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th"); const contract = Address.newFromBech32("erd1qqqqqqqqqqqqqpgqak8zt22wl2ph4tswtyc39namqx6ysa2sd8ss4xmlj3"); diff --git a/src/smartContracts/smartContractTransactionsFactory.ts b/src/smartContracts/smartContractTransactionsFactory.ts index 521a8f60..18e9e522 100644 --- a/src/smartContracts/smartContractTransactionsFactory.ts +++ b/src/smartContracts/smartContractTransactionsFactory.ts @@ -1,6 +1,10 @@ import { ArgSerializer, ContractFunction, EndpointDefinition, isTyped, NativeSerializer } from "../abi"; import { Address, CodeMetadata } from "../core"; -import { CONTRACT_DEPLOY_ADDRESS_HEX, VM_TYPE_WASM_VM } from "../core/constants"; +import { + CONTRACT_DEPLOY_ADDRESS_HEX, + EGLD_IDENTIFIER_FOR_MULTI_ESDTNFT_TRANSFER, + VM_TYPE_WASM_VM, +} from "../core/constants"; import { Err } from "../core/errors"; import { Logger } from "../core/logger"; import { TokenComputer, TokenTransfer } from "../core/tokens"; @@ -87,7 +91,10 @@ export class SmartContractTransactionsFactory { if (numberOfTokens === 1) { const transfer = tokenTransfers[0]; - if (this.tokenComputer.isFungible(transfer.token)) { + if (transfer.token.identifier === EGLD_IDENTIFIER_FOR_MULTI_ESDTNFT_TRANSFER) { + dataParts = this.dataArgsBuilder.buildDataPartsForMultiESDTNFTTransfer(receiver, tokenTransfers); + receiver = sender; + } else if (this.tokenComputer.isFungible(transfer.token)) { dataParts = this.dataArgsBuilder.buildDataPartsForESDTTransfer(transfer); } else { dataParts = this.dataArgsBuilder.buildDataPartsForSingleESDTNFTTransfer(transfer, receiver);