Skip to content

Commit f8c3836

Browse files
committed
Ton wallet control commands
1 parent 232a9c5 commit f8c3836

File tree

2 files changed

+84
-23
lines changed

2 files changed

+84
-23
lines changed

cmd/node/main.go

Lines changed: 84 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"github.com/xssnick/ton-payment-network/tonpayments/db"
2222
"github.com/xssnick/ton-payment-network/tonpayments/db/leveldb"
2323
"github.com/xssnick/ton-payment-network/tonpayments/transport"
24+
tonaddr "github.com/xssnick/tonutils-go/address"
2425
"github.com/xssnick/tonutils-go/adnl"
2526
"github.com/xssnick/tonutils-go/adnl/address"
2627
"github.com/xssnick/tonutils-go/adnl/dht"
@@ -194,10 +195,12 @@ func main() {
194195
return
195196
}
196197

198+
var wlt *wallet.Wallet
197199
var pmt tunnel.PaymentConfig
200+
var apiClient ton.APIClientWrapped
198201
if cfg.PaymentsEnabled {
199202
log.Info().Msg("Initializing payment node ")
200-
pm := preparePayments(context.Background(), gCfg, dhtClient, cfg)
203+
pm, w, apiC := preparePayments(context.Background(), gCfg, dhtClient, cfg)
201204
go pm.Start()
202205

203206
var ch []byte
@@ -224,6 +227,8 @@ func main() {
224227
MinPricePerPacketRoute: cfg.Payments.MinPricePerPacketRoute,
225228
MinPricePerPacketInOut: cfg.Payments.MinPricePerPacketInOut,
226229
}
230+
wlt = w
231+
apiClient = apiC
227232
}
228233

229234
lvl := zerolog.InfoLevel
@@ -322,6 +327,71 @@ func main() {
322327
log.Info().Msg("Capacity left: " + tlb.FromNanoTON(amount).String() + " TON")
323328
}
324329
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")
325395
}
326396

