Skip to content
This repository was archived by the owner on Jun 1, 2026. It is now read-only.

Commit ddf7c26

Browse files
committed
add tests from app side
1 parent 72aed9c commit ddf7c26

2 files changed

Lines changed: 76 additions & 2 deletions

File tree

crates/gem_bitcoin/src/signer/chain_signer.rs

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ mod tests {
4848
use primitives::ChainSigner;
4949

5050
use super::*;
51-
use crate::testkit::signer_mock::{TEST_PRIVATE_KEY, transfer_input};
51+
use crate::testkit::signer_mock::{TEST_PRIVATE_KEY, funded_transfer_input, transfer_input, transfer_swap_input};
5252

5353
fn sign_transfer(chain: BitcoinChain) -> String {
5454
BitcoinChainSigner::new(chain).sign_transfer(&transfer_input(chain), &TEST_PRIVATE_KEY).unwrap()
@@ -65,6 +65,18 @@ mod tests {
6565
assert_eq!(script[signature_len], 0x01);
6666
}
6767

68+
#[test]
69+
fn test_sign_transfer_doge() {
70+
let input = funded_transfer_input(BitcoinChain::Doge);
71+
let raw = BitcoinChainSigner::new(BitcoinChain::Doge).sign_transfer(&input, &TEST_PRIVATE_KEY).unwrap();
72+
let transaction: bitcoin::Transaction = deserialize(&hex::decode(raw).unwrap()).unwrap();
73+
let script = transaction.input[0].script_sig.as_bytes();
74+
let signature_len = script[0] as usize;
75+
assert_eq!(transaction.input.len(), 1);
76+
assert_eq!(transaction.output[0].value.to_sat(), 10_000);
77+
assert_eq!(script[signature_len], 0x01);
78+
}
79+
6880
#[test]
6981
fn test_sign_transfer_bitcoin_cash() {
7082
let raw = sign_transfer(BitcoinChain::BitcoinCash);
@@ -82,4 +94,22 @@ mod tests {
8294
let zcash_bytes = hex::decode(raw).unwrap();
8395
assert_eq!(&zcash_bytes[..20], hex::decode("050000800a27a726f04dec4d0000000000000000").unwrap().as_slice());
8496
}
97+
98+
#[test]
99+
fn test_sign_swap_memo_op_return() {
100+
let memo = "=:s:0xEe7E9CcFb529f2c1Cc02C0Aea8aCed7Ec7e98B5e:0/1/0:g1:50";
101+
let input = transfer_swap_input(BitcoinChain::Doge, memo);
102+
let raw = BitcoinChainSigner::new(BitcoinChain::Doge).sign_swap(&input, &TEST_PRIVATE_KEY).unwrap().remove(0);
103+
let transaction: bitcoin::Transaction = deserialize(&hex::decode(raw).unwrap()).unwrap();
104+
let memo_output = transaction
105+
.output
106+
.iter()
107+
.find(|output| output.script_pubkey.is_op_return())
108+
.expect("expected OP_RETURN memo output");
109+
let script = memo_output.script_pubkey.as_bytes();
110+
assert_eq!(memo_output.value.to_sat(), 0);
111+
assert_eq!(script[0], 0x6a);
112+
assert_eq!(script[1] as usize, memo.len());
113+
assert_eq!(&script[2..], memo.as_bytes());
114+
}
85115
}

crates/gem_bitcoin/src/testkit/signer_mock.rs

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ use bitcoin::{
33
secp256k1::{PublicKey as Secp256k1PublicKey, Secp256k1, SecretKey},
44
};
55
use num_bigint::BigInt;
6-
use primitives::{Asset, BitcoinChain, GasPriceType, SignerInput, TransactionFee, TransactionInputType, TransactionLoadInput, TransactionLoadMetadata, UTXO};
6+
use primitives::{
7+
Asset, BitcoinChain, GasPriceType, SignerInput, SwapProvider, TransactionFee, TransactionInputType, TransactionLoadInput, TransactionLoadMetadata, UTXO,
8+
swap::{SwapData, SwapProviderData, SwapQuote, SwapQuoteData},
9+
};
710

811
use crate::{signer::address::public_key_hash, testkit::address_mock::address_for_hash};
912

@@ -60,6 +63,47 @@ pub fn transfer_input(chain: BitcoinChain) -> SignerInput {
6063
)
6164
}
6265

66+
pub fn funded_transfer_input(chain: BitcoinChain) -> SignerInput {
67+
let mut input = transfer_input(chain);
68+
match &mut input.input.metadata {
69+
TransactionLoadMetadata::Bitcoin { utxos } | TransactionLoadMetadata::Zcash { utxos, .. } => {
70+
utxos[0].value = "100000000".to_string();
71+
}
72+
_ => {}
73+
}
74+
input
75+
}
76+
77+
pub fn transfer_swap_input(chain: BitcoinChain, memo: &str) -> SignerInput {
78+
let mut input = funded_transfer_input(chain);
79+
let sender_address = input.sender_address.clone();
80+
let destination_address = input.destination_address.clone();
81+
let value = input.value.clone();
82+
83+
input.input.input_type = TransactionInputType::Swap(
84+
Asset::from_chain(chain.get_chain()),
85+
Asset::from_chain(BitcoinChain::Bitcoin.get_chain()),
86+
SwapData {
87+
quote: SwapQuote {
88+
from_address: sender_address,
89+
from_value: value.clone(),
90+
to_address: destination_address.clone(),
91+
to_value: value.clone(),
92+
provider_data: SwapProviderData {
93+
provider: SwapProvider::Thorchain,
94+
name: "THORChain".to_string(),
95+
protocol_name: "thorchain".to_string(),
96+
},
97+
slippage_bps: 50,
98+
eta_in_seconds: None,
99+
use_max_amount: Some(false),
100+
},
101+
data: SwapQuoteData::new_tranfer(destination_address, value, Some(memo.to_string())),
102+
},
103+
);
104+
input
105+
}
106+
63107
pub(crate) fn utxo_with(transaction_id: &str, vout: i32, value: &str, address: &str) -> UTXO {
64108
UTXO {
65109
transaction_id: transaction_id.to_string(),

0 commit comments

Comments
 (0)