Skip to content

Commit 4be881b

Browse files
authored
Merge pull request #357 from hack-a-chain-software/balances-backfill
refactor: improved balances backfill; normalized the gas price format in the database to a decimal to ensure consistency
2 parents e4eed41 + 4726a5e commit 4be881b

File tree

11 files changed

+275
-347
lines changed

11 files changed

+275
-347
lines changed
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
package process
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
"go-backfill/repository"
7+
)
8+
9+
// PrepareFungibleBalancesData processes regular token transfers to prepare fungible balance data
10+
func PrepareFungibleBalancesData(transfers []repository.TransferAttributes) []repository.BalanceAttributes {
11+
// Pre-allocate with estimated size (2 balances per transfer)
12+
balances := make([]repository.BalanceAttributes, 0, len(transfers)*2)
13+
14+
// Process transfers
15+
for _, transfer := range transfers {
16+
17+
// Add from account if not empty
18+
if transfer.FromAcct != "" {
19+
balances = append(balances, repository.BalanceAttributes{
20+
ChainId: transfer.ChainId,
21+
Account: transfer.FromAcct,
22+
Module: transfer.ModuleName,
23+
HasTokenId: transfer.HasTokenId,
24+
TokenId: stringValueOrEmpty(transfer.TokenId),
25+
})
26+
}
27+
28+
// Add to account if not empty
29+
if transfer.ToAcct != "" {
30+
balances = append(balances, repository.BalanceAttributes{
31+
ChainId: transfer.ChainId,
32+
Account: transfer.ToAcct,
33+
Module: transfer.ModuleName,
34+
HasTokenId: transfer.HasTokenId,
35+
TokenId: stringValueOrEmpty(transfer.TokenId),
36+
})
37+
}
38+
}
39+
40+
return balances
41+
}
42+
43+
// PrepareNonFungibleBalancesData processes Marmalade events to prepare NFT balance data
44+
func PrepareNonFungibleBalancesData(events []repository.EventAttributes) ([]repository.BalanceAttributes, error) {
45+
// Pre-allocate with estimated size (1 balance per mint/transfer event)
46+
balances := make([]repository.BalanceAttributes, 0, len(events))
47+
48+
// Process mint and transfer events for Marmalade NFTs
49+
for _, event := range events {
50+
var isMarmaladeEvent = event.Module == "marmalade-v2.ledger" || event.Module == "marmalade.ledger"
51+
var isMarmaladeTransferEvent = event.Name == "TRANSFER"
52+
var isMarmaladeMintEvent = event.Name == "MINT"
53+
if isMarmaladeEvent && (isMarmaladeTransferEvent || isMarmaladeMintEvent) {
54+
var params []interface{}
55+
if err := json.Unmarshal(event.Params, &params); err != nil {
56+
return []repository.BalanceAttributes{}, fmt.Errorf("unmarshaling params for event %s: %w", event.RequestKey, err)
57+
}
58+
59+
switch event.Name {
60+
case "MINT":
61+
if len(params) < 2 {
62+
continue // Skip if we don't have enough params
63+
}
64+
tokenId, ok1 := params[0].(string)
65+
account, ok2 := params[1].(string)
66+
if !ok1 || !ok2 {
67+
continue
68+
}
69+
balances = append(balances, repository.BalanceAttributes{
70+
ChainId: event.ChainId,
71+
TokenId: tokenId,
72+
Account: account,
73+
Module: event.Module,
74+
HasTokenId: true,
75+
})
76+
case "TRANSFER":
77+
if len(params) < 3 {
78+
continue // Skip if we don't have enough params
79+
}
80+
tokenId, ok1 := params[0].(string)
81+
recipient, ok2 := params[2].(string)
82+
if !ok1 || !ok2 {
83+
continue
84+
}
85+
balances = append(balances, repository.BalanceAttributes{
86+
ChainId: event.ChainId,
87+
TokenId: tokenId,
88+
Account: recipient, // params[2] is the recipient account
89+
Module: event.Module,
90+
HasTokenId: true,
91+
})
92+
}
93+
}
94+
}
95+
96+
return balances, nil
97+
}
98+
99+
func stringValueOrEmpty(s *string) string {
100+
if s == nil {
101+
return ""
102+
}
103+
return *s
104+
}

backfill/process/process_guards.go

