@@ -21,6 +21,7 @@ import (
21
21
"github.com/xssnick/ton-payment-network/tonpayments/db"
22
22
"github.com/xssnick/ton-payment-network/tonpayments/db/leveldb"
23
23
"github.com/xssnick/ton-payment-network/tonpayments/transport"
24
+ tonaddr "github.com/xssnick/tonutils-go/address"
24
25
"github.com/xssnick/tonutils-go/adnl"
25
26
"github.com/xssnick/tonutils-go/adnl/address"
26
27
"github.com/xssnick/tonutils-go/adnl/dht"
@@ -194,10 +195,12 @@ func main() {
194
195
return
195
196
}
196
197
198
+ var wlt * wallet.Wallet
197
199
var pmt tunnel.PaymentConfig
200
+ var apiClient ton.APIClientWrapped
198
201
if cfg .PaymentsEnabled {
199
202
log .Info ().Msg ("Initializing payment node " )
200
- pm := preparePayments (context .Background (), gCfg , dhtClient , cfg )
203
+ pm , w , apiC := preparePayments (context .Background (), gCfg , dhtClient , cfg )
201
204
go pm .Start ()
202
205
203
206
var ch []byte
@@ -224,6 +227,8 @@ func main() {
224
227
MinPricePerPacketRoute : cfg .Payments .MinPricePerPacketRoute ,
225
228
MinPricePerPacketInOut : cfg .Payments .MinPricePerPacketInOut ,
226
229
}
230
+ wlt = w
231
+ apiClient = apiC
227
232
}
228
233
229
234
lvl := zerolog .InfoLevel
@@ -322,6 +327,71 @@ func main() {
322
327
log .Info ().Msg ("Capacity left: " + tlb .FromNanoTON (amount ).String () + " TON" )
323
328
}
324
329
continue
330
+ case "wallet-ton-balance" :
331
+ if wlt == nil {
332
+ log .Error ().Msg ("payments are not enabled" )
333
+ continue
334
+ }
335
+
336
+ blk , err := apiClient .CurrentMasterchainInfo (context .Background ())
337
+ if err != nil {
338
+ log .Error ().Err (err ).Msg ("failed to get current masterchain info" )
339
+ continue
340
+ }
341
+
342
+ balance , err := wlt .GetBalance (context .Background (), blk )
343
+ if err != nil {
344
+ log .Error ().Err (err ).Msg ("failed to get balance" )
345
+ continue
346
+ }
347
+
348
+ log .Info ().Msgf ("wallet balance: %s TON" , balance .String ())
349
+ case "wallet-ton-transfer" :
350
+ if wlt == nil {
351
+ log .Error ().Msg ("payments are not enabled" )
352
+ continue
353
+ }
354
+
355
+ log .Info ().Msg ("enter address to transfer to:" )
356
+
357
+ var addrStr string
358
+ _ , _ = fmt .Scanln (& addrStr )
359
+
360
+ addr , err := tonaddr .ParseAddr (addrStr )
361
+ if err != nil {
362
+ log .Error ().Err (err ).Msg ("incorrect format of address" )
363
+ continue
364
+ }
365
+
366
+ log .Info ().Msg ("input amount:" )
367
+ var strAmt string
368
+ _ , _ = fmt .Scanln (& strAmt )
369
+
370
+ amt , err := tlb .FromTON (strAmt )
371
+ if err != nil {
372
+ log .Error ().Err (err ).Msg ("incorrect format of amount" )
373
+ continue
374
+ }
375
+
376
+ log .Info ().Msg ("input comment:" )
377
+ var comment string
378
+ _ , _ = fmt .Scanln (& comment )
379
+
380
+ log .Info ().
381
+ Str ("to_address" , addr .String ()).
382
+ Str ("amount" , amt .String ()).
383
+ Msg ("transferring..." )
384
+
385
+ time .Sleep (3 * time .Second ) // give user some time to cancel
386
+
387
+ pmt .Service .GetPrivateKey ()
388
+
389
+ tx , _ , err := wlt .TransferWaitTransaction (context .Background (), addr , amt , comment )
390
+ if err != nil {
391
+ log .Error ().Err (err ).Msg ("failed to transfer" )
392
+ continue
393
+ }
394
+ log .Info ().Str ("hash" , base64 .URLEncoding .EncodeToString (tx .Hash )).Msg ("transfer transaction committed" )
325
395
}
326
396
327
397
}
@@ -355,15 +425,15 @@ func formatNumInt(packets int64) string {
355
425
return fmt .Sprintf ("%.2f%s" , sizeFloat , sizes [sizeIndex ])
356
426
}
357
427
358
- func preparePayments (ctx context.Context , gCfg * liteclient.GlobalConfig , dhtClient * dht.Client , cfg * config.Config ) * tonpayments.Service {
428
+ func preparePayments (ctx context.Context , gCfg * liteclient.GlobalConfig , dhtClient * dht.Client , cfg * config.Config ) ( * tonpayments.Service , * wallet. Wallet , ton. APIClientWrapped ) {
359
429
client := liteclient .NewConnectionPool ()
360
430
361
431
log .Info ().Msg ("initializing ton client with verified proof chain..." )
362
432
363
433
// connect to lite servers
364
434
if err := client .AddConnectionsFromConfig (ctx , gCfg ); err != nil {
365
435
log .Fatal ().Err (err ).Msg ("ton connect err" )
366
- return nil
436
+ return nil , nil , nil
367
437
}
368
438
369
439
policy := ton .ProofCheckPolicyFast
@@ -383,25 +453,25 @@ func preparePayments(ctx context.Context, gCfg *liteclient.GlobalConfig, dhtClie
383
453
384
454
if err := gate .StartClient (); err != nil {
385
455
log .Fatal ().Err (err ).Msg ("failed to init adnl payments gateway" )
386
- return nil
456
+ return nil , nil , nil
387
457
}
388
458
389
459
walletPrv := ed25519 .NewKeyFromSeed (cfg .Payments .WalletPrivateKey )
390
460
fdb , freshDb , err := leveldb .NewDB (cfg .Payments .DBPath , nodePrv .Public ().(ed25519.PublicKey ))
391
461
if err != nil {
392
462
log .Fatal ().Err (err ).Msg ("failed to init leveldb" )
393
- return nil
463
+ return nil , nil , nil
394
464
}
395
465
396
466
if freshDb {
397
467
if err = fdb .SetMigrationVersion (context .Background (), len (db .Migrations )); err != nil {
398
468
log .Fatal ().Err (err ).Msg ("failed to set initial migration version" )
399
- return nil
469
+ return nil , nil , nil
400
470
}
401
471
} else {
402
472
if err = db .RunMigrations (fdb ); err != nil {
403
473
log .Fatal ().Err (err ).Msg ("failed to run migrations" )
404
- return nil
474
+ return nil , nil , nil
405
475
}
406
476
}
407
477
@@ -411,7 +481,7 @@ func preparePayments(ctx context.Context, gCfg *liteclient.GlobalConfig, dhtClie
411
481
if bo , err := fdb .GetBlockOffset (ctx ); err != nil {
412
482
if ! errors .Is (err , db .ErrNotFound ) {
413
483
log .Fatal ().Err (err ).Msg ("failed to load block offset" )
414
- return nil
484
+ return nil , nil , nil
415
485
}
416
486
} else {
417
487
seqno = bo .Seqno
@@ -426,12 +496,14 @@ func preparePayments(ctx context.Context, gCfg *liteclient.GlobalConfig, dhtClie
426
496
sc := chain .NewScanner (apiClient , seqno , scanLog )
427
497
if err = sc .StartSmall (inv ); err != nil {
428
498
log .Fatal ().Err (err ).Msg ("failed to start scanner" )
499
+ return nil , nil , nil
429
500
}
430
501
fdb .SetOnChannelUpdated (sc .OnChannelUpdate )
431
502
432
503
chList , err := fdb .GetChannels (context .Background (), nil , db .ChannelStateAny )
433
504
if err != nil {
434
505
log .Fatal ().Err (err ).Msg ("failed to load channels" )
506
+ return nil , nil , nil
435
507
}
436
508
437
509
for _ , channel := range chList {
@@ -440,29 +512,22 @@ func preparePayments(ctx context.Context, gCfg *liteclient.GlobalConfig, dhtClie
440
512
}
441
513
}
442
514
443
- w , err := wallet .FromPrivateKey (apiClient , walletPrv , wallet.ConfigHighloadV3 {
444
- MessageTTL : 3 * 60 + 30 ,
445
- MessageBuilder : func (ctx context.Context , subWalletId uint32 ) (id uint32 , createdAt int64 , err error ) {
446
- createdAt = time .Now ().Unix () - 30 // something older than last master block, to pass through LS external's time validation
447
- id = uint32 (createdAt ) % (1 << 23 ) // TODO: store seqno in db
448
- return
449
- },
450
- })
515
+ w , err := chain .InitWallet (apiClient , walletPrv )
451
516
if err != nil {
452
517
log .Fatal ().Err (err ).Msg ("failed to init wallet" )
453
- return nil
518
+ return nil , nil , nil
454
519
}
455
520
log .Info ().Str ("addr" , w .WalletAddress ().String ()).Msg ("wallet initialized" )
456
521
457
522
svc , err := tonpayments .NewService (apiClient , fdb , tr , w , inv , nodePrv , cfg .Payments .ChannelsConfig )
458
523
if err != nil {
459
524
log .Fatal ().Err (err ).Msg ("failed to init payments service" )
460
- return nil
525
+ return nil , nil , nil
461
526
}
462
527
tr .SetService (svc )
463
528
log .Info ().Str ("pubkey" , base64 .StdEncoding .EncodeToString (nodePrv .Public ().(ed25519.PublicKey ))).Msg ("payment node initialized" )
464
529
465
- return svc
530
+ return svc , w , apiClient
466
531
}
467
532
468
533
func preparePaymentChannel (ctx context.Context , pmt * tonpayments.Service , ch []byte ) ([]byte , error ) {
0 commit comments