Invoice Factoring Protocol on Arc Testnet

Float

Float is an on-chain invoice factoring protocol. SMEs submit unpaid invoices and receive a USDC advance immediately. Buyers repay the full amount at maturity. Investors deposit USDC into the pool and earn yield from the spread between the advance rate and the full repayment.

Advance rate

75 to 88%

Settlement

Sub-second

Currency

USDC

Network

Arc Testnet

Protocol flow

How Float works

01
SellerCreate invoice

The seller calls createInvoice(buyer, amount, dueDate) on FloatCore. The contract reads the seller's credit score, computes the advance rate and required buyer collateral, and stores the invoice on-chain. Status: PENDING_APPROVAL. No funds move yet.

02
BuyerApprove or reject

The buyer receives the invoice and reviews the terms. They call approveInvoice(id) to confirm the invoice is legitimate, or rejectInvoice(id) to cancel it. Approval requires no USDC — it is only a signature. Status: PENDING_COLLATERAL.

03
BuyerLock collateral

The buyer approves FloatCore for the collateral amount, then calls lockCollateral(id). FloatCore pulls USDC from the buyer into FloatPool as escrow, then immediately instructs the pool to advance funds to the seller. Status: FUNDED. Both actions occur in one transaction.

04
BuyerPay at due date

The buyer approves FloatCore for the full invoice amount and calls payInvoice(id). FloatCore transfers the full amount to FloatPool, then releases the locked collateral back to the buyer. Both credit scores update atomically. Status: PAID.

05
InvestorCapture the spread

The pool received 100% of the invoice but only disbursed 75-88% as advance. The difference (12-25%) stays in the pool and increases investorAssets relative to total shares. Share value rises. Investors redeem shares for more USDC than they deposited.

Seller receives

75-88% upfront

Based on credit score tier

Buyer repays

100% at maturity

7-day grace period after due date

Investor earns

12-25% spread

Accumulated as share value growth

Step-by-step guides

Using Float

Seller

Float an invoice

1

Connect wallet

Use MetaMask or create a Circle Wallet. Make sure you are on Arc Testnet (Chain ID 5042002).

2

Go to Seller dashboard

Navigate to /app/seller. Your current credit score and available pool liquidity are shown at the top.

3

Fill in invoice details

Enter the buyer's wallet address, the invoice amount in USDC, and the payment due date. Float previews your advance amount and the buyer's required collateral in real-time.

4

Submit

Click Create Invoice. The transaction calls createInvoice() on FloatCore and stores the invoice on-chain. The invoice is now PENDING_APPROVAL — no funds move yet. The advance is sent only after the buyer approves and locks collateral.

5

Track your invoices

Your invoices appear below the form with live status. PENDING_APPROVAL means waiting for buyer. FUNDED means the advance has been sent to your wallet. PAID means the invoice is settled.

Buyer

Pay an invoice

1

Connect wallet

Connect the wallet address that was specified by the seller as buyer. Float identifies invoices by on-chain buyer address.

2

Go to Buyer dashboard

Navigate to /app/buyer. Invoices are grouped by action required: Pending Approval, Needs Collateral, Active, and History.

3

Approve or reject invoice

Review the invoice terms: seller address, amount, advance sent to seller, collateral required from you, and due date. Call approveInvoice(id) to confirm or rejectInvoice(id) to cancel. No USDC needed yet.

4

Lock collateral

After approving, Float asks you to lock USDC as collateral. Step 1: approve FloatCore for the collateral amount. Step 2: call lockCollateral(id). This triggers the advance to the seller in the same transaction.

5

Pay at due date

When the invoice is due, Step 1: approve FloatCore for the full invoice amount. Step 2: call payInvoice(id). The full amount goes to the pool and your collateral is returned to your wallet in the same transaction.

6

Early repayment

Pay before the due date to receive a discount of up to 2% of the invoice amount. The discount is proportional to how much time remains — the earlier you pay, the more you save.

Investor

Deposit and earn yield

1

Connect wallet

Connect any EVM wallet holding USDC on Arc Testnet.

2

Go to Investor dashboard

Navigate to /app/investor. The dashboard shows pool TVL, current share value, your position in USDC, and historical share value growth.

