diff --git a/api/gateway/tron/config.dev.yml b/api/gateway/tron/config.dev.yml index d9ea74db..cc3e5022 100644 --- a/api/gateway/tron/config.dev.yml +++ b/api/gateway/tron/config.dev.yml @@ -49,9 +49,7 @@ chains: max_topup_trx: 100 tokens: - symbol: USDT - contract: "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t" - - symbol: USDC - contract: "TEkxiTehnzSmSe2XqrBj4w32RUN966rdz8" + contract: "TXYZopYRdj2D9XRtbG411XZZ3kM5VkAeBf" service_wallet: chain: tron_nile diff --git a/api/gateway/tron/config.yml b/api/gateway/tron/config.yml index 4f5bc587..8c572774 100644 --- a/api/gateway/tron/config.yml +++ b/api/gateway/tron/config.yml @@ -50,8 +50,6 @@ chains: tokens: - symbol: USDT contract: "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t" - - symbol: USDC - contract: "TEkxiTehnzSmSe2XqrBj4w32RUN966rdz8" service_wallet: chain: tron_mainnet diff --git a/api/gateway/tron/internal/service/gateway/driver/evm/evm.go b/api/gateway/tron/internal/service/gateway/driver/evm/evm.go index 7e6d360e..9cbcbaa8 100644 --- a/api/gateway/tron/internal/service/gateway/driver/evm/evm.go +++ b/api/gateway/tron/internal/service/gateway/driver/evm/evm.go @@ -2,9 +2,7 @@ package evm import ( "context" - "encoding/hex" "errors" - "fmt" "math/big" "strings" "time" @@ -15,7 +13,6 @@ import ( "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/rpc" - "github.com/shengdoushi/base58" "github.com/shopspring/decimal" "github.com/tech/sendico/gateway/tron/internal/service/gateway/driver" "github.com/tech/sendico/gateway/tron/internal/service/gateway/shared" @@ -62,34 +59,6 @@ const erc20ABIJSON = ` } ]` -func tronBase58ToHex(addr string) (string, error) { - const ( - tronAddrLen = 25 - tronPrefix = byte(0x41) - payloadLen = 21 - checksumBytes = 4 - ) - - raw, err := base58.Decode(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("tron address: invalid length") - } - - // 21 байт: prefix + 20 байт EVM адреса - payload := raw[:payloadLen] - - if payload[0] != tronPrefix { - return "", merrors.DataConflict("tron address: invalid prefix") - } - - evm := payload[1:payloadLen] - return "0x" + hex.EncodeToString(evm), nil -} - // NormalizeAddress validates and normalizes EVM hex addresses. func NormalizeAddress(address string) (string, error) { trimmed := strings.TrimSpace(address) @@ -155,7 +124,7 @@ func Balance(ctx context.Context, deps driver.Deps, network shared.Network, wall return nil, merrors.Internal("network rpc url is not configured") } - contract, err := tronBase58ToHex(strings.TrimSpace(wallet.ContractAddress)) + contract, err := shared.TronBase58ToHex(strings.TrimSpace(wallet.ContractAddress)) if err != nil { logger.Warn("Failed to convert contract address", zap.String("contract_address", wallet.ContractAddress)) return nil, err @@ -471,7 +440,7 @@ func SubmitTransfer(ctx context.Context, deps driver.Deps, network shared.Networ chainID := new(big.Int).SetUint64(network.ChainID) - contract, err := tronBase58ToHex(strings.TrimSpace(transfer.ContractAddress)) + contract, err := shared.TronBase58ToHex(strings.TrimSpace(transfer.ContractAddress)) if err != nil { logger.Warn("Failed to convert contract address", zap.String("contract_address", transfer.ContractAddress)) return "", err diff --git a/api/gateway/tron/internal/service/gateway/driver/tron/transfer.go b/api/gateway/tron/internal/service/gateway/driver/tron/transfer.go index 97b19f27..5eab782f 100644 --- a/api/gateway/tron/internal/service/gateway/driver/tron/transfer.go +++ b/api/gateway/tron/internal/service/gateway/driver/tron/transfer.go @@ -73,7 +73,7 @@ func SubmitTransferNative( if contract != "" { normalizedContract, err := normalizeAddress(contract) if err != nil { - logger.Warn("Invalid TRON contract address", zap.String("transfer_ref", transfer.TransferRef), zap.Error(err)) + logger.Warn("Invalid TRON contract address", zap.String("contract_address", contract), zap.String("transfer_ref", transfer.TransferRef), zap.Error(err)) return "", err } contract = normalizedContract diff --git a/api/gateway/tron/internal/service/gateway/shared/tron_addr.go b/api/gateway/tron/internal/service/gateway/shared/tron_addr.go new file mode 100644 index 00000000..681bf5c2 --- /dev/null +++ b/api/gateway/tron/internal/service/gateway/shared/tron_addr.go @@ -0,0 +1,37 @@ +package shared + +import ( + "encoding/hex" + "fmt" + + "github.com/shengdoushi/base58" + "github.com/tech/sendico/pkg/merrors" +) + +func TronBase58ToHex(addr string) (string, error) { + const ( + tronAddrLen = 25 + tronPrefix = byte(0x41) + payloadLen = 21 + checksumBytes = 4 + ) + + raw, err := base58.Decode(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("tron address: invalid length") + } + + // 21 байт: prefix + 20 байт EVM адреса + payload := raw[:payloadLen] + + if payload[0] != tronPrefix { + return "", merrors.DataConflict("tron address: invalid prefix") + } + + evm := payload[1:payloadLen] + return "0x" + hex.EncodeToString(evm), nil +} diff --git a/api/gateway/tron/storage/model/transfer.go b/api/gateway/tron/storage/model/transfer.go index cc7e61a0..1ef03a3b 100644 --- a/api/gateway/tron/storage/model/transfer.go +++ b/api/gateway/tron/storage/model/transfer.go @@ -89,7 +89,7 @@ func (t *Transfer) Normalize() { t.SourceWalletRef = strings.TrimSpace(t.SourceWalletRef) t.Network = strings.TrimSpace(strings.ToLower(t.Network)) t.TokenSymbol = strings.TrimSpace(strings.ToUpper(t.TokenSymbol)) - t.ContractAddress = strings.TrimSpace(strings.ToLower(t.ContractAddress)) + t.ContractAddress = strings.TrimSpace(t.ContractAddress) t.Destination.ManagedWalletRef = strings.TrimSpace(t.Destination.ManagedWalletRef) t.Destination.ExternalAddress = normalizeWalletAddress(t.Destination.ExternalAddress) t.Destination.ExternalAddressOriginal = strings.TrimSpace(t.Destination.ExternalAddressOriginal) diff --git a/frontend/pweb/lib/app/router/payout_shell.dart b/frontend/pweb/lib/app/router/payout_shell.dart index 959d7cb8..8422972d 100644 --- a/frontend/pweb/lib/app/router/payout_shell.dart +++ b/frontend/pweb/lib/app/router/payout_shell.dart @@ -25,7 +25,6 @@ import 'package:pweb/pages/address_book/page/page.dart'; import 'package:pweb/pages/dashboard/dashboard.dart'; import 'package:pweb/pages/invitations/page.dart'; import 'package:pweb/pages/payment_methods/page.dart'; -import 'package:pweb/pages/payout_page/page.dart'; import 'package:pweb/pages/payout_page/wallet/edit/page.dart'; import 'package:pweb/pages/report/page.dart'; import 'package:pweb/pages/settings/profile/page.dart';