feat: check valid withdraw when send

This commit is contained in:
jiedo
2024-05-31 18:15:09 +08:00
parent ab9173247e
commit 17bde7cfcd
5 changed files with 24 additions and 16 deletions

View File

@@ -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
}

View File

@@ -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

View File

@@ -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

View File

@@ -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")
}

View File

@@ -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
}