Files
sendico/api/gateway/tron/shared/tron_addr.go
2026-02-05 16:27:43 +01:00

53 lines
1.1 KiB
Go

package shared
import (
"bytes"
"crypto/sha256"
"encoding/hex"
"fmt"
"strings"
"github.com/shengdoushi/base58"
"github.com/tech/sendico/pkg/merrors"
)
func TronBase58ToHex(addr string) (string, error) {
const (
tronAddrLen = 25
tronPrefix = byte(0x41)
)
raw, err := base58.Decode(strings.TrimSpace(addr), base58.BitcoinAlphabet)
if err != nil {
return "", merrors.InvalidArgument(
fmt.Sprintf("tron address: base58 decode failed: %s", err.Error()),
)
}
if len(raw) != tronAddrLen {
return "", merrors.DataConflict(
fmt.Sprintf("tron address: invalid length %d", len(raw)),
)
}
// 21 байт: prefix + 20 байт EVM
payload := raw[:21]
checksum := raw[21:]
if payload[0] != tronPrefix {
return "", merrors.DataConflict("tron address: invalid prefix")
}
// validate checksum (double sha256)
h1 := sha256.Sum256(payload)
h2 := sha256.Sum256(h1[:])
expectedChecksum := h2[:4]
if !bytes.Equal(expectedChecksum, checksum) {
return "", merrors.DataConflict("tron address: invalid checksum")
}
evm := payload[1:]
return "0x" + hex.EncodeToString(evm), nil
}