package wallet import ( "bytes" "crypto/sha256" "fmt" "github.com/btcsuite/btcd/btcutil/base58" ) // DecodeTronAddress decodes a base58check TRON address ("T...") to its 21-byte // payload (0x41 || 20-byte body), validating the checksum. The 20-byte body // (payload[1:]) is what TRON ABI parameters use (left-padded to 32 bytes). func DecodeTronAddress(addr string) ([]byte, error) { raw := base58.Decode(addr) if len(raw) != 25 { // 21 payload + 4 checksum return nil, fmt.Errorf("wallet: bad TRON address length %d", len(raw)) } payload, sum := raw[:21], raw[21:] h1 := sha256.Sum256(payload) h2 := sha256.Sum256(h1[:]) if !bytes.Equal(h2[:4], sum) { return nil, fmt.Errorf("wallet: bad TRON address checksum") } if payload[0] != tronAddrPrefix { return nil, fmt.Errorf("wallet: bad TRON address prefix 0x%02x", payload[0]) } return payload, nil } // TronAddressBodyHex returns the 20-byte address body as hex (no 0x41 prefix) — // used to build/verify ABI-encoded transfer recipients. func TronAddressBodyHex(addr string) (string, error) { payload, err := DecodeTronAddress(addr) if err != nil { return "", err } return fmt.Sprintf("%x", payload[1:]), nil }