Investigate: swap path rejects fee-less small tokens — CU107 'Outputs are required and must be an array' (1-sat single-proof V3)
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Aptitud para principiantes
- 35/100
Línea de trabajo
Start by tracing the receive path from merchant.Fund to the wallet swap and locating where swap outputs are constructed; the issue does not name files or tests. Compare fee/reserve handling with the mint’s reported input_fee_ppk and determine whether a real wallet can reproduce the failure. Done means identifying the cause and establishing whether this is a user-facing bug or a test-tooling artifact, with an appropriate response for affected payments.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Migrated from Amperstrand/tollgate-module-basic-go#95 as part of the fork retirement — OpenTollGate/tollgate-module-basic-go is the single source of truth; the fork issue carries the original discussion and any lab evidence. Retirement plan: see the tracking issue linked in the migration comment there.]
What happened
During PR validation on the QEMU virtual lab (ai-legion, OpenWrt 24.10.1 VM, testnut mint), a fee-less 1-sat V3 token (single proof, keyset 008e808b89acc141) was submitted through the captive portal. Client-side validation passed ("Valid Cashu token / 1 sat / You will receive 30.00 MiB"), then payment failed with:
Payment failed — #CU107
Payment processing failed: could not swap proofs: Outputs are required and must be an array
The error text is the mint's NUT-03 response — the swap request reached testnut with an empty/missing outputs array.
A fee-buffered token (11 sats minted, mirroring physical-router-test-automation/scripts/mint-token/main.go's feeBuffer = 10) succeeds through the identical path, as do 4-sat tokens (multiple proofs).
Repro (lab)
- Lab: OpenWrt VM 10.99.99.1, backend merchant mode (1 sat/step, 30 MiB steps), testnut.cashu.exchange.
- Mint 1 sat, single proof, V3 (
HttpMinter.mint(1)from PRTAlib/cashu.py). - Submit through the portal (or raw-body POST
text/plainto:2121). - Observe CU107 + mint error above;
logreadshows the swap failure.
Is it fees? — evidence both ways (needs a dig)
For the fee hypothesis: the failure boundary so far is amount/proof-count dependent (1 sat fails, 4/11 sats pass), which smells like a fee reserve being subtracted before outputs are constructed (outputs = amount − fee; fee ≥ amount → empty array). The Gonuts-era mint-token tool explicitly carries feeBuffer = 10 "because of fees".
Against: testnut's /v1/keysets reports input_fee_ppk: 0 for all keysets (including active 008e808b89acc141). If the mint charges nothing, a fee-based explanation requires a locally computed reserve (wallet-side heuristic, not the mint's advertised fee) — or the empty-outputs bug is something else entirely (e.g. single-proof denomination split edge in the swap-output construction).
Questions for whoever digs in
- Where exactly are swap outputs constructed on the receive path (merchant.Fund → wallet swap)? Gonuts vs backend code?
- Is there a fee/reserve computation that ignores
input_fee_ppkor assumes a minimum? - Can a real wallet produce a token that hits this? (If yes → user-facing bug, needs a clean error like "token amount below network fee"; if no → close as test-tooling artifact.)
- Should the backend pre-check
amount ≤ keyset feeand return a proper CU-code instead of surfacing the mint's raw 400?
Environment
- Backend: deployed on lab VM, gonuts-tollgate (version unconfirmed — binary undated; this repro predates any fresh-main deployment)
- Mint: testnut.cashu.exchange (Nutshell-CF/0.0.1),
input_fee_ppk: 0on all keysets - Full session log and portal error snapshot available in PRTA PR #114/#115 validation notes (2026-09-18)
- Lenguaje dominante
- Go
- Estrellas
- 12
- Forks
- 14
- Merge medio
- 1 d 6 h
- PR fusionados (30 d)
- 217
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de OpenTollGate/tollgate-module-basic-go
-
go-battery needs an ndsctl on PATH: TestPurchaseSessionGuardHoldsThroughTheOutcomeUnknownWindow fails on bare hosts (passes with stub)Posiblemente ocupada @Amperstrand la tomó hace 1 día. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
OpenTollGate/tollgate-module-basic-go#726 · 2 comentarios ·
Los mantenedores suelen responder en 1 día
-
rebrand-literal-gutter: uhttpd section-vocabulary check trips on a COMMENT (uhttpd.luci in 92-tollgate-admin-setup:178)Posiblemente ocupada @Amperstrand la tomó hace 1 día. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
OpenTollGate/tollgate-module-basic-go#723 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 20/100
OpenTollGate/tollgate-module-basic-go#768 ·
Los mantenedores suelen responder en 1 día
-
Four drift fences for tests/contract/ (+ test.yml clean-container lane + pre-commit wiring)Posiblemente ocupada Un pull request vinculado a esta issue está abierto o ya se fusionó. Abierto
Dificultad 5/5 Más de una semana Aptitud para principiantes 25/100
OpenTollGate/tollgate-module-basic-go#767 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 20/100
OpenTollGate/tollgate-module-basic-go#763 ·
Los mantenedores suelen responder en 1 día
Todos los issues de OpenTollGate/tollgate-module-basic-go
Issues similares
-
enhancement exporter/awss3 needs triage
Dificultad 2/5 1-3 horas Aptitud para principiantes 66/100
open-telemetry/opentelemetry-collector-contrib#51905 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
area/docs theme/validation
Dificultad 1/5 1-3 horas Aptitud para principiantes 88/100
Los mantenedores suelen responder en 1 día
-
Add skip-to-content linkAbiertoa11y P1-significant
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
Los mantenedores suelen responder en 1 día
-
[correctness][missing-coverage][sort] Strict uniqueness checks lack numeric-key equivalence coverageAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 77/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 83/100
infiniflow/ragflow#20625 · 1 reacción ·
Los mantenedores suelen responder en 1 día