Skip to content

Commit

Permalink
Merge branch 'master' into s/ton-mnemonic
Browse files Browse the repository at this point in the history
  • Loading branch information
satoshiotomakan committed Oct 4, 2024
2 parents 026e367 + b4221b4 commit 2164d3e
Show file tree
Hide file tree
Showing 169 changed files with 1,838 additions and 397 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
package com.trustwallet.core.app.blockchains.bitcoin

import com.google.protobuf.ByteString
import com.trustwallet.core.app.utils.Numeric
import com.trustwallet.core.app.utils.toHex
import com.trustwallet.core.app.utils.toHexBytes
import com.trustwallet.core.app.utils.toHexBytesInByteString
import org.junit.Assert.assertEquals
import org.junit.Test
import wallet.core.java.AnySigner
import wallet.core.jni.BitcoinScript
import wallet.core.jni.BitcoinSigHashType
import wallet.core.jni.CoinType
import wallet.core.jni.CoinType.BITCOIN
import wallet.core.jni.Hash
import wallet.core.jni.PrivateKey
import wallet.core.jni.PublicKey
import wallet.core.jni.PublicKeyType
import wallet.core.jni.proto.Bitcoin
import wallet.core.jni.proto.BitcoinV2
import wallet.core.jni.proto.Common.SigningError

