Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
85 changes: 85 additions & 0 deletions src/delegation/delegationTransactionsOutcomeParser.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);
});
});
37 changes: 37 additions & 0 deletions src/delegation/delegationTransactionsOutcomeParser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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") {
Expand All @@ -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"));
}
}
Loading