327397
}
@@ -355,15 +425,15 @@ func formatNumInt(packets int64) string {
355425
return fmt.Sprintf("%.2f%s", sizeFloat, sizes[sizeIndex])
356426
}
357427

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) {
359429
client := liteclient.NewConnectionPool()
360430

361431
log.Info().Msg("initializing ton client with verified proof chain...")
362432

363433
// connect to lite servers
364434
if err := client.AddConnectionsFromConfig(ctx, gCfg); err != nil {
365435
log.Fatal().Err(err).Msg("ton connect err")
366-
return nil
436+
return nil, nil, nil
367437
}
368438

369439
policy := ton.ProofCheckPolicyFast
@@ -383,25 +453,25 @@ func preparePayments(ctx context.Context, gCfg *liteclient.GlobalConfig, dhtClie
383453

384454
if err := gate.StartClient(); err != nil {
385455
log.Fatal().Err(err).Msg("failed to init adnl payments gateway")
386-
return nil
456+
return nil, nil, nil
387457
}
388458

389459
walletPrv := ed25519.NewKeyFromSeed(cfg.Payments.WalletPrivateKey)
390460
fdb, freshDb, err := leveldb.NewDB(cfg.Payments.DBPath, nodePrv.Public().(ed25519.PublicKey))
391461
if err != nil {
392462
log.Fatal().Err(err).Msg("failed to init leveldb")
393-
return nil
463+
return nil, nil, nil
394464
}
395465

396466
if freshDb {
397467
if err = fdb.SetMigrationVersion(context.Background(), len(db.Migrations)); err != nil {
398468
log.Fatal().Err(err).Msg("failed to set initial migration version")
399-
return nil
469+
return nil, nil, nil
400470
}
401471
} else {
402472
if err = db.RunMigrations(fdb); err != nil {
403473
log.Fatal().Err(err).Msg("failed to run migrations")
404-
return nil
474+
return nil, nil, nil
405475
}
406476
}
407477

@@ -411,7 +481,7 @@ func preparePayments(ctx context.Context, gCfg *liteclient.GlobalConfig, dhtClie
411481
if bo, err := fdb.GetBlockOffset(ctx); err != nil {
412482
if !errors.Is(err, db.ErrNotFound) {
413483
log.Fatal().Err(err).Msg("failed to load block offset")
414-
return nil
484+
return nil, nil, nil
415485
}
416486
} else {
417487
seqno = bo.Seqno
@@ -426,12 +496,14 @@ func preparePayments(ctx context.Context, gCfg *liteclient.GlobalConfig, dhtClie
426496
sc := chain.NewScanner(apiClient, seqno, scanLog)
427497
if err = sc.StartSmall(inv); err != nil {
428498
log.Fatal().Err(err).Msg("failed to start scanner")
499+
return nil, nil, nil
429500
}
430501
fdb.SetOnChannelUpdated(sc.OnChannelUpdate)
431502

432503
chList, err := fdb.GetChannels(context.Background(), nil, db.ChannelStateAny)
433504
if err != nil {
434505
log.Fatal().Err(err).Msg("failed to load channels")
506+
return nil, nil, nil
435507
}
436508

437509
for _, channel := range chList {
@@ -440,29 +512,22 @@ func preparePayments(ctx context.Context, gCfg *liteclient.GlobalConfig, dhtClie
440512
}
441513
}
442514

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)
451516
if err != nil {
452517
log.Fatal().Err(err).Msg("failed to init wallet")
453-
return nil
518+
return nil, nil, nil
454519
}
455520
log.Info().Str("addr", w.WalletAddress().String()).Msg("wallet initialized")
456521

457522
svc, err := tonpayments.NewService(apiClient, fdb, tr, w, inv, nodePrv, cfg.Payments.ChannelsConfig)
458523
if err != nil {
459524
log.Fatal().Err(err).Msg("failed to init payments service")
460-
return nil
525+
return nil, nil, nil
461526
}
462527
tr.SetService(svc)
463528
log.Info().Str("pubkey", base64.StdEncoding.EncodeToString(nodePrv.Public().(ed25519.PublicKey))).Msg("payment node initialized")
464529

465-
return svc
530+
return svc, w, apiClient
466531
}
467532

468533
func preparePaymentChannel(ctx context.Context, pmt *tonpayments.Service, ch []byte) ([]byte, error) {

go.sum

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,6 @@ github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFd
6363
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
6464
github.com/xssnick/raptorq v1.0.0 h1:l77lntIV/W/SV9rZjF4wRpIhikQm8nBHtB3h+qiu2cM=
6565
github.com/xssnick/raptorq v1.0.0/go.mod h1:kgEVVsZv2hP+IeV7C7985KIFsDdvYq2ARW234SBA9Q4=
66-
github.com/xssnick/ton-payment-network v0.1.1 h1:xgCyZqOoNnsQXU9Wxw6ESuhWcLykvdYvJ6TjR6D7o4U=
67-
github.com/xssnick/ton-payment-network v0.1.1/go.mod h1:5MZK8Pv5EuNFe0qDSFYZuhY3COGBLxIR17yGhkKoacQ=
68-
github.com/xssnick/ton-payment-network v0.1.2-0.20250509174604-e0288a2a55e4 h1:Nmb3nMq6xihY8CO0oLd9ImrjWzNW5lgvJQlKtAz/zy8=
69-
github.com/xssnick/ton-payment-network v0.1.2-0.20250509174604-e0288a2a55e4/go.mod h1:5MZK8Pv5EuNFe0qDSFYZuhY3COGBLxIR17yGhkKoacQ=
7066
github.com/xssnick/ton-payment-network v0.1.2-0.20250509194518-ac5c48f2446e h1:TD9LrIC24h5kLLUKx//ARyZk18jYPgMExDtY9lU8fIw=
7167
github.com/xssnick/ton-payment-network v0.1.2-0.20250509194518-ac5c48f2446e/go.mod h1:5MZK8Pv5EuNFe0qDSFYZuhY3COGBLxIR17yGhkKoacQ=
7268
github.com/xssnick/tonutils-go v1.12.1-0.20250508133817-83128a4c7520 h1:xWfOIHtOHwq0Z0Ew4Q1lRNqt6hm4ApEanjhbCDIZWlM=

0 commit comments

Comments
 (0)