Skip to content

Commit ce9f99f

Browse files
committed
Expose option to get new or last onchain address
1 parent 31720e9 commit ce9f99f

28 files changed

Lines changed: 136 additions & 49 deletions

File tree

‎crates/breez-sdk/bindings/examples/cli/langs/csharp/Commands.cs‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -474,6 +474,7 @@ private static async Task HandleReceive(BreezSdk sdk, Func<string, string?> read
474474
var expirySecsStr = GetFlag(args, "-e", "--expiry-secs");
475475
var senderPubKey = GetFlag(args, "-s", "--sender-public-key");
476476
var hodl = HasFlag(args, "--hodl");
477+
var newAddress = HasFlag(args, "--new-address");
477478

478479
if (method == null)
479480
{
@@ -508,7 +509,7 @@ private static async Task HandleReceive(BreezSdk sdk, Func<string, string?> read
508509
break;
509510

510511
case "bitcoin":
511-
paymentMethod = new ReceivePaymentMethod.BitcoinAddress();
512+
paymentMethod = new ReceivePaymentMethod.BitcoinAddress(newAddress: newAddress);
512513
break;
513514

514515
case "bolt11":

‎crates/breez-sdk/bindings/examples/cli/langs/flutter/lib/commands.dart‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,8 @@ Future<void> _handleReceive(BreezSdk sdk, TokenIssuer tokenIssuer, List<String>
295295
..addOption('token-identifier', abbr: 't')
296296
..addOption('expiry-secs', abbr: 'e')
297297
..addOption('sender-public-key', abbr: 's')
298-
..addFlag('hodl', defaultsTo: false);
298+
..addFlag('hodl', defaultsTo: false)
299+
..addFlag('new-address', defaultsTo: false, help: 'Get a new bitcoin deposit address');
299300
final results = _parseArgs(parser, args, 'receive -m <method> [options]');
300301
if (results == null) return;
301302

@@ -308,6 +309,7 @@ Future<void> _handleReceive(BreezSdk sdk, TokenIssuer tokenIssuer, List<String>
308309
final expirySecs = expirySecsStr != null ? int.parse(expirySecsStr) : null;
309310
final senderPublicKey = results.option('sender-public-key');
310311
final hodl = results.flag('hodl');
312+
final newAddress = results.flag('new-address');
311313

312314
ReceivePaymentMethod paymentMethod;
313315
switch (method) {
@@ -326,7 +328,7 @@ Future<void> _handleReceive(BreezSdk sdk, TokenIssuer tokenIssuer, List<String>
326328
senderPublicKey: senderPublicKey,
327329
);
328330
case 'bitcoin':
329-
paymentMethod = ReceivePaymentMethod.bitcoinAddress();
331+
paymentMethod = ReceivePaymentMethod.bitcoinAddress(newAddress: newAddress);
330332
case 'bolt11':
331333
String? paymentHash;
332334
if (hodl) {

‎crates/breez-sdk/bindings/examples/cli/langs/golang/commands.go‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,7 @@ func handleReceive(sdk *breez_sdk_spark.BreezSdk, _ *readline.Instance, args []s
273273
senderPublicKey := fs.String("s", "", "Optional sender public key (sparkinvoice only)")
274274
fs.StringVar(senderPublicKey, "sender-public-key", "", "Optional sender public key")
275275
hodl := fs.Bool("hodl", false, "Create a HODL invoice (bolt11 only)")
276+
newAddress := fs.Bool("new-address", false, "Get a new bitcoin deposit address (bitcoin only)")
276277
if err := fs.Parse(args); err != nil {
277278
return err
278279
}
@@ -315,7 +316,9 @@ func handleReceive(sdk *breez_sdk_spark.BreezSdk, _ *readline.Instance, args []s
315316
paymentMethod = pm
316317

317318
case "bitcoin":
318-
paymentMethod = breez_sdk_spark.ReceivePaymentMethodBitcoinAddress{}
319+
paymentMethod = breez_sdk_spark.ReceivePaymentMethodBitcoinAddress{
320+
NewAddress: newAddress,
321+
}
319322

320323
case "bolt11":
321324
pm := breez_sdk_spark.ReceivePaymentMethodBolt11Invoice{

‎crates/breez-sdk/bindings/examples/cli/langs/kotlin-multiplatform/src/main/kotlin/Commands.kt‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,7 @@ suspend fun handleReceive(sdk: BreezSdk, reader: LineReader, args: List<String>)
288288
val expirySecs = fp.getUInt("e", "expiry-secs")
289289
val senderPublicKey = fp.getString("s", "sender-public-key")
290290
val hodl = fp.hasFlag("hodl")
291+
val newAddress = fp.hasFlag("new-address")
291292

292293
if (method == null) {
293294
println("Usage: receive -m <method> [options]")
@@ -299,6 +300,7 @@ suspend fun handleReceive(sdk: BreezSdk, reader: LineReader, args: List<String>)
299300
println(" -e, --expiry-secs <secs> Expiry in seconds")
300301
println(" -s, --sender-public-key <key> Sender public key (spark invoice only)")
301302
println(" --hodl Create a HODL invoice (bolt11 only)")
303+
println(" --new-address Get a new bitcoin deposit address")
302304
return
303305
}
304306

@@ -329,7 +331,7 @@ suspend fun handleReceive(sdk: BreezSdk, reader: LineReader, args: List<String>)
329331
)
330332
}
331333

332-
"bitcoin" -> ReceivePaymentMethod.BitcoinAddress
334+
"bitcoin" -> ReceivePaymentMethod.BitcoinAddress(newAddress = newAddress)
333335

334336
"bolt11" -> {
335337
var paymentHash: String? = null

‎crates/breez-sdk/bindings/examples/cli/langs/react-native/src/commands.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,7 @@ async function handleReceive(sdk: BreezSdkInterface, _tokenIssuer: TokenIssuerIn
433433
const expirySecsStr = parseFlag(args, '--expiry-secs', '-e')
434434
const senderPublicKey = parseFlag(args, '--sender-public-key', '-s')
435435
const hodl = hasFlag(args, '--hodl')
436+
const newAddress = hasFlag(args, '--new-address')
436437

437438
const amount = amountStr !== undefined ? BigInt(amountStr) : undefined
438439
const expirySecs = expirySecsStr !== undefined ? parseInt(expirySecsStr, 10) : undefined
@@ -468,7 +469,7 @@ async function handleReceive(sdk: BreezSdkInterface, _tokenIssuer: TokenIssuerIn
468469
}
469470

470471
case 'bitcoin':
471-
paymentMethod = new ReceivePaymentMethod.BitcoinAddress()
472+
paymentMethod = new ReceivePaymentMethod.BitcoinAddress({ newAddress })
472473
break
473474

474475
case 'bolt11': {

‎crates/breez-sdk/breez-bench/src/bin/bench.rs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -858,7 +858,7 @@ async fn fund_via_faucet(sdk_instance: &mut BenchSdkInstance, min_balance: u64)
858858
let receive = sdk_instance
859859
.sdk
860860
.receive_payment(ReceivePaymentRequest {
861-
payment_method: ReceivePaymentMethod::BitcoinAddress,
861+
payment_method: ReceivePaymentMethod::BitcoinAddress { new_address: None },
862862
})
863863
.await?;
864864
let deposit_address = receive.payment_request;

‎crates/breez-sdk/breez-bench/src/bin/claim_perf.rs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,7 @@ async fn fund_sdk_via_faucet(
439439
// Get deposit address
440440
let receive = sdk
441441
.receive_payment(ReceivePaymentRequest {
442-
payment_method: ReceivePaymentMethod::BitcoinAddress,
442+
payment_method: ReceivePaymentMethod::BitcoinAddress { new_address: None },
443443
})
444444
.await?;
445445
let deposit_address = receive.payment_request;

‎crates/breez-sdk/breez-bench/src/bin/parallel_perf.rs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -694,7 +694,7 @@ async fn fund_via_faucet(sdk_instance: &mut BenchSdkInstance, amount: u64) -> Re
694694
let receive = sdk_instance
695695
.sdk
696696
.receive_payment(ReceivePaymentRequest {
697-
payment_method: ReceivePaymentMethod::BitcoinAddress,
697+
payment_method: ReceivePaymentMethod::BitcoinAddress { new_address: None },
698698
})
699699
.await?;
700700
let deposit_address = receive.payment_request;

‎crates/breez-sdk/breez-itest/src/helpers.rs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -770,7 +770,7 @@ async fn receive_and_fund_inner(
770770
let receive = sdk_instance
771771
.sdk
772772
.receive_payment(ReceivePaymentRequest {
773-
payment_method: ReceivePaymentMethod::BitcoinAddress,
773+
payment_method: ReceivePaymentMethod::BitcoinAddress { new_address: None },
774774
})
775775
.await?;
776776

‎crates/breez-sdk/breez-itest/tests/deposit_withdraw.rs‎

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ async fn test_onchain_withdraw_to_static_address(
6767
let bob_address = bob
6868
.sdk
6969
.receive_payment(ReceivePaymentRequest {
70-
payment_method: ReceivePaymentMethod::BitcoinAddress,
70+
payment_method: ReceivePaymentMethod::BitcoinAddress { new_address: None },
7171
})
7272
.await?
7373
.payment_request;
@@ -156,7 +156,7 @@ async fn test_deposit_fee_manual_claim(
156156
let addr = bob
157157
.sdk
158158
.receive_payment(ReceivePaymentRequest {
159-
payment_method: ReceivePaymentMethod::BitcoinAddress,
159+
payment_method: ReceivePaymentMethod::BitcoinAddress { new_address: None },
160160
})
161161
.await?
162162
.payment_request;
@@ -253,7 +253,7 @@ async fn test_send_all_to_bitcoin_address(
253253
let bob_address = bob
254254
.sdk
255255
.receive_payment(ReceivePaymentRequest {
256-
payment_method: ReceivePaymentMethod::BitcoinAddress,
256+
payment_method: ReceivePaymentMethod::BitcoinAddress { new_address: None },
257257
})
258258
.await?
259259
.payment_request;
@@ -342,7 +342,7 @@ async fn test_deposit_fee_refund(#[future] bob_no_fee_sdk: Result<SdkInstance>)
342342
let addr = bob
343343
.sdk
344344
.receive_payment(ReceivePaymentRequest {
345-
payment_method: ReceivePaymentMethod::BitcoinAddress,
345+
payment_method: ReceivePaymentMethod::BitcoinAddress { new_address: None },
346346
})
347347
.await?
348348
.payment_request;
@@ -450,7 +450,7 @@ async fn test_deposit_low_amount_refund_fee_rate(
450450
let bob_address = bob
451451
.sdk
452452
.receive_payment(ReceivePaymentRequest {
453-
payment_method: ReceivePaymentMethod::BitcoinAddress,
453+
payment_method: ReceivePaymentMethod::BitcoinAddress { new_address: None },
454454
})
455455
.await?
456456
.payment_request;
@@ -538,7 +538,9 @@ async fn test_deposits_to_multiple_addresses(
538538
let addr = alice
539539
.sdk
540540
.receive_payment(ReceivePaymentRequest {
541-
payment_method: ReceivePaymentMethod::BitcoinAddress,
541+
payment_method: ReceivePaymentMethod::BitcoinAddress {
542+
new_address: Some(true),
543+
},
542544
})
543545
.await?
544546
.payment_request;
@@ -551,7 +553,35 @@ async fn test_deposits_to_multiple_addresses(
551553
assert_eq!(
552554
unique.len(),
553555
addresses.len(),
554-
"Every rotated address should be unique"
556+
"Every new address should be unique"
557+
);
558+
559+
// Calling with new_address=false (or None) should return the same address.
560+
let reused_1 = alice
561+
.sdk
562+
.receive_payment(ReceivePaymentRequest {
563+
payment_method: ReceivePaymentMethod::BitcoinAddress {
564+
new_address: Some(false),
565+
},
566+
})
567+
.await?
568+
.payment_request;
569+
let reused_2 = alice
570+
.sdk
571+
.receive_payment(ReceivePaymentRequest {
572+
payment_method: ReceivePaymentMethod::BitcoinAddress { new_address: None },
573+
})
574+
.await?
575+
.payment_request;
576+
assert_eq!(
577+
reused_1, reused_2,
578+
"new_address=false and None should return the same address"
579+
);
580+
// The reused address should match the last one obtained with new_address=true.
581+
assert_eq!(
582+
reused_1,
583+
*addresses.last().unwrap(),
584+
"new_address=false should return the latest address"
555585
);
556586

557587
let first_addr = &addresses[0];

0 commit comments

Comments
 (0)