Skip to content

Commit d3b7a86

Browse files
committed
fix: skip blocks for finality
1 parent 771627a commit d3b7a86

File tree

12 files changed

+145
-34
lines changed

12 files changed

+145
-34
lines changed

ds/account_quota.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,17 @@ func NewAccountQuotaMgr(client core.ClientI) *AccountQuotaMgr {
4141
}
4242
}
4343

44-
func (mdl *AccountQuotaMgr) GetUpdateQuotaEventForAccount(txHash common.Hash) []*UpdateQuotaEvent {
44+
func (mdl *AccountQuotaMgr) GetUpdateQuotaEventForAccount(txHash common.Hash) map[common.Address][]*UpdateQuotaEvent {
4545
mdl.mu.Lock()
4646
defer mdl.mu.Unlock()
4747
//
4848
ans := mdl.events[txHash.Hex()]
4949
delete(mdl.events, txHash.Hex())
50-
return ans
50+
accountToQuotas := map[common.Address][]*UpdateQuotaEvent{}
51+
for _, entry := range ans {
52+
accountToQuotas[entry.CreditAccount] = append(accountToQuotas[entry.CreditAccount], entry)
53+
}
54+
return accountToQuotas
5155
}
5256

5357
func (mdl *AccountQuotaMgr) getUpdateQuotaEvent(txLog types.Log) *UpdateQuotaEvent {

ds/multicall_processor/index.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,11 @@ func (v *FacadeAccountAction) SetMulticalls(ops []*schemas.AccountOperation) {
4545

4646
type MulticallProcessorI interface {
4747
AddMulticallEvent(operation *schemas.AccountOperation)
48-
Start(txHash string, startEvent *schemas.AccountOperation)
48+
Start(txHash string, startEvent *schemas.AccountOperation, _ string)
4949
AddOpenEvent(openEvent *schemas.AccountOperation)
5050
AddCloseEvent(event *schemas.AccountOperation)
5151
AddLiquidateEvent(event *schemas.AccountOperation)
5252
PopNonMulticallEvents() []*schemas.AccountOperation
5353
PopMainActions(txHash string, mgr *ds.AccountQuotaMgr) (facadeActions, openEventWithoutMulticall []*FacadeAccountAction)
54-
End(logId uint, debts []pool_v3.ManageDebt, _ string)
54+
End(logId uint, debts []pool_v3.ManageDebt, _, _ string)
5555
}

ds/multicall_processor/multicall_processor_v2.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ func (p *MultiCallProcessorv2) lastMainAction() *FacadeAccountAction {
5858
return nil
5959
}
6060

61-
func (p *MultiCallProcessorv2) Start(txHash string, startEvent *schemas.AccountOperation) {
61+
func (p *MultiCallProcessorv2) Start(txHash string, startEvent *schemas.AccountOperation, _ string) {
6262
lastMainAction := p.lastMainAction()
6363
if p.running {
6464
log.Fatalf("Previously started multicall(%s) is not ended for txHash(%s)",
@@ -86,7 +86,7 @@ func (p *MultiCallProcessorv2) AddLiquidateEvent(event *schemas.AccountOperation
8686
})
8787
}
8888

89-
func (p *MultiCallProcessorv2) End(logId uint, _ []pool_v3.ManageDebt, _ string) {
89+
func (p *MultiCallProcessorv2) End(logId uint, _ []pool_v3.ManageDebt, _ string, _ string) {
9090
if !p.running {
9191
log.Fatal("Multicall end called though multicall not running")
9292
}

ds/multicall_processor/multicall_processor_v3.go

Lines changed: 112 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import (
1414
"github.com/ethereum/go-ethereum/common"
1515
)
1616

17-
type MultiCallProcessorv3 struct {
17+
type MultiCallProcessorv3Unit struct {
1818
// borrower string
1919
running bool // is the multicall running
2020
nonMultiCallEvents []*schemas.AccountOperation
@@ -23,7 +23,7 @@ type MultiCallProcessorv3 struct {
2323
}
2424

2525
// edge case it adds non multicall addCollateral for open credit account
26-
func (p *MultiCallProcessorv3) AddMulticallEvent(operation *schemas.AccountOperation) {
26+
func (p *MultiCallProcessorv3Unit) AddMulticallEvent(operation *schemas.AccountOperation) {
2727
lastMainAction := p.lastMainAction()
2828
//
2929
if !p.running { // non multicall
@@ -33,7 +33,7 @@ func (p *MultiCallProcessorv3) AddMulticallEvent(operation *schemas.AccountOpera
3333
}
3434
}
3535

36-
func (p *MultiCallProcessorv3) AddOpenEvent(openEvent *schemas.AccountOperation) {
36+
func (p *MultiCallProcessorv3Unit) AddOpenEvent(openEvent *schemas.AccountOperation) {
3737
if p.noOfOpens > 0 {
3838
log.Fatal("2 opencreditaccount event are in same txhash", utils.ToJson(p.facadeActions), utils.ToJson(openEvent))
3939
}
@@ -44,14 +44,14 @@ func (p *MultiCallProcessorv3) AddOpenEvent(openEvent *schemas.AccountOperation)
4444
p.noOfOpens++
4545
}
4646

47-
func (p *MultiCallProcessorv3) lastMainAction() *FacadeAccountAction {
47+
func (p *MultiCallProcessorv3Unit) lastMainAction() *FacadeAccountAction {
4848
if len(p.facadeActions) > 0 {
4949
return p.facadeActions[len(p.facadeActions)-1]
5050
}
5151
return nil
5252
}
5353

54-
func (p *MultiCallProcessorv3) Start(txHash string, startEvent *schemas.AccountOperation) {
54+
func (p *MultiCallProcessorv3Unit) Start(txHash string, startEvent *schemas.AccountOperation) {
5555
lastMainAction := p.lastMainAction()
5656
if p.running {
5757
log.Fatalf("Previously started multicall(%s) is not ended for txHash(%s)",
@@ -66,22 +66,22 @@ func (p *MultiCallProcessorv3) Start(txHash string, startEvent *schemas.AccountO
6666
p.running = true
6767
}
6868

69-
func (p *MultiCallProcessorv3) AddCloseEvent(event *schemas.AccountOperation) {
69+
func (p *MultiCallProcessorv3Unit) AddCloseEvent(event *schemas.AccountOperation) {
7070
p.facadeActions = append(p.facadeActions, &FacadeAccountAction{
7171
Data: event,
7272
ended: true,
7373
Type: GBFacadeCloseEvent,
7474
})
7575
}
76-
func (p *MultiCallProcessorv3) AddLiquidateEvent(event *schemas.AccountOperation) {
76+
func (p *MultiCallProcessorv3Unit) AddLiquidateEvent(event *schemas.AccountOperation) {
7777
p.facadeActions = append(p.facadeActions, &FacadeAccountAction{
7878
Data: event,
7979
Type: GBFacadev3LiqUpdateEvent,
8080
ended: true,
8181
})
8282
}
8383

84-
func (p *MultiCallProcessorv3) End(logId uint, debts []pool_v3.ManageDebt, underlying string) {
84+
func (p *MultiCallProcessorv3Unit) End(logId uint, debts []pool_v3.ManageDebt, underlying string) {
8585
if !p.running {
8686
log.Fatal("Multicall end called though multicall not running")
8787
}
@@ -133,7 +133,7 @@ func AddManageDebtsToMain(lastMainAction *schemas.AccountOperation, debts []pool
133133
// - open call without multicalls
134134
// open call have the multicalls in them
135135
// liquidated, closed and directly multicalls are separated entries
136-
func (p *MultiCallProcessorv3) PopMainActions(txHash string, mgr *ds.AccountQuotaMgr) (facadeActions, openEventWithoutMulticall []*FacadeAccountAction) {
136+
func (p *MultiCallProcessorv3Unit) popMainActions(txHash string, quotas []*ds.UpdateQuotaEvent, mgr *ds.AccountQuotaMgr) (facadeActions, openEventWithoutMulticall []*FacadeAccountAction) {
137137
defer func() { p.facadeActions = nil }()
138138

139139
p.noOfOpens = 0
@@ -142,7 +142,6 @@ func (p *MultiCallProcessorv3) PopMainActions(txHash string, mgr *ds.AccountQuot
142142
}
143143

144144
{
145-
quotas := mgr.GetUpdateQuotaEventForAccount(common.HexToHash(txHash))
146145
// update quota with session based on accountquotamgr
147146
for i := len(facadeActions) - 1; i >= 0; i-- {
148147
facade := facadeActions[i]
@@ -164,7 +163,7 @@ func (p *MultiCallProcessorv3) PopMainActions(txHash string, mgr *ds.AccountQuot
164163
return
165164
}
166165

167-
func (p *MultiCallProcessorv3) PopNonMulticallEvents() []*schemas.AccountOperation {
166+
func (p *MultiCallProcessorv3Unit) PopNonMulticallEvents() []*schemas.AccountOperation {
168167
calls := p.nonMultiCallEvents
169168
p.nonMultiCallEvents = nil
170169
return calls
@@ -191,3 +190,105 @@ func addQuotasToFacade(action *FacadeAccountAction, quotaEvents []*ds.UpdateQuot
191190
return action.Data.MultiCall[i].LogId < action.Data.MultiCall[j].LogId
192191
})
193192
}
193+
194+
type MultiCallProcessorv3 struct {
195+
units map[string]*MultiCallProcessorv3Unit
196+
facadeAddrToSession map[string]string
197+
}
198+
199+
func NewMultiCallProcessorv3() *MultiCallProcessorv3 {
200+
return &MultiCallProcessorv3{
201+
units: make(map[string]*MultiCallProcessorv3Unit),
202+
facadeAddrToSession: map[string]string{},
203+
}
204+
}
205+
206+
func (p *MultiCallProcessorv3) check(operation *schemas.AccountOperation) {
207+
if operation.SessionId == "" {
208+
log.Fatal("Multicall event without sessionid", utils.ToJson(operation))
209+
}
210+
}
211+
func (p *MultiCallProcessorv3) AddMulticallEvent(operation *schemas.AccountOperation) {
212+
p.check(operation)
213+
unit, exists := p.units[operation.SessionId]
214+
if !exists {
215+
unit = &MultiCallProcessorv3Unit{}
216+
p.units[operation.SessionId] = unit
217+
}
218+
unit.AddMulticallEvent(operation)
219+
}
220+
func (p *MultiCallProcessorv3) Start(txHash string, startEvent *schemas.AccountOperation, facadeAddr string) {
221+
p.check(startEvent)
222+
unit, exists := p.units[startEvent.SessionId]
223+
if !exists {
224+
unit = &MultiCallProcessorv3Unit{}
225+
p.units[startEvent.SessionId] = unit
226+
}
227+
if _, ok := p.facadeAddrToSession[facadeAddr]; ok {
228+
log.Fatal("Two multicalls started for same facade in same txhash without ending previous one", facadeAddr, p.facadeAddrToSession[facadeAddr], startEvent.SessionId, txHash)
229+
} else {
230+
p.facadeAddrToSession[facadeAddr] = startEvent.SessionId
231+
}
232+
unit.Start(txHash, startEvent)
233+
}
234+
func (p *MultiCallProcessorv3) AddOpenEvent(openEvent *schemas.AccountOperation) {
235+
p.check(openEvent)
236+
unit, exists := p.units[openEvent.SessionId]
237+
if !exists {
238+
unit = &MultiCallProcessorv3Unit{}
239+
p.units[openEvent.SessionId] = unit
240+
}
241+
unit.AddOpenEvent(openEvent)
242+
}
243+
func (p *MultiCallProcessorv3) AddCloseEvent(event *schemas.AccountOperation) {
244+
p.check(event)
245+
unit, exists := p.units[event.SessionId]
246+
if !exists {
247+
unit = &MultiCallProcessorv3Unit{}
248+
p.units[event.SessionId] = unit
249+
}
250+
unit.AddCloseEvent(event)
251+
}
252+
func (p *MultiCallProcessorv3) AddLiquidateEvent(event *schemas.AccountOperation) {
253+
p.check(event)
254+
unit, exists := p.units[event.SessionId]
255+
if !exists {
256+
unit = &MultiCallProcessorv3Unit{}
257+
p.units[event.SessionId] = unit
258+
}
259+
unit.AddLiquidateEvent(event)
260+
}
261+
func (p *MultiCallProcessorv3) PopNonMulticallEvents() []*schemas.AccountOperation {
262+
var calls []*schemas.AccountOperation
263+
for _, unit := range p.units {
264+
calls = append(calls, unit.PopNonMulticallEvents()...)
265+
}
266+
return calls
267+
}
268+
func (p *MultiCallProcessorv3) PopMainActions(txHash string, mgr *ds.AccountQuotaMgr) (facadeActions, openEventWithoutMulticall []*FacadeAccountAction) {
269+
quotas := mgr.GetUpdateQuotaEventForAccount(common.HexToHash(txHash))
270+
for sessionId, unit := range p.units {
271+
facade, openWithoutMC := unit.popMainActions(txHash, quotas[common.HexToAddress(strings.Split(sessionId, "_")[0])], mgr)
272+
facadeActions = append(facadeActions, facade...)
273+
openEventWithoutMulticall = append(openEventWithoutMulticall, openWithoutMC...)
274+
}
275+
p.units = make(map[string]*MultiCallProcessorv3Unit)
276+
if len(p.facadeAddrToSession) != 0 {
277+
log.Fatal("facadeAddrToSession not empty after popping main actions", utils.ToJson(p.facadeAddrToSession))
278+
}
279+
return
280+
281+
}
282+
func (p *MultiCallProcessorv3) End(logId uint, debts []pool_v3.ManageDebt, underlyingtoken string, facadeAddr string) {
283+
sessionId, ok := p.facadeAddrToSession[facadeAddr]
284+
if !ok {
285+
log.Fatal("Multicall end called though no multicall was started for facadeAddr", facadeAddr)
286+
}
287+
delete(p.facadeAddrToSession, facadeAddr)
288+
//
289+
unit, exists := p.units[sessionId]
290+
if !exists {
291+
log.Fatal("Multicall end called though no multicall was started for sessionid", sessionId)
292+
}
293+
unit.End(logId, debts, underlyingtoken)
294+
}

engine/index.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,10 @@ func (e *Engine) getLastSyncedTill() int64 {
108108

109109
func (e *Engine) SyncHandler() {
110110
e.init()
111-
latestBlockNum := e.GetLatestFinalizedBlock(2)
112-
// latestBlockNum = 50768558
111+
blocksToSkipForfinality := core.BlockPer(core.GetBaseChainId(e.Client), time.Minute) / 2
112+
latestBlockNum := e.GetLatestFinalizedBlock(blocksToSkipForfinality)
113+
// latestBlockNum = 23624143
114+
113115
lastSyncedTill := e.getLastSyncedTill()
114116
e.syncedBlock.Store(lastSyncedTill)
115117
//
@@ -120,7 +122,8 @@ func (e *Engine) SyncHandler() {
120122
}
121123
for {
122124
latestBlockNum = e.GetLatestFinalizedBlock(2)
123-
// latestBlockNum = 50768558
125+
// latestBlockNum = 23624143
126+
124127
e.SyncAndFlush(latestBlockNum)
125128
log.Infof("Synced till %d sleeping for 2 mins", latestBlockNum)
126129
time.Sleep(2 * time.Minute) // on kovan 5 blocks in 1 min , sleep for 5 mins

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ go 1.23
55
// toolchain go1.23.2
66

77
require (
8-
github.com/Gearbox-protocol/sdk-go v0.0.0-20251015055252-92dd2d7b6903
8+
github.com/Gearbox-protocol/sdk-go v0.0.0-20251021075349-8001f420e823
99
github.com/ethereum/go-ethereum v1.13.14
1010
github.com/go-playground/validator/v10 v10.4.1
1111
github.com/google/go-cmp v0.6.0

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ
66
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
77
github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ=
88
github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo=
9-
github.com/Gearbox-protocol/sdk-go v0.0.0-20251015055252-92dd2d7b6903 h1:TO4Acste+rQEX0Nynfr6RVxNqwWjlpGM7aoV1bcDrxc=
10-
github.com/Gearbox-protocol/sdk-go v0.0.0-20251015055252-92dd2d7b6903/go.mod h1:MZsiiSAwDdnHY6GEILYtHEqhb9wmbUUE34UBQgNlUyM=
9+
github.com/Gearbox-protocol/sdk-go v0.0.0-20251021075349-8001f420e823 h1:5yuKbokqIr7EZGMoSaJs7lGyTxQIyW62AkKxpClwx+4=
10+
github.com/Gearbox-protocol/sdk-go v0.0.0-20251021075349-8001f420e823/go.mod h1:MZsiiSAwDdnHY6GEILYtHEqhb9wmbUUE34UBQgNlUyM=
1111
github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow=
1212
github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
1313
github.com/OffchainLabs/go-ethereum v1.13.4-0.20240313010929-e5d8587e7227 h1:+/3TrD+q+BP36jGj2Bycdmrc/joKLNbc5ImePQzKRLM=

models/credit_manager/cm_common/facade_actions.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,14 @@ func (mdl *CommonCMAdapter) fixFacadeActionStructureViaTenderlyCalls(mainCalls [
2222
facadeActions []*mpi.FacadeAccountAction) (result []*mpi.FacadeAccountAction) { // facadeEvents from rpc, mainCalls from tenderly
2323
if len(mainCalls) > len(facadeActions) {
2424

25-
log.Warn(utils.ToJson(mainCalls) , utils.ToJson(facadeActions))
26-
log.Warnf("Len of calls(%d) can't be more than separated close/liquidate and multicall(%d).",
25+
log.Warn(utils.ToJson(mainCalls), utils.ToJson(facadeActions))
26+
log.Warnf("Len of calls(%d) can't be more than separated close/liquidate and multicall(%d).",
2727
len(mainCalls), len(facadeActions),
2828
)
2929
if "0x6355aa8c94e2db37e99bb6702dd66ef189d1d356cc3149081be247f72f526c8d" == facadeActions[0].Data.TxHash {
3030
//mainCalls = []*ds.FacadeCallNameWithMulticall{mainCalls[1]}
31-
}}
31+
}
32+
}
3233
//
3334
var ind int
3435
for _, mainCall := range mainCalls[:utils.Min(len(facadeActions), len(mainCalls))] { // TOOD fix
@@ -75,7 +76,6 @@ func (mdl *CommonCMAdapter) validateAndSaveFacadeActions(version core.VersionTyp
7576
facadeActions []*mpi.FacadeAccountAction,
7677
mainCalls []*ds.FacadeCallNameWithMulticall,
7778
nonMultiCallExecuteEvents []ds.ExecuteParams) {
78-
7979
executeParams := []ds.ExecuteParams{} // non multicall and multicall execute orders for a tx to be compared with call trace
8080
for ind, _mainAction := range facadeActions {
8181
mainEvent := _mainAction.Data

models/credit_manager/cm_v2/v2.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,9 @@ func (mdl *CMv2) checkLogV2(txLog types.Log) {
7676
Dapp: txLog.Address.Hex(),
7777
LogId: txLog.Index,
7878
Action: "MultiCallStarted(address)",
79-
})
79+
}, mdl.Address) // facade addr
8080
case core.Topic("MultiCallFinished()"):
81-
mdl.MulticallMgr.End(txLog.Index, nil, mdl.GetUnderlyingToken())
81+
mdl.MulticallMgr.End(txLog.Index, nil, mdl.GetUnderlyingToken(), mdl.Address)
8282
case core.Topic("IncreaseBorrowedAmount(address,uint256)"):
8383
increaseBorrowEvent, err := mdl.facadeContractv2.ParseIncreaseBorrowedAmount(txLog)
8484
if err != nil {

models/credit_manager/cm_v3/cm_state.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ type Cmv3State struct {
2525

2626
func NewCmv3State(adapter *ds.SyncAdapter) Cmv3State {
2727
return Cmv3State{
28-
CommonCMAdapter: cm_common.NewCommonCMAdapter(adapter, &mp.MultiCallProcessorv3{}),
28+
CommonCMAdapter: cm_common.NewCommonCMAdapter(adapter, mp.NewMultiCallProcessorv3()),
2929
allowedProtocols: map[string]bool{},
3030
whosAccount: map[string]AccountOwner{},
3131
}

0 commit comments

Comments
 (0)