class TestBitcoinPsbt {

init {
System.loadLibrary("TrustWalletCore")
}

@Test
fun testSignThorSwap() {
// Successfully broadcasted tx: https://mempool.space/tx/634a416e82ac710166725f6a4090ac7b5db69687e86b2d2e38dcb3d91c956c32

val privateKey = "f00ffbe44c5c2838c13d2778854ac66b75e04eb6054f0241989e223223ad5e55".toHexBytesInByteString()
val psbt = "70736274ff0100bc0200000001147010db5fbcf619067c1090fec65c131443fbc80fb4aaeebe940e44206098c60000000000ffffffff0360ea000000000000160014f22a703617035ef7f490743d50f26ae08c30d0a70000000000000000426a403d3a474149412e41544f4d3a636f736d6f7331737377797a666d743675396a373437773537753438746778646575393573757a666c6d7175753a303a743a35303e12000000000000160014b139199ec796f36fc42e637f42da8e3e6720aa9d000000000001011f6603010000000000160014b139199ec796f36fc42e637f42da8e3e6720aa9d00000000".toHexBytesInByteString()

val input = BitcoinV2.SigningInput.newBuilder()
.setPsbt(BitcoinV2.Psbt.newBuilder().setPsbt(psbt))
.addPrivateKeys(privateKey)
.build()

val legacyInput = Bitcoin.SigningInput.newBuilder()
.setSigningV2(input)
.build()

val legacyOutput = AnySigner.sign(legacyInput, BITCOIN, Bitcoin.SigningOutput.parser())
val output = legacyOutput.signingResultV2

assertEquals(output.error, SigningError.OK)
assertEquals(
output.psbt.psbt.toByteArray().toHex(),
"0x70736274ff0100bc0200000001147010db5fbcf619067c1090fec65c131443fbc80fb4aaeebe940e44206098c60000000000ffffffff0360ea000000000000160014f22a703617035ef7f490743d50f26ae08c30d0a70000000000000000426a403d3a474149412e41544f4d3a636f736d6f7331737377797a666d743675396a373437773537753438746778646575393573757a666c6d7175753a303a743a35303e12000000000000160014b139199ec796f36fc42e637f42da8e3e6720aa9d000000000001011f6603010000000000160014b139199ec796f36fc42e637f42da8e3e6720aa9d01086c02483045022100b1229a008f20691639767bf925d6b8956ea957ccc633ad6b5de3618733a55e6b02205774d3320489b8a57a6f8de07f561de3e660ff8e587f6ac5422c49020cd4dc9101210306d8c664ea8fd2683eebea1d3114d90e0a5429e5783ba49b80ddabce04ff28f300000000"
)
assertEquals(
output.encoded.toByteArray().toHex(),
"0x02000000000101147010db5fbcf619067c1090fec65c131443fbc80fb4aaeebe940e44206098c60000000000ffffffff0360ea000000000000160014f22a703617035ef7f490743d50f26ae08c30d0a70000000000000000426a403d3a474149412e41544f4d3a636f736d6f7331737377797a666d743675396a373437773537753438746778646575393573757a666c6d7175753a303a743a35303e12000000000000160014b139199ec796f36fc42e637f42da8e3e6720aa9d02483045022100b1229a008f20691639767bf925d6b8956ea957ccc633ad6b5de3618733a55e6b02205774d3320489b8a57a6f8de07f561de3e660ff8e587f6ac5422c49020cd4dc9101210306d8c664ea8fd2683eebea1d3114d90e0a5429e5783ba49b80ddabce04ff28f300000000"
)
assertEquals(
output.txid.toByteArray().toHex(),
"0x634a416e82ac710166725f6a4090ac7b5db69687e86b2d2e38dcb3d91c956c32"
)
}

@Test
fun testPlanThorSwap() {
// Successfully broadcasted tx: https://mempool.space/tx/634a416e82ac710166725f6a4090ac7b5db69687e86b2d2e38dcb3d91c956c32

val privateKey = PrivateKey("f00ffbe44c5c2838c13d2778854ac66b75e04eb6054f0241989e223223ad5e55".toHexBytes())
val publicKey = privateKey.getPublicKeySecp256k1(true)
val psbt = "70736274ff0100bc0200000001147010db5fbcf619067c1090fec65c131443fbc80fb4aaeebe940e44206098c60000000000ffffffff0360ea000000000000160014f22a703617035ef7f490743d50f26ae08c30d0a70000000000000000426a403d3a474149412e41544f4d3a636f736d6f7331737377797a666d743675396a373437773537753438746778646575393573757a666c6d7175753a303a743a35303e12000000000000160014b139199ec796f36fc42e637f42da8e3e6720aa9d000000000001011f6603010000000000160014b139199ec796f36fc42e637f42da8e3e6720aa9d00000000".toHexBytesInByteString()

val input = BitcoinV2.SigningInput.newBuilder()
.setPsbt(BitcoinV2.Psbt.newBuilder().setPsbt(psbt))
.addPublicKeys(ByteString.copyFrom(publicKey.data()))
.build()

val legacyInput = Bitcoin.SigningInput.newBuilder()
.setSigningV2(input)
.build()

val legacyPlan = AnySigner.plan(legacyInput, BITCOIN, Bitcoin.TransactionPlan.parser())
val plan = legacyPlan.planningResultV2

assertEquals(plan.error, SigningError.OK)

assertEquals(plan.getInputs(0).receiverAddress, "bc1qkyu3n8k8jmekl3pwvdl59k5w8enjp25akz2r3z")
assertEquals(plan.getInputs(0).value, 66_406)

// Vault transfer
assertEquals(plan.getOutputs(0).toAddress, "bc1q7g48qdshqd000aysws74pun2uzxrp598gcfum0")
assertEquals(plan.getOutputs(0).value, 60_000)

// OP_RETURN
assertEquals(
plan.getOutputs(1).customScriptPubkey.toByteArray().toHex(),
"0x6a403d3a474149412e41544f4d3a636f736d6f7331737377797a666d743675396a373437773537753438746778646575393573757a666c6d7175753a303a743a3530"
)
assertEquals(plan.getOutputs(1).value, 0)

// Change output
assertEquals(plan.getOutputs(2).toAddress, "bc1qkyu3n8k8jmekl3pwvdl59k5w8enjp25akz2r3z")
assertEquals(plan.getOutputs(2).value, 4_670)

assertEquals(plan.feeEstimate, 1736)
// Please note that `change` in PSBT planning is always 0.
// That's because we aren't able to determine which output is an actual change from PSBT.
assertEquals(plan.change, 0)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -198,19 +198,21 @@ class TestBitcoinSigning {
p2Wpkh = BitcoinV2.PublicKeyOrHash.newBuilder().setPubkey(publicKey).build()
})

val signingInput = BitcoinV2.SigningInput.newBuilder()
val builder = BitcoinV2.TransactionBuilder.newBuilder()
.setVersion(BitcoinV2.TransactionVersion.V2)
.addPrivateKeys(ByteString.copyFrom(privateKeyData))
.addInputs(utxo0)
.addOutputs(out0)
.addOutputs(changeOutput)
.setInputSelector(BitcoinV2.InputSelector.UseAll)
.setFixedDustThreshold(dustSatoshis)
val signingInput = BitcoinV2.SigningInput.newBuilder()
.setBuilder(builder)
.addPrivateKeys(ByteString.copyFrom(privateKeyData))
.setChainInfo(BitcoinV2.ChainInfo.newBuilder().apply {
p2PkhPrefix = 0
p2ShPrefix = 5
})
.setDangerousUseFixedSchnorrRng(true)
.setFixedDustThreshold(dustSatoshis)
.build()

val legacySigningInput = Bitcoin.SigningInput.newBuilder().apply {
Expand Down Expand Up @@ -256,18 +258,20 @@ class TestBitcoinSigning {
p2Wpkh = BitcoinV2.PublicKeyOrHash.newBuilder().setPubkey(publicKey).build()
})

val signingInput = BitcoinV2.SigningInput.newBuilder()
val builder = BitcoinV2.TransactionBuilder.newBuilder()
.setVersion(BitcoinV2.TransactionVersion.V2)
.addPrivateKeys(ByteString.copyFrom(privateKeyData))
.addInputs(utxo0)
.addOutputs(out0)
.setInputSelector(BitcoinV2.InputSelector.UseAll)
.setFixedDustThreshold(dustSatoshis)
val signingInput = BitcoinV2.SigningInput.newBuilder()
.setBuilder(builder)
.addPrivateKeys(ByteString.copyFrom(privateKeyData))
.setChainInfo(BitcoinV2.ChainInfo.newBuilder().apply {
p2PkhPrefix = 0
p2ShPrefix = 5
})
.setDangerousUseFixedSchnorrRng(true)
.setFixedDustThreshold(dustSatoshis)
.build()

val legacySigningInput = Bitcoin.SigningInput.newBuilder().apply {
Expand Down Expand Up @@ -326,20 +330,22 @@ class TestBitcoinSigning {
p2Wpkh = BitcoinV2.PublicKeyOrHash.newBuilder().setPubkey(publicKey).build()
})

val signingInput = BitcoinV2.SigningInput.newBuilder()
val builder = BitcoinV2.TransactionBuilder.newBuilder()
.setVersion(BitcoinV2.TransactionVersion.V2)
.addPrivateKeys(ByteString.copyFrom(privateKeyData))
.addInputs(utxo0)
.addInputs(utxo1)
.addOutputs(out0)
.addOutputs(changeOutput)
.setInputSelector(BitcoinV2.InputSelector.UseAll)
.setFixedDustThreshold(dustSatoshis)
val signingInput = BitcoinV2.SigningInput.newBuilder()
.setBuilder(builder)
.addPrivateKeys(ByteString.copyFrom(privateKeyData))
.setChainInfo(BitcoinV2.ChainInfo.newBuilder().apply {
p2PkhPrefix = 0
p2ShPrefix = 5
})
.setDangerousUseFixedSchnorrRng(true)
.setFixedDustThreshold(dustSatoshis)
.build()

val legacySigningInput = Bitcoin.SigningInput.newBuilder().apply {
Expand Down
42 changes: 38 additions & 4 deletions bootstrap.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,43 @@
# Fail if any commands fails
set -e

echo "#### Initializing workspace with dependencies ... ####"
source tools/parse_args "$@"

if isHelp; then
echo "usage: bootstrap.sh [-h | --help] [all | wasm | android | ios]"
echo ""
echo "Installs dependencies and prepares WalletCore for building"
exit 0
fi

echo "#### Installing system dependencies ... ####"
if [[ $(uname) == "Darwin" ]]; then
tools/install-sys-dependencies-macos
else
tools/install-sys-dependencies-linux
fi

echo "#### Installing C++ libraries ... ####"
tools/install-dependencies
tools/install-rust-dependencies

echo "#### Building and running tests ... ####"
tools/build-and-test
echo "#### Installing Rust toolchain and tools ... ####"
tools/install-rust-dependencies dev

# WASM
if isTargetSpecified "wasm"; then
echo "#### Installing WASM environment ... ####"
tools/install-wasm-dependencies
fi

# Android
if isTargetSpecified "android"; then
echo "#### Installing Android dependencies ... ####"
tools/install-android-dependencies
fi

echo "#### Generating files... ####"
tools/generate-files "$@"

echo ""
echo "WalletCore is ready for development!"
echo "Consider running native C++ tests via './tools/build-and-test'"
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
//
// Copyright © 2017 Trust Wallet.

use crate::codegen::rust::tw_any_coin_directory;
use crate::codegen::rust::tw_tests_directory;
use crate::registry::CoinItem;
use crate::utils::FileContent;
use crate::Result;
Expand All @@ -14,7 +14,7 @@ const EVM_ADDRESS_DERIVATION_TEST_END: &str =
"end_of_evm_address_derivation_tests_marker_do_not_modify";

pub fn coin_address_derivation_test_path() -> PathBuf {
tw_any_coin_directory()
tw_tests_directory()
.join("tests")
.join("coin_address_derivation_test.rs")
}
Expand Down
6 changes: 3 additions & 3 deletions codegen-v2/src/codegen/rust/coin_integration_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
//
// Copyright © 2017 Trust Wallet.

use crate::codegen::rust::tw_any_coin_directory;
use crate::codegen::rust::tw_tests_directory;
use crate::codegen::template_generator::TemplateGenerator;
use crate::coin_id::CoinId;
use crate::registry::CoinItem;
Expand All @@ -20,15 +20,15 @@ const MOD_ADDRESS_TESTS_TEMPLATE: &str = include_str!("templates/integration_tes
const SIGN_TESTS_TEMPLATE: &str = include_str!("templates/integration_tests/sign_tests.rs");

pub fn chains_integration_tests_directory() -> PathBuf {
tw_any_coin_directory().join("tests").join("chains")
tw_tests_directory().join("tests").join("chains")
}

pub fn coin_integration_tests_directory(id: &CoinId) -> PathBuf {
chains_integration_tests_directory().join(id.as_str())
}

pub fn coin_address_derivation_test_path() -> PathBuf {
tw_any_coin_directory()
tw_tests_directory()
.join("tests")
.join("coin_address_derivation_test.rs")
}
Expand Down
4 changes: 2 additions & 2 deletions codegen-v2/src/codegen/rust/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ pub fn chains_directory() -> PathBuf {
rust_source_directory().join("chains")
}

pub fn tw_any_coin_directory() -> PathBuf {
rust_source_directory().join("tw_any_coin")
pub fn tw_tests_directory() -> PathBuf {
rust_source_directory().join("tw_tests")
}

pub fn workspace_toml_path() -> PathBuf {
Expand Down
35 changes: 25 additions & 10 deletions rust/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion rust/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
members = [
"chains/tw_aptos",
"chains/tw_binance",
"chains/tw_bitcoin",
"chains/tw_cosmos",
"chains/tw_ethereum",
"chains/tw_greenfield",
Expand All @@ -18,7 +19,6 @@ members = [
"tw_any_coin",
"tw_base58_address",
"tw_bech32_address",
"tw_bitcoin",
"tw_coin_entry",
"tw_coin_registry",
"tw_cosmos_sdk",
Expand All @@ -31,6 +31,7 @@ members = [
"tw_misc",
"tw_number",
"tw_proto",
"tw_tests",
"wallet_core_bin",
"wallet_core_rs",
]
Expand Down
Loading

0 comments on commit 2164d3e

Please sign in to comment.