mirror of
https://github.com/alexgo-io/libbrc20-indexer.git
synced 2026-01-12 08:34:31 +08:00
feat: check valid withdraw when send
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user