Lines changed: 0 additions & 155 deletions
This file was deleted.

backfill/process/save_payloads.go

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@ type Counters struct {
1616
Events int
1717
Transfers int
1818
Signers int
19+
Balances int
1920
}
2021

2122
type DataSizeTracker struct {
2223
TransactionsKB int
2324
EventsKB int
2425
TransfersKB int
2526
SignersKB int
27+
BalancesKB int
2628
}
2729

2830
func savePayloads(network string, chainId int, processedPayloads []fetch.ProcessedPayload, pool *pgxpool.Pool) (Counters, DataSizeTracker, error) {
@@ -33,13 +35,15 @@ func savePayloads(network string, chainId int, processedPayloads []fetch.Process
3335
Events: 0,
3436
Transfers: 0,
3537
Signers: 0,
38+
Balances: 0,
3639
}
3740

3841
dataSizeTracker := DataSizeTracker{
3942
TransactionsKB: 0,
4043
EventsKB: 0,
4144
TransfersKB: 0,
4245
SignersKB: 0,
46+
BalancesKB: 0,
4347
}
4448

4549
conn, err := pool.Acquire(context.Background())
@@ -100,6 +104,18 @@ func savePayloads(network string, chainId int, processedPayloads []fetch.Process
100104
return Counters{}, DataSizeTracker{}, fmt.Errorf("saving events -> %w", err)
101105
}
102106

107+
balances, err := PrepareNonFungibleBalancesData(events)
108+
if err != nil {
109+
return Counters{}, DataSizeTracker{}, fmt.Errorf("preparing non fungible balances -> %w", err)
110+
}
111+
if err := repository.SaveBalancesToDatabase(balances, tx); err != nil {
112+
return Counters{}, DataSizeTracker{}, fmt.Errorf("saving non fungible balances: %w", err)
113+
}
114+
115+
balancesSize := approximateSize(balances)
116+
dataSizeTracker.BalancesKB += balancesSize
117+
counters.Balances += len(balances)
118+
103119
size := approximateSize(events)
104120
dataSizeTracker.EventsKB += size
105121
counters.Events += len(events)
@@ -114,6 +130,15 @@ func savePayloads(network string, chainId int, processedPayloads []fetch.Process
114130
return Counters{}, DataSizeTracker{}, fmt.Errorf("saving transfers: %w", err)
115131
}
116132

133+
balances := PrepareFungibleBalancesData(transfers)
134+
if err := repository.SaveBalancesToDatabase(balances, tx); err != nil {
135+
return Counters{}, DataSizeTracker{}, fmt.Errorf("saving fungible balances: %w", err)
136+
}
137+
138+
balancesSize := approximateSize(balances)
139+
dataSizeTracker.BalancesKB += balancesSize
140+
counters.Balances += len(balances)
141+
117142
size := approximateSize(transfers)
118143
dataSizeTracker.TransfersKB += size
119144
counters.Transfers += len(transfers)
@@ -130,20 +155,6 @@ func savePayloads(network string, chainId int, processedPayloads []fetch.Process
130155
counters.Signers += len(signers)
131156
}
132157

133-
// for _, processedPayload := range processedPayloads {
134-
// guards, err := PrepareGuards(processedPayload)
135-
// if err != nil {
136-
// return Counters{}, DataSizeTracker{}, fmt.Errorf("preparing guards -> %w", err)
137-
// }
138-
// if err := repository.SaveGuardsToDatabase(guards, tx); err != nil {
139-
// return Counters{}, DataSizeTracker{}, fmt.Errorf("saving guards -> %w", err)
140-
// }
141-
142-
// size := approximateSize(guards)
143-
// dataSizeTracker.GuardsKB += size
144-
// counters.Guards += len(guards)
145-
// }
146-
147158
log.Printf("Saved payloads in %fs\n", time.Since(startTime).Seconds())
148159

149160
commitStartTime := time.Now()
@@ -156,6 +167,7 @@ func savePayloads(network string, chainId int, processedPayloads []fetch.Process
156167
dataSizeTracker.EventsKB /= 1024
157168
dataSizeTracker.TransfersKB /= 1024
158169
dataSizeTracker.SignersKB /= 1024
170+
dataSizeTracker.BalancesKB /= 1024
159171

160172
return counters, dataSizeTracker, nil
161173
}

0 commit comments

Comments
 (0)