Skip to content

Commit 545d741

Browse files
feat: index tx fees as native balance events
1 parent 3786850 commit 545d741

File tree

4 files changed

+30
-24
lines changed

4 files changed

+30
-24
lines changed

schema.graphql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ type Transaction @entity {
3131
block: Block!
3232
gasUsed: BigInt!
3333
gasWanted: BigInt!
34-
fees: String!
34+
fees: [Coin]!
3535
memo: String
3636
status: TxStatus!
3737
log: String!

src/mappings/mappingHandlers.ts

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ export async function handleTransaction(tx: CosmosTransaction): Promise<void> {
8888
gasWanted: BigInt(Math.trunc(tx.tx.gasWanted)),
8989
memo: tx.decodedTx.body.memo,
9090
timeoutHeight: BigInt(tx.decodedTx.body.timeoutHeight.toString()),
91-
fees: JSON.stringify(tx.decodedTx.authInfo.fee.amount),
91+
fees: tx.decodedTx.authInfo.fee.amount,
9292
log: tx.tx.log,
9393
status,
9494
signerAddress,
@@ -403,10 +403,7 @@ export async function handleNativeBalanceDecrement(event: CosmosEvent): Promise<
403403
for (const [i, spendEvent] of Object.entries(spendEvents)) {
404404
await saveNativeBalanceEvent(`${messageId(event)}-spend-${i}`, spendEvent.spender, spendEvent.amount, spendEvent.denom, event);
405405
}
406-
407-
const tx = event.tx.decodedTx;
408-
const fee = tx.authInfo.fee;
409-
await saveNativeBalanceEvent(`${messageId(event)}-fee`, fee.payer, BigInt(0) - BigInt(fee.amount[0].amount), fee.amount[0].denom, event);
406+
await saveNativeFeesEvent(event);
410407
}
411408

412409
export async function handleNativeBalanceIncrement(event: CosmosEvent): Promise<void> {
@@ -438,10 +435,7 @@ export async function handleNativeBalanceIncrement(event: CosmosEvent): Promise<
438435
for (const [i, receiveEvent] of Object.entries(receiveEvents)) {
439436
await saveNativeBalanceEvent(`${messageId(event)}-receive-${i}`, receiveEvent.receiver, receiveEvent.amount, receiveEvent.denom, event);
440437
}
441-
442-
const tx = event.tx.decodedTx;
443-
const fee = tx.authInfo.fee;
444-
await saveNativeBalanceEvent(`${messageId(event)}-fee`, fee.payer, BigInt(0) - BigInt(fee.amount[0].amount), fee.amount[0].denom, event);
438+
await saveNativeFeesEvent(event);
445439
}
446440

447441
async function checkBalancesAccount(address: string, chainId: string) {
@@ -466,6 +460,16 @@ async function saveNativeBalanceEvent(id: string, address: string, amount: BigIn
466460
await nativeBalanceChangeEntity.save()
467461
}
468462

463+
async function saveNativeFeesEvent(event: CosmosEvent) {
464+
let balanceChangeEvent = await NativeBalanceChange.get(`${event.tx.hash}-fee`)
465+
if (typeof(balanceChangeEvent) === "undefined") {
466+
const transaction = await Transaction.get(event.tx.hash);
467+
const fees = transaction.fees[0], signer = transaction.signerAddress;
468+
const amount = fees.amount, denom = fees.denom;
469+
await saveNativeBalanceEvent(`${event.tx.hash}-fee`, signer, BigInt(0) - BigInt(amount), denom, event);
470+
}
471+
}
472+
469473
export async function handleIBCTransfer(event: CosmosEvent): Promise<void> {
470474
const msg = event.msg;
471475
logger.info(`[handleIBCTransfer] (tx ${msg.tx.hash}): indexing message ${msg.idx + 1} / ${msg.tx.decodedTx.body.messages.length}`)

tests/e2e/entities/test_native_balances.py

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33
import unittest
44
from pathlib import Path
55

6+
from tests.helpers.entity_test import EntityTest
7+
from tests.helpers.field_enums import NativeBalanceChangeFields
8+
69
from gql import gql
710

811
repo_root_path = Path(__file__).parent.parent.parent.parent.absolute()
912
sys.path.insert(0, str(repo_root_path))
1013

11-
from tests.helpers.entity_test import EntityTest
12-
from tests.helpers.field_enums import NativeBalanceChangeFields
13-
1414

1515
class TestNativeBalances(EntityTest):
1616
@classmethod
@@ -21,7 +21,7 @@ def setUpClass(cls):
2121
tx = cls.ledger_client.send_tokens(cls.delegator_wallet.address(), 10*10**18, "atestfet", cls.validator_wallet)
2222
tx.wait_to_complete()
2323
cls.assertTrue(tx.response.is_successful(), "first set-up tx failed")
24-
24+
2525
tx = cls.ledger_client.send_tokens(cls.validator_wallet.address(), 3*10**18, "atestfet", cls.delegator_wallet)
2626
tx.wait_to_complete()
2727
cls.assertTrue(tx.response.is_successful(), "second set-up tx failed")
@@ -41,16 +41,17 @@ def test_account_balance_tracking_db(self):
4141
for event in events:
4242
self.assertTrue(
4343
(event[NativeBalanceChangeFields.account_id.value] == self.validator_wallet.address() or
44-
event[NativeBalanceChangeFields.account_id.value] == self.delegator_wallet.address())
44+
event[NativeBalanceChangeFields.account_id.value] == self.delegator_wallet.address())
4545
)
4646
self.assertNotEqual(int(event[NativeBalanceChangeFields.balance_offset.value]), 0)
4747
self.assertEqual(event[NativeBalanceChangeFields.denom.value], "atestfet")
48-
48+
4949
total[event[NativeBalanceChangeFields.account_id.value]] += event[NativeBalanceChangeFields.balance_offset.value]
5050

51-
self.assertEqual(total[self.validator_wallet.address()], -7*10**18)
52-
self.assertEqual(total[self.delegator_wallet.address()], 7*10**18)
53-
51+
# TODO: Represent variable fees in more robust way
52+
self.assertLessEqual(total[self.validator_wallet.address()], -7*10**18)
53+
self.assertLessEqual(total[self.delegator_wallet.address()], 7*10**18)
54+
5455
def test_account_balance_tracking_query(self):
5556
query = gql("""
5657
query {
@@ -64,7 +65,7 @@ def test_account_balance_tracking_query(self):
6465
}
6566
}
6667
""")
67-
68+
6869
result = self.gql_client.execute(query)
6970
validator_balance = 0
7071
delegator_balance = 0
@@ -76,9 +77,10 @@ def test_account_balance_tracking_query(self):
7677
delegator_balance += int(balance["sum"]["balanceOffset"])
7778
else:
7879
self.fail("couldn't find validator or delegator address in keys")
79-
80-
self.assertEqual(-7*10**18, validator_balance)
81-
self.assertEqual(7*10**18, delegator_balance)
80+
81+
self.assertLessEqual(-7*10**18, validator_balance)
82+
self.assertLessEqual(7*10**18, delegator_balance)
83+
8284

8385
if __name__ == '__main__':
8486
unittest.main()

tests/e2e/entities/test_native_primitives.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ def test_transactions(self):
101101
self.assertTrue(tx_signer_address == self.validator_address or
102102
tx_signer_address == self.delegator_address)
103103

104-
fees = json.loads(tx[TxFields.fees.value])
104+
fees = tx[TxFields.fees.value]
105105
self.assertEqual(len(fees), 1)
106106
self.assertEqual(fees[0]["denom"], self.denom)
107107
self.assertGreater(int(fees[0]["amount"]), 0)

0 commit comments

Comments
 (0)