From 6ef7323e74ce3b6bc098eb8d04f3ae1740354da9 Mon Sep 17 00:00:00 2001 From: 5lliot Date: Thu, 7 Dec 2023 01:51:06 +0700 Subject: [PATCH] fix: updatedQuota events can be less than the number of calls --- ds/account_quota.go | 19 ++++---- .../cm_common/facade_actions.go | 43 +++++++++++-------- 2 files changed, 34 insertions(+), 28 deletions(-) diff --git a/ds/account_quota.go b/ds/account_quota.go index 00675dcd..813b7c0a 100644 --- a/ds/account_quota.go +++ b/ds/account_quota.go @@ -16,6 +16,7 @@ import ( type AccountQuotaMgr struct { mu sync.Mutex // so that credit manager can create latest quota update event + // account+ txHash events map[string][]*updateQuotaEvent contract *poolQuotaKeeperv3.PoolQuotaKeeperv3 } @@ -40,17 +41,14 @@ func NewAccountQuotaMgr(client core.ClientI) *AccountQuotaMgr { } } -func (mdl *AccountQuotaMgr) GetUpdateQuotaEventForAccount(account string) *updateQuotaEvent { +func (mdl *AccountQuotaMgr) GetUpdateQuotaEventForAccount(txHash common.Hash, account string) []*updateQuotaEvent { mdl.mu.Lock() defer mdl.mu.Unlock() - l := len(mdl.events[account]) - if l == 0 { - return nil - } else { - front := mdl.events[account][0] - mdl.events[account] = mdl.events[account][1:] - return front - } + key := account + txHash.Hex() + // + ans := mdl.events[key] + delete(mdl.events, key) + return ans } func (mdl *AccountQuotaMgr) getUpdateQuotaEvent(txLog types.Log) *updateQuotaEvent { @@ -72,7 +70,8 @@ func (mdl *AccountQuotaMgr) AddAccountQuota(blockNum int64, // updateQuota := mdl.getUpdateQuotaEvent(txLog) account := updateQuota.CreditAccount.Hex() - mdl.events[account] = append(mdl.events[account], updateQuota) + key := account + txLog.TxHash.Hex() + mdl.events[key] = append(mdl.events[key], updateQuota) } // utils diff --git a/models/credit_manager/cm_common/facade_actions.go b/models/credit_manager/cm_common/facade_actions.go index da2c653c..89a33e78 100644 --- a/models/credit_manager/cm_common/facade_actions.go +++ b/models/credit_manager/cm_common/facade_actions.go @@ -61,28 +61,35 @@ func (mdl *CommonCMAdapter) fixFacadeActionStructureViaTenderlyCalls(mainCalls [ return } -func (mdl CommonCMAdapter) updateQuotasWithSessionId(sessionId string, mainCall *ds.FacadeCallNameWithMulticall) { +func (mdl CommonCMAdapter) updateQuotasWithSessionId(sessionId string, txHash common.Hash, mainCall *ds.FacadeCallNameWithMulticall) { + quotaEvents := mdl.Repo.GetAccountQuotaMgr().GetUpdateQuotaEventForAccount(txHash, strings.Split(sessionId, "_")[0]) + // + updateQuotaCount := 0 for _, multicall := range mainCall.GetMulticalls() { sig := hex.EncodeToString(multicall.CallData[:4]) if sig == "712c10ad" { // updateQuota on v3 - quotaEvent := mdl.Repo.GetAccountQuotaMgr().GetUpdateQuotaEventForAccount(strings.Split(sessionId, "_")[0]) - // - // - mdl.Repo.AddAccountOperation(&schemas.AccountOperation{ - TxHash: quotaEvent.TxHash, - BlockNumber: quotaEvent.BlockNumber, - LogId: quotaEvent.Index, - // Borrower: session.Borrower, - SessionId: sessionId, - Dapp: mdl.GetCreditFacadeAddr(), - Action: "UpdateQuota", - Args: &core.Json{"token": quotaEvent.Token, "change": quotaEvent.QuotaChange}, - AdapterCall: false, - // Transfers: &core.Transfers{tx.Token: amount}, - }) - mdl.SetSessionIsUpdated(sessionId) + updateQuotaCount++ } } + // add quota events to db + if len(quotaEvents) < updateQuotaCount { + log.Infof("Some of the updateQuota events not emitted maybe due to 0 quotaChange. txhash: %s. events:%d, calls:%d ", txHash.Hex(), len(quotaEvents), updateQuotaCount) + } + for _, quotaEvent := range quotaEvents { + mdl.Repo.AddAccountOperation(&schemas.AccountOperation{ + TxHash: quotaEvent.TxHash, + BlockNumber: quotaEvent.BlockNumber, + LogId: quotaEvent.Index, + // Borrower: session.Borrower, + SessionId: sessionId, + Dapp: mdl.GetCreditFacadeAddr(), + Action: "UpdateQuota", + Args: &core.Json{"token": quotaEvent.Token, "change": quotaEvent.QuotaChange}, + AdapterCall: false, + // Transfers: &core.Transfers{tx.Token: amount}, + }) + mdl.SetSessionIsUpdated(sessionId) + } } // check name @@ -113,7 +120,7 @@ func (mdl *CommonCMAdapter) validateAndSaveFacadeActions(version core.VersionTyp utils.ToJson(eventMulticalls), mainCall.String(), mainEvent.TxHash) } // update quota with session based on calls from tenderly and also mark sesssion as updated - mdl.updateQuotasWithSessionId(mainEvent.SessionId, mainCall) + mdl.updateQuotasWithSessionId(mainEvent.SessionId, common.HexToHash(txHash), mainCall) // account := strings.Split(mainEvent.SessionId, "_")[0] for _, event := range eventMulticalls {