From 8c87e5534e5bd93a9294d054712b3820c73d7b84 Mon Sep 17 00:00:00 2001 From: Stephan D Date: Thu, 25 Dec 2025 19:54:01 +0100 Subject: [PATCH] fixed self sending TRX issue --- .../service/gateway/driver/tron/driver.go | 18 ++++++++++ .../gateway/driver/tron/driver_test.go | 33 +++++++++++++++++++ .../service/gateway/rpcclient/clients.go | 6 ++++ .../service/gateway/transfer_execution.go | 19 ++++++++++- 4 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 api/gateway/chain/internal/service/gateway/driver/tron/driver_test.go diff --git a/api/gateway/chain/internal/service/gateway/driver/tron/driver.go b/api/gateway/chain/internal/service/gateway/driver/tron/driver.go index 35a8e4e..2124985 100644 --- a/api/gateway/chain/internal/service/gateway/driver/tron/driver.go +++ b/api/gateway/chain/internal/service/gateway/driver/tron/driver.go @@ -2,6 +2,7 @@ package tron import ( "context" + "strings" "github.com/ethereum/go-ethereum/core/types" "github.com/tech/sendico/gateway/chain/internal/service/gateway/driver" @@ -113,6 +114,9 @@ func (d *Driver) EstimateFee(ctx context.Context, deps driver.Deps, network shar if wallet == nil { return nil, merrors.InvalidArgument("wallet is required") } + if amount == nil { + return nil, merrors.InvalidArgument("amount is required") + } d.logger.Debug("Estimate fee request", zap.String("wallet_ref", wallet.WalletRef), zap.String("network", network.Name), @@ -134,6 +138,12 @@ func (d *Driver) EstimateFee(ctx context.Context, deps driver.Deps, network shar ) return nil, err } + if rpcFrom == rpcTo { + return &moneyv1.Money{ + Currency: nativeCurrency(network), + Amount: "0", + }, nil + } driverDeps := deps driverDeps.Logger = d.logger result, err := evm.EstimateFee(ctx, driverDeps, network, wallet, rpcFrom, rpcTo, amount) @@ -220,4 +230,12 @@ func (d *Driver) AwaitConfirmation(ctx context.Context, deps driver.Deps, networ return receipt, err } +func nativeCurrency(network shared.Network) string { + currency := strings.ToUpper(strings.TrimSpace(network.NativeToken)) + if currency == "" { + currency = strings.ToUpper(strings.TrimSpace(network.Name)) + } + return currency +} + var _ driver.Driver = (*Driver)(nil) diff --git a/api/gateway/chain/internal/service/gateway/driver/tron/driver_test.go b/api/gateway/chain/internal/service/gateway/driver/tron/driver_test.go new file mode 100644 index 0000000..12456eb --- /dev/null +++ b/api/gateway/chain/internal/service/gateway/driver/tron/driver_test.go @@ -0,0 +1,33 @@ +package tron + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + "github.com/tech/sendico/gateway/chain/internal/service/gateway/driver" + "github.com/tech/sendico/gateway/chain/internal/service/gateway/shared" + "github.com/tech/sendico/gateway/chain/storage/model" + moneyv1 "github.com/tech/sendico/pkg/proto/common/money/v1" + "go.uber.org/zap" +) + +func TestEstimateFeeSelfTransferReturnsZero(t *testing.T) { + logger := zap.NewNop() + d := New(logger) + wallet := &model.ManagedWallet{ + WalletRef: "wallet_ref", + DepositAddress: "TGBDXEg9rxSqGFJDcb889zqTjDwx1bmLRF", + } + network := shared.Network{ + Name: "tron_mainnet", + NativeToken: "TRX", + } + amount := &moneyv1.Money{Currency: "TRX", Amount: "1000000"} + + fee, err := d.EstimateFee(context.Background(), driver.Deps{}, network, wallet, wallet.DepositAddress, amount) + require.NoError(t, err) + require.NotNil(t, fee) + require.Equal(t, "TRX", fee.GetCurrency()) + require.Equal(t, "0", fee.GetAmount()) +} diff --git a/api/gateway/chain/internal/service/gateway/rpcclient/clients.go b/api/gateway/chain/internal/service/gateway/rpcclient/clients.go index 8a135ae..6dff514 100644 --- a/api/gateway/chain/internal/service/gateway/rpcclient/clients.go +++ b/api/gateway/chain/internal/service/gateway/rpcclient/clients.go @@ -2,6 +2,7 @@ package rpcclient import ( "context" + "encoding/json" "fmt" "io" "net/http" @@ -175,11 +176,16 @@ func (l *loggingRoundTripper) RoundTrip(req *http.Request) (*http.Response, erro respFields := append(fields, zap.Int("status_code", resp.StatusCode), ) + if contentType := strings.TrimSpace(resp.Header.Get("Content-Type")); contentType != "" { + respFields = append(respFields, zap.String("content_type", contentType)) + } if len(bodyBytes) > 0 { respFields = append(respFields, zap.String("rpc_response", truncate(string(bodyBytes), 2048))) } if resp.StatusCode >= 400 { l.logger.Warn("RPC response error", respFields...) + } else if len(bodyBytes) > 0 && !json.Valid(bodyBytes) { + l.logger.Warn("RPC response invalid JSON", respFields...) } return resp, nil diff --git a/api/gateway/chain/internal/service/gateway/transfer_execution.go b/api/gateway/chain/internal/service/gateway/transfer_execution.go index 37e9eeb..7ffd410 100644 --- a/api/gateway/chain/internal/service/gateway/transfer_execution.go +++ b/api/gateway/chain/internal/service/gateway/transfer_execution.go @@ -24,7 +24,7 @@ func (s *Service) launchTransferExecution(transferRef, sourceWalletRef string, n defer cancel() if err := s.executeTransfer(ctx, ref, walletRef, net); err != nil { - s.logger.Warn("failed to execute transfer", zap.String("transfer_ref", ref), zap.Error(err)) + s.logger.Warn("Failed to execute transfer", zap.String("transfer_ref", ref), zap.Error(err)) } }(transferRef, sourceWalletRef, network) } @@ -57,6 +57,23 @@ func (s *Service) executeTransfer(ctx context.Context, transferRef, sourceWallet return err } + sourceAddress, err := chainDriver.NormalizeAddress(sourceWallet.DepositAddress) + if err != nil { + _, _ = s.storage.Transfers().UpdateStatus(ctx, transferRef, model.TransferStatusFailed, err.Error(), "") + return err + } + if chainDriver.Name() == "tron" && sourceAddress == destinationAddress { + s.logger.Info("Self transfer detected; skipping submission", + zap.String("transfer_ref", transferRef), + zap.String("wallet_ref", sourceWalletRef), + zap.String("network", network.Name), + ) + if _, err := s.storage.Transfers().UpdateStatus(ctx, transferRef, model.TransferStatusConfirmed, "", ""); err != nil { + s.logger.Warn("Failed to update transfer status to confirmed", zap.String("transfer_ref", transferRef), zap.Error(err)) + } + return nil + } + txHash, err := chainDriver.SubmitTransfer(ctx, driverDeps, network, transfer, sourceWallet, destinationAddress) if err != nil { _, _ = s.storage.Transfers().UpdateStatus(ctx, transferRef, model.TransferStatusFailed, err.Error(), "")