3

Approve USDC

Enter the amount you want to deposit and click Approve. This authorizes FloatPool to pull your USDC.

4

Deposit

Click Deposit. FloatPool mints shares proportional to your deposit at the current share value and transfers your USDC into the pool.

5

Earn passively

As sellers create invoices and buyers repay, totalAssets grows. Your shares are worth more USDC over time with no action required.

6

Withdraw

Enter share amount and click Withdraw. FloatPool burns your shares and returns USDC at the current share value, including all accrued yield.

On-chain scoring

Credit Score System

Every seller has a credit score stored on FloatCore. It is computed purely from on-chain data, is immutable, and determines the advance rate applied to each new invoice.

Scoring formula

// new seller (no invoices yet)

score = 50

// after at least one invoice

score = paidCount * 100 / totalCount

Score updates after every payInvoice() and markDefault() call. The update is atomic within the same transaction, so the seller's next invoice reflects the new rate immediately.

Advance tiers

Newscore 0 to 40

Starting tier for new sellers

75%
Fairscore 41 to 70

Building repayment history

80%
Goodscore 71 to 85

Consistent on-time payments

84%
Excellentscore 86 to 100

Top-tier seller track record

88%

Default and grace period

Grace period

7 days after due date

Buyer has 7 additional days before default can be triggered.

Who calls markDefault

Anyone

Any address can trigger markDefault() after the grace period expires. There is no keeper requirement.

Consequence

Score drops

totalCount increments without paidCount incrementing, permanently reducing the seller's ratio.

Technical architecture

System Design

Seller          FloatCore               FloatPool           Buyer / Investor
    |                  |                      |                      |
    |--createInvoice()->|                      |                      |
    |  (status: PENDING_APPROVAL)              |                      |
    |                  |                      |    <--approveInvoice()|
    |                  |  (status: PENDING_COLLATERAL)                |
    |                  |                      | <--lockCollateral()---|
    |                  |<--USDC collateral----|<--transferFrom(buyer)-|
    |                  |--recordCollateral()-->|                      |
    |<--USDC advance---|<--advanceFunds()------|                      |
    |  (status: FUNDED)                        |                      |
    |                  |                      |<----deposit(amt)------|
    |                  |                      |-----mint shares------>|
    |                  |                      |    <---payInvoice()---|
    |                  |<--USDC full amount---|<--transferFrom(buyer)-|
    |                  |--releaseCollateral()->|---USDC collateral-->buyer
    |                  |  (status: PAID)       |---shareValue up------>|

FloatCore responsibilities

  • 6-state invoice lifecycle (PENDING_APPROVAL to PAID/DEFAULTED/CANCELLED)
  • Dual credit scores: separate scores for sellers and buyers
  • Advance rate calculation from seller score tier (75-88%)
  • Buyer collateral requirement calculation per invoice
  • Early repayment discount up to 2% (proportional to time remaining)
  • Permissionless markDefault() after grace period expires
  • 72h approval timeout + 48h collateral timeout auto-cancel

FloatPool responsibilities

  • USDC custody: investor deposits + buyer collateral held separately
  • Share issuance on deposit (proportional to investorAssets)
  • Share redemption: burns shares, returns USDC at current share value
  • Collateral escrow: recordCollateral, releaseCollateral, slashCollateral
  • investorAssets() excludes locked collateral from share value calculation
  • Access-controlled: only FloatCore can move funds (onlyCore modifier)

Arc Testnet

Smart Contracts

Investor vault with collateral custody. Accepts USDC deposits, issues proportional shares, holds buyer collateral in escrow, disburses advances to sellers, and releases or slashes collateral on repayment or default. Share value rises as invoice spreads accumulate.

deposit(uint256 amount)withdraw(uint256 shareAmount)recordCollateral(uint256 id, uint256 amount)releaseCollateral(uint256 id, address to)slashCollateral(uint256 id)shareValue() returns uint256investorAssets() returns uint256availableLiquidity() returns uint256

Invoice lifecycle manager with dual credit scores. Handles 6-state invoice flow (PENDING_APPROVAL, PENDING_COLLATERAL, FUNDED, PAID, DEFAULTED, CANCELLED), buyer collateral locking, early repayment discounts up to 2%, and atomic score updates for both seller and buyer.

