package tron import ( "fmt" "strings" "custodial/pkg/locker" "github.com/btcsuite/btcd/btcec/v2" "github.com/decred/dcrd/dcrec/secp256k1/v4" "github.com/fbsobreira/gotron-sdk/pkg/address" "github.com/fbsobreira/gotron-sdk/pkg/keys/hd" "github.com/tyler-smith/go-bip39" ) const MAX_ACCOUNT_INDEX int = 4294967295 type TronAccount struct { privateKey *secp256k1.PrivateKey publicKey *secp256k1.PublicKey address string } func (t *TronAccount) PrivateKey() *secp256k1.PrivateKey { return t.privateKey } func (t *TronAccount) PublicKey() *secp256k1.PublicKey { return t.publicKey } func (t *TronAccount) Address() string { return t.address } var master [32]byte var ch [32]byte func InitMaster(mnemonic, passphrase string) { if master != [32]byte{} { return } seed := bip39.NewSeed(strings.TrimSpace(mnemonic), strings.TrimSpace(passphrase)) master, ch = hd.ComputeMastersFromSeed(seed, []byte("Bitcoin seed")) } func InitMasterFromPrivateSettings() { mnemonic := locker.GetPrivateEnv("BIP39_MNEMONIC") passphrase := locker.GetPrivateEnv("PASSPHRASE") if mnemonic == "" { panic("BIP39_MNEMONIC is not set") } InitMaster(mnemonic, passphrase) } func DeriveAccount(index int) (*TronAccount, error) { private, _ := hd.DerivePrivateKeyForPath( btcec.S256(), master, ch, fmt.Sprintf("44'/195'/0'/0/%d", index), ) t := TronAccount{} t.privateKey, t.publicKey = btcec.PrivKeyFromBytes(private[:]) t.address = address.PubkeyToAddress(*t.publicKey.ToECDSA()).String() return &t, nil } func GetSpender() (*TronAccount, error) { return DeriveAccount(MAX_ACCOUNT_INDEX) }