diff --git a/src/delegation/delegationTransactionsOutcomeParser.spec.ts b/src/delegation/delegationTransactionsOutcomeParser.spec.ts index cd88c5ed..996c8a08 100644 --- a/src/delegation/delegationTransactionsOutcomeParser.spec.ts +++ b/src/delegation/delegationTransactionsOutcomeParser.spec.ts @@ -63,4 +63,89 @@ describe("test delegation transactions outcome parser", () => { assert.lengthOf(outcome, 1); assert.equal(outcome[0].contractAddress, contractAddress.toBech32()); }); + + it("should test parseClaimRewards ", () => { + const encodedTopics = ["AvYUMPsrWw==", "ZmFsc2U=", "AAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAABD///8="]; + + const claimRewardsEvent = new TransactionEvent({ + address: new Address("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"), + identifier: "claimRewards", + topics: b64TopicsToBytes(encodedTopics), + }); + + const logs = new TransactionLogs({ events: [claimRewardsEvent] }); + + const transaction = new TransactionOnNetwork({ logs: logs }); + + const outcome = parser.parseClaimRewards(transaction); + + assert.lengthOf(outcome, 1); + assert.equal(outcome[0].amount, 833516534967131n); + }); + + it("should test parseDelegate ", () => { + const encodedTopics = [ + "DeC2s6dkAAA=", + "DeC2s6dkAAA=", + "pg==", + "Gasl6c5mNE7QJw==", + "AAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAABn///8=", + ]; + + const delegateEvent = new TransactionEvent({ + address: new Address("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"), + identifier: "delegate", + topics: b64TopicsToBytes(encodedTopics), + }); + + const logs = new TransactionLogs({ events: [delegateEvent] }); + const transaction = new TransactionOnNetwork({ logs: logs }); + + const outcome = parser.parseDelegate(transaction); + + assert.lengthOf(outcome, 1); + assert.equal(outcome[0].amount, 1000000000000000000n); + }); + + it("should test parseUndelegate ", () => { + const encodedTopics = ["DeC2s6dkAAA=", "DeC2s6dkAAA=", "", "irzOS6k1Z2fS", "ZnVuZA4="]; + + const undelegateEvent = new TransactionEvent({ + address: new Address("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"), + identifier: "unDelegate", + topics: b64TopicsToBytes(encodedTopics), + }); + + const logs = new TransactionLogs({ events: [undelegateEvent] }); + const transaction = new TransactionOnNetwork({ logs: logs }); + + const outcome = parser.parseUndelegate(transaction); + + assert.lengthOf(outcome, 1); + assert.equal(outcome[0].amount, 1000000000000000000n); + }); + + it("should test parseRedelegateRewards ", () => { + const encodedTopics = [ + "BM+vfE0H7g==", + "EVkZ9Arz3e4=", + "Aw==", + "iluVsi0Qb93u", + "AAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAC3///8=", + ]; + + const redelegateRewardsEvent = new TransactionEvent({ + address: new Address("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"), + identifier: "delegate", + topics: b64TopicsToBytes(encodedTopics), + }); + + const logs = new TransactionLogs({ events: [redelegateRewardsEvent] }); + const transaction = new TransactionOnNetwork({ logs: logs }); + + const outcome = parser.parseRedelegateRewards(transaction); + + assert.lengthOf(outcome, 1); + assert.equal(outcome[0].amount, 1354252518492142n); + }); }); diff --git a/src/delegation/delegationTransactionsOutcomeParser.ts b/src/delegation/delegationTransactionsOutcomeParser.ts index 137a28f6..6cd7ab6d 100644 --- a/src/delegation/delegationTransactionsOutcomeParser.ts +++ b/src/delegation/delegationTransactionsOutcomeParser.ts @@ -15,6 +15,34 @@ export class DelegationTransactionsOutcomeParser { return events.map((event) => ({ contractAddress: this.extractContractAddress(event) })); } + parseClaimRewards(transaction: TransactionOnNetwork): { amount: bigint }[] { + this.ensureNoError(transaction.logs.events); + + const events = findEventsByIdentifier(transaction, "claimRewards"); + + return events.map((event) => ({ amount: this.extractAmount(event) })); + } + + parseDelegate(transaction: TransactionOnNetwork): { amount: bigint }[] { + this.ensureNoError(transaction.logs.events); + + const events = findEventsByIdentifier(transaction, "delegate"); + + return events.map((event) => ({ amount: this.extractAmount(event) })); + } + + parseUndelegate(transaction: TransactionOnNetwork): { amount: bigint }[] { + this.ensureNoError(transaction.logs.events); + + const events = findEventsByIdentifier(transaction, "unDelegate"); + + return events.map((event) => ({ amount: this.extractAmount(event) })); + } + + parseRedelegateRewards(transaction: TransactionOnNetwork): { amount: bigint }[] { + return this.parseDelegate(transaction); + } + private ensureNoError(transactionEvents: TransactionEvent[]) { for (const event of transactionEvents) { if (event.identifier == "signalError") { @@ -39,4 +67,13 @@ export class DelegationTransactionsOutcomeParser { private decodeTopicAsString(topic: Uint8Array): string { return Buffer.from(topic).toString(); } + + private extractAmount(event: TransactionEvent): bigint { + if (!event.topics[0]?.length) { + return 0n; + } + + const amount = Buffer.from(event.topics[0]); + return BigInt("0x" + amount.toString("hex")); + } }