1
1
extern crate core;
2
2
3
- use std:: { fs, path:: PathBuf } ;
3
+ use std:: { fs, path:: PathBuf , str :: FromStr } ;
4
4
5
5
use base64:: { prelude:: BASE64_STANDARD , Engine } ;
6
6
use clap:: { Parser , Subcommand } ;
@@ -10,7 +10,9 @@ use jsonrpsee::{
10
10
} ;
11
11
use protocol:: {
12
12
bitcoin:: { Amount , FeeRate , OutPoint , Txid } ,
13
+ hasher:: { KeyHasher , SpaceHash } ,
13
14
opcodes:: OP_SETALL ,
15
+ sname:: { NameLike , SName } ,
14
16
Covenant , FullSpaceOut ,
15
17
} ;
16
18
use serde:: { Deserialize , Serialize } ;
@@ -20,6 +22,7 @@ use spaced::{
20
22
BidParams , ExecuteParams , OpenParams , RegisterParams , RpcClient , RpcWalletRequest ,
21
23
RpcWalletTxBuilder , SendCoinsParams , TransferSpacesParams ,
22
24
} ,
25
+ store:: Sha256 ,
23
26
wallets:: AddressKind ,
24
27
} ;
25
28
@@ -222,6 +225,12 @@ enum Commands {
222
225
/// compatible with most bitcoin wallets
223
226
#[ command( name = "getnewaddress" ) ]
224
227
GetCoinAddress ,
228
+ /// Calculate a spacehash from the specified space name
229
+ #[ command( name = "spacehash" ) ]
230
+ SpaceHash {
231
+ /// The space name
232
+ space : String ,
233
+ } ,
225
234
}
226
235
227
236
struct SpaceCli {
@@ -264,7 +273,7 @@ impl SpaceCli {
264
273
let result = self
265
274
. client
266
275
. wallet_send_request (
267
- self . wallet . clone ( ) ,
276
+ & self . wallet ,
268
277
RpcWalletTxBuilder {
269
278
auction_outputs,
270
279
requests : match req {
@@ -360,6 +369,13 @@ async fn main() -> anyhow::Result<()> {
360
369
Ok ( ( ) )
361
370
}
362
371
372
+ fn space_hash ( spaceish : & str ) -> anyhow:: Result < String > {
373
+ let space = normalize_space ( & spaceish) ;
374
+ let sname = SName :: from_str ( & space) ?;
375
+ let spacehash = SpaceHash :: from ( Sha256 :: hash ( sname. to_bytes ( ) ) ) ;
376
+ Ok ( hex:: encode ( spacehash. as_slice ( ) ) )
377
+ }
378
+
363
379
async fn handle_commands (
364
380
cli : & SpaceCli ,
365
381
command : Commands ,
@@ -373,7 +389,7 @@ async fn handle_commands(
373
389
for ( priority, spacehash) in hashes {
374
390
let outpoint = cli
375
391
. client
376
- . get_space_owner ( hex:: encode ( spacehash. as_slice ( ) ) )
392
+ . get_space_owner ( & hex:: encode ( spacehash. as_slice ( ) ) )
377
393
. await ?;
378
394
379
395
if let Some ( outpoint) = outpoint {
@@ -404,31 +420,31 @@ async fn handle_commands(
404
420
println ! ( "{} sat" , Amount :: from_sat( response) . to_string( ) ) ;
405
421
}
406
422
Commands :: GetSpace { space } => {
407
- let space = normalize_space ( & space) ;
408
- let response = cli. client . get_space ( space ) . await ?;
423
+ let space_hash = space_hash ( & space) . map_err ( |e| ClientError :: Custom ( e . to_string ( ) ) ) ? ;
424
+ let response = cli. client . get_space ( & space_hash ) . await ?;
409
425
println ! ( "{}" , serde_json:: to_string_pretty( & response) ?) ;
410
426
}
411
427
Commands :: GetSpaceOut { outpoint } => {
412
428
let response = cli. client . get_spaceout ( outpoint) . await ?;
413
429
println ! ( "{}" , serde_json:: to_string_pretty( & response) ?) ;
414
430
}
415
431
Commands :: CreateWallet { name } => {
416
- cli. client . wallet_create ( name) . await ?;
432
+ cli. client . wallet_create ( & name) . await ?;
417
433
}
418
434
Commands :: LoadWallet { name } => {
419
- cli. client . wallet_load ( name) . await ?;
435
+ cli. client . wallet_load ( & name) . await ?;
420
436
}
421
437
Commands :: ImportWallet { path } => {
422
438
let content =
423
439
fs:: read_to_string ( path) . map_err ( |e| ClientError :: Custom ( e. to_string ( ) ) ) ?;
424
- cli. client . wallet_import ( content) . await ?;
440
+ cli. client . wallet_import ( & content) . await ?;
425
441
}
426
442
Commands :: ExportWallet { name } => {
427
- let result = cli. client . wallet_export ( name) . await ?;
443
+ let result = cli. client . wallet_export ( & name) . await ?;
428
444
println ! ( "{}" , result) ;
429
445
}
430
446
Commands :: GetWalletInfo { name } => {
431
- let result = cli. client . wallet_get_info ( name) . await ?;
447
+ let result = cli. client . wallet_get_info ( & name) . await ?;
432
448
println ! ( "{}" , serde_json:: to_string_pretty( & result) . expect( "result" ) ) ;
433
449
}
434
450
Commands :: GetServerInfo => {
@@ -543,46 +559,49 @@ async fn handle_commands(
543
559
. await ?;
544
560
}
545
561
Commands :: ListUnspent => {
546
- let spaces = cli. client . wallet_list_unspent ( cli. wallet . clone ( ) ) . await ?;
562
+ let spaces = cli. client . wallet_list_unspent ( & cli. wallet ) . await ?;
547
563
println ! ( "{}" , serde_json:: to_string_pretty( & spaces) ?) ;
548
564
}
549
565
Commands :: ListAuctionOutputs => {
550
- let spaces = cli
551
- . client
552
- . wallet_list_auction_outputs ( cli. wallet . clone ( ) )
553
- . await ?;
566
+ let spaces = cli. client . wallet_list_auction_outputs ( & cli. wallet ) . await ?;
554
567
println ! ( "{}" , serde_json:: to_string_pretty( & spaces) ?) ;
555
568
}
556
569
Commands :: ListSpaces => {
557
- let spaces = cli. client . wallet_list_spaces ( cli. wallet . clone ( ) ) . await ?;
570
+ let spaces = cli. client . wallet_list_spaces ( & cli. wallet ) . await ?;
558
571
println ! ( "{}" , serde_json:: to_string_pretty( & spaces) ?) ;
559
572
}
560
573
Commands :: Balance => {
561
- let balance = cli. client . wallet_get_balance ( cli. wallet . clone ( ) ) . await ?;
574
+ let balance = cli. client . wallet_get_balance ( & cli. wallet ) . await ?;
562
575
println ! ( "{}" , serde_json:: to_string_pretty( & balance) ?) ;
563
576
}
564
577
Commands :: GetCoinAddress => {
565
578
let response = cli
566
579
. client
567
- . wallet_get_new_address ( cli. wallet . clone ( ) , AddressKind :: Coin )
580
+ . wallet_get_new_address ( & cli. wallet , AddressKind :: Coin )
568
581
. await ?;
569
582
println ! ( "{}" , response) ;
570
583
}
571
584
Commands :: GetSpaceAddress => {
572
585
let response = cli
573
586
. client
574
- . wallet_get_new_address ( cli. wallet . clone ( ) , AddressKind :: Space )
587
+ . wallet_get_new_address ( & cli. wallet , AddressKind :: Space )
575
588
. await ?;
576
589
println ! ( "{}" , response) ;
577
590
}
578
591
Commands :: BumpFee { txid, fee_rate } => {
579
592
let fee_rate = FeeRate :: from_sat_per_vb ( fee_rate) . expect ( "valid fee rate" ) ;
580
593
let response = cli
581
594
. client
582
- . wallet_bump_fee ( cli. wallet . clone ( ) , txid, fee_rate)
595
+ . wallet_bump_fee ( & cli. wallet , txid, fee_rate)
583
596
. await ?;
584
597
println ! ( "{}" , serde_json:: to_string_pretty( & response) ?) ;
585
598
}
599
+ Commands :: SpaceHash { space } => {
600
+ println ! (
601
+ "{}" ,
602
+ space_hash( & space) . map_err( |e| ClientError :: Custom ( e. to_string( ) ) ) ?
603
+ ) ;
604
+ }
586
605
}
587
606
588
607
Ok ( ( ) )
0 commit comments