1- use std:: { path :: Path , str:: FromStr } ;
1+ use std:: str:: FromStr ;
22
3+ use tabled:: {
4+ settings:: { disable:: Remove , object:: FirstRow } ,
5+ Table ,
6+ } ;
37use torus_client:: {
48 client:: TorusClient ,
5- subxt:: {
6- ext:: futures:: TryStreamExt ,
7- utils:: { AccountId32 , MultiAddress } ,
8- } ,
9+ subxt:: utils:: { AccountId32 , MultiAddress } ,
910} ;
1011
11- use crate :: { cli:: CliCtx , store:: get_key} ;
12+ use crate :: {
13+ cli:: CliCtx ,
14+ store:: { get_account, get_key} ,
15+ } ;
1216
13- #[ derive( clap:: Subcommand ) ]
14- pub enum BalanceCliCommand {
15- Free {
16- key : String ,
17- } ,
18- Staking {
19- key : String ,
20- } ,
21- Staked {
22- key : String ,
23- } ,
24- Show {
25- key : String ,
26- } ,
27- Stake {
28- key : String ,
29- target : String ,
30- amount : u128 ,
31- } ,
32- Unstake {
17+ #[ derive( clap:: Args ) ]
18+ #[ command( arg_required_else_help = true ) ]
19+ pub struct BalanceCliCommand {
20+ pub key : Option < String > ,
21+
22+ #[ command( subcommand) ]
23+ pub sub_command : Option < BalanceCliSubCommand > ,
24+ }
25+
26+ #[ derive( clap:: Subcommand , Clone ) ]
27+ pub enum BalanceCliSubCommand {
28+ Check {
3329 key : String ,
34- target : String ,
35- amount : u128 ,
3630 } ,
3731 Transfer {
3832 key : String ,
3933 target : String ,
4034 amount : u128 ,
4135 } ,
42- TransferStake {
43- key : String ,
44- source : String ,
45- target : String ,
46- amount : u128 ,
47- } ,
48- }
49-
50- pub async fn free_balance ( ctx : & CliCtx , key : String ) -> anyhow:: Result < ( ) > {
51- let key = get_key ( & key) ?;
52- let ( _key, keypair) = ctx. decrypt ( & key) ?;
53-
54- let account = keypair. account ( ) ;
55-
56- let free_balance = if ctx. is_testnet ( ) {
57- let client = TorusClient :: for_mainnet ( ) . await ?;
58- client
59- . balances ( )
60- . storage ( )
61- . account_get ( & account)
62- . await ?
63- . map ( |data| data. free )
64- } else {
65- let client = TorusClient :: for_testnet ( ) . await ?;
66- client
67- . balances ( )
68- . storage ( )
69- . account_get ( & account)
70- . await ?
71- . map ( |data| data. free )
72- } ;
73-
74- println ! (
75- "\" {}\" 's free balance: {}" ,
76- Path :: new( & key. path)
77- . file_name( )
78- . map( |path| path. to_string_lossy( ) . to_string( ) )
79- . unwrap_or( key. path) ,
80- free_balance. unwrap_or( 0 )
81- ) ;
82-
83- Ok ( ( ) )
8436}
8537
86- pub async fn staking_balance ( ctx : & CliCtx , key : String ) -> anyhow:: Result < ( ) > {
87- let key = get_key ( & key) ?;
88- let ( _key, keypair) = ctx. decrypt ( & key) ?;
89-
90- let account = keypair. account ( ) ;
38+ pub async fn check ( ctx : & CliCtx , key : String ) -> anyhow:: Result < ( ) > {
39+ let account = get_account ( & key) ?;
9140
92- let staked_balance = if ctx. is_testnet ( ) {
93- let client = TorusClient :: for_mainnet ( ) . await ?;
94- client
95- . balances ( )
96- . storage ( )
97- . account_get ( & account)
98- . await ?
99- . map ( |data| data. reserved )
100- } else {
41+ let data = if ctx. is_testnet ( ) {
10142 let client = TorusClient :: for_testnet ( ) . await ?;
10243 client
103- . balances ( )
44+ . system ( )
10445 . storage ( )
10546 . account_get ( & account)
10647 . await ?
107- . map ( |data| data. reserved )
108- } ;
109-
110- println ! (
111- "\" {}\" 's staking balance: {}" ,
112- Path :: new( & key. path)
113- . file_name( )
114- . map( |path| path. to_string_lossy( ) . to_string( ) )
115- . unwrap_or( key. path) ,
116- staked_balance. unwrap_or( 0 )
117- ) ;
118-
119- Ok ( ( ) )
120- }
121-
122- pub async fn staked_balance ( ctx : & CliCtx , key : String ) -> anyhow:: Result < ( ) > {
123- let key = get_key ( & key) ?;
124- let ( _key, keypair) = ctx. decrypt ( & key) ?;
125-
126- let account = keypair. account ( ) ;
127-
128- let staked_balance = if ctx. is_testnet ( ) {
129- let client = TorusClient :: for_mainnet ( ) . await ?;
130- client
131- . torus0 ( )
132- . storage ( )
133- . staked_by_iter1 ( & account)
134- . await ?
135- . try_fold ( 0u128 , async move |a, ( _, amount) | Ok ( a + amount) )
136- . await ?
48+ . map ( |info| ( info. data . free , info. data . reserved , info. data . frozen ) )
13749 } else {
138- let client = TorusClient :: for_testnet ( ) . await ?;
139- client
140- . torus0 ( )
141- . storage ( )
142- . staked_by_iter1 ( & account)
143- . await ?
144- . try_fold ( 0u128 , async move |a, ( _, amount) | Ok ( a + amount) )
145- . await ?
146- } ;
147-
148- println ! (
149- "\" {}\" 's staked balance: {}" ,
150- Path :: new( & key. path)
151- . file_name( )
152- . map( |path| path. to_string_lossy( ) . to_string( ) )
153- . unwrap_or( key. path) ,
154- staked_balance
155- ) ;
156-
157- Ok ( ( ) )
158- }
159-
160- pub async fn show_balance ( ctx : & CliCtx , key : String ) -> anyhow:: Result < ( ) > {
161- let key = get_key ( & key) ?;
162- let ( _key, keypair) = ctx. decrypt ( & key) ?;
163-
164- let account = keypair. account ( ) ;
165-
166- let full_balance = if ctx. is_testnet ( ) {
16750 let client = TorusClient :: for_mainnet ( ) . await ?;
16851 client
169- . balances ( )
52+ . system ( )
17053 . storage ( )
17154 . account_get ( & account)
17255 . await ?
173- . map ( |data| data. reserved + data. free + data. frozen )
174- } else {
175- let client = TorusClient :: for_testnet ( ) . await ?;
176- client
177- . balances ( )
178- . storage ( )
179- . account_get ( & account)
180- . await ?
181- . map ( |data| data. reserved + data. free + data. frozen )
182- } ;
56+ . map ( |info| ( info. data . free , info. data . reserved , info. data . frozen ) )
57+ }
58+ . unwrap_or ( ( 0 , 0 , 0 ) ) ;
59+
60+ let mut table = Table :: new ( vec ! [
61+ ( ( "free" . to_string( ) ) , data. 0 . to_string( ) ) ,
62+ (
63+ ( "reserved (stake + others)" . to_string( ) ) ,
64+ ( data. 1 + data. 2 ) . to_string( ) ,
65+ ) ,
66+ ] ) ;
67+ table. with ( Remove :: row ( FirstRow ) ) ;
18368
184- println ! (
185- "\" {}\" 's full balance: {}" ,
186- Path :: new( & key. path)
187- . file_name( )
188- . map( |path| path. to_string_lossy( ) . to_string( ) )
189- . unwrap_or( key. path) ,
190- full_balance. unwrap_or( 0 )
191- ) ;
69+ println ! ( "{table}" ) ;
19270
19371 Ok ( ( ) )
19472}
19573
196- pub async fn transfer_balance (
74+ pub async fn transfer (
19775 ctx : & CliCtx ,
19876 key : String ,
19977 target : String ,
@@ -207,14 +85,14 @@ pub async fn transfer_balance(
20785 println ! ( "Transfering..." ) ;
20886
20987 if ctx. is_testnet ( ) {
210- let client = TorusClient :: for_mainnet ( ) . await ?;
88+ let client = TorusClient :: for_testnet ( ) . await ?;
21189 client
21290 . balances ( )
21391 . calls ( )
21492 . transfer_keep_alive_wait ( MultiAddress :: Id ( target) , amount, keypair)
21593 . await ?
21694 } else {
217- let client = TorusClient :: for_testnet ( ) . await ?;
95+ let client = TorusClient :: for_mainnet ( ) . await ?;
21896 client
21997 . balances ( )
22098 . calls ( )
@@ -226,107 +104,3 @@ pub async fn transfer_balance(
226104
227105 Ok ( ( ) )
228106}
229-
230- pub async fn stake_balance (
231- ctx : & CliCtx ,
232- key : String ,
233- target : String ,
234- amount : u128 ,
235- ) -> anyhow:: Result < ( ) > {
236- let key = get_key ( & key) ?;
237- let ( _key, keypair) = ctx. decrypt ( & key) ?;
238-
239- let target = AccountId32 :: from_str ( & target) ?;
240-
241- println ! ( "Staking..." ) ;
242-
243- if ctx. is_testnet ( ) {
244- let client = TorusClient :: for_mainnet ( ) . await ?;
245- client
246- . torus0 ( )
247- . calls ( )
248- . add_stake_wait ( target, amount, keypair)
249- . await ?
250- } else {
251- let client = TorusClient :: for_testnet ( ) . await ?;
252- client
253- . torus0 ( )
254- . calls ( )
255- . add_stake_wait ( target, amount, keypair)
256- . await ?
257- } ;
258-
259- println ! ( "Staked successfully!" ) ;
260-
261- Ok ( ( ) )
262- }
263-
264- pub async fn transfer_staked_balance (
265- ctx : & CliCtx ,
266- key : String ,
267- source : String ,
268- target : String ,
269- amount : u128 ,
270- ) -> anyhow:: Result < ( ) > {
271- let key = get_key ( & key) ?;
272- let ( _key, keypair) = ctx. decrypt ( & key) ?;
273-
274- let source = AccountId32 :: from_str ( & source) ?;
275- let target = AccountId32 :: from_str ( & target) ?;
276-
277- println ! ( "Transfering stake..." ) ;
278-
279- if ctx. is_testnet ( ) {
280- let client = TorusClient :: for_mainnet ( ) . await ?;
281- client
282- . torus0 ( )
283- . calls ( )
284- . transfer_stake_wait ( source, target, amount, keypair)
285- . await ?
286- } else {
287- let client = TorusClient :: for_testnet ( ) . await ?;
288- client
289- . torus0 ( )
290- . calls ( )
291- . add_stake_wait ( target, amount, keypair)
292- . await ?
293- } ;
294-
295- println ! ( "Stake transfered successfully!" ) ;
296-
297- Ok ( ( ) )
298- }
299-
300- pub async fn unstake_balance (
301- ctx : & CliCtx ,
302- key : String ,
303- target : String ,
304- amount : u128 ,
305- ) -> anyhow:: Result < ( ) > {
306- let key = get_key ( & key) ?;
307- let ( _key, keypair) = ctx. decrypt ( & key) ?;
308-
309- let target = AccountId32 :: from_str ( & target) ?;
310-
311- println ! ( "Unstaking..." ) ;
312-
313- if ctx. is_testnet ( ) {
314- let client = TorusClient :: for_mainnet ( ) . await ?;
315- client
316- . torus0 ( )
317- . calls ( )
318- . remove_stake_wait ( target, amount, keypair)
319- . await ?
320- } else {
321- let client = TorusClient :: for_testnet ( ) . await ?;
322- client
323- . torus0 ( )
324- . calls ( )
325- . remove_stake_wait ( target, amount, keypair)
326- . await ?
327- } ;
328-
329- println ! ( "Unstaked successfully!" ) ;
330-
331- Ok ( ( ) )
332- }
0 commit comments