From 17bde7cfcd720f1324bb1f52b6628cc1c4a82846 Mon Sep 17 00:00:00 2001 From: jiedo Date: Fri, 31 May 2024 18:15:09 +0800 Subject: [PATCH] feat: check valid withdraw when send --- indexer/indexer.go | 1 + indexer/init.go | 3 ++- indexer/module_withdraw.go | 21 ++++++++++++--------- loader/dump.go | 4 ++-- model/swap.go | 11 +++++++---- 5 files changed, 24 insertions(+), 16 deletions(-) diff --git a/indexer/indexer.go b/indexer/indexer.go index 9e709b3..596b5b2 100644 --- a/indexer/indexer.go +++ b/indexer/indexer.go @@ -90,6 +90,7 @@ func (g *BRC20ModuleIndexer) ProcessUpdateLatestBRC20Loop(brc20Datas, brc20Datas if err := g.ProcessWithdraw(data, withdrawInfo); err != nil { log.Printf("process withdraw move failed: %s", err) } else { + g.InscriptionsValidWithdrawMap[withdrawInfo.Data.GetInscriptionId()] = data.Height } break } diff --git a/indexer/init.go b/indexer/init.go index 79b10a3..b0c8f3d 100644 --- a/indexer/init.go +++ b/indexer/init.go @@ -65,7 +65,8 @@ type BRC20ModuleIndexer struct { // runtime for withdraw InscriptionsWithdrawRemoveMap map[string]uint32 // remove at height - InscriptionsWithdrawMap map[string]*model.InscriptionBRC20SwapInfo // inner all withdraw by key + InscriptionsWithdrawMap map[string]*model.InscriptionBRC20SwapInfo // inner all ready to withdraw by key + InscriptionsValidWithdrawMap map[string]uint32 // valid withdraw by key(when send, can tell if valid) // for gen approve event ThisTxId string diff --git a/indexer/module_withdraw.go b/indexer/module_withdraw.go index d389029..e7659da 100644 --- a/indexer/module_withdraw.go +++ b/indexer/module_withdraw.go @@ -82,7 +82,7 @@ func (g *BRC20ModuleIndexer) ProcessWithdraw(data *model.InscriptionBRC20Data, w } // Cross-check whether the withdraw-inscription exists. - if _, ok := fromTokenBalance.ValidWithdrawMap[data.CreateIdxKey]; !ok { + if _, ok := fromTokenBalance.ReadyToWithdrawMap[data.CreateIdxKey]; !ok { log.Printf("ProcessBRC20Withdraw send from withdraw missing(dup withdraw?). height: %d, txidx: %d", data.Height, data.TxIdx, @@ -92,6 +92,10 @@ func (g *BRC20ModuleIndexer) ProcessWithdraw(data *model.InscriptionBRC20Data, w // available > amt balanceWithdraw := withdrawInfo.Amount + fromTokenBalance.ReadyToWithdrawAmount = fromTokenBalance.ReadyToWithdrawAmount.Sub(balanceWithdraw) + delete(fromTokenBalance.ReadyToWithdrawMap, data.CreateIdxKey) + fromTokenBalance.UpdateHeight = data.Height + if fromTokenBalance.AvailableBalance.Cmp(balanceWithdraw) < 0 { // invalid isInvalid = true } @@ -118,14 +122,10 @@ func (g *BRC20ModuleIndexer) ProcessWithdraw(data *model.InscriptionBRC20Data, w } // set from - fromTokenBalance.UpdateHeight = data.Height - // The available balance here needs to be directly deducted and transferred to WithdrawableBalance. fromTokenBalance.AvailableBalanceSafe = fromTokenBalance.AvailableBalanceSafe.Sub(balanceWithdraw) fromTokenBalance.AvailableBalance = fromTokenBalance.AvailableBalance.Sub(balanceWithdraw) - delete(fromTokenBalance.ValidWithdrawMap, data.CreateIdxKey) - fromHistory := model.NewBRC20ModuleHistory(true, constant.BRC20_HISTORY_MODULE_TYPE_N_WITHDRAW_FROM, withdrawInfo.Data, data, nil, true) fromTokenBalance.History = append(fromTokenBalance.History, fromHistory) @@ -228,12 +228,15 @@ func (g *BRC20ModuleIndexer) ProcessInscribeWithdraw(data *model.InscriptionBRC2 // Check if the module balance is sufficient to withdraw moduleTokenBalance := moduleInfo.GetUserTokenBalance(withdrawInfo.Tick, data.PkScript) { + + moduleTokenBalance.ReadyToWithdrawAmount = moduleTokenBalance.ReadyToWithdrawAmount.Add(balanceWithdraw) + history.Valid = true - // Update personal withdraw lookup table ValidWithdrawMap - if moduleTokenBalance.ValidWithdrawMap == nil { - moduleTokenBalance.ValidWithdrawMap = make(map[string]*model.InscriptionBRC20Data, 1) + // Update personal withdraw lookup table ReadyToWithdrawMap + if moduleTokenBalance.ReadyToWithdrawMap == nil { + moduleTokenBalance.ReadyToWithdrawMap = make(map[string]*model.InscriptionBRC20Data, 1) } - moduleTokenBalance.ValidWithdrawMap[data.CreateIdxKey] = data + moduleTokenBalance.ReadyToWithdrawMap[data.CreateIdxKey] = data moduleTokenBalance.UpdateHeight = data.Height // Update global withdraw lookup table diff --git a/loader/dump.go b/loader/dump.go index 09764ff..9a785d6 100644 --- a/loader/dump.go +++ b/loader/dump.go @@ -267,8 +267,8 @@ func DumpModuleTickInfoMap(file *os.File, condStateBalanceDataMap map[string]*mo if len(balanceData.ValidApproveMap) > 0 { fmt.Fprintf(file, ", nApprove: %d", len(balanceData.ValidApproveMap)) } - if len(balanceData.ValidWithdrawMap) > 0 { - fmt.Fprintf(file, ", nWithdraw: %d", len(balanceData.ValidWithdrawMap)) + if len(balanceData.ReadyToWithdrawMap) > 0 { + fmt.Fprintf(file, ", nWithdraw: %d", len(balanceData.ReadyToWithdrawMap)) } fmt.Fprintf(file, "\n") } diff --git a/model/swap.go b/model/swap.go index 97adb21..4711d83 100644 --- a/model/swap.go +++ b/model/swap.go @@ -623,10 +623,11 @@ type BRC20ModuleTokenBalance struct { AvailableBalance *decimal.Decimal ApproveableBalance *decimal.Decimal CondApproveableBalance *decimal.Decimal + ReadyToWithdrawAmount *decimal.Decimal ValidConditionalApproveMap map[string]*InscriptionBRC20Data ValidApproveMap map[string]*InscriptionBRC20Data - ValidWithdrawMap map[string]*InscriptionBRC20Data + ReadyToWithdrawMap map[string]*InscriptionBRC20Data // ready to use, but inscription may invalid(depends on available b) History []*BRC20ModuleHistory } @@ -656,10 +657,11 @@ func (in *BRC20ModuleTokenBalance) DeepCopy() *BRC20ModuleTokenBalance { ApproveableBalance: decimal.NewDecimalCopy(in.ApproveableBalance), CondApproveableBalance: decimal.NewDecimalCopy(in.CondApproveableBalance), + ReadyToWithdrawAmount: decimal.NewDecimalCopy(in.ReadyToWithdrawAmount), ValidConditionalApproveMap: make(map[string]*InscriptionBRC20Data, len(in.ValidConditionalApproveMap)), ValidApproveMap: make(map[string]*InscriptionBRC20Data, len(in.ValidApproveMap)), - ValidWithdrawMap: make(map[string]*InscriptionBRC20Data, len(in.ValidWithdrawMap)), + ReadyToWithdrawMap: make(map[string]*InscriptionBRC20Data, len(in.ReadyToWithdrawMap)), } for k, v := range in.ValidConditionalApproveMap { @@ -670,9 +672,9 @@ func (in *BRC20ModuleTokenBalance) DeepCopy() *BRC20ModuleTokenBalance { data := *v tb.ValidApproveMap[k] = &data } - for k, v := range in.ValidWithdrawMap { + for k, v := range in.ReadyToWithdrawMap { data := *v - tb.ValidWithdrawMap[k] = &data + tb.ReadyToWithdrawMap[k] = &data } for _, h := range in.History { @@ -699,6 +701,7 @@ func (in *BRC20ModuleTokenBalance) CherryPick() *BRC20ModuleTokenBalance { ApproveableBalance: decimal.NewDecimalCopy(in.ApproveableBalance), CondApproveableBalance: decimal.NewDecimalCopy(in.CondApproveableBalance), + ReadyToWithdrawAmount: decimal.NewDecimalCopy(in.ReadyToWithdrawAmount), } return tb }