fix(bitcoin-v2): Fail if max_amount_output provided with outputs or change_output at a time#4607
Merged
sergei-boiko-trustwallet merged 2 commits intomasterfrom Jan 6, 2026
Merged
Conversation
…or `change_output` at a time
Contributor
There was a problem hiding this comment.
Pull request overview
This pull request adds validation logic to ensure that the max_amount_output field cannot be used simultaneously with either outputs or change_output fields in Bitcoin transaction building, preventing invalid transaction configurations.
Key Changes:
- Added validation check in transaction builder to fail early when incompatible fields are set together
- Added comprehensive test coverage for the new validation scenarios
- Updated protobuf documentation to clarify field usage constraints
Reviewed changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated 3 comments.
| File | Description |
|---|---|
rust/chains/tw_bitcoin/src/modules/signing_request/standard_signing_request.rs |
Adds validation logic to return an error when max_amount_output is set with either outputs or change_output |
rust/tw_tests/tests/chains/bitcoin/bitcoin_sign/sign_error.rs |
New test file containing tests that verify the validation error is returned for invalid field combinations |
rust/tw_tests/tests/chains/bitcoin/bitcoin_sign/mod.rs |
Registers the new sign_error test module in the test suite |
src/proto/BitcoinV2.proto |
Updates documentation comment for max_amount_output field to clarify mutual exclusivity with outputs |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Binary size comparison➡️ aarch64-apple-ios: - 14.33 MB
+ 14.33 MB +1 KB➡️ aarch64-apple-ios-sim: - 14.33 MB
+ 14.33 MB +1 KB➡️ aarch64-linux-android: - 18.75 MB
+ 18.76 MB +2 KB➡️ armv7-linux-androideabi: - 16.18 MB
+ 16.18 MB +2 KB➡️ wasm32-unknown-emscripten: 13.67 MB |
davidkulman-tw
approved these changes
Jan 6, 2026
erdemaslan-tw
approved these changes
Jan 6, 2026
sergei-boiko-trustwallet
added a commit
that referenced
this pull request
Jan 14, 2026
* fiux(ci): Use `iPhone 16` in ios-release (#4493) * Throw exception rather than SIGSEGV (#4443) * Throw exception rather than SIGSEGV * Fix test cases * Add NULL checker for exceptionClass * feat(Plasma): Add Plasma Mainnet (#4499) * feat(plasma): Add Plasma Mainnet * feat(plasma): Add mobile tests * [Solana]: Adds ability to transfer tokens to the feepayer (#4503) * Initial setup * Minor updates * Restructure * fix(barz): Replace u32 parameters with i32 (#4504) * Disallow to use unsigned integer parameters within class methods * fix(data): Allocate empty array on `tw_data_create_with_bytes` if data is NULL (#4508) * fix(data): Allocate empty array on `tw_data_create_with_bytes` if data is NULL * fix(data): Add TWData test * feat(Biz): Add helper functions to support `BizPasskeySessionAccount` (#4516) * feat(biz-passkey): Add `TWBarzEncodeRegisterSessionCall` FFI * feat(biz-passkey): Add `TWBarzEncodeRemoveSessionCall` FFI * feat(biz-passkey): Add `TWBarzEncodePasskeySessionNonce` FFI * feat(biz-passkey): Add `TWBarzEncodeExecuteWithPasskeySessionCall` FFI * refactor(barz): Move some functions to TWBiz and TWEip7702 modules * feat(biz): Add WebAuthn * feat(biz): Add `TWWebAuthnGetMessageHash` and `TWWebAuthnGetFormattedSignature` * feat(biz): Fix C++ and Mobile * Rename `TWWebAuthn` module to `TWWebAuthnSolidity` * feat(biz): Adjust `executeWithPasskeySession` arguments * feat(biz): Fix fmt * feat(biz): Add Biz Android tests * feat(biz): Add final Biz Android test * feat(biz): Fix lints * feat(biz): Minor change * feat(biz): fmt * feat(solana): Add `SolanaTransaction.insertTransferInstruction()` (#4523) * feat(solana): Add `transfer_to_fee_payer` instruction * feat(solana): Add `tw_solana_transaction_insert_transfer_instruction` FFI * feat(solana): Add a note comment * feat(solana): Add one more comment * feat(zcash): Add support for TEX address (#4527) * feat(zcash): Add `TexAddress` in Rust * feat(zcash): Add successfully broadcasted transaction test * feat(zcash): Add successfully broadcasted transaction C++ test * feat(zcash): Fix C++ tests * feat(zcash): Reuse code in `TexAddress::isValid` * feat(zcash): Fix `TexAddress:isValid` * [Solana]: Renames fee recipient token account for clarity (#4528) * [Solana]: Renames fee recipient token account for clarity * Fix typo * Feature: Add trade and secured fields to THORChain Asset (#4500) * my tracked commit * MsgInstantiateContract * revert formatting * test * Tests fixes and broadcast * cargo fmt * remove unused * feat: add trade and secured fields to Thorchain Asset - Add trade and secured boolean fields to Asset proto message - Update ThorchainAsset struct in Rust with new fields - Update asset initialization in tx_builder.rs - Matches Thorchain blockchain Asset struct definition --------- Co-authored-by: gupnik <mail.guptanikhil@gmail.com> * feat(kusama-asset-hub): Add ability to force to use `ChargeAssetTxPayment` (#4541) * feat(kusama-asset-hub): Add ability to force to use `ChargeAssetTxPayment` for native tip * feat(kusama-asset-hub): Add a unit test * feat(monad): Add Monad testnet (#4543) * feat(monad): Update Monad to mainnet (#4550) * TODO update explorer * feat(monad): Update block explorer (#4553) * feat(monad): Update explorer * feat(monad): Update explorer schema * Fix incorrect value of NO_PAD constant (#4487) Co-authored-by: Sergei Boiko <127754187+satoshiotomakan@users.noreply.github.com> * fix(public-key): Fix `PublicKey::verify` by adding signature length validation (#4565) * fix(public-key): Fix `PublicKey::verify` by adding signature length validation * fix(public-key): Fix PR comments * Fix Reveal Operations for Seoul Protocol (#4557) * Since the Seoul protocol, reveal operations require the presence of a boolean for whether or not the proof field is present. This is required when manually forging bytes. Added. * Fix TezosTests.swift * Fix TezosTests.swift * Update tests * Update tests * Fix TezosCompiler.CompileWithSignatures * Fix TezosCompiler.CompileWithSignatures * fix(tezos): Fix Tezos compile test * fix(tezos): Fix Tezos signing test * fix(tezos): Add mainnet test transaction --------- Co-authored-by: gupnik <nikhil.g@trustwallet.com> Co-authored-by: Sergei Boiko <satoshiotomakan8@gmail.com> * fix(public-key): Check zilliqa schnorr signature size (#4571) * fix(public-key): Check zilliqa schnorr signature size * Replace assert macros with proper checks * fix(public-key): Address a PR comment * fix(public-key): Address a PR comments * fix(public-key): Fix a bug in PublicKey constructor * feat(pczt): Add implementation of PCZT signing (#4576) * feat(pczt): Add implementation of PCZT signing * feat(pczt): Add a successfully broadcasted tx test * feat(pczt): Address PR comments * fix(webauthn): Fix buffer out of bounds (#4577) * fix(webauthn): Fix buffer out of bounds * fix(webauthn): Fix `TWWebAuthnGetRSValues` implicit Data conversion * fix(webauthn): Extra checks for algorithm, and public key parts * fix(webauthn): Test common buffer overflows * fix(webauthn): Check `crv` and `kty` parameters * fix(private-key): Add PrivateKey Data move constructor * chore(noexcept): Remove wrong noexcept * fix(private-key): Zeroize memory on move `operator=` * fix(private-key): Avoid cleaning private key if self-assign * fix(aes): Add iv size validation (#4580) * fix(aes): Add iv size validation * fix(aes): Add unit tests * Update Dockerfile to install cbindgen with --locked and provide explicit links to clang binaries (#4568) * install cbindgen with --locked * add explicit links to clang/clang++ since CMake will not use the ENV --------- Co-authored-by: Sergei Boiko <127754187+satoshiotomakan@users.noreply.github.com> * feat(stable-account): Add `TWDerivationSmartChainStableAccount` derivation type (#4585) * fix(overflow): Fix integer overflows in `BinaryEncoding` and `Pactus` (#4592) * fix(binary-coding): Avoid unsigned integer overflow * fix(pactus): Avoid unsigned integer overflow * feat(tron): Add `raw_data_hex` parameter in JSON transaction representation (#4593) * feat(tron): Add `raw_data_hex` parameter in JSON transaction representation * feat(tron): Fix iOS test * feat(biz): Add `Biz.signExecuteWithSignatureCall` and `BizPasskeySession.signExecuteWithSignatureCall` (#4594) * feat(biz): Add `Biz.SignExecuteWithSignatureCall` * Add new `BizPasskeySession` module * feat(biz): Add `Biz.SignExecuteWithSignatureCall` * Finish `BizPasskeySession` module separation * feat(biz): Fix android tests * feat(biz): Address PR review comments * chore(codeowners): Add onchain-corex-enabling team to CODEOWNERS (#4600) * fix(ethereum-abi): Fix Ethereum ABI type parsing recursion + chore actions and toolchain (#4597) * fix(ethereum-abi): Fix Ethereum ABI type parsing recursion * fix(ethereum-abi): Freeze community github actions * chore(rust): Bump rust toolchain version to nightly-2025-12-11 * chore(wasm): Try to update emsdk to 4.0.22 * chore(rust): Decrease code coverage to 94.1 due to a recent toolchain update * chore(rust): Freeze `actions` hashes --------- Co-authored-by: Sergei Boiko <satoshiotomakan8@gmail.com> Co-authored-by: Sergei <> * chore(actions): Replace unverified actions with GH scripts (#4604) * chore(actions): Replace unverified actions with GH scripts * chore(actions): Update rust toolchain in Dockerfile * fix(bitcoin-v2): Fail if `max_amount_output` provided with `outputs` or `change_output` at a time (#4607) * fix(bitcoin-v2): Fail if `max_amount_output` provided with `outputs` or `change_output` at a time * fix(bitcoin-v2): PR notes * fix(cbor): Fix Cbor Map with odd elements number decoding (#4610) * fix(cbor): Fix Cbor Map with odd elements number decoding * fix(cbor): Change test name * chore(sync): Fix merge conflicts Breaking changes: * The following FFIs take i32 instead of u32 due to Kotlin bindings limitations: `tw_hd_node_create_with_seed`, `tw_hd_node_create_with_extended_private_key`, `tw_hd_node_derive_from_path`, `tw_hd_node_extended_private_key`, `tw_hd_node_extended_public_key`, `tw_hd_node_public_create_with_extended_public_key`, `tw_hd_node_public_derive_from_path`, `tw_mnemonic_generate`, `tw_mnemonic_get_word`, `tw_pbkdf2_hmac_sha512`, `tw_ecdsa_pubkey_hash` * `crypto_scrypt` FFI is no longer marked as `tw_ffi` to avoid changing u32 and usize argument types to i32 * chore(sync): Increase test coverage * Add Bitcoin PSBT compile test * Add `PrivateKey.CopyAssignmentOperator` and `PrivateKey.MoveAssignmentOperator` tests * Copy Rust TWMnemonic tests to C++ * Copy Rust Biz tests to C++ * Copy Rust BizPasskeySession tests to C++ * chore(sync): Push missing PSBT implementation + remove unused code * chore(sync): Fix Biz android tests --------- Co-authored-by: Sergei Boiko <127754187+satoshiotomakan@users.noreply.github.com> Co-authored-by: 10gic <github10gic@proton.me> Co-authored-by: gupnik <nikhil.g@trustwallet.com> Co-authored-by: Enrique Souza <enriquesouza@live.com> Co-authored-by: gupnik <mail.guptanikhil@gmail.com> Co-authored-by: Corey Soreff <csoreff@gmail.com> Co-authored-by: Sergei Boiko <satoshiotomakan8@gmail.com> Co-authored-by: Joey Yandle <xoloki@gmail.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This pull request introduces stricter validation to the Bitcoin transaction builder logic to ensure that the
max_amount_outputfield cannot be set at the same time as regular outputs or a change output. It also adds comprehensive tests to verify the new validation behavior and updates documentation to clarify usage constraints.Validation logic improvements:
standard_signing_request.rsto return an error ifmax_amount_outputis set together with eitheroutputsorchange_output, preventing invalid transaction configurations.Testing enhancements:
sign_error.rsto verify that using bothoutputsorchange_outputwithmax_amount_outputresults in anError_invalid_paramserror, covering both scenarios.bitcoin_sign/mod.rs.Documentation updates:
BitcoinV2.protofile that only one ofoutputsormax_amount_outputmust be used, updating the field comment formax_amount_output.