Skip to content

Commit

Permalink
fix nonce
Browse files Browse the repository at this point in the history
  • Loading branch information
CoderZhi committed Jan 23, 2025
1 parent c712f6e commit bda3412
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 31 deletions.
34 changes: 12 additions & 22 deletions witness-service/relayer/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ func (s *Service) submit(w *types.Witness) ([]byte, error) {
}
}
var fboToken, fboRecipient *common.Address
unwrapper, ok := s.unwrappers[cashier.String()]
unwrapper, ok := s.unwrappers[transfer.recipient.String()]
if ok {
t, ok := unwrapper[transfer.token.String()]
if ok {
Expand Down Expand Up @@ -429,21 +429,14 @@ func (s *Service) process() error {
if s.validators == nil {
return nil
}
if err := s.sendBonus(); err != nil {
util.LogErr(err)
}
skipSubmit, err := s.confirmTransfers()
switch {
case err != nil:
util.LogErr(err)
case skipSubmit:
log.Println("skip submitting new transfers")
return nil
s.sendBonus()
if _, err := s.confirmTransfers(); err != nil {
return err
}
return s.submitTransfers()
}

func (s *Service) sendBonus() error {
func (s *Service) sendBonus() {
cashiers := []string{}
for cashier := range s.validators {
cashiers = append(cashiers, cashier)
Expand All @@ -456,7 +449,8 @@ func (s *Service) sendBonus() error {
CashiersQueryOption(cashiers),
)
if err != nil {
return errors.Wrap(err, "failed to read transfers to reward")
log.Printf("failed to read transfers to reward: %v\n", err)
return
}
for _, transfer := range transfers {
if err := s.bonusSender.SendBonus(transfer); err != nil {
Expand All @@ -467,10 +461,9 @@ func (s *Service) sendBonus() error {
}
}
}
return nil
}

func (s *Service) confirmTransfers() (bool, error) {
func (s *Service) confirmTransfers() error {
for cashier, validator := range s.validators {
expectedSize := validator.Size() * 2
validatedTransfers, err := s.recorder.Transfers(
Expand All @@ -481,7 +474,7 @@ func (s *Service) confirmTransfers() (bool, error) {
CashiersQueryOption([]string{cashier}),
)
if err != nil {
return false, errors.Wrap(err, "failed to read transfers to confirm")
return errors.Wrap(err, "failed to read transfers to confirm")
}
for _, transfer := range validatedTransfers {
speedup, merged, err := s.confirmTransfer(transfer, validator)
Expand All @@ -501,17 +494,16 @@ func (s *Service) confirmTransfers() (bool, error) {
}
}
case speedup:
log.Printf("transfer %s has been speeded up, skip other transfers\n", transfer.id.String())
return true, nil
return errors.Errorf("transfer %s has been speeded up", transfer.id.String())
case merged:
expectedSize += 1
}
}
if expectedSize == len(validatedTransfers) {
return true, nil
return errors.New("waiting to more transfers to be confirmed")
}
}
return false, nil
return nil
}

func (s *Service) confirmTransfer(transfer *Transfer, validator TransferValidator) (bool, bool, error) {
Expand Down Expand Up @@ -556,8 +548,6 @@ func (s *Service) confirmTransfer(transfer *Transfer, validator TransferValidato
default:
return false, false, errors.Wrap(err, "failed to speed up")
}
case StatusOnChainPending:
// do nothing
case StatusOnChainNotConfirmed:
return false, true, nil
case StatusOnChainRejected:
Expand Down
13 changes: 5 additions & 8 deletions witness-service/relayer/transfervalidatoronethereum.go
Original file line number Diff line number Diff line change
Expand Up @@ -341,8 +341,8 @@ func (tv *transferValidatorOnEthereum) Check(transfer *Transfer) (StatusOnChainT
if transfer.relayer == zeroAddress {
return StatusOnChainUnknown, errors.New("relayer is null")
}
// Fetch confirmed pendingNonce before all the other checks
pendingNonce, err := tv.client.PendingNonceAt(context.Background(), transfer.relayer)
// Fetch confirmed nonce before all the other checks
nonce, err := tv.client.NonceAt(context.Background(), transfer.relayer, nil)
if err != nil {
return StatusOnChainUnknown, err
}
Expand Down Expand Up @@ -382,13 +382,10 @@ func (tv *transferValidatorOnEthereum) Check(transfer *Transfer) (StatusOnChainT
transfer.timestamp = time.Unix(int64(settleBlockHeader.Time), 0)
return StatusOnChainSettled, nil
}
if transfer.nonce < pendingNonce {
if transfer.updateTime.Add(10 * time.Minute).Before(time.Now()) {
return StatusOnChainNonceOverwritten, nil
}
return StatusOnChainPending, nil
if transfer.nonce < nonce {
return StatusOnChainNonceOverwritten, nil
}
if transfer.updateTime.Before(time.Now().Add(-10*time.Minute)) && transfer.nonce == pendingNonce {
if transfer.updateTime.Before(time.Now().Add(-10*time.Minute)) && transfer.nonce == nonce {
log.Printf("transfer %s with nonce %d needs speed up, %s %s %d\n", transfer.id, transfer.nonce, transfer.updateTime.String(), time.Now(), pendingNonce)
return StatusOnChainNeedSpeedUp, nil
}
Expand Down
1 change: 0 additions & 1 deletion witness-service/relayer/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,6 @@ const (

const (
StatusOnChainUnknown StatusOnChainType = iota
StatusOnChainPending
StatusOnChainNotConfirmed
StatusOnChainNeedSpeedUp
StatusOnChainRejected
Expand Down

0 comments on commit bda3412

Please sign in to comment.