Skip to content

[Bug] Eco funding disclosed ~1.5% estimate, but intent targeted 3.0127% and expired #122

Description

@jasZ2026

Summary

A 1.000000 USDC Base → Polygon Gateway deposit via selat fund --method eco was confirmed after SELAT disclosed an estimated ~1.5% Eco routing fee. The resulting Eco intent encoded a net Gateway target of 0.969873 USDC, a 0.030127 USDC (3.0127%) difference, then expired without fulfillment.

The intent is currently Pending / WaitingForRefund, and the unified Gateway balance remains 0 USDC.

Environment

  • @selat-ai/selat-cli: 0.15.9
  • @circle-fin/cli: 0.0.6 (update check reports current)
  • Source: Base
  • Eco destination: Polygon Gateway
  • Input: 1.000000 USDC
  • Disclosed estimate: ~1.5% (approximately 0.985000; UI displays 0.98 after cent-flooring)
  • Encoded net target: 0.969873 USDC
  • Difference: 0.030127 USDC / 3.0127%

Evidence

Root cause in current UX

ECO_ROUTING_FEE_RATE = 0.015 is an estimate based on one observed 2.00 → 1.97 deposit. The code comments correctly note that neither Circle CLI nor the existing skill exposes a pre-deposit quote, but the confirmation flow still permits the transfer without an enforceable maximum fee or minimum net credit.

For small deposits, fixed route costs can make the effective percentage materially higher than the historical estimate.

Requested changes

  1. Require an exact live quote before an Eco transfer, including input, net Gateway credit, total fee, fee percentage, and quote expiry.
  2. Enforce a user-approved maxFee or minNetAmount; abort before transfer if the live route exceeds it.
  3. If no exact quote is available, refuse the Eco path rather than relying on a historical percentage.
  4. Track Eco intent state through Fulfilled or Refunded; do not report the transfer submission as a completed Gateway deposit.
  5. Surface WaitingForRefund with the intent hash and prevent accidental re-deposit.
  6. Add regression coverage for small deposits where flat fees materially change the effective percentage.

This is not yet a settled fee because the intent failed and is awaiting refund. Final user loss can only be reconciled after the refund transaction completes.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions