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
80 to 90%
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 buyer repays 100% of the invoice face value. The explicit invoice fee is split 10% to protocol, 15% to insurance, and 75% to LPs. The LP share increases investorAssets relative to total shares, so share value rises as invoices settle.
Seller receives
80-90% advance
Based on credit score tier
Buyer repays
100% at maturity
7-day grace period after due date
Investor earns
75% of fees
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 chooses a funding path.
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.
Choose funding path
After approving, choose standard collateral mode or buyer-financed mode. Standard mode calls lockCollateral(id). Buyer-financed mode calls financeAsBuyer(id).
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.
Repay invoice
Pay at or before the due date. Standard mode repays the invoice face value. Buyer-financed mode pays the reduced settlement amount after the buyer discount.
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, term-scaled fees, 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)feeBpsForTerm(address buyer, uint256 termSeconds)sellerScore(address) returns uint256buyerScore(address) returns uint256Arc system predeploy used for transaction reconciliation. Float wraps collateral locks, buyer-financed advances, and full repayments with an invoice memo. Arc preserves the signing EOA as msg.sender for the inner FloatCore call. Smart contract wallets use the direct FloatCore fallback.
memo(address target, bytes data, bytes32 memoId, bytes memoData)Network
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.
Analytics roadmap
Float also plans to publish a dedicated Dune dashboard for deeper protocol analytics. That dashboard would break down pool-financed versus buyer-financed volume, realized fee flows, defaults, utilization, and longer-term investor performance without overloading the public homepage.
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 advanced upfront. In Float, this ranges from 80% to 90% depending on the seller's credit score tier and paid-count gates.
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 the buyer approves the invoice and chooses a funding path. The buyer can either lock collateral so the pool funds the advance, or fund the advance directly through buyer-financed mode.
What is buyer collateral and why is it required?
Buyer collateral is a USDC deposit locked in FloatPool for standard pool-financed invoices. It protects the pool if the buyer defaults. Collateral is returned in full when the buyer pays the invoice. Buyer-financed invoices do not need this collateral because the buyer funds the advance directly.
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 receive the conservative 80% advance rate until they build enough paid invoice history. Higher tiers require both a strong paid ratio and a minimum number of paid invoices.
Is there an early repayment discount?
Standard pool-financed invoices do not have an early repayment discount. Buyer-financed invoices are different: the buyer funds the advance upfront and keeps 75% of the invoice fee as a discount at settlement.
How do investors earn yield?
When a buyer repays 100% of the invoice, the explicit invoice fee is split between protocol, insurance, and LPs. Investors receive 75% of the fee, increasing investorAssets relative to total shares. 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 does verified buyer mean?
On testnet, verified status is only a demo switch used to unlock lighter collateral. In production, it should mean the buyer passed real identity checks, sanctions screening, and wallet ownership checks, and was confirmed to be separate from the seller.
Why is verification so important?
Verification is what makes light collateral safe enough to offer. Without strong verification, a seller and buyer could collude around a fake invoice. That is why unverified buyers stay in strict collateral mode and why production should use a dedicated attestor service instead of a self-serve toggle.
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.
What are Arc transaction memos used for?
Float adds a deterministic invoice reference to collateral locks, buyer-financed advances, and full repayments. This lets support tools and indexers match a transaction to its invoice without storing memo data in FloatCore. The invoice contract remains the source of truth, and no Float contract redeployment is required.
Get started
Connect your wallet, submit an invoice, and receive USDC in seconds on Arc Testnet.