createInvoice(address buyer, uint256 amount, uint256 dueDate)approveInvoice(uint256 id)rejectInvoice(uint256 id)lockCollateral(uint256 id)payInvoice(uint256 id)markDefault(uint256 id)earlyRepayAmount(uint256 id)sellerScore(address) returns uint256buyerScore(address) returns uint256

Network

Arc Testnet

Chain ID

5042002

Gas token

USDC

Finality

Sub-second

Risk and security

Risk Model

Recourse model

Sellers are liable for buyer defaults. A default reduces the seller's credit score, restricting future advance rates. The pool does not pursue collateral recovery; instead, the score penalty creates economic incentive for sellers to work with creditworthy buyers.

Pool liquidity risk

If all pool capital is deployed in active invoices, new invoice advances and investor withdrawals may be temporarily blocked. Liquidity is displayed live on the dashboard. The pool is replenished each time a buyer repays.

Smart contract risk

Float contracts use OpenZeppelin libraries, ReentrancyGuard, and checks-effects-interactions. All state changes emit events. The code is open source and deployed on testnet only. No formal audit has been conducted.

Security primitives used

OpenZeppelin Ownable

Owner-only access control on admin functions such as setting the FloatCore address in FloatPool.

ReentrancyGuard

All fund-moving functions (advance, withdraw, payInvoice) are protected against re-entrancy attacks.

Checks-effects-interactions

State variables are updated before any external token transfers to prevent state manipulation.

Custom errors

Gas-efficient revert reasons replace string-based require statements throughout both contracts.

Future roadmap

Privacy with Arc Privacy Sector

Float currently runs on Arc's public EVM where all invoice data is visible on-chain. For enterprise trade finance, confidentiality is critical: buyers do not want competitors inferring their supply chains, and sellers do not want their credit scores exposed. Arc Privacy Sector (APS) addresses this.

What APS enables

  • Private invoice amounts invisible to external observers
  • Confidential buyer and seller identities on-chain
  • Private credit scores accessible only to the seller
  • Investor positions hidden from public state

How it works

  • APS runs a private EVM inside AWS Nitro hardware enclaves
  • Existing Solidity contracts deploy to pEVM with minimal changes
  • USDC moves between public Arc and private APS via shield/unshield bridge
  • Post-quantum hybrid cryptography (X-Wing KEM + AES-256-GCM)

Migration path

When APS testnet becomes publicly available, Float's contracts can be redeployed to the private pEVM with minimal modifications. The public-facing entry point would shield USDC into the private environment, execute the invoice lifecycle privately, and unshield repayments back to the public chain. The net effect: all invoice economics remain identical, but the amounts, parties, and scores become confidential.

Reference

Glossary

Invoice factoring

The practice of selling an unpaid invoice to a third party at a discount in exchange for immediate cash. Float implements this on-chain with USDC.

Advance rate

The percentage of the invoice face value paid to the seller upfront. In Float, this ranges from 75% to 88% depending on the seller's credit score tier.

Recourse model

A factoring arrangement where the seller remains liable if the buyer fails to pay. The opposite is non-recourse, where the factor absorbs the loss.

Share value

totalAssets divided by totalShares in FloatPool. This number starts at 1.0 USDC per share and increases as repayments accumulate. It never decreases on repayment.

Credit score

A 0 to 100 integer stored on-chain per seller, computed as paidCount * 100 / totalCount. Determines the advance tier applied to new invoices.

Grace period

The 7-day window after an invoice's due date before markDefault() can be called. Allows for minor payment delays without immediately penalizing the seller.

Available liquidity

The amount of USDC in FloatPool not currently deployed in active invoice advances. This caps the maximum invoice size a seller can submit.

Arc Testnet

A public EVM-compatible blockchain by Circle. Chain ID 5042002. Uses USDC as the native gas token. Sub-second finality. Float runs exclusively on this network.

Getting started

Testing on Arc Testnet

1. Add Arc Testnet to your wallet

