From f9eae9fd3d9fcc62acc15bf71cb2adc265b97c4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20B=C4=83ncioiu?= Date: Thu, 28 Mar 2024 13:20:34 +0200 Subject: [PATCH 1/8] Sketch parsing of deploy transaction. --- .../smartContractTransactionsOutcomeParser.ts | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/transactionsOutcomeParsers/smartContractTransactionsOutcomeParser.ts b/src/transactionsOutcomeParsers/smartContractTransactionsOutcomeParser.ts index eede9d6f..97e57311 100644 --- a/src/transactionsOutcomeParsers/smartContractTransactionsOutcomeParser.ts +++ b/src/transactionsOutcomeParsers/smartContractTransactionsOutcomeParser.ts @@ -1,6 +1,7 @@ +import { Address } from "../address"; import { Err } from "../errors"; import { EndpointDefinition, ResultsParser, ReturnCode, Type, UntypedOutcomeBundle } from "../smartcontracts"; -import { TransactionOutcome } from "./resources"; +import { TransactionEvent, TransactionOutcome, findEventsByIdentifier } from "./resources"; interface IAbi { getEndpoint(name: string): EndpointDefinition; @@ -35,6 +36,34 @@ export class SmartContractTransactionsOutcomeParser { this.legacyResultsParser = options?.legacyResultsParser || new ResultsParser(); } + parseDeploy(options: { transactionOutcome: TransactionOutcome }): { + values: any[]; + returnCode: string; + returnMessage: string; + addresses: string[]; + } { + const directCallOutcome = options.transactionOutcome.directSmartContractCallOutcome; + const events = findEventsByIdentifier(options.transactionOutcome, "SCDeploy"); + const addresses = events.map((event) => this.extractContractAddress(event)); + + return { + values: directCallOutcome.returnDataParts, + returnCode: directCallOutcome.returnCode, + returnMessage: directCallOutcome.returnMessage, + addresses: addresses, + }; + } + + private extractContractAddress(event: TransactionEvent): string { + const firstTopic = event.topics[0]; + + if (!firstTopic?.length) { + return ""; + } + + return Address.fromBuffer(Buffer.from(firstTopic)).toBech32(); + } + parseExecute(options: { transactionOutcome: TransactionOutcome; function?: string }): { values: any[]; returnCode: string; From 215ea7acea1bad0c218bb1637ac6525577a11f15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20B=C4=83ncioiu?= Date: Thu, 28 Mar 2024 13:21:21 +0200 Subject: [PATCH 2/8] Remove arbitrary constraint in "findEventsByIdentifier". --- src/transactionsOutcomeParsers/resources.ts | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/transactionsOutcomeParsers/resources.ts b/src/transactionsOutcomeParsers/resources.ts index 60ae05bc..93a4d1e5 100644 --- a/src/transactionsOutcomeParsers/resources.ts +++ b/src/transactionsOutcomeParsers/resources.ts @@ -1,5 +1,3 @@ -import { ErrParseTransactionOutcome } from "../errors"; - export class TransactionEvent { address: string; identifier: string; @@ -82,13 +80,7 @@ export function findEventsByPredicate( } export function findEventsByIdentifier(transactionOutcome: TransactionOutcome, identifier: string): TransactionEvent[] { - const events = findEventsByPredicate(transactionOutcome, (event) => event.identifier == identifier); - - if (events.length == 0) { - throw new ErrParseTransactionOutcome(`cannot find event of type ${identifier}`); - } - - return events; + return findEventsByPredicate(transactionOutcome, (event) => event.identifier == identifier); } export function gatherAllEvents(transactionOutcome: TransactionOutcome): TransactionEvent[] { From 4c601f17fb459646444f8f1f591abab5f15b03c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20B=C4=83ncioiu?= Date: Thu, 28 Mar 2024 14:05:15 +0200 Subject: [PATCH 3/8] Parse deploy events. --- ...tContractTransactionsOutcomeParser.spec.ts | 42 ++++++++++++++++++- .../smartContractTransactionsOutcomeParser.ts | 36 +++++++++++----- 2 files changed, 66 insertions(+), 12 deletions(-) diff --git a/src/transactionsOutcomeParsers/smartContractTransactionsOutcomeParser.spec.ts b/src/transactionsOutcomeParsers/smartContractTransactionsOutcomeParser.spec.ts index 92491168..bedf6157 100644 --- a/src/transactionsOutcomeParsers/smartContractTransactionsOutcomeParser.spec.ts +++ b/src/transactionsOutcomeParsers/smartContractTransactionsOutcomeParser.spec.ts @@ -1,12 +1,52 @@ import { ContractResultItem, ContractResults, TransactionOnNetwork } from "@multiversx/sdk-network-providers"; import BigNumber from "bignumber.js"; import { assert } from "chai"; +import { Address } from "../address"; import { TransactionsConverter } from "../converters/transactionsConverter"; import { loadAbiRegistry } from "../testutils"; -import { SmartContractCallOutcome, TransactionOutcome } from "./resources"; +import { SmartContractCallOutcome, TransactionEvent, TransactionLogs, TransactionOutcome } from "./resources"; import { SmartContractTransactionsOutcomeParser } from "./smartContractTransactionsOutcomeParser"; describe("test smart contract transactions outcome parser", () => { + it("parses deploy outcome (minimalistic)", async function () { + const parser = new SmartContractTransactionsOutcomeParser(); + + const parsed = parser.parseDeploy({ + transactionOutcome: new TransactionOutcome({ + directSmartContractCallOutcome: new SmartContractCallOutcome({ + returnCode: "ok", + returnMessage: "ok", + }), + logs: new TransactionLogs({ + events: [ + new TransactionEvent({ + identifier: "SCDeploy", + topics: [ + Address.fromBech32( + "erd1qqqqqqqqqqqqqpgqqacl85rd0gl2q8wggl8pwcyzcr4fflc5d8ssve45cj", + ).getPublicKey(), + Address.fromBech32( + "erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th", + ).getPublicKey(), + Buffer.from("abba", "hex"), + ], + }), + ], + }), + }), + }); + + assert.equal(parsed.returnCode, "ok"); + assert.equal(parsed.returnMessage, "ok"); + assert.deepEqual(parsed.contracts, [ + { + address: "erd1qqqqqqqqqqqqqpgqqacl85rd0gl2q8wggl8pwcyzcr4fflc5d8ssve45cj", + ownerAddress: "erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th", + codeHash: Buffer.from("abba", "hex"), + }, + ]); + }); + it("parses execute outcome, without ABI (minimalistic)", function () { const parser = new SmartContractTransactionsOutcomeParser(); diff --git a/src/transactionsOutcomeParsers/smartContractTransactionsOutcomeParser.ts b/src/transactionsOutcomeParsers/smartContractTransactionsOutcomeParser.ts index 97e57311..72f612d4 100644 --- a/src/transactionsOutcomeParsers/smartContractTransactionsOutcomeParser.ts +++ b/src/transactionsOutcomeParsers/smartContractTransactionsOutcomeParser.ts @@ -37,31 +37,45 @@ export class SmartContractTransactionsOutcomeParser { } parseDeploy(options: { transactionOutcome: TransactionOutcome }): { - values: any[]; returnCode: string; returnMessage: string; - addresses: string[]; + contracts: { + address: string; + ownerAddress: string; + codeHash: Uint8Array; + }[]; } { const directCallOutcome = options.transactionOutcome.directSmartContractCallOutcome; const events = findEventsByIdentifier(options.transactionOutcome, "SCDeploy"); - const addresses = events.map((event) => this.extractContractAddress(event)); + const contracts = events.map((event) => this.parseScDeployEvent(event)); return { - values: directCallOutcome.returnDataParts, returnCode: directCallOutcome.returnCode, returnMessage: directCallOutcome.returnMessage, - addresses: addresses, + contracts: contracts, }; } - private extractContractAddress(event: TransactionEvent): string { - const firstTopic = event.topics[0]; + private parseScDeployEvent(event: TransactionEvent): { + address: string; + ownerAddress: string; + codeHash: Uint8Array; + } { + const topicForAddress = event.topics[0]; + const topicForOwnerAddress = event.topics[1]; + const topicForCodeHash = event.topics[2]; - if (!firstTopic?.length) { - return ""; - } + const address = topicForAddress?.length ? Address.fromBuffer(Buffer.from(topicForAddress)).toBech32() : ""; + const ownerAddress = topicForOwnerAddress?.length + ? Address.fromBuffer(Buffer.from(topicForOwnerAddress)).toBech32() + : ""; + const codeHash = topicForCodeHash; - return Address.fromBuffer(Buffer.from(firstTopic)).toBech32(); + return { + address, + ownerAddress, + codeHash, + }; } parseExecute(options: { transactionOutcome: TransactionOutcome; function?: string }): { From 6bac43654902e1618d3c967060daabb50e5c1f26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20B=C4=83ncioiu?= Date: Thu, 28 Mar 2024 14:39:04 +0200 Subject: [PATCH 4/8] Extra tests. --- ...tContractTransactionsOutcomeParser.spec.ts | 67 +++++++++++++++---- 1 file changed, 54 insertions(+), 13 deletions(-) diff --git a/src/transactionsOutcomeParsers/smartContractTransactionsOutcomeParser.spec.ts b/src/transactionsOutcomeParsers/smartContractTransactionsOutcomeParser.spec.ts index bedf6157..46d7085c 100644 --- a/src/transactionsOutcomeParsers/smartContractTransactionsOutcomeParser.spec.ts +++ b/src/transactionsOutcomeParsers/smartContractTransactionsOutcomeParser.spec.ts @@ -1,4 +1,11 @@ -import { ContractResultItem, ContractResults, TransactionOnNetwork } from "@multiversx/sdk-network-providers"; +import { + ContractResultItem, + ContractResults, + TransactionEventTopic, + TransactionOnNetwork, + TransactionEvent as TransactionOnNetworkEvent, + TransactionLogs as TransactionOnNetworkLogs, +} from "@multiversx/sdk-network-providers"; import BigNumber from "bignumber.js"; import { assert } from "chai"; import { Address } from "../address"; @@ -9,6 +16,10 @@ import { SmartContractTransactionsOutcomeParser } from "./smartContractTransacti describe("test smart contract transactions outcome parser", () => { it("parses deploy outcome (minimalistic)", async function () { + const deployer = Address.fromBech32("erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th"); + const contract = Address.fromBech32("erd1qqqqqqqqqqqqqpgqqacl85rd0gl2q8wggl8pwcyzcr4fflc5d8ssve45cj"); + const codeHash = Buffer.from("abba", "hex"); + const parser = new SmartContractTransactionsOutcomeParser(); const parsed = parser.parseDeploy({ @@ -21,15 +32,7 @@ describe("test smart contract transactions outcome parser", () => { events: [ new TransactionEvent({ identifier: "SCDeploy", - topics: [ - Address.fromBech32( - "erd1qqqqqqqqqqqqqpgqqacl85rd0gl2q8wggl8pwcyzcr4fflc5d8ssve45cj", - ).getPublicKey(), - Address.fromBech32( - "erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th", - ).getPublicKey(), - Buffer.from("abba", "hex"), - ], + topics: [contract.getPublicKey(), deployer.getPublicKey(), codeHash], }), ], }), @@ -40,9 +43,47 @@ describe("test smart contract transactions outcome parser", () => { assert.equal(parsed.returnMessage, "ok"); assert.deepEqual(parsed.contracts, [ { - address: "erd1qqqqqqqqqqqqqpgqqacl85rd0gl2q8wggl8pwcyzcr4fflc5d8ssve45cj", - ownerAddress: "erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th", - codeHash: Buffer.from("abba", "hex"), + address: contract.toBech32(), + ownerAddress: deployer.toBech32(), + codeHash: codeHash, + }, + ]); + }); + + it("parses deploy outcome", async function () { + const deployer = Address.fromBech32("erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th"); + const contract = Address.fromBech32("erd1qqqqqqqqqqqqqpgqqacl85rd0gl2q8wggl8pwcyzcr4fflc5d8ssve45cj"); + const codeHash = Buffer.from("abba", "hex"); + + const parser = new SmartContractTransactionsOutcomeParser(); + const transactionsConverter = new TransactionsConverter(); + + const transactionOnNetwork = new TransactionOnNetwork({ + nonce: 7, + logs: new TransactionOnNetworkLogs({ + events: [ + new TransactionOnNetworkEvent({ + identifier: "SCDeploy", + topics: [ + new TransactionEventTopic(deployer.getPublicKey().toString("base64")), + new TransactionEventTopic(contract.getPublicKey().toString("base64")), + new TransactionEventTopic(codeHash.toString("base64")), + ], + }), + ], + }), + }); + + const transactionOutcome = transactionsConverter.transactionOnNetworkToOutcome(transactionOnNetwork); + const parsed = parser.parseDeploy({ transactionOutcome }); + + assert.equal(parsed.returnCode, "ok"); + assert.equal(parsed.returnMessage, "ok"); + assert.deepEqual(parsed.contracts, [ + { + address: contract.toBech32(), + ownerAddress: deployer.toBech32(), + codeHash: codeHash, }, ]); }); From d97cce82bd7bd77bf6642d44eae60275f7fefafa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20B=C4=83ncioiu?= Date: Thu, 28 Mar 2024 14:45:10 +0200 Subject: [PATCH 5/8] Fix tests. --- .../smartContractTransactionsOutcomeParser.spec.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/transactionsOutcomeParsers/smartContractTransactionsOutcomeParser.spec.ts b/src/transactionsOutcomeParsers/smartContractTransactionsOutcomeParser.spec.ts index 46d7085c..eeed8dde 100644 --- a/src/transactionsOutcomeParsers/smartContractTransactionsOutcomeParser.spec.ts +++ b/src/transactionsOutcomeParsers/smartContractTransactionsOutcomeParser.spec.ts @@ -16,8 +16,8 @@ import { SmartContractTransactionsOutcomeParser } from "./smartContractTransacti describe("test smart contract transactions outcome parser", () => { it("parses deploy outcome (minimalistic)", async function () { - const deployer = Address.fromBech32("erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th"); const contract = Address.fromBech32("erd1qqqqqqqqqqqqqpgqqacl85rd0gl2q8wggl8pwcyzcr4fflc5d8ssve45cj"); + const deployer = Address.fromBech32("erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th"); const codeHash = Buffer.from("abba", "hex"); const parser = new SmartContractTransactionsOutcomeParser(); @@ -51,8 +51,8 @@ describe("test smart contract transactions outcome parser", () => { }); it("parses deploy outcome", async function () { - const deployer = Address.fromBech32("erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th"); const contract = Address.fromBech32("erd1qqqqqqqqqqqqqpgqqacl85rd0gl2q8wggl8pwcyzcr4fflc5d8ssve45cj"); + const deployer = Address.fromBech32("erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th"); const codeHash = Buffer.from("abba", "hex"); const parser = new SmartContractTransactionsOutcomeParser(); @@ -65,13 +65,19 @@ describe("test smart contract transactions outcome parser", () => { new TransactionOnNetworkEvent({ identifier: "SCDeploy", topics: [ - new TransactionEventTopic(deployer.getPublicKey().toString("base64")), new TransactionEventTopic(contract.getPublicKey().toString("base64")), + new TransactionEventTopic(deployer.getPublicKey().toString("base64")), new TransactionEventTopic(codeHash.toString("base64")), ], }), ], }), + contractResults: new ContractResults([ + new ContractResultItem({ + nonce: 8, + data: "@6f6b", + }), + ]), }); const transactionOutcome = transactionsConverter.transactionOnNetworkToOutcome(transactionOnNetwork); From 4d6aa6ef3ecd609a79e254b5c00d7383f13c4731 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20B=C4=83ncioiu?= Date: Thu, 28 Mar 2024 14:45:40 +0200 Subject: [PATCH 6/8] Address constructor: accept Uint8Array, as well. --- src/address.spec.ts | 11 +++++++---- src/address.ts | 10 +++++----- .../smartContractTransactionsOutcomeParser.ts | 6 ++---- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/address.spec.ts b/src/address.spec.ts index ff1da62d..7acbd999 100644 --- a/src/address.spec.ts +++ b/src/address.spec.ts @@ -9,11 +9,14 @@ describe("test address", () => { let bobHex = "8049d639e5a6980d1cd2392abcce41029cda74a1563523a202f09641cc2618f8"; it("should create address", async () => { - let alice = new Address(aliceBech32); - let bob = new Address(bobBech32); + assert.equal(new Address(aliceBech32).toHex(), aliceHex); + assert.equal(new Address(bobBech32).toHex(), bobHex); + + assert.equal(new Address(Buffer.from(aliceHex, "hex")).toHex(), aliceHex); + assert.equal(new Address(Buffer.from(bobHex, "hex")).toHex(), bobHex); - assert.equal(alice.hex(), aliceHex); - assert.equal(bob.hex(), bobHex); + assert.equal(new Address(new Uint8Array(Buffer.from(aliceHex, "hex"))).toHex(), aliceHex); + assert.equal(new Address(new Uint8Array(Buffer.from(bobHex, "hex"))).toHex(), bobHex); }); it("should create empty address", async () => { diff --git a/src/address.ts b/src/address.ts index 051e8b00..e694c001 100644 --- a/src/address.ts +++ b/src/address.ts @@ -1,7 +1,7 @@ import * as bech32 from "bech32"; -import * as errors from "./errors"; -import { CURRENT_NUMBER_OF_SHARDS_WITHOUT_META, METACHAIN_ID, WasmVirtualMachine } from "./constants"; import BigNumber from "bignumber.js"; +import { CURRENT_NUMBER_OF_SHARDS_WITHOUT_META, METACHAIN_ID, WasmVirtualMachine } from "./constants"; +import * as errors from "./errors"; import { bigIntToBuffer } from "./tokenOperations/codec"; const createKeccakHash = require("keccak"); @@ -32,15 +32,15 @@ export class Address { /** * Creates an address object, given a raw string (whether a hex pubkey or a Bech32 address), a sequence of bytes, or another Address object. */ - public constructor(value: Address | Buffer | string) { + public constructor(value: Address | Buffer | Uint8Array | string) { if (!value) { return; } if (value instanceof Address) { return Address.fromAddress(value); } - if (value instanceof Buffer) { - return Address.fromBuffer(value); + if (ArrayBuffer.isView(value)) { + return Address.fromBuffer(Buffer.from(value)); } if (typeof value === "string") { return Address.fromString(value); diff --git a/src/transactionsOutcomeParsers/smartContractTransactionsOutcomeParser.ts b/src/transactionsOutcomeParsers/smartContractTransactionsOutcomeParser.ts index 72f612d4..7c240504 100644 --- a/src/transactionsOutcomeParsers/smartContractTransactionsOutcomeParser.ts +++ b/src/transactionsOutcomeParsers/smartContractTransactionsOutcomeParser.ts @@ -65,10 +65,8 @@ export class SmartContractTransactionsOutcomeParser { const topicForOwnerAddress = event.topics[1]; const topicForCodeHash = event.topics[2]; - const address = topicForAddress?.length ? Address.fromBuffer(Buffer.from(topicForAddress)).toBech32() : ""; - const ownerAddress = topicForOwnerAddress?.length - ? Address.fromBuffer(Buffer.from(topicForOwnerAddress)).toBech32() - : ""; + const address = topicForAddress?.length ? new Address(topicForAddress).toBech32() : ""; + const ownerAddress = topicForOwnerAddress?.length ? new Address(topicForOwnerAddress).toBech32() : ""; const codeHash = topicForCodeHash; return { From 7980fec45cd7696775384199b6c500b5c5dd845b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20B=C4=83ncioiu?= Date: Thu, 28 Mar 2024 15:59:32 +0200 Subject: [PATCH 7/8] Additional tests. --- src/converters/transactionsConverter.ts | 2 +- ...tContractTransactionsOutcomeParser.spec.ts | 30 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/converters/transactionsConverter.ts b/src/converters/transactionsConverter.ts index 04674071..2f0df281 100644 --- a/src/converters/transactionsConverter.ts +++ b/src/converters/transactionsConverter.ts @@ -117,7 +117,7 @@ export class TransactionsConverter { // Before Sirius, there was no "additionalData" field on transaction logs. // After Sirius, the "additionalData" field includes the payload of the legacy "data" field, as well (as its first element): // https://github.com/multiversx/mx-chain-go/blob/v1.6.18/process/transactionLog/process.go#L159 - const legacyData = eventOnNetwork.dataPayload?.valueOf() || Buffer.from([]); + const legacyData = eventOnNetwork.dataPayload?.valueOf() || Buffer.from(eventOnNetwork.data || ""); const dataItems = eventOnNetwork.additionalData?.map((data) => Buffer.from(data.valueOf())) || []; if (dataItems.length === 0) { diff --git a/src/transactionsOutcomeParsers/smartContractTransactionsOutcomeParser.spec.ts b/src/transactionsOutcomeParsers/smartContractTransactionsOutcomeParser.spec.ts index eeed8dde..8a187af4 100644 --- a/src/transactionsOutcomeParsers/smartContractTransactionsOutcomeParser.spec.ts +++ b/src/transactionsOutcomeParsers/smartContractTransactionsOutcomeParser.spec.ts @@ -94,6 +94,36 @@ describe("test smart contract transactions outcome parser", () => { ]); }); + it.only("parses deploy outcome (with error)", async function () { + const deployer = Address.fromBech32("erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th"); + + const parser = new SmartContractTransactionsOutcomeParser(); + const transactionsConverter = new TransactionsConverter(); + + const transactionOnNetwork = new TransactionOnNetwork({ + nonce: 7, + logs: new TransactionOnNetworkLogs({ + events: [ + new TransactionOnNetworkEvent({ + identifier: "signalError", + topics: [ + new TransactionEventTopic(deployer.getPublicKey().toString("base64")), + new TransactionEventTopic(Buffer.from("wrong number of arguments").toString("base64")), + ], + data: "@75736572206572726f72", + }), + ], + }), + }); + + const transactionOutcome = transactionsConverter.transactionOnNetworkToOutcome(transactionOnNetwork); + const parsed = parser.parseDeploy({ transactionOutcome }); + + assert.equal(parsed.returnCode, "user error"); + assert.equal(parsed.returnMessage, "wrong number of arguments"); + assert.deepEqual(parsed.contracts, []); + }); + it("parses execute outcome, without ABI (minimalistic)", function () { const parser = new SmartContractTransactionsOutcomeParser(); From 0932d36ac5f89b25f86c4dd0ed88c558f1f69ad3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20B=C4=83ncioiu?= Date: Thu, 28 Mar 2024 16:00:59 +0200 Subject: [PATCH 8/8] Undo "it.only()". --- .../smartContractTransactionsOutcomeParser.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/transactionsOutcomeParsers/smartContractTransactionsOutcomeParser.spec.ts b/src/transactionsOutcomeParsers/smartContractTransactionsOutcomeParser.spec.ts index 8a187af4..5bbcbdd5 100644 --- a/src/transactionsOutcomeParsers/smartContractTransactionsOutcomeParser.spec.ts +++ b/src/transactionsOutcomeParsers/smartContractTransactionsOutcomeParser.spec.ts @@ -94,7 +94,7 @@ describe("test smart contract transactions outcome parser", () => { ]); }); - it.only("parses deploy outcome (with error)", async function () { + it("parses deploy outcome (with error)", async function () { const deployer = Address.fromBech32("erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th"); const parser = new SmartContractTransactionsOutcomeParser();