diff --git a/package-lock.json b/package-lock.json index 8bc6faee..0d66869e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@multiversx/sdk-core", - "version": "14.0.3", + "version": "14.0.4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@multiversx/sdk-core", - "version": "14.0.3", + "version": "14.0.4", "license": "MIT", "dependencies": { "@multiversx/sdk-transaction-decoder": "1.0.2", diff --git a/package.json b/package.json index 05d65752..922f23ce 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@multiversx/sdk-core", - "version": "14.0.3", + "version": "14.0.4", "description": "MultiversX SDK for JavaScript and TypeScript", "author": "MultiversX", "homepage": "https://multiversx.com", diff --git a/src/core/smartContractQuery.ts b/src/core/smartContractQuery.ts index 1f0702d5..7c0d5ae3 100644 --- a/src/core/smartContractQuery.ts +++ b/src/core/smartContractQuery.ts @@ -49,7 +49,7 @@ export class SmartContractQueryResponse { let returnMessage = payload["returnMessage"] || payload["ReturnMessage"]; return new SmartContractQueryResponse({ - returnDataParts: returnData?.map((item) => Buffer.from(item || "", "base64")), + returnDataParts: returnData?.map((item) => Buffer.from(item || "", "base64")) ?? [], returnCode: returnCode, returnMessage: returnMessage, function: functionName, diff --git a/src/core/transactionOnNetwork.ts b/src/core/transactionOnNetwork.ts index 5d6cbafc..7136dd80 100644 --- a/src/core/transactionOnNetwork.ts +++ b/src/core/transactionOnNetwork.ts @@ -76,11 +76,12 @@ export class TransactionOnNetwork { const result = TransactionOnNetwork.fromHttpResponse(txHash, response); result.smartContractResults = response.smartContractResults?.map( - (result: Partial) => + (result: any) => new SmartContractResult({ ...result, receiver: result.receiver ? new Address(result.receiver) : undefined, sender: result.sender ? new Address(result.sender) : undefined, + data: Buffer.from(result.data ?? "", "utf-8"), raw: result, }), ) ?? []; @@ -142,11 +143,12 @@ export class TransactionOnNetwork { const result = TransactionOnNetwork.fromHttpResponse(txHash, response); result.smartContractResults = response.results?.map( - (result: Partial) => + (result: any) => new SmartContractResult({ ...result, receiver: result.receiver ? new Address(result.receiver) : undefined, sender: result.sender ? new Address(result.sender) : undefined, + data: Buffer.from(result.data ?? "", "base64"), raw: result, }), ) ?? []; @@ -167,7 +169,6 @@ export class TransactionOnNetwork { result.gasPrice = BigInt(response.gasPrice) || 0n; result.gasLimit = BigInt(response.gasLimit) || 0n; result.function = response.function || ""; - result.data = Buffer.from(response.data || "", "base64"); result.version = response.version || 1; result.options = response.options || 0; result.data = Buffer.from(response.data || "", "base64"); diff --git a/src/networkProviders/apiNetworkProvider.dev.net.spec.ts b/src/networkProviders/apiNetworkProvider.dev.net.spec.ts index 4e7183a8..37ea79e6 100644 --- a/src/networkProviders/apiNetworkProvider.dev.net.spec.ts +++ b/src/networkProviders/apiNetworkProvider.dev.net.spec.ts @@ -162,7 +162,7 @@ describe("ApiNetworkProvider Tests", function () { assert.isTrue(transaction.status.isCompleted()); }); - it("should fetch smart contract invoking transaction", async () => { + it("should fetch smart contract invoking transaction with expected data", async () => { const transaction = await apiProvider.getTransaction( "6fe05e4ca01d42c96ae5182978a77fe49f26bcc14aac95ad4f19618173f86ddb", ); @@ -175,6 +175,10 @@ describe("ApiNetworkProvider Tests", function () { "issue@54455354546f6b656e@54455354@016345785d8a0000@06@63616e4368616e67654f776e6572@74727565@63616e55706772616465@74727565@63616e4164645370656369616c526f6c6573@74727565", ), ); + assert.deepEqual( + transaction.smartContractResults[0].data, + Buffer.from("ESDTSetBurnRoleForAll@544553542d666631353565"), + ); assert.equal(Buffer.from(transaction.logs.events[0].topics[0]).toString("hex"), "544553542d666631353565"); assert.equal(Buffer.from(transaction.logs.events[0].topics[1]).toString("hex"), ""); assert.equal(Buffer.from(transaction.logs.events[0].topics[2]).toString("hex"), "63616e4368616e67654f776e6572"); @@ -382,4 +386,14 @@ describe("ApiNetworkProvider Tests", function () { const result = await apiProvider.queryContract(query); assert.equal(result.returnDataParts.length, 1); }); + + it("should query contract when undefined returnData", async () => { + const query = new SmartContractQuery({ + contract: Address.newFromBech32("erd1qqqqqqqqqqqqqpgqf738mcf8f08kuwhn8dvtka5veyad2fqwu00sqnjgln"), + function: "getAllProposers", + arguments: [], + }); + const result = await apiProvider.queryContract(query); + assert.equal(result.returnDataParts.length, 0); + }); }); diff --git a/src/networkProviders/proxyNetworkProvider.dev.net.spec.ts b/src/networkProviders/proxyNetworkProvider.dev.net.spec.ts index 39322cb1..94adc490 100644 --- a/src/networkProviders/proxyNetworkProvider.dev.net.spec.ts +++ b/src/networkProviders/proxyNetworkProvider.dev.net.spec.ts @@ -168,7 +168,7 @@ describe("ProxyNetworkProvider Tests", function () { assert.isTrue(transaction.status.isCompleted()); }); - it("should fetch smart contract invoking transaction", async () => { + it("should fetch smart contract invoking transaction with expected data", async () => { const transaction = await proxy.getTransaction( "6fe05e4ca01d42c96ae5182978a77fe49f26bcc14aac95ad4f19618173f86ddb", ); @@ -181,6 +181,10 @@ describe("ProxyNetworkProvider Tests", function () { "issue@54455354546f6b656e@54455354@016345785d8a0000@06@63616e4368616e67654f776e6572@74727565@63616e55706772616465@74727565@63616e4164645370656369616c526f6c6573@74727565", ), ); + assert.deepEqual( + transaction.smartContractResults[0].data, + Buffer.from("ESDTSetBurnRoleForAll@544553542d666631353565"), + ); assert.equal(Buffer.from(transaction.logs.events[0].topics[0]).toString("hex"), "544553542d666631353565"); assert.equal(Buffer.from(transaction.logs.events[0].topics[1]).toString("hex"), ""); assert.equal(Buffer.from(transaction.logs.events[0].topics[2]).toString("hex"), "63616e4368616e67654f776e6572"); @@ -388,4 +392,14 @@ describe("ProxyNetworkProvider Tests", function () { const result = await proxy.queryContract(query); assert.equal(result.returnDataParts.length, 1); }); + + it("should query contract when undefined returnData", async () => { + const query = new SmartContractQuery({ + contract: Address.newFromBech32("erd1qqqqqqqqqqqqqpgqf738mcf8f08kuwhn8dvtka5veyad2fqwu00sqnjgln"), + function: "getAllProposers", + arguments: [], + }); + const result = await proxy.queryContract(query); + assert.equal(result.returnDataParts.length, 0); + }); }); diff --git a/src/smartContracts/smartContractTransactionsOutcomeParser.spec.ts b/src/smartContracts/smartContractTransactionsOutcomeParser.spec.ts index 649d4b2a..67a18651 100644 --- a/src/smartContracts/smartContractTransactionsOutcomeParser.spec.ts +++ b/src/smartContracts/smartContractTransactionsOutcomeParser.spec.ts @@ -93,7 +93,7 @@ describe("test smart contract transactions outcome parser", () => { const transactionOnNetwork = new TransactionOnNetwork({ nonce: 7n, function: "getUltimateAnswer", - smartContractResults: [new SmartContractResult({ data: Buffer.from("@6f6b@2a") })], + smartContractResults: [new SmartContractResult({ data: Buffer.from("QDZmNmJAMmE=", "base64") })], }); const parsed = parser.parseExecute({ transactionOnNetwork }); diff --git a/src/smartContracts/smartContractTransactionsOutcomeParser.ts b/src/smartContracts/smartContractTransactionsOutcomeParser.ts index 75ba1e3d..23ba9be0 100644 --- a/src/smartContracts/smartContractTransactionsOutcomeParser.ts +++ b/src/smartContracts/smartContractTransactionsOutcomeParser.ts @@ -142,7 +142,7 @@ export class SmartContractTransactionsOutcomeParser { const eligibleResults: SmartContractResult[] = []; for (const result of transactionOnNetwork.smartContractResults) { - const matchesCriteriaOnData = result.data.toString().startsWith(ARGUMENTS_SEPARATOR); + const matchesCriteriaOnData = Buffer.from(result.data).toString("utf-8").startsWith(ARGUMENTS_SEPARATOR); const matchesCriteriaOnReceiver = result.receiver.toBech32() === transactionOnNetwork.sender.toBech32(); const matchesCriteriaOnPreviousHash = result;