Skip to content

feat(kotlin-sdk): bind OP_RETURN, output-order and VIN0-change builder controls - #4288

Merged
QuantumExplorer merged 12 commits into
dashpay:v4.2-devfrom
HashEngineering:feat/maya-op-return-kotlin
Aug 6, 2026
Merged

feat(kotlin-sdk): bind OP_RETURN, output-order and VIN0-change builder controls#4288
QuantumExplorer merged 12 commits into
dashpay:v4.2-devfrom
HashEngineering:feat/maya-op-return-kotlin

Conversation

@HashEngineering

@HashEngineering HashEngineering commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

Issue being fixed or feature implemented

Kotlin/Android parity for #4286. That PR exposes the MAYACHAIN-deposit
builder controls (add_op_return, preserve_output_order,
change_to_first_input, and the pre-broadcast
core_wallet_signed_transaction_v2_bytes reader) through the FFI and binds
them for Swift only. The Android wallet is restoring the same MAYACHAIN swap
routes (dashpay/dash-wallet#1520, the Maya/SwapKit items), and its send path
runs on dash-sdk-android — without JNI/Kotlin bindings the FFI surface is
unreachable there.

What was done?

Stacked on #4286 (base = feat/maya-op-return); the diff on top is only the
Kotlin-side plumbing:

  • packages/rs-unified-sdk-jni/src/wallet_manager.rs: four thin JNI
    trampolines following the module's one-export-one-FFI-call convention —
    coreTxBuilderAddOpReturn, coreTxBuilderPreserveOutputOrder,
    coreTxBuilderChangeToFirstInput, and coreSignedTransactionV2Bytes
    (copies the FFI-owned buffer into a byte[] and frees it with
    platform_wallet_bytes_free on every path).
  • packages/kotlin-sdk/.../ffi/WalletManagerNative.kt: the matching
    external fun declarations.
  • packages/kotlin-sdk/.../wallet/CoreTransactionBuilder.kt:
    addOpReturn(ByteArray), preserveOutputOrder(), changeToFirstInput()
    mirroring the Swift CoreTransactionBuilder methods, and
    FinalizedCoreTransaction.serializedData() mirroring Swift's
    serializedData() — a non-consuming read so the caller can assert the
    deposit shape (vault VOUT0 / memo VOUT1 / change VOUT2) before deciding to
    broadcast or abandon.
  • packages/kotlin-sdk/.../androidTest/.../CoreTxBuilderOpReturnBindingTest.kt:
    instrumented binding coverage that needs no funded wallet — the four
    symbols resolve, the canonical Maya option sequence succeeds on a live
    builder, an 81-byte memo throws DashSDKException while the builder
    survives (the FFI rejects before consuming builder state), and the bytes
    reader rejects a null handle instead of crashing. The full funded
    deposit-shape assertion stays with feat(sdk): expose OP_RETURN, output-order and change-to-VIN0 controls #4286's gated Swift integration suite
    and the wallet-side testnet verification.

Like #4286, building this locally needs the uncommitted
[patch."https://github.com/dashpay/rust-dashcore"] override until
dashpay/rust-dashcore#922 merges and the workspace rev is bumped — the CI
guard added there enforces that the override never lands.

How Has This Been Tested?

  • cargo check -p rs-unified-sdk-jni and cargo fmt --check /
    cargo clippy -p rs-unified-sdk-jni against chore(rs-dpp): fix build issues in rs-dpp #922's key-wallet commits
    (cherry-picked onto the pinned rev locally).
  • :sdk:compileDebugKotlin, :sdk:testDebugUnitTest,
    :sdk:compileDebugAndroidTestKotlin — green.
  • :sdk:connectedDebugAndroidTest on a Pixel 8 API-34 arm64 emulator with a
    locally built libdash_sdk_jni.so (dev profile, patched engine):
    4/4 tests pass — symbols resolve, options apply, the oversize-memo
    rejection and null-handle rejection both surface as DashSDKException.

Breaking Changes

None — additive bindings only.

Checklist:

  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have added or updated relevant unit/integration/functional/e2e tests
  • I have made corresponding changes to the documentation

For repository code-owners and collaborators only

  • I have assigned this pull request to a milestone

Summary by CodeRabbit

  • New Features

    • Added support for building signed payments with optional OP_RETURN data.
    • Added options to preserve output order and route change to the first input.
    • Added access to serialized finalized transactions for inspection before broadcast.
  • Bug Fixes

    • Improved handling of invalid transaction handles and oversized payloads with clear errors instead of crashes.
  • Tests

    • Added coverage for payment options, transaction-builder configuration, supported payload sizes, cleanup, and error handling.

jeanpierreroma and others added 4 commits August 4, 2026 15:06
…trols

MAYAChain requires a UTXO deposit shaped as VOUT0=vault, VOUT1=OP_RETURN memo,
VOUT2=change paid back to the VIN0 address, with no output reordering, and it
identifies the depositor by VIN0 for refunds.
https://docs.mayaprotocol.com/mayachain-dev-docs/concepts/sending-transactions

`CoreTransactionBuilder.buildSigned` builds and signs in one FFI call, so none
of this can be applied after the fact — it has to be expressed on the builder.

FFI (rs-platform-wallet-ffi):
- core_wallet_tx_builder_add_op_return / _preserve_output_order /
  _change_to_first_input, mirroring the existing setter style
- an over-long payload is rejected before take_builder() runs, so a refused memo
  cannot leave the slot holding a mem::take default and silently drop outputs
  the caller already configured
- core_wallet_signed_transaction_v2_bytes: read the finalized transaction bytes
  without broadcasting, so the deposit shape can be asserted pre-broadcast

Swift SDK:
- addOpReturn / preserveOutputOrder / changeToFirstInput
- FinalizedCoreTransaction.serializedData()

Tests: MayaDepositVerificationIntegrationTests builds short- and long-memo
deposits and asserts output count/order, the OP_RETURN payload, VOUT2 == VIN0
scriptPubKey, the memo ceiling, the dust floor and a >= 1 duff/byte fee, then
checks fee parity for ordinary, multi-recipient, selected-input, drain and
asset-lock shapes so the precise output sizing does not move existing fees.

CI: fail the workspace workflow if the local rust-dashcore [patch] override is
still present in Cargo.toml.

Depends on key-wallet gaining add_op_return / preserve_output_order /
change_to_first_input (dashpay/rust-dashcore, branch feat/tx-builder-op-return).
Until that lands and the rev in Cargo.toml is bumped, building this needs a
local [patch] override, which is deliberately NOT committed.
Review follow-ups on the deposit verification test:

- Require exactly three outputs and always assert VOUT2 against VIN0. Both
  fixtures leave millions of duffs after the vault payment and fee, so change is
  mandatory; accepting two outputs let a regression that suppresses change pass
  the very test that exists to prove change-to-VIN0.
- Assert the output and input counts before indexing, so a wrong shape fails
  readably instead of trapping on an out-of-range subscript and taking the test
  process down.
- Cover the 80/81-byte OP_RETURN boundary rather than just the fixture, and
  reuse the same builder after a rejected payload. That pins the FFI guarantee
  this branch adds: the size check runs before `take_builder()`, so a refused
  memo must leave already-configured outputs and options intact.
- Gate the suite behind MAYA_DEPOSIT_VERIFICATION=1. `run_tests.sh` runs this
  bundle in CI, and these tests sit behind several 90-second waits on top of a
  full SPV bootstrap, so a bootstrap stall would hang the job rather than fail
  it.

Also renames MAX_STANDARD_OP_RETURN_BYTES to DEFAULT_MAX_OP_RETURN_BYTES,
following key-wallet making the ceiling configurable per builder.
…r controls

Kotlin/Android parity for the Swift-only surface dashpay#4286 added: four thin JNI
trampolines over core_wallet_tx_builder_add_op_return /
_preserve_output_order / _change_to_first_input and
core_wallet_signed_transaction_v2_bytes, the matching WalletManagerNative
declarations, CoreTransactionBuilder.addOpReturn/preserveOutputOrder/
changeToFirstInput, and FinalizedCoreTransaction.serializedData() — a
non-consuming read so callers can assert the MAYACHAIN deposit shape
(vault VOUT0, memo VOUT1, change VOUT2) before broadcasting.

Instrumented binding test needs no funded wallet: symbols resolve, the
Maya option sequence succeeds, an 81-byte memo throws while the builder
survives, and the bytes reader rejects a null handle.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: bb91d6a1-5692-4ac6-8ade-bd8f3fde1666

📥 Commits

Reviewing files that changed from the base of the PR and between 27b8502 and 3af7eb5.

📒 Files selected for processing (7)
  • docs/sdk/sdk-parity-manifest.json
  • packages/kotlin-sdk/PARITY_SUMMARY.md
  • packages/kotlin-sdk/sdk/src/androidTest/kotlin/org/dashfoundation/dashsdk/wallet/BuildSignedPaymentMayaOptionsTest.kt
  • packages/kotlin-sdk/sdk/src/main/kotlin/org/dashfoundation/dashsdk/ffi/WalletManagerNative.kt
  • packages/kotlin-sdk/sdk/src/main/kotlin/org/dashfoundation/dashsdk/wallet/CoreTransactionBuilder.kt
  • packages/kotlin-sdk/sdk/src/main/kotlin/org/dashfoundation/dashsdk/wallet/ManagedPlatformWallet.kt
  • packages/rs-unified-sdk-jni/src/wallet_manager.rs

📝 Walkthrough

Walkthrough

Changes

The PR adds Kotlin and JNI support for MAYACHAIN payment construction. It adds OP_RETURN data, output-order preservation, first-input change routing, and non-consuming finalized transaction serialization. Android tests and parity metadata cover the new behavior.

MAYACHAIN transaction-builder support

Layer / File(s) Summary
Native and JNI transaction-builder bindings
packages/kotlin-sdk/sdk/src/main/kotlin/org/dashfoundation/dashsdk/ffi/WalletManagerNative.kt, packages/rs-unified-sdk-jni/src/wallet_manager.rs, docs/sdk/sdk-parity-manifest.json
Adds native declarations and JNI implementations for transaction-builder controls and serialized finalized-transaction bytes.
Kotlin wallet integration and serialization
packages/kotlin-sdk/sdk/src/main/kotlin/org/dashfoundation/dashsdk/wallet/CoreTransactionBuilder.kt, packages/kotlin-sdk/sdk/src/main/kotlin/org/dashfoundation/dashsdk/wallet/ManagedPlatformWallet.kt
Exposes the controls through the Kotlin builder and extends buildSignedPayment with MAYACHAIN options.
Android validation and parity tracking
packages/kotlin-sdk/sdk/src/androidTest/kotlin/org/dashfoundation/dashsdk/wallet/*, packages/kotlin-sdk/PARITY_SUMMARY.md, docs/sdk/sdk-parity-manifest.json
Tests valid options, payload boundaries, builder-state preservation, null-handle errors, and wallet reuse. Parity metadata records the new capability.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
  participant ManagedPlatformWallet
  participant CoreTransactionBuilder
  participant WalletManagerNative
  participant JNIWalletManager
  participant PlatformWalletFFI
  ManagedPlatformWallet->>CoreTransactionBuilder: configure recipients and MAYACHAIN options
  CoreTransactionBuilder->>WalletManagerNative: invoke native builder controls
  WalletManagerNative->>JNIWalletManager: call JNI methods
  JNIWalletManager->>PlatformWalletFFI: apply OP_RETURN and output-shape controls
  PlatformWalletFFI-->>JNIWalletManager: return result or error
  JNIWalletManager-->>CoreTransactionBuilder: return result or DashSDKException
  CoreTransactionBuilder-->>ManagedPlatformWallet: finalize signed payment
Loading

Possibly related PRs

Suggested reviewers: quantumexplorer, lklimek, llbartekll, shumkov, zocolini

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main Kotlin SDK changes for OP_RETURN, output-order preservation, and first-input change controls.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands.

@thepastaclaw

thepastaclaw commented Aug 4, 2026

Copy link
Copy Markdown
Collaborator

🕓 Ready for review — next in queue (commit 3af7eb5)
Queue position: 1/1

@thepastaclaw thepastaclaw left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Preliminary review — Codex only

The JNI bindings and finalized-transaction byte ownership are implemented consistently with the existing FFI patterns. However, the new MAYACHAIN controls are inaccessible to consumers of the published Kotlin SDK, so the feature cannot be used through the supported public API.

Source: reviewers codex/general=gpt-5.6-sol(completed); codex/ffi-engineer=gpt-5.6-sol(completed); verifier=codex/verifier=gpt-5.6-sol(completed); coordinator=openclaw-agent/cliproxy/gpt-5.6-sol(orchestration-only).

Validated blockers were found in the Codex precheck. Sonnet is deferred until a fresh Codex revalidation clears the blocker gate.

Review provenance

  • Codex reviewers: gpt-5.6-sol — general (completed), gpt-5.6-sol — ffi-engineer (completed)
  • Verifier: gpt-5.6-sol — verifier
  • Sonnet: not run (deferred by blocker gate)

🔴 1 blocking

🤖 Prompt for all review comments with AI agents
These findings are from an automated code review. Verify each finding against the current code and only fix it if needed.

In `packages/kotlin-sdk/sdk/src/main/kotlin/org/dashfoundation/dashsdk/wallet/CoreTransactionBuilder.kt`:
- [BLOCKING] packages/kotlin-sdk/sdk/src/main/kotlin/org/dashfoundation/dashsdk/wallet/CoreTransactionBuilder.kt:71-95: Expose the MAYACHAIN controls through a public atomic API
  All three new builder controls are `internal`, as are the builder constructor, `addOutput`, and `finalizeAtomic`; the underlying `WalletManagerNative` object is internal as well. The only public driver, `ManagedPlatformWallet.sendToAddresses`, accepts ordinary positive-value address outputs, applies none of these controls, immediately broadcasts, and never returns a `FinalizedCoreTransaction`. Consequently, an application consuming the published `dash-sdk-android` artifact cannot add the OP_RETURN memo, preserve the required output order, route change to VIN0, or obtain a finalized transaction to inspect with `serializedData()`. The instrumented test only exercises the internal native surface from within the SDK module, so it does not verify consumer accessibility. Add a public atomic prepare/send API that applies these options and returns a `FinalizedCoreTransaction` for inspection while keeping the deprecated split `setFunding`/`buildSigned` path inaccessible.

Comment on lines +71 to +95
internal fun addOpReturn(data: ByteArray): CoreTransactionBuilder = apply {
WalletManagerNative.coreTxBuilderAddOpReturn(handle, data)
}

/** Override the change address (network-checked Rust-side). */
internal fun setChangeAddress(address: String): CoreTransactionBuilder = apply {
WalletManagerNative.coreTxBuilderSetChangeAddress(handle, address)
}

/**
* Preserve outputs in insertion order (skip BIP-69 sorting) for a
* MAYACHAIN-style deposit — vault must stay VOUT0, memo VOUT1 (mirror of
* Swift's `preserveOutputOrder`).
*/
internal fun preserveOutputOrder(): CoreTransactionBuilder = apply {
WalletManagerNative.coreTxBuilderPreserveOutputOrder(handle)
}

/**
* Route change to the first selected input's address (VIN0) for a
* MAYACHAIN-style deposit — MAYAChain identifies the depositor by VIN0
* and pays refunds there (mirror of Swift's `changeToFirstInput`).
*/
internal fun changeToFirstInput(): CoreTransactionBuilder = apply {
WalletManagerNative.coreTxBuilderChangeToFirstInput(handle)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔴 Blocking: Expose the MAYACHAIN controls through a public atomic API

All three new builder controls are internal, as are the builder constructor, addOutput, and finalizeAtomic; the underlying WalletManagerNative object is internal as well. The only public driver, ManagedPlatformWallet.sendToAddresses, accepts ordinary positive-value address outputs, applies none of these controls, immediately broadcasts, and never returns a FinalizedCoreTransaction. Consequently, an application consuming the published dash-sdk-android artifact cannot add the OP_RETURN memo, preserve the required output order, route change to VIN0, or obtain a finalized transaction to inspect with serializedData(). The instrumented test only exercises the internal native surface from within the SDK module, so it does not verify consumer accessibility. Add a public atomic prepare/send API that applies these options and returns a FinalizedCoreTransaction for inspection while keeping the deprecated split setFunding/buildSigned path inaccessible.

source: ['codex']

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Retracting this as a blocker after verifying the stacked integration context. This PR intentionally adds the JNI/Kotlin binding layer on top of #4286; the supported public call site is the option-carrying ManagedPlatformWallet.buildSignedPayment, whose reservation-token overload belongs to the separate #4185/#4247 deferred-payment stack. The downstream #1535 branch has already exercised that combined stack end to end on mainnet. Requiring a second public atomic API here would duplicate or preempt that stack rather than fix a defect in these bindings. The public entry-point follow-up remains a documented dependency before an integration AAR can ship.

@HashEngineering

Copy link
Copy Markdown
Contributor Author

Downstream consumer: dashpay/dash-wallet#1535 routes Maya/SwapKit swap deposits through these bindings and deletes the wallet's dashj transaction construction for that path. Mainnet-verified end to end with the full stack (rust-dashcore#922 + #4286 + this PR): tx 59f7d755ddb007648e915744de57f66bc43e03b0d347c714d754c44f3a39d8ce — 0.05318952 DASH → 3.5205806 RUNE, completed, engine InstantSend lock 1.6s after broadcast, deposit priced at a 343-duff fee by the OP_RETURN-aware sizing.

One note for whoever cuts the next integration AAR: the wallet also needs an option-carrying ManagedPlatformWallet.buildSignedPayment (opReturnData / preserveOutputOrder / changeToFirstInput threaded into the builder sequence), which cannot be filed against v4.2-dev yet because the reservation-token overload lives on the #4185/#4247 deferred-payment stack. That commit sits on a local qa5-plus-maya branch (integration/v41-keystore-qa5 @ 8e76a1b + both #4286 commits + this one + the options commit — all cherry-pick conflict-free) and I'll upstream it as soon as the reconciled stack lands.

Also worth recording: #4286's two commits are inseparable — the first alone references MAX_STANDARD_OP_RETURN_BYTES, which the second renames.

@thepastaclaw

Copy link
Copy Markdown
Collaborator

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
packages/kotlin-sdk/sdk/src/main/kotlin/org/dashfoundation/dashsdk/wallet/CoreTransactionBuilder.kt (1)

64-96: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add Swift source-file citations for all iOS-ported behavior.

  • packages/kotlin-sdk/sdk/src/main/kotlin/org/dashfoundation/dashsdk/wallet/CoreTransactionBuilder.kt#L64-L96,L217-L227: add the applicable Swift source file paths to each KDoc block that identifies a Swift mirror.
  • packages/kotlin-sdk/sdk/src/androidTest/kotlin/org/dashfoundation/dashsdk/wallet/CoreTxBuilderOpReturnBindingTest.kt#L12-L25: add the Swift source file path for MayaDepositVerificationIntegrationTests.

As per coding guidelines, Kotlin behavior ported from iOS must cite the corresponding Swift source file in KDoc.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@packages/kotlin-sdk/sdk/src/main/kotlin/org/dashfoundation/dashsdk/wallet/CoreTransactionBuilder.kt`
around lines 64 - 96, Add citations to the corresponding Swift source files for
every iOS-ported behavior in CoreTransactionBuilder.kt, including the KDoc
blocks for addOpReturn, setChangeAddress, preserveOutputOrder,
changeToFirstInput, and the additional cited block at L217-L227; update
packages/kotlin-sdk/sdk/src/main/kotlin/org/dashfoundation/dashsdk/wallet/CoreTransactionBuilder.kt
lines 64-96 and 217-227. Also document the Swift source path for
MayaDepositVerificationIntegrationTests in
packages/kotlin-sdk/sdk/src/androidTest/kotlin/org/dashfoundation/dashsdk/wallet/CoreTxBuilderOpReturnBindingTest.kt
lines 12-25.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In
`@packages/kotlin-sdk/sdk/src/main/kotlin/org/dashfoundation/dashsdk/wallet/CoreTransactionBuilder.kt`:
- Around line 64-96: Add citations to the corresponding Swift source files for
every iOS-ported behavior in CoreTransactionBuilder.kt, including the KDoc
blocks for addOpReturn, setChangeAddress, preserveOutputOrder,
changeToFirstInput, and the additional cited block at L217-L227; update
packages/kotlin-sdk/sdk/src/main/kotlin/org/dashfoundation/dashsdk/wallet/CoreTransactionBuilder.kt
lines 64-96 and 217-227. Also document the Swift source path for
MayaDepositVerificationIntegrationTests in
packages/kotlin-sdk/sdk/src/androidTest/kotlin/org/dashfoundation/dashsdk/wallet/CoreTxBuilderOpReturnBindingTest.kt
lines 12-25.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 91de4dcd-af89-4212-a74c-899ea8f1edee

📥 Commits

Reviewing files that changed from the base of the PR and between c3ffb89 and 27b8502.

📒 Files selected for processing (4)
  • packages/kotlin-sdk/sdk/src/androidTest/kotlin/org/dashfoundation/dashsdk/wallet/CoreTxBuilderOpReturnBindingTest.kt
  • packages/kotlin-sdk/sdk/src/main/kotlin/org/dashfoundation/dashsdk/ffi/WalletManagerNative.kt
  • packages/kotlin-sdk/sdk/src/main/kotlin/org/dashfoundation/dashsdk/wallet/CoreTransactionBuilder.kt
  • packages/rs-unified-sdk-jni/src/wallet_manager.rs

QuantumExplorer and others added 7 commits August 6, 2026 22:57
# Conflicts:
#	.github/workflows/tests-rs-workspace.yml
…SignedPayment

The three builder controls, the builder itself, and WalletManagerNative are
all internal, so a consumer of the published dash-sdk-android artifact could
not add the OP_RETURN memo, preserve output order, route change to VIN0, or
inspect the result before broadcast. Thread opReturnData /
preserveOutputOrder / changeToFirstInput through the public
ManagedPlatformWallet.buildSignedPayment: one atomic native
select+reserve+sign+register returning a SignedCoreTransaction whose
rawTxBytes lets the caller assert the deposit shape (vault VOUT0 / memo
VOUT1 / change VOUT2) before broadcastSigned or releaseReservation. The
deprecated setFunding/buildSigned split stays inaccessible.

Instrumented coverage drives only the public overload: on an unfunded
wallet the canonical Maya option set must reach atomic selection
(CoreInsufficientFunds), an 81-byte memo must fail before selection, and
the wallet must survive to run a well-formed build afterwards.

Registers the core.maya_op_return_deposit parity capability over the four
shared FFI symbols, verified by the gated Swift Maya integration suite and
the Kotlin instrumented tests.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The engine PR dropped the configurable ceiling (set_max_op_return_bytes /
DEFAULT_MAX_OP_RETURN_BYTES) and went back to the plain
MAX_STANDARD_OP_RETURN_BYTES constant; the FFI pre-check tracks the rename.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Points the eight workspace pins at dca5b05b (rust-dashcore's merged
tx-builder OP_RETURN/output-order/change-routing support), replacing the
local patch override the CI guard forbids committing.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@QuantumExplorer
QuantumExplorer deleted the branch dashpay:v4.2-dev August 6, 2026 17:39
@QuantumExplorer
QuantumExplorer changed the base branch from feat/maya-op-return to v4.2-dev August 6, 2026 17:41
@QuantumExplorer
QuantumExplorer merged commit 6dc1b46 into dashpay:v4.2-dev Aug 6, 2026
1 check was pending
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants