Add XecVibe to the OP_RETURN prefix guideline, parse XECV payloads
(xecvibe.com + one-time memo) in Cashtab Send preview and tx history,
and add unit test vectors.
Details
- Reviewers
a2c.dev - Group Reviewers
Restricted Project Restricted Owners Package (Owns No Changed Paths)
- cd cashtab && pnpm test src/opreturn/__tests__/index.test.js --watchAll=false
Diff Detail
- Repository
- rABC Bitcoin ABC
- Branch
- xecv-opreturn-prefix
- Lint
Lint Skipped - Unit
No Test Coverage - Build Status
Event Timeline
Build Bitcoin ABC Diffs / Diff Testing (ai-review) passed.
CodeRabbit Review
Diff : committed changes only
Compare : HEAD → master
Directory : work
────────────────────────────────────────
(\(\
(• .•) I refactor in bunny hops.
────────────────────────────────────────────────────────────────────────
major [Data Integrity & Integration] → ]8;;vscode://file//work/doc/standards/xecvibe.md:5doc/standards/xecvibe.md:5]8;; Document the wire format before shipping the protocol. This file ends after the Output layout heading. Define the push order, site encoding, memo encoding and length, and handling of extra pushes. Add invalid examples so producers and consumers implement the same contract.
────────────────────────────────────────
Review complete
1 finding ✔
Major 1
5 files reviewed:
- cashtab/src/config/opreturn.ts
- cashtab/src/opreturn/fixtures/vectors.js
- cashtab/src/opreturn/index.ts
- doc/standards/op_return-prefix-guideline.md
- doc/standards/xecvibe.md
────────────────────────────────────────
Print all AI prompts: coderabbit review --show-prompts
| cashtab/src/opreturn/index.ts | ||
|---|---|---|
| 241–261 ↗ | (On Diff #61192) | need to update modules/ecash-parse if you want these txs to be appropriately parsed in Cashtab's tx-history |
| doc/standards/xecvibe.md | ||
| 5 ↗ | (On Diff #61192) | is there no output layout? are there not different types of txs? what is the spec for XECV txs? |
Updating D20572: [Cashtab] Parse XecVibe (XECV) OP_RETURN prefix
Register LOKAD 58454356 for xecvibe.com payments (login, likes, sprays).
Spec: doc/standards/xecvibe.md
Build Bitcoin ABC Diffs / Diff Testing (ai-review) passed.
CodeRabbit Review
Diff : committed changes only
Compare : HEAD → master
Directory : work
────────────────────────────────────────
(\(\
(• .•) Expecto bugtronum!
────────────────────────────────────────
Review complete
No findings ✔
12 files reviewed:
- cashtab/src/config/opreturn.ts
- cashtab/src/opreturn/fixtures/vectors.js
- cashtab/src/opreturn/index.ts
- doc/standards/op_return-prefix-guideline.md
- doc/standards/xecvibe.md
- modules/ecash-parse/src/constants/opreturn.ts
- modules/ecash-parse/src/fixtures/xecvFixtures.ts
- modules/ecash-parse/src/getTxNotificationMsg.test.ts
- modules/ecash-parse/src/getTxNotificationMsg.ts
- modules/ecash-parse/src/parseTx.test.ts
... and 2 more files
────────────────────────────────────────
| doc/standards/xecvibe.md | ||
|---|---|---|
| 17 ↗ | (On Diff #61223) | why? adding a constant brings no apparent value and makes the tx bigger for no reason |
Updating D20572: [Cashtab] Parse XecVibe (XECV) OP_RETURN prefix
Register LOKAD 58454356 for xecvibe.com payments (login, likes, sprays).
Spec: doc/standards/xecvibe.md
Build Bitcoin ABC Diffs / Diff Testing (ai-review) passed.
CodeRabbit Review
Diff : committed changes only
Compare : HEAD → master
Directory : work
────────────────────────────────────────
(\(\
(• .•) Patience, young padawan. The bugs will reveal themselves.
────────────────────────────────────────────────────────────────────────
major [Data Integrity & Integration]
→ ]8;;vscode://file//work/modules/ecash-parse/src/parseTx.ts:634modules/ecash-parse/src/parseTx.ts:634]8;;
Preserve legacy XecVibe transactions during parsing.
This check marks every previously valid transaction as invalid.
On-chain transactions cannot be rewritten, and the unchanged XECV LOKAD
provides no version boundary. Accept the legacy three-push shape with site
validation and normalize it to { memo }; keep the two-push shape for
newly created transactions. Apply the same compatibility rule in
parseOpReturnRaw.────────────────────────────────────────────────────────────────────────
major [Data Integrity & Integration] → ]8;;vscode://file//work/cashtab/src/opreturn/index.ts:244cashtab/src/opreturn/index.ts:244]8;; Preserve legacy XecVibe payloads when parsing. This check rejects every previously valid payload. The LOKAD is unchanged, so existing on-chain transactions and BIP21 op_return_raw links remain in circulation. Keep a legacy three-push read path with site validation, normalize it to the new memo result, and use the two-push shape for new payments. Apply the same rule in parseTx.
────────────────────────────────────────
Review complete
2 findings ✔
Major 2
7 files reviewed:
- cashtab/src/opreturn/fixtures/vectors.js
- cashtab/src/opreturn/index.ts
- doc/standards/xecvibe.md
- modules/ecash-parse/src/fixtures/xecvFixtures.ts
- modules/ecash-parse/src/getTxNotificationMsg.ts
- modules/ecash-parse/src/parseTx.ts
- modules/ecash-parse/src/types.ts
────────────────────────────────────────
Print all AI prompts: coderabbit review --show-prompts
where did the line in docs/standards/op_return-prefix-guideline.md go?
Could you explain what you are trying to accomplish with the XECV spec and what you are trying to do in this diff?
Do XEC Vibe users use Cashtab? Do you just want XECV txs to appear as such in Cashtab, or do you want more in depth parsing? How is the lokad used on your site? Is there not a pre-existing spec?
Thanks for the review.
What I’m trying to do: XecVibe users make payments through Cashtab (BIP21). Right now those show up as Cashtab Msg or Unknown Protocol. I want them labeled XecVibe in Send and history.
Yes — Cashtab users on XecVibe use Cashtab for those payments. The in-app wallet is separate.
I only need Cashtab to recognize the LOKAD and show the memo — not POWR-style action types. Same layout for all payments (login, likes, sprays now; NFT and other payments later). Format is just XECV + memo. Spec is new in this diff (doc/standards/xecvibe.md).
About the missing line in op_return-prefix-guideline.md — Diff 3 was only the follow-up that removed the extra xecvibe.com push, so the guideline row probably dropped out of the revision. I’ll re-upload a full squash so that line is back in.
| cashtab/src/opreturn/fixtures/vectors.js | ||
|---|---|---|
| 557 ↗ | (On Diff #61225) | there are no XecVibe vectors on master ... so this diff is not off the latest master. There is some kind of rebase / hidden stacking going on that needs to be cleaned up. This diff should be 1 commit off the latest master. |
Updating D20572: [Cashtab] Parse XecVibe (XECV) OP_RETURN prefix
Register LOKAD 58454356 for xecvibe.com payments (login, likes, sprays).
Spec: doc/standards/xecvibe.md
Build Bitcoin ABC Diffs / Diff Testing (ai-review) passed.
CodeRabbit Review
Diff : committed changes only
Compare : HEAD → master
Directory : work
────────────────────────────────────────
(\(\
(• .•) 💣 Deploying bug fixes in 3... 2... 1...
────────────────────────────────────────────────────────────────────────
major [Data Integrity & Integration] → ]8;;vscode://file//work/modules/ecash-wallet/package.json:3modules/ecash-wallet/package.json:3]8;; The package version moves backwards from 6.2.1 to 6.2.0. npm rejects a publish for a version that already exists, so this blocks release of ecash-wallet. Workspace consumers that resolve ^6.2.1 also break. Set the version to 6.2.2 or higher. 🔧 Proposed fix - "version": "6.2.0", + "version": "6.2.2",
────────────────────────────────────────────────────────────────────────
minor [Maintainability & Code Quality] → ]8;;vscode://file//work/apps/alp-fusion/src/client/oneshot.ts:11apps/alp-fusion/src/client/oneshot.ts:11]8;; Limit this statement to the one-shot flow. README.md and DEPLOY.md identify TCP/TLS framing as landed. State that this in-process module does not use TCP/TLS. Do not state that TCP/TLS lands only in follow-up diffs.
────────────────────────────────────────────────────────────────────────
minor [Functional Correctness] → ]8;;vscode://file//work/apps/alp-dex/test/quotes.test.ts:228apps/alp-dex/test/quotes.test.ts:228]8;; Keep a numeric price-impact oracle. This assertion accepts any positive percentage. A regression that reports 1 or 99 for this fixture will pass. Assert the expected value within a tolerance, or derive the expected value from the fixture reserves and input amount.
────────────────────────────────────────────────────────────────────────
major [Functional Correctness] → ]8;;vscode://file//work/modules/ecash-agora/src/agora.ts:1201modules/ecash-agora/src/agora.ts:1201-1205]8;; Detect the partial-change offer instead of requiring P2PKH. acceptTx permits any recipientScript. If a full PARTIAL accept sends tokens to a P2SH script, output 2 does not start with 76a914. This code then selects output 3, which is not the taker token output. historicOffers() leaves takenInfo unset for that valid accept. Select index 3 only when output 2 is an Agora plugin output. Add a regression test with a full PARTIAL accept that uses Script.p2sh(...) as recipientScript. Proposed fix -const takerBuyIndex = tx.outputs[2].outputScript.startsWith( - '76a914', -) - ? 2 - : 3; +const takerBuyIndex = + typeof tx.outputs[2].plugins !== 'undefined' && + PLUGIN_NAME in tx.outputs[2].plugins + ? 3 + : 2;
────────────────────────────────────────────────────────────────────────
major [Stability & Availability] → ]8;;vscode://file//work/contrib/guix/manifest.scm:286contrib/guix/manifest.scm:286-291]8;; Use nss-certs for SSL_CERT_FILE. python-oscrypto does not install etc/ssl/certs/ca-certificates.crt, so its search path can set SSL_CERT_FILE to a nonexistent file. Propagate nss-certs and use its certificate search path, or install the bundle at this path.
────────────────────────────────────────────────────────────────────────
major [Stability & Availability]
→ ]8;;vscode://file//work/apps/alp-fusion/src/protocol/covert.ts:601apps/alp-fusion/src/protocol/covert.ts:601]8;;
Handle getTypes() rejection and close the connection.
If getTypes() rejects before the receive loop starts, serveCovertPeer
can reject before any cleanup runs. Callers use `void
serveCovertPeer(...), so conn` can remain open and the rejection can
become unhandled. Catch this failure, close conn, and return.
Proposed fix
- const types = await getTypes();
+ let types: ProtoTypes;
+ try {
+ types = await getTypes();
+ } catch {
+ conn.close();
+ return;
+ }
Add a regression test that makes getTypes() reject and verifies that
serveCovertPeer resolves after it closes conn.────────────────────────────────────────
Review complete
6 findings ✔
Major 4
Minor 2
67 files reviewed:
- CMakeLists.txt
- apps/alp-dex/src/pricing/templates.ts
- apps/alp-dex/src/routes/quotes.ts
- apps/alp-dex/src/routes/settle.ts
- apps/alp-dex/test/pricing.test.ts
- apps/alp-dex/test/quotes.test.ts
- apps/alp-fusion/DEPLOY.md
- apps/alp-fusion/README.md
- apps/alp-fusion/src/client/oneshot.ts
- apps/alp-fusion/src/client/wire.ts
... and 57 more files
────────────────────────────────────────
Print all AI prompts: coderabbit review --show-prompts
ok this diff is totally off the rails now. prob just abandon it.
please read the CONTRIBUTING.md guidelines. a diff should be 1 commit off the latest master.
This should be a simple diff
- update the docs for the spec of your lokad
- update cf-parse to parse these txs
- add some tests in Cashtab to confirm these txs are rendering as you expect
there should not be a bunch of changes to C files, release notes, etc
also do not skip lint when you push up a diff. the whole point of lint is to catch all of the lint errors in this diff.