Inspiration

As international students, we watch our parents send money across the world every semester, check the exchange rate again and again, and still lose money to a price nobody explains. Our friends send part of every paycheque home and accept whatever arrives.

The average $200 remittance loses about $13 to fees and hidden exchange rates. Stellar has already made moving money almost free, so we asked: if the pipe is fixed, why is the price still so high? The answer is that on each transfer, one payout provider quietly sets the rate, and the family never sees a better offer.

What it does

RateRace turns every remittance into an open auction.

  1. A sender requests a transfer, for example $200 to a bank account in Mexico.
  2. Licensed Stellar anchors return signed, firm quotes for the exact amount the family will receive after every fee.
  3. The best offer wins. The sender sees each offer's markup against the real market rate before sending.
  4. A Soroban smart contract verifies the winning quote, checks it against the Reflector market rate, and holds the funds in escrow.
  5. The anchor pays the family, then gets paid from escrow.
  6. Every anchor posts a bond. If it fails to deliver, the sender is refunded with a penalty taken from that bond.

The family never touches crypto. They just receive more money.

How we built it

  • Soroban (Rust): one contract for the anchor registry and escrow: quote signature checks (ed25519), oracle markup checks, bonds, payout deadlines, refunds and slashing.
  • Reflector oracle (SEP-40): live fiat exchange rates as a referee, not a price setter.
  • Quote router (TypeScript): sends each request to every registered anchor and ranks the signed quotes. It never holds funds and can't alter quotes.
  • Mock anchors: three SEP-38-style services with different pricing, including one that fails to deliver, to demonstrate refunds and slashing.
  • Web app (React + Stellar SDK): send page, live quote board, order tracker and anchor leaderboard, deployed on Stellar testnet.

The contract caps each quote's markup against the market:

$$\text{markup} = \frac{\text{amount sent} - \text{landed amount in USD}}{\text{amount sent}}$$

(Build in progress for the Project Showcase.)

Challenges we ran into

  • Bank payouts can't be seen on-chain. We solved this with anchor bonds, payout deadlines, a challenge window and automatic refunds.
  • Signing quotes identically in Rust and JavaScript. The contract exposes the exact digest that anchors sign, so both sides always agree.
  • Stale or extreme exchange rates. The contract rejects quotes when the oracle is out of date or the markup is too high.
  • Few real anchors on testnet. We built mock anchors with the same interface real anchors use, so real ones can plug in later.

Accomplishments that we're proud of

  • Mapped every Stellar anchor in the public directory by country: Mexico, Brazil and Colombia each have six or more listed.
  • Verified Reflector's live fiat price feed on-chain.
  • Tested a real public anchor quote and found it about 1.1% below the market rate before fees.
  • Designed a system where anchors compete on the one number families care about: how much actually lands.

What we learned

The blockchain part of a remittance is already cheap. The cost lives at the edges, where money is converted and paid out, and the only thing that reliably lowers it is competition.

What's next for RateRace

  • Onboard real anchors, starting with Mexico, then Brazil and Kenya.
  • Let recipients confirm delivery by SMS, so it works on any phone.
  • Batch auctions for NGOs and employers paying many households at once.
  • Reputation-based bonds so trusted anchors lock up less capital.
  • Privacy improvements so amounts and addresses stay confidential.

Built With

Share this project:

Updates

Submission history