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

80 to 90%

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 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

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 chooses a funding path.

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

Choose funding path

After approving, choose standard collateral mode or buyer-financed mode. Standard mode calls lockCollateral(id). Buyer-financed mode calls financeAsBuyer(id).

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

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.

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

80%
Fairscore 41 to 70

Building repayment history

85%
Goodscore 71 to 85

Consistent on-time payments

88%
Excellentscore 86 to 100

Top-tier seller track record

90%

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 (80-90%)
  • Buyer collateral requirement calculation per invoice
  • Explicit term-scaled fee calculation with no early-repayment discount
  • 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, 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 uint256

Arc 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

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.

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

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 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

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 choose collateral mode or buyer-financed mode
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 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

Float your first invoice.

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