From 5c61ef32ab6e76dd69baa1ee5c4fbd7dc74f2b93 Mon Sep 17 00:00:00 2001 From: violog <51th.apprent1ce.f0rce@gmail.com> Date: Tue, 2 Jul 2024 16:20:38 +0300 Subject: [PATCH] Fix bug with auto-claim for unverified balance --- internal/service/handlers/fulfill_qr_event.go | 6 ++++ .../service/workers/nooneisforgotten/main.go | 30 ++++++++++++++----- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/internal/service/handlers/fulfill_qr_event.go b/internal/service/handlers/fulfill_qr_event.go index 8084b35..e354e65 100644 --- a/internal/service/handlers/fulfill_qr_event.go +++ b/internal/service/handlers/fulfill_qr_event.go @@ -71,6 +71,12 @@ func FulfillQREvent(w http.ResponseWriter, r *http.Request) { return } + if !balance.IsVerified { + Log(r).Infof("Balance nullifier=%s is not verified, fulfill or claim not allowed", event.Nullifier) + ape.RenderErr(w, problems.Forbidden()) + return + } + err = EventsQ(r).Transaction(func() error { event, err = claimEvent(r, event, balance) return err diff --git a/internal/service/workers/nooneisforgotten/main.go b/internal/service/workers/nooneisforgotten/main.go index 02a2cf2..468e2cd 100644 --- a/internal/service/workers/nooneisforgotten/main.go +++ b/internal/service/workers/nooneisforgotten/main.go @@ -48,6 +48,7 @@ func updatePassportScanEvents(db *pgdb.DB, types evtypes.Types, levels config.Le return nil } + // ensured in query that all balances are verified balances, err := pg.NewBalances(db).WithoutPassportEvent() if err != nil { return fmt.Errorf("failed to select balances without points for passport scan: %w", err) @@ -146,21 +147,14 @@ func claimReferralSpecificEvents(db *pgdb.DB, types evtypes.Types, levels config } // we need to have maps which link nullifiers to events slice - toClaim := make([]string, 0, len(events)) nullifiers := make([]string, 0, len(events)) for _, event := range events { - toClaim = append(toClaim, event.ID) nullifiers = append(nullifiers, event.Nullifier) } - if len(toClaim) == 0 { + if len(nullifiers) == 0 { return nil } - _, err = pg.NewEvents(db).FilterByID(toClaim...).Update(data.EventClaimed, nil, &evType.Reward) - if err != nil { - return fmt.Errorf("update event status: %w", err) - } - balances, err := pg.NewBalances(db).FilterByNullifier(nullifiers...).Select() if err != nil { return fmt.Errorf("failed to select balances for claim passport scan event: %w", err) @@ -169,6 +163,26 @@ func claimReferralSpecificEvents(db *pgdb.DB, types evtypes.Types, levels config return errors.New("critical: events present, but no balances with nullifier") } + toClaim := make([]string, 0, len(events)) + // select events to claim only for verified balances + for _, event := range events { + for _, balance := range balances { + if event.Nullifier != balance.Nullifier || !balance.IsVerified { + continue + } + toClaim = append(toClaim, event.ID) + break + } + } + if len(toClaim) == 0 { + return nil + } + + _, err = pg.NewEvents(db).FilterByID(toClaim...).Update(data.EventClaimed, nil, &evType.Reward) + if err != nil { + return fmt.Errorf("update event status: %w", err) + } + for _, balance := range balances { err = handlers.DoClaimEventUpdates( levels,