Skip to content

Commit dcb94ae

Browse files
authored
Merge pull request #678 from multiversx/add-missing-parsers-delegation
Add missing parsers for delegation operations
2 parents b2d8b7e + 8e1bb5e commit dcb94ae

2 files changed

Lines changed: 122 additions & 0 deletions

File tree

src/delegation/delegationTransactionsOutcomeParser.spec.ts

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,4 +63,89 @@ describe("test delegation transactions outcome parser", () => {
6363
assert.lengthOf(outcome, 1);
6464
assert.equal(outcome[0].contractAddress, contractAddress.toBech32());
6565
});
66+
67+
it("should test parseClaimRewards ", () => {
68+
const encodedTopics = ["AvYUMPsrWw==", "ZmFsc2U=", "AAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAABD///8="];
69+
70+
const claimRewardsEvent = new TransactionEvent({
71+
address: new Address("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"),
72+
identifier: "claimRewards",
73+
topics: b64TopicsToBytes(encodedTopics),
74+
});
75+
76+
const logs = new TransactionLogs({ events: [claimRewardsEvent] });
77+
78+
const transaction = new TransactionOnNetwork({ logs: logs });
79+
80+
const outcome = parser.parseClaimRewards(transaction);
81+
82+
assert.lengthOf(outcome, 1);
83+
assert.equal(outcome[0].amount, 833516534967131n);
84+
});
85+
86+
it("should test parseDelegate ", () => {
87+
const encodedTopics = [
88+
"DeC2s6dkAAA=",
89+
"DeC2s6dkAAA=",
90+
"pg==",
91+
"Gasl6c5mNE7QJw==",
92+
"AAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAABn///8=",
93+
];
94+
95+
const delegateEvent = new TransactionEvent({
96+
address: new Address("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"),
97+
identifier: "delegate",
98+
topics: b64TopicsToBytes(encodedTopics),
99+
});
100+
101+
const logs = new TransactionLogs({ events: [delegateEvent] });
102+
const transaction = new TransactionOnNetwork({ logs: logs });
103+
104+
const outcome = parser.parseDelegate(transaction);
105+
106+
assert.lengthOf(outcome, 1);
107+
assert.equal(outcome[0].amount, 1000000000000000000n);
108+
});
109+
110+
it("should test parseUndelegate ", () => {
111+
const encodedTopics = ["DeC2s6dkAAA=", "DeC2s6dkAAA=", "", "irzOS6k1Z2fS", "ZnVuZA4="];
112+
113+
const undelegateEvent = new TransactionEvent({
114+
address: new Address("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"),
115+
identifier: "unDelegate",
116+
topics: b64TopicsToBytes(encodedTopics),
117+
});
118+
119+
const logs = new TransactionLogs({ events: [undelegateEvent] });
120+
const transaction = new TransactionOnNetwork({ logs: logs });
121+
122+
const outcome = parser.parseUndelegate(transaction);
123+
124+
assert.lengthOf(outcome, 1);
125+
assert.equal(outcome[0].amount, 1000000000000000000n);
126+
});
127+
128+
it("should test parseRedelegateRewards ", () => {
129+
const encodedTopics = [
130+
"BM+vfE0H7g==",
131+
"EVkZ9Arz3e4=",
132+
"Aw==",
133+
"iluVsi0Qb93u",
134+
"AAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAC3///8=",
135+
];
136+
137+
const redelegateRewardsEvent = new TransactionEvent({
138+
address: new Address("erd18s6a06ktr2v6fgxv4ffhauxvptssnaqlds45qgsrucemlwc8rawq553rt2"),
139+
identifier: "delegate",
140+
topics: b64TopicsToBytes(encodedTopics),
141+
});
142+
143+
const logs = new TransactionLogs({ events: [redelegateRewardsEvent] });
144+
const transaction = new TransactionOnNetwork({ logs: logs });
145+
146+
const outcome = parser.parseRedelegateRewards(transaction);
147+
148+
assert.lengthOf(outcome, 1);
149+
assert.equal(outcome[0].amount, 1354252518492142n);
150+
});
66151
});

src/delegation/delegationTransactionsOutcomeParser.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,34 @@ export class DelegationTransactionsOutcomeParser {
1515
return events.map((event) => ({ contractAddress: this.extractContractAddress(event) }));
1616
}
1717

18+
parseClaimRewards(transaction: TransactionOnNetwork): { amount: bigint }[] {
19+
this.ensureNoError(transaction.logs.events);
20+
21+
const events = findEventsByIdentifier(transaction, "claimRewards");
22+
23+
return events.map((event) => ({ amount: this.extractAmount(event) }));
24+
}
25+
26+
parseDelegate(transaction: TransactionOnNetwork): { amount: bigint }[] {
27+
this.ensureNoError(transaction.logs.events);
28+
29+
const events = findEventsByIdentifier(transaction, "delegate");
30+
31+
return events.map((event) => ({ amount: this.extractAmount(event) }));
32+
}
33+
34+
parseUndelegate(transaction: TransactionOnNetwork): { amount: bigint }[] {
35+
this.ensureNoError(transaction.logs.events);
36+
37+
const events = findEventsByIdentifier(transaction, "unDelegate");
38+
39+
return events.map((event) => ({ amount: this.extractAmount(event) }));
40+
}
41+
42+
parseRedelegateRewards(transaction: TransactionOnNetwork): { amount: bigint }[] {
43+
return this.parseDelegate(transaction);
44+
}
45+
1846
private ensureNoError(transactionEvents: TransactionEvent[]) {
1947
for (const event of transactionEvents) {
2048
if (event.identifier == "signalError") {
@@ -39,4 +67,13 @@ export class DelegationTransactionsOutcomeParser {
3967
private decodeTopicAsString(topic: Uint8Array): string {
4068
return Buffer.from(topic).toString();
4169
}
70+
71+
private extractAmount(event: TransactionEvent): bigint {
72+
if (!event.topics[0]?.length) {
73+
return 0n;
74+
}
75+
76+
const amount = Buffer.from(event.topics[0]);
77+
return BigInt("0x" + amount.toString("hex"));
78+
}
4279
}

0 commit comments

Comments
 (0)