Network NameArc Testnet
Chain ID5042002
RPC URLhttps://rpc.testnet.arc.network
CurrencyUSDC (6 decimals)
Block Explorerhttps://testnet.arcscan.app
Fallback RPChttps://rpc.blockdaemon.testnet.arc.network

Arc uses USDC as its native gas token. Gas fees are tiny (sub-cent). No ETH needed.

2. Get test USDC

Arc Testnet USDC is minted by the Arc faucet. The contract address is 0x3600...0000. Visit the Arc testnet faucet and request USDC to your wallet address.

1.Go to the Arc testnet faucet (linked in the Arc developer portal)
2.Paste your wallet address and request USDC
3.Funds arrive within a few seconds (sub-second finality)
4.You need at least ~10 USDC to test as an investor or buyer

3. Quick test flow

InvestorDeposit USDC into the pool to fund the liquidity buffer
SellerCreate an invoice with a buyer address and due date
BuyerApprove the invoice, then lock collateral to release the advance
BuyerPay the full invoice amount at or before the due date
InvestorWithdraw anytime — share value increases as invoices are repaid

No Circle Wallet required for testing with MetaMask. Just add Arc Testnet and connect.

Common questions

FAQ

What do I need to create an invoice?

Connect any EVM wallet to Arc Testnet. On the Seller dashboard, enter the buyer's wallet address, the invoice amount in USDC, and the due date. Float previews your advance amount and the collateral required from the buyer. The invoice is submitted on-chain and waits for the buyer to approve.

When does the seller receive the advance?

The advance is not sent at invoice creation. It is sent after two buyer actions: first the buyer approves the invoice on-chain, then the buyer locks the required collateral. Both must happen before the advance is disbursed. This protects the pool from fraudulent invoices.

What is buyer collateral and why is it required?

Buyer collateral is a USDC deposit locked in FloatPool when the buyer confirms the invoice. It acts as security for the pool. If the buyer defaults, the collateral is slashed to partially offset the advance loss. Collateral is returned in full when the buyer pays the invoice. The amount is calculated as max(buyer tier rate, 100% minus advance rate).

What happens if the buyer does not pay?

After the due date plus a 7-day grace period, anyone can call markDefault() on FloatCore. The invoice is marked DEFAULTED, the buyer's collateral is slashed to the pool, and both credit scores drop. The buyer can still pay (avoiding default) up until the moment markDefault is called.

How is the advance rate calculated?

Each seller has an on-chain score from 0 to 100. New sellers start at 50 and receive a 75% advance rate. The score is the ratio of paid invoices to total invoices. Scores improve as the seller builds repayment history, unlocking 80%, 84%, and 88% advance rates over time.

Is there an early repayment benefit?

Yes. Buyers who pay before the due date receive a discount of up to 2% of the invoice amount. The discount decreases linearly over time: paying on day 1 of a 30-day invoice gives the full 2%, while paying on day 29 gives almost nothing. After the due date, no discount applies.

How do investors earn yield?

When a buyer repays 100% of the invoice but the seller only received 75-88%, the spread (12-25%) accumulates in the pool. This increases investorAssets relative to total shares, raising the share value. Investors capture accrued yield when they redeem their shares.

Can investors withdraw at any time?

Yes. Enter the number of shares to redeem and call withdraw(). The contract converts shares to USDC at the current share value. Withdrawals are limited to available liquidity — USDC deployed as advances or held as collateral cannot be withdrawn until invoices settle.

Are the contracts audited?

Float is a hackathon prototype on Arc Testnet. Contracts use OpenZeppelin libraries, ReentrancyGuard, and the checks-effects-interactions pattern, but have not undergone a formal security audit. Do not use with real funds.

What happens to my credit score if I default?

After markDefault() is called, your total invoice count increases while your paid count stays the same, dropping the score ratio. This reduces your advance rate on all future invoices and is permanently recorded on-chain.

Does Float support multiple currencies?

No. Float is USDC-native by design, running on Arc Testnet where USDC is also the gas token. All invoice amounts, advances, and repayments are denominated in USDC with 6 decimal places.

Get started

Float your first invoice.

Connect your wallet, submit an invoice, and receive USDC in seconds on Arc Testnet.