fixed db operations
This commit is contained in:
52
api/gateway/tron/shared/tron_addr.go
Normal file
52
api/gateway/tron/shared/tron_addr.go
Normal file
@@ -0,0 +1,52 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user