Invoice Factoring Protocol on Arc Testnet
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
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.
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.
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.
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.
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
Connect wallet
Use MetaMask or create a Circle Wallet. Make sure you are on Arc Testnet (Chain ID 5042002).
Go to Seller dashboard
Navigate to /app/seller. Your current credit score and available pool liquidity are shown at the top.
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.
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.
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.
Connect wallet
Connect the wallet address that was specified by the seller as buyer. Float identifies invoices by on-chain buyer address.
Go to Buyer dashboard
Navigate to /app/buyer. Invoices are grouped by action required: Pending Approval, Needs Collateral, Active, and History.
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.
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.
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.
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.
Connect wallet
Connect any EVM wallet holding USDC on Arc Testnet.
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.
Approve USDC
Enter the amount you want to deposit and click Approve. This authorizes FloatPool to pull your USDC.
Deposit
Click Deposit. FloatPool mints shares proportional to your deposit at the current share value and transfers your USDC into the pool.
Earn passively
As sellers create invoices and buyers repay, totalAssets grows. Your shares are worth more USDC over time with no action required.
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
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
Starting tier for new sellers
Building repayment history
Consistent on-time payments
Top-tier seller track record
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
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
FloatPool responsibilities
Arc Testnet
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 uint256Invoice 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 uint256Network
Arc Testnet
Chain ID
5042002
Gas token
USDC
Finality
Sub-second
Risk and security
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
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
How it works
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
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
1. Add Arc Testnet to your wallet
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.
3. Quick test flow
No Circle Wallet required for testing with MetaMask. Just add Arc Testnet and connect.
Common questions
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
Connect your wallet, submit an invoice, and receive USDC in seconds on Arc Testnet.