Skip to content
3F Docs

Pull Offers (Direct EOA)

Pull offers are signed and submitted directly from your wallet. Each offer requires:

  1. A one-time EIP-712 sign-in (valid 1 week) so the BF API can list your offers.
  2. A USDC approval (or bump if your existing allowance doesn’t cover all live offers).
  3. A per-offer EIP-712 signature of the offer terms.

Pull offers settle by the protocol pulling funds from your EOA when matched, so your wallet must keep enough USDC + allowance to cover all live offers simultaneously.


Open the User tab. The first time you visit (or after the previous signature expired), you’ll see a sign-in card titled “Sign in to view your offers” with a single Sign message button. Clicking it pops an EIP-712 GetOffers typed-data prompt in your wallet — sign it, and the resulting signature is cached locally for 7 days. You won’t be asked again unless you switch wallet, switch network, or the deadline expires.

You can also reach the same flow through an auth gate dialog when you try to submit from the Auctions tab without being signed in.


Go to the Auctions tab. The table lists every auction (active + terminal) with columns for ID, vault, amount requested, blended rate, direction, term, and status. Filter by status if you want only LIVE rows visible.

Click a LIVE row to open the offer form drawer. Fill the two inputs:

  • Principal (USDC) — the amount you want to lend. Use MAX to auto-fill the auction’s full amount requested. Over-offering is allowed (the protocol only pulls what’s needed); the form shows a soft warning when you exceed the requested amount.
  • Yield (bps) — the non-annualized yield in basis points. Auctions last 1 day, so 100 bps = 1% over the duration. Sub-bp precision is supported (e.g. 3.5).

Click Submit. The form runs a multi-step flow with a live stepper that highlights the current phase:

  1. Loading offers — only shown the first time you submit in a session; the console fetches your existing offer list to pick the next nonce and to compute the required allowance.
  2. Approving — only if your USDC allowance doesn’t already cover the sum of all SUBMITTED pull offers + this new one. If approval is needed, sign an approve tx in your wallet. The submission proceeds in parallel — it doesn’t wait for the approve to mine, since the pull only happens later when the offer matches on-chain.
  3. Signing — sign the EIP-712 Offer typed data in your wallet. The console resolves the signing domain from the request contract via eip712Domain() (with a fallback to the API-provided domain).
  4. Posting — the signed offer is sent to the BF API.

On success a toast surfaces the new offer ID; the offer appears under User → Live Offers with no PUSH badge (push-only badge — pull offers are unlabeled).

Allowance covers all live offers, not just one. If you have three SUBMITTED pull offers of 100 USDC each and submit a fourth for 50, the console requests 350 USDC of allowance — enough to cover every offer in case they all match at once.


In User → Live Offers, click Cancel on the row, confirm in the inline Cancel offer? Yes / No confirmation, then sign the EIP-712 CancelOffer message in your wallet. See Managing offers for the full flow.


Pull offers don’t have an “AWAITING_MINT” provisioning step — when matched, the protocol pulls USDC from your EOA via the allowance and the bridge opens immediately. The offer transitions to SUCCEEDED and the bridge appears in Open Bridges.

When the auction repays, the row goes claimable and a green Claim X.XX USDC button appears in the action column. The amount comes from a live on-chain convertToAssets(pt, yt) read, so it matches what burnAll will actually pay out. See Claiming repaid bridges.


  • Sign in once (1 week TTL).
  • Submit offer from Auctions → LIVE row → fill form → Submit. Approval signed automatically when needed.
  • Cancel from User → Live Offers → Cancel.
  • Claim from User → Open Bridges → click row / Claim button.