# Floatless documentation > Floatless is a mobile money app on Monad. You hold digital dollars in one balance, set spending rules that you sign and register onchain, protect savings goals, earn on AUSD you aren’t spending through a Morpho vault on Monad mainnet, and have every payment checked before you sign. Identity-verified regulated dollars from Cleanverse run on Monad testnet. --- # What is Floatless > A mobile money app on Monad: one dollar balance, spending rules you sign, savings that earn, and a check before every payment. Source: https://floatless.xyz/docs Floatless is a mobile money app on [Monad](https://floatless.xyz/docs/glossary#monad), a public blockchain. You keep digital dollars, called [stablecoins](https://floatless.xyz/docs/glossary#stablecoin), in one wallet balance, set spending rules you sign yourself, protect savings goals, and earn on AUSD you aren't spending. Floatless checks every payment you make in the app against your rules before you approve it. ## Who it's for Floatless is for people who keep their savings in digital dollars, often instead of a local currency that's losing value, and want guardrails when they spend from them. You decide how much can go out per payment and per day, and the balance Floatless won't let a payment take you below. When Floatless stops a payment, it tells you why. You don't need to know how blockchains work. The app sets up your wallet when you sign in, and the [glossary](https://floatless.xyz/docs/glossary) explains the few new words you'll meet, like MON and network fee. ## The problems it solves ### Idle money To spend safely, people keep cash parked in a spending balance just in case, and that money earns nothing. With Floatless you can move AUSD you aren't spending into [Floatless Savings](https://floatless.xyz/docs/floatless-savings), a Morpho vault on Monad mainnet that earns interest, and withdraw it to your wallet when you need it, as long as Morpho has the AUSD available. ### No guardrails A crypto wallet sends whatever you tell it to. One rushed payment or one convincing scammer can empty money you meant to keep. In Floatless you set [spending rules](https://floatless.xyz/docs/spending-rules) once, sign them, and register them on Monad. Before every payment, Floatless checks your rules, your daily total and the floors on your [savings goals](https://floatless.xyz/docs/savings-goals). If something's off, you see the reason before anything is signed. ### Regulated money is locked out Some digital dollars may only move between people whose identity has been checked. Ordinary wallets can't follow that rule, so this kind of money stays out of everyday payments. Floatless supports Cleanverse's regulated dollar, aUSDC, and asks Cleanverse to confirm both people before each payment. This runs on Monad testnet with Cleanverse's sandbox. [Regulated dollars](https://floatless.xyz/docs/regulated-dollars) explains how it works. ### Complexity Seed phrases, network fees and failed transactions make crypto payments feel risky. Floatless signs you in with a passkey or your email, so there's no seed phrase to write down. Before you confirm a payment, it shows the most the network fee can be, and your history reads in plain words. You still need a little MON, Monad's own token, to pay network fees. ## What you can do today - Sign in with a passkey or your email. Floatless sets up a wallet for you. - See your stablecoins and MON added up in one **Wallet balance**, and receive money at one address with a QR code. - Set limits for each payment and each day, plus a balance you always keep, then register those rules on Monad. - Send digital dollars to any Monad address after Floatless checks the payment against your rules. - Create savings goals with a protected floor that Floatless won't let a payment dip below. - Earn interest on AUSD in Floatless Savings on Monad mainnet, and withdraw whenever Morpho has the money available. - Look back at your payments, savings moves, new goals and rule changes in **Activity**, grouped by day. - On Monad testnet, pay with aUSDC after Cleanverse confirms that you and the person you're paying are both verified. ## What's live on which network | | Monad mainnet, chain 143 | Monad testnet, chain 10143 | | ---------------------------------- | ------------------------ | ---------------------------------- | | Sign in, add money and send | Yes | Yes, with test tokens | | Spending rules registered on Monad | Yes | Yes | | Savings goals | Yes | Yes | | Floatless Savings on Morpho | Live | Labeled preview, nothing deposited | | Regulated dollars in aUSDC | Not listed | Yes, with Cleanverse's sandbox | | Card and Apple Pay | Not available yet | Not available yet | | Bank transfers | Not available yet | Not available yet | Card and Apple Pay are waiting on a card issuer partner. [Mainnet and testnet](https://floatless.xyz/docs/networks) covers what each network is for and how Floatless keeps them apart. ## Where to go next Floatless isn't in app stores yet. It's in private testing, and [Getting started](https://floatless.xyz/docs/getting-started) takes you from the waitlist to your first week. Before you move real money, read [Keys and security](https://floatless.xyz/docs/security) to see who can sign for your wallet, and [Fees and limits](https://floatless.xyz/docs/fees-and-limits) for what each action costs. If you'd rather check than trust, [Live proof](https://floatless.xyz/docs/proof) lists recorded transactions and [Contracts and verification](https://floatless.xyz/docs/contracts) lists every contract address. You can also ask ChatGPT or Claude about Floatless. [Use Floatless in ChatGPT and Claude](https://floatless.xyz/docs/ai-assistants) shows how to connect your assistant to these docs. --- # Getting started > Get an invite, sign in with a passkey or email, and set up your first week with Floatless. Source: https://floatless.xyz/docs/getting-started This page takes you from the waitlist to a working Floatless account. It covers getting access, how each way of signing in treats your keys, where things live in the app, and five things to set up in your first week. ## Get access Floatless isn't in the App Store or Google Play yet. It's in private testing. Join the waitlist at https://floatless.xyz/#join with your email, and you'll get an email when your invite is ready. You need to be at least 18, or the age of majority where you live, to use Floatless. The [Terms](https://floatless.xyz/terms) have the details. ## Open the app and sign in The first time you open Floatless, you'll see three short intro screens. Tap **Skip**, or move through them with the arrow button, to reach the welcome screen. Once you've seen the intro, the app skips it and opens on the welcome screen. New to Floatless? Tap **Get started**. Already have an account? Tap **I already have an account**, and your phone signs you in with your passkey right away. On a phone that has signed in before, the welcome screen says "Welcome back" and leads with **Sign in**, with **Create a new account** and **Sign in with email** below it. How you sign in decides who can sign for your wallet. A passkey and an email account are separate accounts with separate wallets, even if the passkey is saved under the same email address. | | Passkey | Email | | ----------------------- | ------------------------------------------------------------------------------------ | -------------------------------------------------------------------------- | | How you sign in | Your phone's passkey, confirmed with your screen lock, like Face ID or a fingerprint | A 6-digit code sent to your email | | Where the wallet key is | Made on your phone from your passkey each time you sign, then wiped | Held by Privy as an embedded wallet that the Floatless API creates for you | | Who signs a payment | Your phone, after you confirm with your passkey | The Floatless API, through Privy, after you confirm in the app | | On a new phone | You need the same passkey on that phone | Sign in with the same email | ### With a passkey New to Floatless? Tap **Get started**. The screen asks "What should we call you?" Type your name into **Your name** and tap **Create account**. When your phone offers to save a passkey for floatless.xyz, confirm with Face ID or your fingerprint. The passkey is named with your name, and Floatless saves the name to your account. Already have an account? Tap **I already have an account** on the welcome screen, or **Sign in with your passkey** on the sign-up screen. Your phone makes your wallet from the passkey, and the app proves to Floatless that you control it by signing a one-time message. - Your wallet key is made on your phone whenever you sign, and wiped from memory right after. Floatless's servers never receive it. - **Create account** always makes a new passkey, which means a new, empty wallet. On a phone that has signed in before, Welcome leads with **Sign in**, and **Create a new account** is there only if you want a second wallet. The old passkey stays in your password manager. - **Sign in with your passkey** is for an account you already have. It never creates a new wallet. If the phone has no Floatless passkey, the app says "No Floatless passkey on this phone yet. Tap Create account to make one." If iOS shows a QR code for a passkey on another device, that's only for a passkey you already have on another phone. - Floatless doesn't show a seed phrase and has no recovery feature yet. If the passkey is deleted, Floatless can't rebuild your wallet. - Your phone needs a passkey provider that can create this kind of account. The app suggests iCloud Keychain on iOS 18 or later, or Google Password Manager on Android. If yours can't, turn on iCloud Keychain or Google Password Manager in Settings and try again. - A passkey sign-in lasts up to an hour. When it runs out, the app takes you back to sign-in, and you confirm your passkey again. ### With email Type your email and tap **Continue**. Enter the 6-digit code from your inbox and tap **Verify & Sign In**. If the code doesn't arrive, tap **Resend code**. - The first time you sign in, the Floatless API creates a Privy embedded wallet for your account. - When you confirm a payment or another action, the app asks the Floatless API to sign it, and the API signs through Privy. The key isn't on your phone, so you're trusting Floatless's servers and Privy with signing for this wallet. - The API signs only what the app builds for this wallet: a stablecoin payment, an approval to the savings vault or SafeLock, a call to one of those or to the spending-rules registry, and your spending rules. It refuses anything else, such as a raw hash, a message, a token permit or a call to another contract. - If you lose your phone, sign in on a new one with the same email to reach the same wallet. [Keys and security](https://floatless.xyz/docs/security) goes deeper on both. ## Your wallet is set up for you With a passkey, your wallet exists as soon as your phone makes it from the passkey. With email, you'll see **Finishing your setup** for a moment while the API creates your wallet. If it takes a while, tap **Try again**. Then **Home** opens. Your wallet starts empty and has no spending rules, and Floatless declines payments until you set rules. Your wallet address is in **Add money**, so that's where you go to receive money. ## Find your way around The tab bar at the bottom has three tabs: **Home**, **Save** and **Activity**. Your profile opens from the round avatar at the top of each tab. It shows your profile picture, or your initials until you add one. | Where | What you'll find | | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Home** | A greeting with your name, or **Add your name**, which opens a form. An eye button hides or shows your balances. Your **Wallet balance** sits under it, and it becomes **Total balance** once you have money in savings. Then come the **Add money**, **Send** and **Save** buttons, a **Get set up** checklist until you finish it, a **Savings** card, up to three **Savings goals** with progress bars, and your last five entries under **Recent activity**. Tap the balance to open **Your dollars**, or press and hold it to hide it. Tap an activity row for its details. There are no push notifications yet. | | **Save** | The **Floatless Savings** card, with **Add to savings** and **Withdraw** on mainnet, and **Your goals** with **New goal** | | **Activity** | Your payments, savings moves, new goals and rule changes, grouped by day, with a search box and the **All**, **Money in**, **Money out**, **Savings** and **Goals & rules** filters | | **Profile** | Opens from your avatar. Your profile picture, which you tap to choose or remove (up to 2 MB), your name, which you tap to edit, your wallet address with **Copy**, **QR code** and **Explorer**, **Spending rules** under **Payments**, passkey and recovery details under **Security**, **Help and legal**, and **Log out** | Card and Apple Pay aren't in the app yet because Floatless is waiting on a card issuer partner, so Home has no card button. Bank transfers aren't available yet either, and **Add money** says so. ## Your first week Start with MON, because registering rules, sending and moving savings all need it. The **Get set up** checklist on Home covers the first three steps below, plus **Add your name**, and ticks each one off as you finish it. > Only receive money and MON on Monad. Floatless reads Monad and nothing else, so anything sent to your address on another network won't show up in the app. 1. Get MON for network fees. Every transaction on Monad pays a small fee in MON, and Floatless doesn't pay it for you or hand out MON. Send a little MON to your wallet address from another wallet or an exchange that supports Monad. On testnet, get test MON from a Monad testnet faucet. 2. Add money. On **Home**, tap **Add money**. The sheet shows your address as a QR code and written in groups of four, with **Copy address** and **Share address**. Have digital dollars sent there. On mainnet, **What you can send** lists USDC, USDT0 and AUSD. [Add money](https://floatless.xyz/docs/add-money) covers each way in. 3. Set your spending rules. Tap your avatar, then **Spending rules** under **Payments**. Fill in **Each payment up to**, **Each day up to** and **Always keep at least**, pick your **Currencies you can send**, and choose how long the **Rules last for**: 30, 90 or 180 days. Tap **Review rules**, then **Approve and register**. With a passkey, your phone asks you to confirm twice. When the app shows **Your rules are on**, try a small payment with **Send** to see the checks run. [Spending rules](https://floatless.xyz/docs/spending-rules) explains each limit. 4. Create a goal. In **Save**, tap **New goal**, or **Create a goal** if you have none yet. Fill in the **Name**, **Target** and **Keep protected (optional)**, pick the currency, which starts as AUSD, and tap **Create goal**. From then on, Floatless won't let a payment in that currency leave you with less of it than your goals' protected amounts add up to. The protected amount can't be higher than the target. [Savings goals](https://floatless.xyz/docs/savings-goals) has more. 5. Try Floatless Savings on mainnet. In **Save**, tap **Add to savings**, enter an amount of AUSD and tap **Move to savings**. A deposit usually takes two transactions: an approval that lets the vault take that exact amount, then the deposit itself. Tap **Withdraw** to bring AUSD back to your wallet, up to what Morpho can pay out right now. If your wallet has no AUSD yet, **Add to savings** stays off and the card offers **Add AUSD to your wallet**. On testnet, the card shows a **Preview** of what your AUSD would earn on mainnet instead. [Floatless Savings](https://floatless.xyz/docs/floatless-savings) covers the rate, the risks and who controls the vault. --- # Mainnet and testnet > What works on Monad mainnet and testnet, and how Floatless keeps each network’s money and history apart. Source: https://floatless.xyz/docs/networks Floatless runs on two Monad networks. This page explains the difference, what works on each, how the app and its API stay on one network, and where to look up transactions and tokens. ## Mainnet and testnet in plain words Monad mainnet is the live network, where tokens are real money. Its chain ID, the number that identifies a network, is 143. Monad testnet is a practice network with chain ID 10143. Its tokens are for testing and aren't real money. The two networks work the same way. On each one you need MON, Monad's own token, to pay network fees, and each has its own explorer. A dollar on testnet and a dollar on mainnet are different tokens on different networks, and nothing moves between them. ## What works on each network | Feature | Mainnet | Testnet | | ---------------------------------- | ------------------------------- | -------------------------------------- | | Sign in with a passkey or email | Yes | Yes | | Currencies the app lists | USDC, USDT0, AUSD | USDC, AUSD and aUSDC, all test tokens | | Send, with checks before you sign | Yes | Yes | | Spending rules registered on Monad | Yes | Yes | | Savings goals | Yes | Yes | | Floatless Savings on Morpho | Live: deposit and withdraw AUSD | Labeled preview using the mainnet rate | | Regulated dollars in aUSDC | Not listed | Yes, with Cleanverse's sandbox | | Card, Apple Pay and bank transfers | Not available yet | Not available yet | Morpho isn't deployed on Monad testnet, so the testnet Save tab applies the live mainnet vault's rate to your testnet AUSD and labels it **Preview**. Nothing is deposited on testnet. Regulated dollars run on Monad testnet with Cleanverse's sandbox. The mainnet app doesn't list aUSDC, and the mainnet API has no Cleanverse connection. ## How the app picks its network Each Floatless app build is set to one network when it's built, and mainnet is the default. There's no network switch inside the app. A build talks only to its own network's API: | Network | Chain ID | API | Explorer links open | | ------------- | -------- | ----------------------------------- | ------------------------------------------------------ | | Monad mainnet | 143 | `https://api-mainnet.floatless.xyz` | [monadscan.com](https://monadscan.com) | | Monad testnet | 10143 | `https://api.floatless.xyz` | [testnet.monadscan.com](https://testnet.monadscan.com) | If you build the app yourself, `EXPO_PUBLIC_MONAD_NETWORK` picks the network, `mainnet` or `testnet`, and `EXPO_PUBLIC_API_BASE_URL` points the build at a different API. Each API reads `MONAD_CHAIN_ID`, which is `143` or `10143`. ## Each network keeps its own records The mainnet and testnet APIs are separate services, each with its own database. Your payments, spending-rule records, goals and savings history on one network never mix with the other. History entries for transactions record the chain they happened on. Your phone keeps the networks apart too. Passkey sessions, your saved account details and any payment waiting for confirmation are stored separately for each network. If you sign in with a passkey, your wallet address is the same on mainnet and testnet, because it comes from your passkey. Your balances aren't shared, since each network has its own tokens. ## The network check on every response Every response from a Floatless API carries an `x-floatless-chain-id` header with that API's chain ID. The app compares it with its own network before using the response. If they differ, the app stops with a message that names both networks, for example: ```text This app is on Monad mainnet, but the server it reached is on Monad testnet. Nothing was changed. ``` A response without the header is accepted, so older servers still work. The app checks again before you sign anything. A payment quote must name the app's chain, and the app confirms that its own connection to Monad is on that chain too. Spending rules prepared for another network are refused before you sign them. You can read the header yourself: ```sh curl -si https://api-mainnet.floatless.xyz/health/ready | grep -i '^x-floatless-chain-id' curl -si https://api.floatless.xyz/health/ready | grep -i '^x-floatless-chain-id' ``` ```text x-floatless-chain-id: 143 x-floatless-chain-id: 10143 ``` The same endpoint reports the chain in its JSON body as `checks.chainId`. ## Explorers An explorer is a website that shows what's on a blockchain: balances, transactions and contracts. The app's links open Monadscan. MonadVision is another explorer for the same networks, and Floatless's contracts are source-verified on both. | Network | Monadscan | MonadVision | | ------- | ------------------------------------------------------ | ---------------------------------------------------------- | | Mainnet | [monadscan.com](https://monadscan.com) | [monadvision.com](https://monadvision.com) | | Testnet | [testnet.monadscan.com](https://testnet.monadscan.com) | [testnet.monadvision.com](https://testnet.monadvision.com) | ## Tokens on each network These are the tokens the app shows for each network. | Network | Token | What it is | Address | | ------- | ----- | -------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | | Mainnet | USDC | USD Coin, issued by Circle | [`0x754704Bc059F8C67012fEd69BC8A327a5aafb603`](https://monadscan.com/address/0x754704Bc059F8C67012fEd69BC8A327a5aafb603) | | Mainnet | USDT0 | Listed in the app as Tether USD | [`0xe7cd86e13AC4309349F30B3435a9d337750fC82D`](https://monadscan.com/address/0xe7cd86e13AC4309349F30B3435a9d337750fC82D) | | Mainnet | AUSD | Agora Dollar, the currency Floatless Savings holds | [`0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a`](https://monadscan.com/address/0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a) | | Testnet | USDC | Test USDC used by Cleanverse's sandbox | [`0x534b2f3A21130d7a60830c2Df862319e593943A3`](https://testnet.monadscan.com/address/0x534b2f3A21130d7a60830c2Df862319e593943A3) | | Testnet | aUSDC | Cleanverse's regulated test dollar | [`0xaC0893567D43C3E7e6e35a72803df05416C1f20D`](https://testnet.monadscan.com/address/0xaC0893567D43C3E7e6e35a72803df05416C1f20D) | | Testnet | AUSD | Agora's test AUSD | [`0xa9012a055bd4e0eDfF8Ce09f960291C09D5322dC`](https://testnet.monadscan.com/address/0xa9012a055bd4e0eDfF8Ce09f960291C09D5322dC) | MON has no token address on either network. It's the network's own currency, and your **Wallet balance** includes it. ## Testnet tokens and faucets A faucet hands out free test tokens. Here's what Floatless's code points to for each test token: - Test USDC. In the testnet app, once Cleanverse has verified you, the **Get aUSDC, verified dollars** card in **Add money** shows your Cleanverse deposit address and links to [Circle's faucet](https://faucet.circle.com) with **Get free test USDC**. Choose Monad testnet there and paste that address. The card says Cleanverse locks USDC sent there from a Cleanverse-approved source and adds the same amount of aUSDC to your wallet. - Test AUSD. Floatless's testnet records list Agora's AUSD faucet contract at [`0xd236c18D274E54FAccC3dd9DDA4b27965a73ee6C`](https://testnet.monadscan.com/address/0xd236c18D274E54FAccC3dd9DDA4b27965a73ee6C). The app doesn't link to it. - Test MON. Floatless doesn't provide testnet MON, and the app doesn't link to a faucet for it. You'll need some from a Monad testnet faucet to pay network fees. --- # Add money > Receive digital dollars to your Floatless address, get MON for network fees, and get regulated dollars on testnet. Source: https://floatless.xyz/docs/add-money Your money in Floatless is digital dollars, also called stablecoins, held in your wallet on Monad. You add money by having stablecoins sent to your Floatless address, and you keep a little MON, Monad's own currency, to pay network fees. ## Open Add money On Home, tap **Add money**. The sheet is one view with no tabs. The same sheet opens from **Add money** in Send when your wallet has no dollars, from the **Add dollars** and **Add a little MON for fees** steps in the **Get set up** checklist, and from **Add MON** when you're short on the network fee. Bank transfers aren't available yet, and the sheet says so at the bottom. For now money comes in as stablecoins sent to your address on Monad. ## Receive with your address or QR code The sheet shows everything someone needs to pay you. - The QR code holds your wallet address. Anyone can scan it with a wallet app to fill in your address. - **Your Floatless address** shows the same address written out in groups of four, which is easier to check by eye. **Copy address** puts it on your clipboard, and **View on Monadscan** opens your address on Monadscan, a public website that shows every transaction on Monad. - A **Send on Monad only** box gives the sender three steps. In their exchange or wallet they choose Send or Withdraw, pick the coin and choose Monad as the network, then scan your code or paste your address. - **What you can send** lists the coins by name, with AUSD first because it's the one Floatless Savings earns on. - A **Network fee** row shows whether you have the MON you need. See [Get MON for network fees](https://floatless.xyz/docs/add-money#get-mon-for-network-fees). - **Share address** at the bottom sends your address through your phone's share sheet, for example in a message. The message names the network and the coins, and reminds the sender to use Monad only. Your Floatless address is your wallet address. Receiving doesn't cost you anything, because whoever sends the money pays the network fee for their transfer. While the sheet is open, it says "Waiting for money" and checks for new dollars every 10 seconds. When dollars arrive, it shows **Money received** with the amount and tells you it's in your balance. If the sheet says **Your wallet is still getting ready**, your wallet is still connecting. Close the sheet and open it again in a moment. > Only send on Monad, and on the same Monad network your app uses. Your address looks like any other 0x address, so a sender can pick the wrong network by mistake. Floatless only shows and moves money on Monad, so money sent on another network won't appear in the app. Testnet money doesn't show up in the mainnet app either, and the other way around. See [Mainnet and testnet](https://floatless.xyz/docs/networks). ## Coins and token contracts This table lists every stablecoin Floatless shows for your network. When you pay someone, Floatless only uses these token contracts. The **What you can send** list on the sheet leaves out AUSDC, because that comes from the Cleanverse card instead. | Network | Asset | Issuer shown in the app | Token contract | | ------- | ----- | --------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | | Mainnet | AUSD | Agora | [`0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a`](https://monadscan.com/address/0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a) | | Mainnet | USDC | Circle | [`0x754704Bc059F8C67012fEd69BC8A327a5aafb603`](https://monadscan.com/address/0x754704Bc059F8C67012fEd69BC8A327a5aafb603) | | Mainnet | USDT0 | LayerZero | [`0xe7cd86e13AC4309349F30B3435a9d337750fC82D`](https://monadscan.com/address/0xe7cd86e13AC4309349F30B3435a9d337750fC82D) | | Testnet | AUSD | Agora | [`0xa9012a055bd4e0eDfF8Ce09f960291C09D5322dC`](https://testnet.monadscan.com/address/0xa9012a055bd4e0eDfF8Ce09f960291C09D5322dC) | | Testnet | USDC | Circle (Cleanverse sandbox) | [`0x534b2f3A21130d7a60830c2Df862319e593943A3`](https://testnet.monadscan.com/address/0x534b2f3A21130d7a60830c2Df862319e593943A3) | | Testnet | AUSDC | Cleanverse | [`0xaC0893567D43C3E7e6e35a72803df05416C1f20D`](https://testnet.monadscan.com/address/0xaC0893567D43C3E7e6e35a72803df05416C1f20D) | AUSDC is aUSDC, Cleanverse's regulated dollar. Floatless only offers it on testnet, and only a wallet with a verified Cleanverse identity can receive it. See [Regulated dollars](https://floatless.xyz/docs/regulated-dollars). ## Check that it arrived Pull down on Home to refresh. Your **Wallet balance** adds up what your wallet holds, and tapping it opens **Your dollars**, with one line for each coin that has a balance. MON shows up there once you hold some. While the app is open, Home also refreshes your balance about every 30 seconds. Floatless values each stablecoin at its market price when it has one, and at $1 when it doesn't. **Your dollars** says so when it counted any coin at $1. Once you have money in [Floatless Savings](https://floatless.xyz/docs/floatless-savings), **Your dollars** adds a **Savings** block with what's in savings and what you can withdraw now. The headline on Home then reads **Total balance**, with a line like "$X in your wallet, $Y in savings". Money you receive raises your balance. On Monad mainnet it also appears in [Activity](https://floatless.xyz/docs/activity) as **Received**, with the sender's address. ## Get MON for network fees Every payment, savings deposit or withdrawal, and spending-rules registration is a transaction on Monad, and you pay its network fee in MON. Floatless doesn't pay network fees for you, so keep some MON in your wallet before you send. To get MON, send it to your deposit address from another wallet or from an exchange that supports withdrawals on Monad. On testnet you need test MON, which you can get from a Monad testnet faucet. The **Network fee** row on the Add money sheet tells you how much MON your wallet has, or says "None yet" or "Low" when you need more. When you send money, the review screen shows the most the network fee can be, and Send stays off with **Add MON** if your wallet can't cover it. See [Fees and limits](https://floatless.xyz/docs/fees-and-limits). ## Regulated dollars on testnet On Monad testnet, the sheet has one more card, **Get aUSDC, verified dollars**. It's where you get aUSDC, a digital dollar from Cleanverse that only moves between wallets with a verified identity. The mainnet app doesn't show this card. What the card shows depends on your Cleanverse identity. - If you haven't verified yet, it explains that aUSDC only moves between verified wallets and offers **Verify with Cleanverse**, which opens Cleanverse's identity check for your wallet. When you come back to Floatless, the card checks again on its own. If it still asks you to verify, close the sheet and open it again. - Once you're verified, it shows your personal Cleanverse deposit address with **Copy**. Send USDC there from a Cleanverse-approved source, and Cleanverse locks it and adds the same amount of aUSDC to your wallet. **Get free test USDC** opens Circle's faucet, where you pick Monad testnet and paste that address. - If Cleanverse can't be reached, it says "Cleanverse didn’t respond. Try again in a moment." and offers **Try again**. > Your Cleanverse deposit address isn't your wallet address. USDC sent to your wallet address stays USDC. Only USDC sent to the Cleanverse deposit address turns into aUSDC. [Regulated dollars](https://floatless.xyz/docs/regulated-dollars) covers the identity check and how to pay with aUSDC. --- # Send money > How a payment works, every check that runs before you sign, and what to do when one is declined. Source: https://floatless.xyz/docs/send-money Sending money pays a wallet address on Monad from the stablecoins in your Floatless wallet. Before anything reaches your wallet to sign, Floatless checks the payment against your spending rules and your real balance, and for regulated dollars, against both people's identities. ## Before your first payment You need three things in place. - Have dollars in your wallet. With none, the Send sheet says **Nothing to send yet** and offers **Add money**. See [Add money](https://floatless.xyz/docs/add-money). - Set your spending rules. Until you do, every payment is declined, and the Send sheet says so up front with a **Set spending rules** button. You can also tap your avatar on Home, then **Spending rules**. See [Spending rules](https://floatless.xyz/docs/spending-rules). - Keep some MON, Monad's own currency, to pay the network fee. See [Get MON for network fees](https://floatless.xyz/docs/add-money#get-mon-for-network-fees). Sending works the same way on Monad mainnet and testnet. Regulated dollars are the one testnet-only currency. ## Send a payment 1. On Home, tap **Send**. The sheet opens straight on **Send money**. Bank transfers aren't available yet, so the sheet has no bank option. 2. Add the recipient's wallet address or ENS name. Tap **Paste**, tap **Scan QR** to scan their code, or type it. Up to three **Recent** recipients from your past sends sit below, and tapping one fills in its address. A valid address shows "Address looks right. Payments can't be reversed, so check it matches." Tap **Continue**. 3. Type the amount on the keypad, in dollars. The line under it reads **Pay with** and a coin, with your balance in it. Tap it to choose another coin. **25%**, **50%** and **Max** fill in that share of your balance. Tap **Review**. 4. Look over **To**, **Pay with**, **Network fee** and **Payment check** while Floatless runs its checks. **Network fee** reads "Up to X MON", with a dollar estimate when Floatless has a MON price, and you pay it on top of the amount. **Payment check** reads "Checking your spending rules…", then "Passed your spending rules" or "Didn't pass, see below". When it passes, the button reads **Send $X** with your amount. Tap it. 5. Approve with your passkey, or let Floatless sign for your email wallet. With a passkey, you can turn on **Skip Face ID for 10 minutes** first, and later payments up to $25 in total go through without Face ID. See [Payment sessions](https://floatless.xyz/docs/security#payment-sessions) and [How signing works](https://floatless.xyz/docs/send-money#how-signing-works). 6. The screen shows **Sending** while Monad confirms the payment, then **Sent**. Tap **Done**. A few details help along the way. - Type a full 0x address or an ENS name such as name.eth. If a 0x address is the wrong length or isn't valid, the sheet says "That isn't a wallet address. It should start with 0x and be 42 characters long." See [Send to an ENS name](#send-to-an-ens-name). - Scanning accepts a plain address or a simple `ethereum:` address link. Floatless ignores a link for a different network, or one that carries extra details such as an amount. - Amounts are always in dollars, and the keypad takes up to 2 decimal places. Floatless counts each stablecoin as $1 here, so $10 sends 10 USDC. - **Review** stays off while the amount is more than your balance in the coin you picked, and the screen warns you with a line like "More than your USDC balance". On the review screen, tap **To** or **Pay with**, each marked **Change**, to change them. - If the wallet has no dollars, the sheet says **Nothing to send yet** with **Add money**. If your spending rules aren't set, or have expired, it says that up front with **Set spending rules**. - If your wallet doesn't have enough MON for the fee, the review screen keeps the send button off and shows **Add MON**. ## Send to an ENS name ENS names live on Ethereum, so when you type a name like alice.eth, Floatless looks it up there and shows the name, the full 0x address and where that address came from before **Continue** turns on. The review screen and the **Sent** screen show the name, with the address under it on review. The payment always goes to the address you saw. Floatless picks the first address the name has set, in this order. 1. The address the name set for this Monad network. The note says the name "set this address for Monad". 2. The name's default address for every EVM network, which covers Monad. The note says the name "uses this address on every EVM network, Monad included". 3. The name's Ethereum address. Most names only set this one. A regular wallet has the same address on Monad, so the note says so and asks you to check with the owner before sending a large amount. A smart-contract wallet such as a Safe is a different case. Its address on Ethereum may not exist on Monad, and nobody may be able to move money sent there. If a name's only address is a contract on Ethereum with nothing at that address on Monad, Floatless refuses it with "points to a smart-contract wallet on Ethereum that may not exist on Monad, so money sent there could be lost. Ask for their Monad address instead." While the lookup runs, the sheet says "Looking up alice.eth…". A name with no address says "alice.eth doesn't point to a wallet address." If ENS doesn't answer, the sheet says "ENS didn't answer. Try again, or paste the 0x address." ## What Floatless checks before you sign Each time you reach the review screen, the Floatless API checks this exact payment. - Your spending rules have to be signed and registered. Floatless reads the spending-rules registry on Monad to confirm the rules it has on file are your current version and still active. - The currency has to be one of your **Currencies you can send**, and the amount can't be more than **Each payment up to**. - The payments you've sent with Floatless today, plus this one, can't go over **Each day up to**. The day starts at midnight UTC, and payments from all your devices count. - After the payment, what's left of that currency has to stay at or above your floor. The floor is the larger of your **Always keep at least** amount and the total protected floors of your active [savings goals](https://floatless.xyz/docs/savings-goals) in that currency. - Floatless reads your balance of that currency from Monad, so the check uses what your wallet really holds. - Floatless estimates the network fee at the current price and adds 20% headroom. That's the maximum network fee you see. - For aUSDC on testnet, Floatless asks Cleanverse whether both wallets hold a verified identity. See [Regulated dollars](https://floatless.xyz/docs/regulated-dollars). If any check fails, **Payment check** reads "Didn't pass, see below", the reason appears under the review rows in plain words, and the send button stays off. A passing check lasts about a minute. The review screen fetches a fresh check by itself when one runs out, so the button comes back after a moment. ## When a payment is declined The API calls your spending rules a mandate, and the app turns its messages into plain sentences. If a rule applies, a **Set spending rules** or **Change spending rules** link sits under the message and opens the Spending rules screen. When several reasons apply, the screen joins their sentences, except that missing rules hide every other reason and a low balance hides the floor message it always triggers. ### At review | What the screen says | What it means | What to do | | -------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | | You don’t have enough USDC for this payment. | You hold less of this coin than the amount. The message names the coin you picked. | Send less, pay with another coin, or [add money](https://floatless.xyz/docs/add-money). | | This would take you below the balance you chose to keep or a goal’s protected amount. | The payment would leave less than your floor in this coin. | Send less or pay with another coin. To change the floor, edit your rules or goals. | | This is more than your limit for one payment. Send less or change your rules. | The amount is over **Each payment up to**. | Send less, or tap **Change spending rules** and raise the limit. | | This would go over your daily limit. Send less or change your rules. | Today's payments plus this one go over **Each day up to**. | Send less, wait until after midnight UTC, or tap **Change spending rules**. | | Your spending rules don’t include USDC. Pick another dollar or change your rules. | The coin isn't one of your **Currencies you can send**. The message names the coin you picked. | Pay with another coin, or tap **Change spending rules** and add it. | | Set your spending rules first. Floatless checks every payment against them, and it takes about a minute. | You haven't set spending rules, the rules Floatless has on file aren't the version registered on Monad, or the registry doesn't show them as active. | Tap **Set spending rules**, then **Review rules** and **Approve and register**. | | Your spending rules have expired. Set them again to keep paying. | Your rules reached the end of the period you chose. | Tap **Set spending rules** and register new rules. | If your wallet can't cover the network fee, the screen says "You need a little MON to pay the network fee" and names how much to add. The send button stays off. Tap **Add MON** to open [Add money](https://floatless.xyz/docs/add-money), then come back to the review. A message the app has no plain sentence for, such as one about a Cleanverse identity, appears as the API wrote it. Those messages are explained in [Regulated dollars](https://floatless.xyz/docs/regulated-dollars#what-each-status-means). ### While signing and sending If a payment stops after you tap **Send $X**, the status screen shows **Didn't send** with one of these messages. | Message | What it means | What to do | | ------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- | | Network fees changed. Return to review and approve the new fee ceiling. | The maximum fee went up after you reviewed it, or the payment no longer passes its checks. Nothing was signed. | Tap **Try again**, check the new fee, and tap **Send $X** again. | | Authorization expired. Review and try again. | The check ran out of time. If it says "expired while signing", it ran out while you were signing. | Tap **Try again** and send again. | | The signed transaction does not match the reviewed transfer. | What got signed differs from what you reviewed, so it wasn't sent. | Tap **Try again** and start again. | | The transaction was not signed by the sending wallet. | The signature didn't come from your wallet, so it wasn't sent. | Tap **Try again** and start again. | | This payment failed on Monad, so no money moved. A network fee may have been charged. | Monad rejected the transaction. Your stablecoins didn't move, but the fee may be spent. | Tap **Try again**, which takes you back to review for a fresh check. | When the screen says "Nothing left your wallet.", the payment never reached Monad and **Try again** returns you to review for a fresh check. ## How signing works How you sign depends on how you signed in. See [Keys and security](https://floatless.xyz/docs/security) for more. - With a passkey, your phone asks for your passkey when you tap **Send $X**. The app rebuilds your wallet key on the phone for this one payment, then wipes it. The key never leaves your phone. If you turned on **Skip Face ID for 10 minutes**, the key stays in memory for that payment session instead, and is wiped when it ends. See [Payment sessions](https://floatless.xyz/docs/security#payment-sessions). - With email, your wallet is an embedded wallet from Privy, and Floatless signs for it through its API as soon as you tap **Send $X**. There's no second prompt. Right before signing, the app gets one more fresh check and stops if anything changed, including a higher fee. The transaction carries the fee limit from that check, so it can't cost more in fees than the maximum you saw. After signing, and before anything goes to Monad, the app reads the signed transaction back. It checks the network, the token, the recipient and the amount, the transaction's sequence number and fee settings, and that your wallet is the one that signed. If anything differs from what you reviewed, nothing is sent. ## After you send 1. The app saves the transaction's ID, called its hash, in your phone's secure storage. Then it sends the transaction to Monad. 2. It waits up to a minute for Monad to confirm the payment. 3. The Floatless API reads the settled transaction from Monad and checks that it moved the right token from your wallet to the recipient, for the right amount. Only then does the payment go into your [history](https://floatless.xyz/docs/activity). 4. The screen shows **Sent** with the amount and the recipient, the transaction hash, which you can tap to copy, and **View on Monadscan**, which opens the payment on Monadscan. Tap **Done** to close the sheet. > Floatless can't reverse a payment once it settles on Monad. Check the address before you tap **Send $X**. ## If a send times out A timeout doesn't mean the payment failed. Monad's RPC can't see a transaction that's still waiting to be included, so a slow payment looks the same as a lost one. If Monad hasn't confirmed it within a minute, or your connection drops, the screen shows **Didn't send** with the transaction hash and the note "This payment may still go through. Check its status before sending again." - Tap **Check status**. The app looks for the transaction on Monad again and records it once it's confirmed. It never sends a second payment. - Tap **Send a new payment instead** if the earlier one seems stuck. The review screen says **Replacing your earlier payment**, and the new payment is signed with the same nonce, the slot in your wallet's transaction order, as the earlier one. Monad can only include one transaction per slot, so at most one of the two goes through and you can't pay twice. If the earlier payment landed in the meantime, the app records it and says "Your earlier payment went through after all, so this one wasn't sent." - Tap **View on Monadscan** to look at the transaction yourself, or tap the hash to copy it. If you close the sheet, the hash stays saved on your phone. The next time you open **Send**, you go straight back to that payment under the title **Earlier payment**, with "Your last payment is still being confirmed. Check its status before sending another." Saved payments are kept separately for each network and each account. The app only treats a saved payment as unsent when that's certain: - Monad confirms another transaction from your wallet in the same slot, so the saved one can never be included. The app clears it and says "Another transaction from this wallet took this payment's place on Monad, so it can't go through. Nothing was sent." - The network refused the payment when the app sent it, for example because there wasn't enough MON for the fee. The app clears it, says "Nothing left your wallet." and shows **Try again**. - The payment failed before its hash was saved, so nothing reached Monad. A dropped connection while sending isn't proof of anything, because Monad may have the transaction, so the payment stays saved and you can check it. If Monad reports that the transaction failed onchain, the app clears it and the screen says "No money moved, though Monad may have charged a network fee. You can try again." with **Try again**. The hash and **View on Monadscan** stay on screen so you can see the failed transaction. **Try again** always takes you back to review for a fresh check. --- # Spending rules > Limits you set and sign yourself, registered on Monad, and checked before every payment. Source: https://floatless.xyz/docs/spending-rules Spending rules are limits you put on your own payments: the most one payment can be, the most you can send in a day, the balance you always keep, and the currencies you can pay with. You sign them with your wallet, they're registered on Monad, and Floatless checks each payment you send in the app against them before you sign. ## What each rule controls | Rule in the app | What it does | Starts at | | --------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- | | **Each payment up to** | The most a single payment can be. It must be more than 0. | $250 | | **Each day up to** | The most you can send in one day, added up across all your currencies and devices. It must be at least your per-payment limit. The day starts over at midnight UTC. | $500 | | **Always keep at least** | A payment that would take your balance below this is declined. Floatless compares it with your balance in the currency you're paying with. Your other currencies don't count. | $0 | | **Currencies you can send** | The currencies a payment can use. Choose at least one. The app lists USDC, USDT0 and AUSD on mainnet, and USDC, AUSDC and AUSD on testnet. | All of them | | **Rules last for** | How long the rules stay valid: 30, 90 or 180 days. | 90 days | Amounts can have up to 6 decimal places. You can type 250, 19.99 or 19,99, and a leading $ is fine. A comma counts as a decimal point only when one or two digits follow it, so 1,000 isn't accepted. Until you set rules on a network, every payment on that network is declined, and the Spending rules screen says "Set your spending rules" and "Payments are paused until you do." If you have [savings goals](https://floatless.xyz/docs/savings-goals), their protected floors work alongside **Always keep at least**. Floatless uses whichever amount is larger. ### What your wallet signs The app turns the form into these fields. Two of them never appear on screen. | Field | Where it comes from | | ------------------- | ------------------------------------------------------------ | | `perTransactionMax` | **Each payment up to** | | `dailyMax` | **Each day up to** | | `liquidFloor` | **Always keep at least** | | `emergencyFloor` | Always 0 from the app | | `allowedSettlement` | **Currencies you can send** | | `maxSlippageBps` | Always 20, which means 0.2%. No payment check uses it today. | | `expiresAt` | The moment you tap **Review rules**, plus **Rules last for** | Your wallet doesn't sign these amounts one by one. It signs four things: your wallet address, a fingerprint of the fields above, a version number, and the expiry date. The fingerprint is a hash, a short code that changes completely if any field changes. The app works out the fingerprint itself from the rules you reviewed before your wallet signs, so a server can't show you one set of rules and have you sign another. ## Set or change your rules 1. Tap the avatar at the top of Home, Save or Activity to open **Profile**. 2. Under **Payments**, tap **Spending rules**. The row shows your limits in a line like "Up to $250 a payment, $500 a day", or "Not set" with a **Set up** badge. The **Set your spending rules** step in the **Get set up** checklist on Home and the **Set spending rules** button in Send open the same screen. 3. The screen shows **Your rules** with "Active until" and a date, an expired notice, or **Set your spending rules**. If you have no rules or they expired, fill in the form. If you have active rules, tap **Change rules**. 4. Fill in the form and tap **Review rules**. 5. Check the summary. Tap **Edit** to change something, or **Approve and register** to continue. 6. Approve with your wallet. If you signed in with a passkey, your phone asks for your passkey twice, once to sign your rules and once to register them on Monad. If you signed in with email, Floatless signs for your embedded wallet. 7. When you see **Your rules are on**, tap **View registration transaction** to open it on Monadscan, then tap **Done**. **Change rules** fills the form with your current limits and currencies. **Rules last for** starts at 90 days again, so pick the period you want. **Keep my current rules** backs out without changing anything. Registering costs a small network fee in MON, as [Fees and limits](https://floatless.xyz/docs/fees-and-limits) explains. The review step says so, and if your wallet has no MON for the fee it shows **Add MON** and keeps **Approve and register** off. ### What happens after you approve The button shows each step as it happens. | Button text | What's happening | | ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Preparing your rules…** | The Floatless API prepares the exact message to sign. The app checks that it matches the rules you reviewed, your wallet, this network and the registry built into the app, and recomputes the fingerprint. If anything differs, it stops before anything is signed, for example with "The prepared rules differ from what you reviewed. Nothing was signed." | | **Confirm with your passkey (1 of 2)…** | Your wallet signs the message. This is the first passkey prompt. | | **Saving your signed rules…** | The API checks the signature and saves your rules. From this point your previous rules are no longer used. | | **Confirm with your passkey (2 of 2)…** | Your wallet sends a transaction to the registry contract. This is the second passkey prompt. | | **Waiting for Monad to confirm…** | The app waits up to a minute for Monad to confirm it. | | **Adding it to your history…** | The API checks that the registry recorded this version for your wallet, then links the transaction to your history. | Your history then shows "Signed your spending rules" with the version number. You'll find it in **Activity** under **Goals & rules**. If something stops during registration, the screen says "Your rules are signed but not registered on Monad yet, so payments stay paused." and adds the reason, for example "The registry rejected these rules onchain. A network fee may have been charged." The API saved your new rules before the registration, so payments are declined until a registration goes through. The review screen stays open, so tap **Approve and register** again. If you leave, open **Spending rules** and register again. ## Where your rules are registered Rules are registered on the `FundingMandateRegistry` contract, a small program that runs on Monad. Each network has its own. | Network | Chain ID | Registry | | ------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------- | | Monad mainnet | 143 | [`0x14077b679274Eb5d8B95c60A5d9E94A68Ea4fDf0`](https://monadscan.com/address/0x14077b679274Eb5d8B95c60A5d9E94A68Ea4fDf0) | | Monad testnet | 10143 | [`0x127af791F0807584CaEAe5eDDfd8012972E9a3Da`](https://testnet.monadscan.com/address/0x127af791F0807584CaEAe5eDDfd8012972E9a3Da) | For your wallet, the registry keeps the fingerprint, the version, the expiry, and whether the rules were revoked. The amounts themselves are stored by the Floatless API. The registry accepts new rules only when: - the transaction comes from your wallet and carries your wallet's signature - the expiry is in the future - the version is exactly one more than your last one During every payment check, the API rebuilds the fingerprint from the rules it stored for you and asks the registry whether that's your active version. If your stored rules were changed without a new signature from your wallet, the fingerprints wouldn't match and your payments would be declined. If you sign in with a passkey, only your passkey can sign and register a new version, so nobody else, Floatless included, can register rules for your wallet without your passkey. If you sign in with email, the Floatless API signs for your wallet through Privy, so this protection depends on the API. [Keys and security](https://floatless.xyz/docs/security) explains the difference. The signature names the network and the registry, so rules signed for one network can't be registered on the other. Set your rules on each network you use. ## Versions and expiry - Your first registration on a network is version 1, and each new one adds 1. The number never goes down. - The screen shows your current limits under **Your rules**, with "Active until" and the date. The version number shows on the "Signed your spending rules" entry in [Activity](https://floatless.xyz/docs/activity). - To change your rules, register a new version with **Change rules**. Payments use it once it's registered. The app has no button to switch rules off. - After the "Active until" date, payments are declined until you register new rules. The screen then says "Your rules expired on" that date and "Set them again to keep paying.", with the form below it. ## When a payment breaks a rule When you review a payment, the app asks the Floatless API for a payment check. If the payment breaks a rule, **Payment check** reads "Didn't pass, see below" and the reason appears under the review rows in plain words, usually with a **Set spending rules** or **Change spending rules** link. The send button stays off. Nothing is signed or sent, so you don't pay a network fee. Change the payment or your rules and try again. The check runs again right before your wallet signs. If you sent money from another device in the meantime, that payment counts toward your daily limit. The API calls your spending rules a "Funding Mandate", the name the code uses, and the app turns its messages into plain sentences. [Send money](https://floatless.xyz/docs/send-money#when-a-payment-is-declined) lists everything the screen can say. | API message | What the screen says | What it means | | ---------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------- | | "An active Funding Mandate is required." | Set your spending rules first. | You haven't set rules on this network. | | "This asset is not permitted by the active mandate." | Your spending rules don’t include USDC. Pick another dollar or change your rules. | The currency isn't one of your **Currencies you can send**. | | "Amount exceeds the per-transaction mandate limit." | This is more than your limit for one payment. Send less or change your rules. | The payment is more than **Each payment up to**. | | "Amount exceeds the daily mandate limit." | This would go over your daily limit. Send less or change your rules. | Today's payments plus this one would go over **Each day up to**. | | "Send would breach a protected liquidity or savings-goal floor." | This would take you below the balance you chose to keep or a goal’s protected amount. | The balance left in this currency would drop below **Always keep at least** or your goals' protected amounts. | | "The active mandate has expired." | Your spending rules have expired. Set them again to keep paying. | The "Active until" date has passed. | | "The registered mandate version is not current." | Set your spending rules first. | Your newest signed rules aren't registered on Monad, usually because a registration didn't finish. It also appears when you haven't set rules. | | "The registered mandate is revoked, expired, or does not match this policy." | Set your spending rules first. | The registry doesn't show the rules Floatless stored for you as active. | ## What rules can and can't stop > Spending rules guide Floatless checks. Monad and the tokens don't enforce them, so they don't block transfers made outside Floatless. - They stop payments you make with **Send** in the Floatless app, on mainnet and on testnet. - They don't stop a transfer your wallet signs anywhere else. The registry records your rules, and no token reads it. - If you sign in with email, the Floatless signing service doesn't check your spending rules when it signs. The check is the payment check the app runs before it asks for a signature. - They don't apply to moving money into [Floatless Savings](https://floatless.xyz/docs/floatless-savings) or to the registration transaction itself. - **Each day up to** only counts payments Floatless recorded. A transfer made outside Floatless doesn't count toward it. - They never limit money you receive. - The payment check runs on the Floatless API, so this protection depends on the API doing its job. --- # Savings goals > Goals with a protected floor, so a payment that would dip into them is stopped before you sign. Source: https://floatless.xyz/docs/savings-goals A savings goal is an amount you're saving toward, with a protected floor: a part of your balance that payments sent with Floatless can't dip into. This page covers creating and editing goals, how a floor stops a payment before you sign, where goals are stored, and what a floor can't protect against. ## How a goal works A goal has four parts. | Part | What it is | | --------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | | **Name** | What you're saving for, up to 80 characters. | | **Currency** | The one currency the goal protects, such as AUSD or USDC. You pick it from a row of chips. | | **Target** | How much you want to save. It must be more than 0. | | **Keep protected (optional)** | The protected floor: how much of your balance payments must leave alone. You can leave it empty or enter 0, and it can't be more than the target. | Each goal card on Save shows how much of the target your wallet covers, a progress bar, and "N% there" with the protected amount next to it. At 100% the card shows **Goal reached** instead. Home shows up to three goals with a progress bar each. Creating a goal doesn't move any money. Your dollars stay in your wallet, and the goal tells Floatless how much of one currency to leave untouched when you pay someone. Nothing adds money to a goal automatically, and a goal doesn't earn interest. To earn on dollars you aren't spending, use [Floatless Savings](https://floatless.xyz/docs/floatless-savings), which runs on Monad mainnet and is separate from goals. ## Create a goal 1. Open the **Save** tab. 2. Next to **Your goals**, tap **New goal**. When you have no goals yet, the section shows **Save toward something** with a **Create a goal** button instead. 3. Fill in **Name**, **Target** and **Keep protected (optional)**. 4. Pick the **Currency**. It starts as AUSD. The chips list USDC, USDT0 and AUSD on mainnet, and USDC, AUSDC and AUSD on testnet. 5. Tap **Create goal**. The goal shows up under **Your goals** in Save and under **Savings goals** on Home, and Activity shows "Created a goal" with its name. Creating a goal is free. Floatless saves it without a transaction, so there's no network fee. The chips list every dollar the app supports on your network, whether or not you hold it. A goal only protects the currency you pick. ## How a goal stops a payment When you send money, Floatless runs a payment check before you sign, as described in [Send money](https://floatless.xyz/docs/send-money). For the currency you're sending, the check: 1. Adds up the protected floors of all your goals in that currency. 2. Compares that total with the **Always keep at least** amount in your [spending rules](https://floatless.xyz/docs/spending-rules#what-each-rule-controls) and keeps whichever is larger. The two don't add together. 3. Works out what your wallet balance in that currency would be after the payment. 4. Declines the payment if that balance would fall below the larger amount. A declined payment shows "This would take you below the balance you chose to keep or a goal’s protected amount." under the review rows, and the send button stays off. Nothing is signed or sent, so you don't pay a network fee. A payment that leaves exactly the floor is allowed. The check runs when you review and again right before your wallet signs. Each time it reads your current balance from Monad. ### An example You hold 650 AUSD. You have two goals in AUSD, Rent with a protected floor of 300 and Trip with a floor of 200, so your goals protect 500 AUSD. Your spending rules say **Always keep at least** $100 and **Each payment up to** $250, so the floor that applies is 500. - Sending 150 AUSD leaves 500. That isn't below 500, so it goes through. - Sending 200 AUSD would leave 450. That's below 500, so it's declined before you sign. - Sending USDC isn't affected by these goals, because they only protect AUSD. ## Edit or remove a goal To edit a goal, open **Save**, tap the goal, change any field, and tap **Save changes**. The new floor counts from the next payment check. The same limits apply, so a protected amount above the target is refused with "The protected amount can’t be more than the target." To delete a goal, open it and tap **Delete goal**. The app asks "Delete this goal?" and explains that its protected amount stops applying to payments right away. Tap **Delete** to confirm. The goal leaves your list and its floor stops counting. If you use the [Floatless API](https://floatless.xyz/docs/api), `DELETE /v1/goals/:id` does the same thing by archiving the goal. Activity lists the goals you create and the edits you save, as "Created a goal" and "Updated a goal". Deleting a goal doesn't add an entry. ## Where goals are stored Goals are saved by the Floatless API in its database. They aren't recorded on Monad, and your wallet doesn't sign them. Open a goal's entry in Activity and you'll see "This happened in your Floatless account, so there is no blockchain transaction to show." | | Savings goals | Spending rules | | --------------------- | ---------------------------- | --------------------------------------------------------- | | Where they're kept | The Floatless API's database | The Floatless API, with a fingerprint registered on Monad | | Signed by your wallet | No | Yes | | Cost to change | Nothing | A small network fee in MON | | When a change applies | Right away | Once the registration is confirmed on Monad | Each network has its own API and database, so goals you create on mainnet don't exist on testnet. See [Mainnet and testnet](https://floatless.xyz/docs/networks). The API keeps your goals and runs the payment check, so the protection depends on the API. If the app can't reach it, there's no payment check, the send button stays off, and nothing is sent. ## What a goal floor can't do > Goal floors guide Floatless payment checks. They don't lock your money, and they don't stop transfers made outside Floatless. - Your dollars stay free to move. A transfer your wallet signs somewhere else isn't checked. - The floor only covers payments made with **Send**. Moving money into Floatless Savings with **Add to savings** isn't checked against it. - A floor only protects its own currency. A goal in AUSD doesn't stop a USDC payment. - The check looks at your wallet balance only. Money you've moved into Floatless Savings isn't part of that balance. - If you sign in with email, the Floatless signing service doesn't check goal floors when it signs. The check is the payment check the app runs before it asks for a signature. See [Keys and security](https://floatless.xyz/docs/security). - Progress on Home and Save is the part of your wallet balance in the goal's currency that covers the goal. Goals in the same currency share that balance oldest goal first, each up to its target, so a dollar never counts toward two goals. --- # Floatless Savings > Earn interest on AUSD you aren’t spending, through a Morpho vault on Monad mainnet. Source: https://floatless.xyz/docs/floatless-savings Floatless Savings lets you earn interest on AUSD you aren't spending. It runs on Monad mainnet, and you move money in and out from the **Save** tab. ## What Floatless Savings is AUSD is a [stablecoin](https://floatless.xyz/docs/glossary), a digital dollar issued by Agora. Money you add to savings goes into Floatless Savings AUSD, a Morpho Vault V2 that Floatless set up and configured. It lends every deposit through Morpho's Grove x Steakhouse High Yield AUSD vault. [Morpho](https://morpho.org) is a lending protocol on Monad, and the interest its borrowers pay is what you earn. The vault and its adapter are Morpho's own contracts, created by Morpho's factories. Floatless chose their settings, and those settings are public onchain. Every address is on [Contracts and verification](https://floatless.xyz/docs/contracts). Your wallet receives the vault's shares, a token called fsAUSD, and the app shows what they're worth in AUSD. That number grows as interest builds up. With a passkey, you sign for your wallet on your phone and the key stays there. With email sign-in, it's an embedded wallet that the Floatless API signs for after you confirm in the app. [Keys and security](https://floatless.xyz/docs/security) explains both. Savings work on Monad mainnet only. Monad testnet shows a [preview](https://floatless.xyz/docs/floatless-savings#testnet-preview) instead. ## Before you start You need AUSD in your wallet and a little MON, Monad's own token. Deposits and withdrawals are Monad transactions, each with a small fee paid in MON. [Add money](https://floatless.xyz/docs/add-money) shows how to get both. ## Add money to savings 1. Open the **Save** tab. Once you have savings, the **Floatless Savings** card shows your balance and "Earning x% a year". Before you've saved anything, it leads with the rate, as "x% a year", and adds a line like "Your X AUSD would earn about Y AUSD a year here." Home has a **Savings** card too, with **Start saving** or **Add or withdraw**, and both open Save. 2. Tap **Add to savings**. It stays off until you have AUSD in your wallet. With none, the card says "Your wallet has no AUSD yet." and offers **Add AUSD to your wallet**, which opens Add money. 3. Enter an amount, or tap **All** to use all your AUSD. As you type, the sheet shows "About X AUSD a year at today’s rate". 4. Tap **Move to savings**. With a passkey, your phone asks you to confirm. With email sign-in, that tap is your confirmation. 5. The sheet shows **Moved to savings** and the amount. **View on Monadscan** opens the transaction, and **Done** closes the sheet. A deposit usually takes two transactions, an approval for exactly the amount you entered and then the deposit itself. The app builds both and only ever deposits into the vault address built into the app. If the Floatless server reported a different vault, the app would stop before signing anything. After the deposit settles, the API reads it back from Monad and checks the vault's Deposit event for your wallet before it adds **Moved to savings** to your [history](https://floatless.xyz/docs/activity). Deposits are capped at 100,000 AUSD across all savers for now. If the vault is full, the app tells you and the deposit doesn't go through, though the approval may already have gone through and cost a small MON fee. ## Take money out 1. On the **Floatless Savings** card, tap **Withdraw**. The sheet shows how much is ready to withdraw. 2. Enter an amount, or tap **All** to take out everything. 3. Tap **Withdraw** and confirm the same way as a deposit. 4. The sheet shows **Withdrawn to your wallet** and the amount, with a **View on Monadscan** link. Your history shows **Withdrew from savings** once the API has checked the vault's Withdraw event. **Withdraw** stays off while nothing can be withdrawn. ## How much you can withdraw right now What you can withdraw now can be less than your balance. When it is, the card says "Only X AUSD can be withdrawn right now", and the **Withdraw** sheet shows the amount as "ready to withdraw". Morpho lends the AUSD to borrowers, and only AUSD that isn't borrowed at that moment can leave right away. Floatless compares your balance with what the vault could pay out right now, meaning what it can pull back from Morpho plus any AUSD already sitting in the vault, and shows the smaller of the two. When Morpho's markets are heavily borrowed, only part of your savings may be withdrawable until borrowers repay or rates rise. The rest keeps earning. If you ask for more than is available, the app tells you the most you can withdraw right now, and nothing is sent. ## If the usual withdrawal path is paused A withdrawal normally pulls AUSD back from Morpho automatically. If that path stops working, for example because the vault's automatic link to Morpho was switched off, the app checks whether it can take your AUSD straight from Morpho instead. If it can, it shows the exact fee and offers **Withdraw straight from Morpho**. Nothing happens until you tap that button, and it's a single transaction you confirm like any other. The fee is 0.01% of the amount taken from Morpho. It comes out of your own shares and stays in the vault with the other savers, so nobody can push everyone's savings out of Morpho for free. ## The rate you see The card shows a line like "Earning 1.16% a year", and a note under the buttons says the rate is after fees. The API takes Morpho's current rate for the Grove x Steakhouse High Yield AUSD vault without WMON rewards, then takes off the 10% Floatless fee. WMON rewards accrue to the vault's adapter and never reach savers, so counting them would overstate what you earn. If Morpho reports 1.29%, you see 1.16%, which was roughly the rate on October 13, 2026. The rate moves with borrowing demand on Morpho, so it can be higher or lower tomorrow. If Morpho can't be reached, the card says the rate is unavailable right now. ## See how savings grow On the **Floatless Savings** card, tap **See how savings grow**. Enter an amount, then pick **6 months**, **1 year**, **2 years** or **5 years**. The chart shows the balance month by month at today's rate after fees. Drag across it to see the balance and the interest at any month, and the summary shows what you'd put in and the interest at the end. It's an estimate. The rate changes with demand on Morpho, so the real interest will differ, and nothing moves until you add money to savings. On testnet it uses the mainnet rate. ## Testnet preview Morpho isn't deployed on Monad testnet, so the testnet card shows a **Preview** badge and nothing is deposited. It shows about how much your testnet AUSD would earn in a year at the mainnet vault's live rate, with no buttons to add or withdraw. [Mainnet and testnet](https://floatless.xyz/docs/networks) explains the two networks. ## Fees | Fee | Amount | Who gets it | | ------------------------- | ---------------------------------------------- | ---------------------------------------- | | Performance fee | 10% of the interest the vault earns | Floatless, paid as new vault shares | | Deposit or withdrawal fee | None | No one | | Management fee | None | No one | | Emergency exit | 0.01% of the amount taken straight from Morpho | Stays in the vault with the other savers | | Network fee | A small amount of MON per transaction | The Monad network | The 10% comes out of interest only, so the AUSD you put in isn't charged. [Fees and limits](https://floatless.xyz/docs/fees-and-limits) covers every fee in Floatless. ## Who can change what The vault's powers are split across three separate keys, so a leaked curator or allocator key can't take it over. | Role | What it can do | | --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Owner | Replace the curator, cancel any pending change, lower the deposit cap, and step in as backup allocator. It also receives the 10% fee. | | Curator | Propose higher caps or changes to adapters, fees, allocators or gates, which decide who may deposit or withdraw. Each change waits 3 days before it can take effect. | | Allocator | Move money between the vault and its one adapter, choose the path deposits and withdrawals take to Morpho, and cap how fast the vault's value can grow. | All 17 of the vault's timelocked functions wait 3 days, so adding or removing an adapter, raising a cap, or changing fees, gates or allocators shows up onchain before it applies, and you can leave first. The owner can cancel a change during that window. The vault can only add adapters from Morpho's adapter registry, and that setting is locked for good. If the allocator key leaked and someone used it to break withdrawals, the owner can restore them right away as backup allocator. The addresses of all three keys are on [Contracts and verification](https://floatless.xyz/docs/contracts#who-can-change-the-savings-vault). ## Risks - Your AUSD is lent to borrowers through Morpho markets. If a market takes bad debt, the Morpho Vault V1.1 that Floatless Savings lends through doesn't show the loss in its share price, so the savers who leave last could absorb it. - Withdrawals depend on Morpho having unborrowed AUSD, so part of your savings may have to wait when markets are heavily borrowed. - The three keys belong to the Floatless team and aren't a multisig yet. The 3-day wait and the owner's power to cancel changes limit what a leaked key could do. - Floatless Savings holds only AUSD, so its value depends on AUSD keeping its dollar value. - The vault, the adapter and Morpho's markets are smart contracts, and a bug in any of them could lose money. ## How it was checked before mainnet - An adversarial review of the vault's key powers, economics, deployment and tests, with a skeptic challenging every finding, confirmed 12 issues. All of them were fixed before deployment, and several attacks were replayed on a copy of Monad mainnet. - A fork test suite runs against live Morpho contracts on a copy of Monad mainnet, deploying the vault with the same script as the real one. It has 12 attack and configuration tests, such as a leaked curator or allocator key and a front-run deployment, 4 fuzz tests with random inputs, and 5 invariants, rules that must keep holding through random deposits, withdrawals, attacks and allocator moves. Every invariant run ends by checking that each saver can still get their money out. - After the real deployment, a read-only check compared the live vault with the intended settings, including that no setup change was left pending. The commands to run these checks yourself are on [Contracts and verification](https://floatless.xyz/docs/contracts#check-the-savings-vault-yourself), and the recorded mainnet deposit and withdrawal are on [Live proof](https://floatless.xyz/docs/proof). --- # Scheduled releases > Send AUSD to someone after a date you pick. It earns interest while it waits, and Chainlink CRE or anyone can release it once it’s due. Source: https://floatless.xyz/docs/scheduled-releases A scheduled release sends AUSD to someone after a date you choose. The money leaves your wallet now, earns interest in Morpho while it waits, and goes to the recipient with that interest after the date. It's on the **Save** tab on Monad mainnet. ## Schedule a release 1. On **Save**, find **Scheduled releases** and tap **Schedule a release**, or **New release** once you have one. 2. Enter the amount in AUSD. The sheet shows how much AUSD you have. 3. Enter the recipient's 0x address or an ENS name such as name.eth. A name is looked up the same way as in [Send](https://floatless.xyz/docs/send-money#send-to-an-ens-name), and the sheet shows the address before you continue. 4. Pick when it releases: **In 1 hour**, **Tomorrow**, **In a week** or **In a month**. The sheet shows the date, for example "Releases on Oct 21, 3:40 PM". 5. Tap **Schedule release**. The button shows each step: "Checking your spending rules…", then "Approving AUSD…" when SafeLock needs permission to take that amount, then "Locking it in SafeLock…" and "Saving…". Approve each transaction with your passkey, or let Floatless sign for your email wallet. You can't cancel or change a release once it's locked. Check the amount, the recipient and the date before you tap **Schedule release**. ## The checks before you sign A scheduled release pays someone else, so Floatless runs the same checks as a payment before anything is signed. See [What Floatless checks before you sign](https://floatless.xyz/docs/send-money#what-floatless-checks-before-you-sign). - AUSD has to be one of your **Currencies you can send**, and the amount can't be more than **Each payment up to**. - The release counts toward today's **Each day up to**, like a payment, because the money leaves your wallet today. - What's left of your AUSD has to stay at or above your floor, which includes your [savings goals](https://floatless.xyz/docs/savings-goals). - Your spending rules have to be signed, registered on Monad and still active. If a check fails, the sheet shows the reason in the same words as Send and nothing is signed. ## Where the money waits The app sends your AUSD to SafeLock, a Floatless contract on Monad mainnet at [`0xFEd7EdE137062CBa02628bBd01A2956D354f3Ca5`](https://monadscan.com/address/0xFEd7EdE137062CBa02628bBd01A2956D354f3Ca5). The app has this address built in and refuses to lock money anywhere else, even if the API names another contract. Before broadcasting, it also checks that the signed transaction goes to that address with the exact call it built, which matters for email wallets, whose signature comes back from the Floatless API. SafeLock puts the AUSD into Morpho's Grove x Steakhouse High Yield AUSD vault, the same vault that [Floatless Savings](https://floatless.xyz/docs/floatless-savings) lends through. On release, SafeLock redeems the vault shares straight to the recipient, so they get what the shares are worth then: the amount plus the interest it earned. Like any lending vault, Morpho carries risk, and if the vault lost value the release would pay less. ## When it releases After the date, the release can be sent in two ways, and the money goes to the recipient either way. - A Chainlink CRE workflow checks for releases that are due and sends them. Today that workflow runs as a Chainlink CRE CLI simulation that broadcasts real transactions on Monad mainnet when it's run, not on a production Chainlink network. Don't count on it sending at the exact minute. See [Proof](https://floatless.xyz/docs/proof#scheduled-release-with-chainlink-cre-on-mainnet). - Anyone can release a lock once it's due, including you and the recipient. In the app, a due release shows **Ready** with **Release now**. Releasing costs a small network fee in MON, paid by whoever sends it. ## Your list of releases Each release shows the amount, the recipient and one of three states. | State | What it means | | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Waiting | "Releases on" the date. It's earning interest, shown as "+X AUSD interest so far" once there is some. | | Ready | The date has passed. "Chainlink CRE sends it when it runs, or you can release it now." Tap **Release now** to send it yourself. | | Released | The money went to the recipient. It says "Sent to the recipient when you released it." if you released it from the app, or "Sent to the recipient." if Chainlink CRE or someone else did. | The list reads each release's state from Monad when it loads, so a release sent by Chainlink CRE or by the recipient shows **Released** too. Your [Activity](https://floatless.xyz/docs/activity) shows each release you schedule as **Scheduled release**, money out, with the recipient and the release date, and a Monadscan link for the lock transaction. ## If the app loses its connection The app saves each lock and release on your phone from the moment it's signed, before it's sent, and keeps it until the Floatless API has recorded it. So a release still appears in your list if the connection drops partway. - If Monad hasn't confirmed the transaction within a minute, or the connection drops after sending, the sheet closes and the list says "It's on Monad. This list catches up once the transaction is confirmed and saved." Don't schedule it again. It may still go through. - If the API can't record a confirmed transaction yet, the app tries again for a few seconds, then again each time the list loads. - If Monad refused the transaction or it failed onchain, nothing was locked and the app forgets it. ## On testnet Scheduled releases are only on Monad mainnet, so the section doesn't appear on testnet. --- # Regulated dollars > Cleanverse aUSDC on Monad testnet: identity checks on both sides of every payment, and a Travel Rule report. Source: https://floatless.xyz/docs/regulated-dollars Regulated dollars are aUSDC, a digital dollar from Cleanverse that only moves between wallets whose owners have verified their identity. In Floatless they run on Monad testnet only, with Cleanverse's sandbox. > Regulated dollars aren't on mainnet. The mainnet app doesn't list aUSDC, and everything on testnet is test money with no real value. ## What aUSDC is Cleanverse runs a compliance network built on two pieces: a verified identity tied to your wallet, and verified assets that check that identity when they move. aUSDC is one of those assets. The app lists it as AUSDC, with Cleanverse as the issuer. - In Floatless, you get aUSDC by depositing USDC. Cleanverse locks the USDC and adds the same amount of aUSDC to your wallet. - In Floatless, both the sender and the recipient need a valid Cleanverse identity. The token itself also rejects transfers to wallets that have no identity. - Your [spending rules](https://floatless.xyz/docs/spending-rules) apply as usual, so AUSDC has to be one of your **Currencies you can send**. - Network fees are paid in MON, like every Floatless payment. These are the Cleanverse contracts the testnet API reports, and you can check them live at [`/v1/compliance/config`](https://api.floatless.xyz/v1/compliance/config). | Contract | Address on Monad testnet | | ----------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | | aUSDC, the regulated dollar | [`0xaC0893567D43C3E7e6e35a72803df05416C1f20D`](https://testnet.monadscan.com/address/0xaC0893567D43C3E7e6e35a72803df05416C1f20D) | | USDC, the dollar aUSDC is made from | [`0x534b2f3A21130d7a60830c2Df862319e593943A3`](https://testnet.monadscan.com/address/0x534b2f3A21130d7a60830c2Df862319e593943A3) | | Access Core, which locks USDC and creates aUSDC | [`0x8F118338a1fa41E7Fa86Be19A4e8B99Ed58A6EcC`](https://testnet.monadscan.com/address/0x8F118338a1fa41E7Fa86Be19A4e8B99Ed58A6EcC) | | A-Pass, the identity credential | [`0xbA82D189540CaC9DC6FF46B6837CaC1BFdEC58B9`](https://testnet.monadscan.com/address/0xbA82D189540CaC9DC6FF46B6837CaC1BFdEC58B9) | ## Your Cleanverse identity Cleanverse calls it a Cleanverse Verified Identity, or CVI, and its contracts and API use the name A-Pass. It's a credential tied to your wallet address once you've passed Cleanverse's identity check. The check itself happens with Cleanverse, not in Floatless. Floatless never handles your documents. For each aUSDC payment, it asks Cleanverse whether both wallets are verified and keeps a record of the answer, so the payment can point to the decision that allowed it. An identity has an expiry date, and Cleanverse can freeze one. Floatless treats an expired or frozen identity as restricted. ## Verify with Cleanverse You can start from two places. - In Add money, the **Get aUSDC, verified dollars** card shows **Verify with Cleanverse** until you're verified. - In Send, if you pay with AUSDC before you're verified, the review screen shows **Verify to use regulated dollars** with the same button. **Verify with Cleanverse** asks Cleanverse for your wallet's personal verification link and opens it. Follow Cleanverse's steps there, then come back to Floatless. In Send, tap **I’ve verified, check again** to run the check again. In Add money, the card checks again when you come back to Floatless. If it still asks you to verify, close the sheet and open it again. ## Get aUSDC Once you're verified, Add money shows your personal Cleanverse deposit address. 1. On Home, tap **Add money**. 2. In the **Get aUSDC, verified dollars** card, tap **Copy** to copy your deposit address. On testnet, **Get free test USDC** opens Circle's faucet. 3. Send USDC to that address from a Cleanverse-approved source. 4. Cleanverse locks the USDC and adds the same amount of aUSDC to your wallet. The card only shows the address after you're verified, because Cleanverse can't add aUSDC to a wallet without an identity. The deposit address is different from your Floatless wallet address, and USDC sent to your wallet address stays USDC. See [Add money](https://floatless.xyz/docs/add-money). ## Pay with aUSDC Send aUSDC like any other payment. On the amount screen, tap the **Pay with** line and choose **AUSDC**, which the list marks "needs a Cleanverse ID". See [Send money](https://floatless.xyz/docs/send-money). At review, a notice shows where the identity check stands. | Notice | What it means | | ----------------------------------- | ----------------------------------------------------------------------------------------------- | | **Regulated dollars** | Cleanverse is still checking both wallets. | | **Identity verified** | Cleanverse verified both wallets for this payment. | | **Verify to use regulated dollars** | Your wallet doesn't have a Cleanverse identity yet. | | **Transfer not allowed** | The recipient isn't verified, an identity is restricted, or Cleanverse couldn't give an answer. | ### The three places the rule is checked In Floatless, a regulated payment goes ahead only if Cleanverse confirms, at that moment, that both you and the recipient hold a valid identity for aUSDC. The rule is checked in three places. 1. Before you sign, each review asks Cleanverse about both wallets. Floatless reads each wallet's identity, then asks whether each one may move aUSDC, and only a clear yes counts. If either side fails, the send button stays off and the message says which side. 2. When Floatless signs for you with email sign-in, its signing service asks Cleanverse again right before it signs an aUSDC transfer, and refuses if the answer isn't yes. It also refuses to sign aUSDC approvals and permits, which could let someone move the money later without a check. Its route for signing a raw hash doesn't run this check yet. With a passkey you sign on your own phone, so this step doesn't apply. 3. On Monad itself, the aUSDC token rejects a transfer to a wallet that has no Cleanverse identity, even when someone skips Floatless entirely. After the payment settles, Floatless links it to a Cleanverse approval given in the previous 30 minutes for the same wallets, currency and amount. Your [Activity](https://floatless.xyz/docs/activity) entry then carries a **Verified** tag. ## What each status means Floatless sorts Cleanverse's answer for each wallet into one of four statuses, and a payment goes ahead only when both wallets are verified. | Status | What it means | What you see | | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | verified | Cleanverse confirmed a valid identity that's allowed to move aUSDC. | **Identity verified**, once both wallets are verified. | | unverified | Cleanverse has no identity for this wallet. | For you, "Verify your identity with Cleanverse to send regulated dollars." and **Verify with Cleanverse**. For the recipient, "This recipient has not verified their identity with Cleanverse, so they cannot receive regulated dollars." | | restricted | The identity is expired or frozen, or Cleanverse's rules don't let this wallet move aUSDC, for example because its verification level is too low. | "Your Cleanverse credential is expired or frozen, so you cannot send regulated dollars." or "This recipient's Cleanverse credential is expired or frozen." | | unavailable | Floatless couldn't get a clear answer. Cleanverse couldn't be reached or didn't answer within five seconds, sent a reply Floatless couldn't read, or doesn't list aUSDC. | "Cleanverse could not confirm eligibility right now. Nothing was sent; try again shortly." | Floatless never treats unavailable as a yes. If you're restricted, Floatless can't change it, and the identity has to be renewed or restored with Cleanverse. If the recipient isn't verified, they need to verify before they can receive aUSDC, or you can pay them in another currency. ## The transaction report Cleanverse can produce a Travel Rule report for a settled aUSDC payment. The Travel Rule is the requirement that details about who sent and who received a payment are recorded and passed along with it. Cleanverse's report has two parts. - An overview of the sender's Cleanverse identity, with its tier, points, status and dates. - The payment itself, with the sender's address, when it started, the amount, the transaction hash, and the addresses that funded it. To get it, open the payment in **Activity** and tap **Open Cleanverse report** on the **Regulated transfer** card. Floatless gets the report from Cleanverse when you ask, and only for a settled aUSDC payment. The download link Cleanverse returns expires, so Floatless fetches a fresh one each time and never stores it. The [API](https://floatless.xyz/docs/api) can request the report for any settled aUSDC payment in your history. ## Live proof on Monad testnet Recorded on October 13, 2026 through the Floatless testnet API, `api.floatless.xyz` on chain 10143, with Cleanverse's sandbox. The test wallets used the same sign-in and payment steps as a passkey account, with a test script holding their keys in place of a phone's passkey. | Wallet | Address | Identity | | -------------------- | -------------------------------------------------------------------------------------------------------------------------------- | -------- | | Sender | [`0x21d12b78F83044AFc433b3493aBEF452dCFD450e`](https://testnet.monadscan.com/address/0x21d12b78F83044AFc433b3493aBEF452dCFD450e) | Verified | | Verified recipient | [`0xe0a65AE7A77EebA5AC464bD3C103Cb1D55EAFF2B`](https://testnet.monadscan.com/address/0xe0a65AE7A77EebA5AC464bD3C103Cb1D55EAFF2B) | Verified | | Unverified recipient | [`0x8BD784F56cd60ee1b7bd7e39F8043Be0983A10cE`](https://testnet.monadscan.com/address/0x8BD784F56cd60ee1b7bd7e39F8043Be0983A10cE) | None | | Step | Result | Proof | | --------------------------------------------------------------- | --------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Sender identity issued | Cleanverse issued the sender's identity | [`0x69b21309e732ed64bf19e1ffeb094d51c2be0cc2a4fd3d07e9e161fbb868cc49`](https://testnet.monadscan.com/tx/0x69b21309e732ed64bf19e1ffeb094d51c2be0cc2a4fd3d07e9e161fbb868cc49) | | Recipient identity issued | Cleanverse issued the verified recipient's identity | [`0x0888935b49b1ab5877ab1dc32d5e8da21351ba8a0075ef058573fb48cae04092`](https://testnet.monadscan.com/tx/0x0888935b49b1ab5877ab1dc32d5e8da21351ba8a0075ef058573fb48cae04092) | | Sender funded | aUSDC from Cleanverse's sandbox faucet | [`0x0fc1fd3acdff66879a4435f87dfb88547433d8e40c14333d02d5acef35ae44b6`](https://testnet.monadscan.com/tx/0x0fc1fd3acdff66879a4435f87dfb88547433d8e40c14333d02d5acef35ae44b6) | | Spending rules registered | Version 1 on the testnet spending-rules registry | [`0xe68df9f3ccadcac5b076ad25ace387e2055e3292c1c424dd7dcb274c0a48310a`](https://testnet.monadscan.com/tx/0xe68df9f3ccadcac5b076ad25ace387e2055e3292c1c424dd7dcb274c0a48310a) | | 0.01 aUSDC to the unverified wallet | Declined before signing because the recipient was unverified | No transaction | | The same transfer sent straight to the token, without Floatless | Rejected by the aUSDC token in a simulation | No transaction | | 0.01 aUSDC to the verified wallet | Both wallets verified, settled, and linked to its Cleanverse approval | [`0x2f24f858f928a822474f82a0f1907c6af9e554ba3aa5b6b862f606e43e577a11`](https://testnet.monadscan.com/tx/0x2f24f858f928a822474f82a0f1907c6af9e554ba3aa5b6b862f606e43e577a11) | | Travel Rule report | Cleanverse's report for that payment | [Report PDF](https://github.com/winsznx/floatless/blob/main/docs/assets/cleanverse-travel-rule-report.pdf) | More recorded transactions, on both networks, are in [Live proof](https://floatless.xyz/docs/proof). --- # Activity and history > Your history in plain words, grouped by day, with every money movement checked on Monad and a Monadscan link for each transaction. Source: https://floatless.xyz/docs/activity The Activity tab is your Floatless history in plain words: payments you've sent, money moved in and out of savings, goals you've created and spending rules you've signed. Floatless reads money movements back from Monad before it records them. ## Open your history Tap **Activity** in the tab bar. Home also shows your five latest entries under **Recent activity**, and **See all** opens the full list. Activity reloads each time you open the tab, and you can pull down to refresh it. It loads your history 50 entries at a time. When there's more, **Show older activity** at the bottom loads the next 50, and a refresh keeps the older entries you already loaded. Search and the filters look through the entries that are loaded, so if nothing matches, **Show older activity** appears there too. If a refresh fails, your last list stays and a bar says "Couldn’t refresh. Showing your last saved activity. Tap to try again." If the first load fails, you see the reason with **Try again**. With no history yet, the tab says **No activity yet** and offers **Add money**. ## Find an entry - Type in **Search your activity** to match the words on each row, such as the start or end of an address or the word savings. - Use the filters **All**, **Money in**, **Money out**, **Savings** and **Goals & rules** to narrow the list. If nothing matches, the tab says so and **Show all** clears the search and the filter. - Entries are grouped by day, newest first, under **Today**, **Yesterday**, and then dates like Friday, October 9. Days and times follow your phone's time zone. Stablecoin amounts show in dollars, with a plus sign for money in and a minus sign for money out. Other coins keep their name. ## What each entry means | Entry | Filter | What happened | | --------------------------------------- | ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | | **Sent** | **Money out** | You paid someone. The row shows "To" with the start and end of their address, and the amount with a minus sign. | | **Received** | **Money in** | A stablecoin arrived in your wallet from someone else. The row shows "From" with the start and end of their address, and the amount with a plus sign. | | **Moved to savings** | **Savings** | You moved AUSD into [Floatless Savings](https://floatless.xyz/docs/floatless-savings). The row says "Floatless Savings on Morpho". Mainnet only. | | **Withdrew from savings** | **Savings** | You took money out of savings, and the row says it went "Back to your wallet". Mainnet only. | | **Created a goal:** and the goal's name | **Goals & rules** | You created a [savings goal](https://floatless.xyz/docs/savings-goals). | | **Signed your spending rules** | **Goals & rules** | You signed a new version of your [spending rules](https://floatless.xyz/docs/spending-rules). The row shows the version number. | | **Updated a goal:** and the goal's name | **Goals & rules** | You changed a goal's target or floor. | Received entries appear on Monad mainnet. When you open Activity, Floatless looks up stablecoin transfers into your wallet, at most every 30 seconds, and adds each new one once, dated when it arrived. It only counts the stablecoins the app lists, matched by contract address, so a look-alike token sent to your wallet doesn't show up. Money coming back from Floatless Savings stays a **Withdrew from savings** entry. ## Open an entry Tap an entry in the Activity tab, or on Home, to open **Details**. - The amount in large type with the entry's title above it, as in the list, and a status below it. The status is **Completed** for an entry with a transaction. For spending rules it's **Registered on Monad** once the registration transaction is attached, or **Signed, not registered yet** before that. - **When** it happened, in your phone's time zone. - **Currency**, with the coin's full name and symbol, for entries with an amount. - **Network**, Monad mainnet or Monad testnet, for entries that record their chain. - **To** or **From**, the full address of the other wallet. Tap it to copy it. - **Transaction**, the full transaction hash. Tap it to copy it. - **View on Monadscan**, which opens the transaction on the explorer for that network inside the app. Entries that never touched the blockchain say so. A new goal says "Goals live in your Floatless account. No money moved." Spending rules that aren't registered yet say "You signed these rules on this phone. They aren’t registered on Monad yet." Some entries end with a button back to the place they came from. A goal entry has **See your goals**, a spending-rules entry has **Open spending rules**, and a savings entry has **Go to savings**. ## Regulated payments Payments in aUSDC, Cleanverse's regulated dollar on Monad testnet, appear as **Sent** like any other payment. When Floatless has Cleanverse's approval on file for the payment, the row carries a **Verified** tag next to its title. Floatless links a payment to an approval when Cleanverse approved the same wallets, currency and amount in the 30 minutes before the payment was recorded. If there's no such approval, the payment is still recorded, just without that note. Opening a regulated payment adds a **Regulated transfer** card. It says "Cleanverse checked both wallets before you signed this transfer." when an approval is linked, or "Cleanverse didn’t check this transfer before it was signed." when it isn't. **Open Cleanverse report** opens Cleanverse's Travel Rule report for the payment. If Cleanverse hasn't produced it yet, the app says "The Cleanverse report isn’t ready yet. Try again shortly." See [Regulated dollars](https://floatless.xyz/docs/regulated-dollars#the-transaction-report). ## How entries are checked before they appear Floatless doesn't take the app's word for a money movement. It reads the transaction from Monad first. - For a payment, the app sends the transaction's hash to the Floatless API once Monad confirms it. The API reads the transaction from Monad, makes sure it succeeded, and looks for a transfer of that token from your wallet to the recipient. It records the entry only if the amount matches what you sent, and a transaction can only be recorded once. - For savings, which run on mainnet only, the API reads the transaction and finds the deposit or withdrawal the savings vault logged for your wallet. The entry shows the amount the vault reports. - For spending rules, the entry appears when you sign them. Once the transaction that registers them on Monad confirms, Floatless checks that the spending-rules registry logged your wallet and that version, then attaches the transaction to the entry. - Goals don't touch the blockchain, so there's no transaction to check. A goal entry records a change in your Floatless account. ## Mainnet and testnet keep separate histories Floatless runs one service for Monad mainnet and another for Monad testnet, and each keeps its own history. Your app works with one of them. Every response from the Floatless API says which network it belongs to, and if the app reaches a server on the other network, it stops with a message like "This app is on Monad mainnet, but the server it reached is on Monad testnet. Nothing was changed." So your mainnet history never shows testnet entries, and the other way around. See [Mainnet and testnet](https://floatless.xyz/docs/networks). --- # Keys and security > How signing works for passkey and email users, what Floatless can and can’t do with your money, and the known risks. Source: https://floatless.xyz/docs/security This page explains how keys work for each way of signing in, what Floatless can and can't do with your money, the checks that run before anything is signed, and the risks we already know about. ## Two ways to sign in Your dollars sit in your own wallet address on Monad, and your Floatless Savings are vault shares held by that same wallet. How you sign in decides who can sign for that wallet. | | Passkey | Email | | --------------------------- | ------------------------------------------------------------------------------------- | -------------------------------------------------------------- | | How you sign in | **Create account** or **Sign in with your passkey**, then your phone's passkey prompt | Your email address, then a 6-digit code | | Where the key comes from | Your passkey, on your phone | An embedded wallet held by Privy | | Who signs | Your phone | The Floatless API, through Privy, after you confirm in the app | | Can Floatless sign for you? | No | Yes | ### Passkey When you tap **Create account**, the app creates a passkey for floatless.xyz named with your name. **Sign in with your passkey**, and **I already have an account** on the welcome screen, use the one you already have and never create a new wallet. Each time you sign, the app rebuilds your wallet key from the passkey on your phone. The key isn't saved on your phone, and it's never sent to Floatless's servers. They get your wallet address and the signatures you make. To start a session, your phone signs a one-time challenge from the API. If your passkey manager can't create a Floatless wallet, the app tells you and suggests iCloud Keychain on iOS 18 or later, or Google Password Manager on Android. Floatless has no copy of your key, so it can't restore your wallet if you lose your passkey. In **Profile**, **Recovery** under **Security** explains that your passkey syncs to a new phone through your password manager, and that guardian recovery isn't available yet. **Passkey** under **Security** shows where yours is saved. ### Payment sessions On the review screen, a passkey account can turn on **Skip Face ID for 10 minutes** before tapping **Send**. That payment is still approved with Face ID. Once it's signed, the app keeps the Mera signing session from that unlock open, so the payments after it don't ask for Face ID again, within these limits that the app checks before it signs: - Up to 10 minutes from the approval. - Only stablecoin payments, meaning a `transfer` on one of the stablecoin contracts the app has built in. It can't approve a token, call any other contract or send MON. - Up to $25 in total across the session, counting each stablecoin at $1. The payment you approved with Face ID to start it doesn't count toward this. - Only on this network, and only from the wallet that opened it. Every payment still gets the full check against your onchain spending rules and balance. While a session is open, Home shows "Payments unlocked" with the time and the amount left, and **End**. The session ends, and the app zeroes the key in memory, when the 10 minutes run out, when you tap **End**, when the app goes to the background, or when you sign out. A payment that's outside the limits asks for Face ID as usual. The limits are enforced by the app on your phone, not onchain, so a payment session trusts the app the same way an unlocked phone does. ### Email Privy, the wallet provider Floatless uses for email accounts, sends you a 6-digit code. The first time, the Floatless API creates an embedded wallet for you with Privy and links it to your account. When you confirm something in the app, the app asks the Floatless API to sign, and the API asks Privy to sign with your wallet. The API signs only structured requests for an email wallet, through two routes: - `/v1/wallet/sign-transaction` signs only the transactions the app builds: a stablecoin `transfer`, an `approve` to the savings vault or SafeLock, or a call to the savings vault, SafeLock or the spending-rules registry. It must be on this network, from your wallet, and send no MON. It also runs the same regulated-transfer check as every payment, and the app checks that the signed transaction matches what you reviewed before sending it. - `/v1/wallet/sign-typed-data` signs only Floatless spending rules: the `FundingMandate` type for this network's registry, for your own wallet, with no extra fields. A token permit or an exchange order is refused. There's no route that signs a raw hash or a message, or that signs and sends in one step. You don't have to manage a key, but your wallet depends on the Floatless API and on Privy. On testnet, the signing service also refuses to sign a regulated-dollar transfer unless Cleanverse approves it at that moment. See [Regulated dollars](https://floatless.xyz/docs/regulated-dollars). ## What Floatless can and can't do With either sign-in, Floatless can decline a payment check. That stops the app from sending the payment, and it doesn't move any money. Floatless also controls the savings vault's settings through team-held keys, within the limits in [Who controls the savings vault](https://floatless.xyz/docs/security#who-controls-the-savings-vault). If you sign in with a passkey, Floatless can't sign anything for your wallet. It can't send your money, register spending rules for you, or approve anyone to spend from your wallet. Each of those needs your passkey. If you sign in with email, the Floatless API can sign for your wallet through Privy. The app only asks it to after you confirm, and it checks every signed payment before sending it. Even so, anyone who controlled the API or its Privy access could sign other transactions for email wallets. That's the trade-off for not managing a key yourself. ## Checks before you sign Here's what happens between tapping **Send** and your payment reaching Monad. 1. Payment check. The Floatless API checks the payment against your [spending rules](https://floatless.xyz/docs/spending-rules), today's total, your [goal floors](https://floatless.xyz/docs/savings-goals) and your balance on Monad, and confirms your rules are the active version in the registry. For regulated dollars on testnet, it also asks Cleanverse about both wallets. 2. Review. On the review screen, **Send $X** only turns on when the check allowed this exact amount, currency and recipient, and the screen shows the maximum network fee. 3. Second check. When you tap **Send $X**, the app runs the check again. It stops if the payment is now declined, the fee went up, the API and the app are on different networks, the sender isn't your wallet, the token address doesn't match the one built into the app, or the amount or recipient changed. A check is good for up to one minute. 4. The app builds the transaction on your phone, a plain token transfer of your amount to your recipient. 5. Your phone signs it with your passkey. For email sign-in, Privy signs it through the Floatless API. 6. Signed-transaction check. Before anything is broadcast, the app reads the signed transaction back and checks that the network, token, recipient, amount, sequence number and fee settings are exactly what it built, and that your wallet signed it. If anything differs, it stops before broadcasting, for example with "The signed transaction does not match the reviewed transfer." 7. The app saves the transaction's ID on your phone, then broadcasts it. If the network is slow, **Check status** looks up that same transaction instead of sending a second payment. 8. After the payment settles, the API reads it back from Monad and checks the sender, recipient, token and amount before adding it to your history. Spending rules get a similar check. Before you sign them, the app confirms that the rules the API prepared match the ones you reviewed, for your wallet, this network and the registry built into the app, and it recomputes the fingerprint your wallet signs from those rules. ## The savings vault is pinned in the app The mainnet app has the Floatless Savings vault address, [`0x35277466836C6cdb426F50DDF79db0e043e6bbFe`](https://monadscan.com/address/0x35277466836C6cdb426F50DDF79db0e043e6bbFe), and the vault's AUSD address built in. - Before each deposit or withdrawal, the app compares both with what the API reports. If they differ, it stops with "The savings vault reported by the server does not match this app. Nothing was signed." - The app builds the transactions itself: an approval for exactly the amount you're depositing when one is needed, then the deposit, or a withdrawal paid to your own wallet. - After each one, the API checks the vault's own deposit or withdrawal record for your wallet on Monad before adding it to your history. A server that's been tampered with can't point your deposits at another vault through the app. For email sign-in, the API still signs these transactions, so the trust described above applies. ## Mainnet and testnet stay apart - The mainnet app uses `api-mainnet.floatless.xyz` on chain 143, and the testnet app uses `api.floatless.xyz` on chain 10143. Each API has its own database. - Every API response names its network, and the app refuses a server on the other one. - Before signing a payment, the app checks that the API and its own connection to Monad are on the app's network. - Spending-rule signatures name the network, so they can't be reused on the other one. - Pending payments and passkey sessions on your phone are kept separately for each network. [Mainnet and testnet](https://floatless.xyz/docs/networks) covers what works on each. ## Who controls the savings vault Floatless Savings is a Morpho Vault V2 on Monad mainnet. The code that holds the money is Morpho's audited contracts, and Floatless configured them. Three separate keys, all held by the Floatless team, can change its settings. | Role | Address | What it can do | | -------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------ | | Owner, also the backup allocator and fee recipient | [`0x024Db1faC265D471C2a5eca95AD00C19e3394A07`](https://monadscan.com/address/0x024Db1faC265D471C2a5eca95AD00C19e3394A07) | Right away: replace the curator, cancel any pending change, lower the deposit cap, and undo a bad allocator move. It receives the 10% fee on interest. | | Curator | [`0x7830200a9D5a4BB821B1C2327B8953f991E8F9C9`](https://monadscan.com/address/0x7830200a9D5a4BB821B1C2327B8953f991E8F9C9) | Propose changes to the vault's adapters, caps, fees, gates or allocators. Each change waits 3 days. | | Allocator, the operations key | [`0xE1E55cB254feB8CBEA730AAe987777f12d8C5B25`](https://monadscan.com/address/0xE1E55cB254feB8CBEA730AAe987777f12d8C5B25) | Move money between the vault and its one Morpho adapter, and set the path deposits and withdrawals use and the maximum interest rate. | In plain words: - An adapter is the vault's connection to a Morpho vault that lends the money out. A gate can limit who deposits or withdraws. - Any curator change that could affect savers waits 3 days. All 17 Vault V2 functions that can be delayed are set to this wait. You can see a change coming onchain and withdraw first, and the owner can cancel it during the wait. - The vault can only use adapters from Morpho's own registry, and that setting is locked for good. - If a leaked allocator key broke the withdrawal path, the owner could restore it right away. The app also offers **Withdraw straight from Morpho** for a 0.01% fee. - None of these keys can move the vault shares in your wallet. [Floatless Savings](https://floatless.xyz/docs/floatless-savings) and [Contracts and verification](https://floatless.xyz/docs/contracts) have the full setup. ## Known risks - Team-held keys. The vault's owner, curator and allocator are separate keys held by the Floatless team. They aren't a multisig yet, which is a wallet that needs several people to approve each action. The 3-day wait and the owner's power to cancel limit what one leaked key could do. - Morpho liquidity. Withdrawals depend on Morpho having unborrowed AUSD. When its markets are heavily borrowed, only part of your savings may be withdrawable until borrowers repay. - Morpho bad debt. If a Morpho market takes a loss, the underlying Morpho Vault V1.1 doesn't show it in its share price, so the last savers to leave could absorb it. - Email wallets. The Floatless API signs for email wallets through Privy, so a problem with the API or with Privy could put them at risk. Passkey wallets don't depend on the API to sign. - Spending rules and goal floors. Floatless checks them before you sign, and they don't stop transfers made outside Floatless. - Lost passkeys. Floatless can't restore a passkey wallet, and guardian recovery isn't set up. - Stablecoin issuers. Your balances are stablecoins, and each one depends on its issuer. Floatless Savings holds only AUSD, issued by Agora. ## Report a vulnerability Please don't open a public issue for a security problem. Report it privately instead. - Open the [Security tab of the Floatless repository](https://github.com/winsznx/floatless/security) and choose "Report a vulnerability". - If you can't use that form, email hello@floatless.app with "Security" in the subject. Say what you found, how to reproduce it and the impact you expect. Describe any private keys, seed phrases, API keys or user data instead of including them. Floatless will acknowledge your report, keep you updated, and credit you when the fix ships if you'd like. Don't test against the live mainnet vault, real users on the hosted APIs, or anyone else's funds. Use a local API, the testnet API or the mainnet fork tests: ```sh MONAD_MAINNET_RPC_URL=https://rpc.monad.xyz forge test --match-contract FloatlessSavingsFork -vv ``` Bugs inside third-party services such as Privy, Mera, Cleanverse and Morpho belong with those providers, but how Floatless configures and uses them is in scope. The risks above are already known, so please don't file them as new findings. The full scope and policy are in [SECURITY.md](https://github.com/winsznx/floatless/blob/main/SECURITY.md). --- # Fees and limits > Every fee you pay and every limit that applies, and where each one is enforced. Source: https://floatless.xyz/docs/fees-and-limits This page lists every fee you can pay while using Floatless and every limit that applies to your money, with where each one is enforced. ## Fees at a glance | Fee | When you pay it | How much | Where it's enforced | | -------------------------------------- | ---------------------------------------------------------------------------- | ----------------------------------------- | ------------------------------------------------------------------------------- | | Monad network fee | Each payment, savings deposit or withdrawal, and spending-rules registration | Set by Monad, paid in MON | Monad charges it. For payments, the app also holds it to a ceiling you approve. | | Floatless Savings performance fee | Only on interest your savings earn on mainnet | 10% of the interest | The savings vault contract | | Emergency exit fee | Only if you choose **Withdraw straight from Morpho** | 0.01% of the amount you take out that way | The savings vault contract | | Savings deposit or withdrawal fee | Never | None | | | Floatless fee for sending or receiving | Never | None | | Floatless itself doesn't charge you to send money, receive money, set spending rules or create goals. Where a transaction is involved, you pay only Monad's network fee. The app doesn't swap one currency for another, so there are no swap fees, and cards aren't available yet, so there are no card fees. ## Network fees in MON Every transaction your wallet sends on Monad costs a network fee, paid in MON, Monad's own currency. Floatless doesn't pay these fees for you, so keep some MON in your wallet. [Add money](https://floatless.xyz/docs/add-money) explains how to get it. On testnet you pay in testnet MON. | What you do | Transactions | Network fee | | ----------------------------------------------------------- | ---------------------------------------- | ---------------------------------------------- | | Send money | 1 | Yes, with a maximum you see before you confirm | | **Add to savings** | 1, or 2 when an approval is needed first | Yes | | **Withdraw** from savings | 1 | Yes | | Register spending rules | 1 | Yes | | Receive money, create or edit goals, or run a payment check | None | No | The approval before a savings deposit lets the vault take exactly the amount you're depositing and nothing more. A declined payment costs nothing, because nothing is sent. A transaction that's sent and then fails onchain can still cost a fee, and the app warns you when that happens. ### The fee ceiling on payments On the review screen, **Network fee** shows the maximum in MON as "Up to X MON", with a dollar estimate when Floatless has a MON price. You pay it in addition to the amount you send. That maximum holds all the way to Monad. 1. The Floatless API estimates the [gas](https://floatless.xyz/docs/glossary#gas) your transfer needs, adds a 20% margin, and multiplies by the current gas price. That's the maximum you see. 2. When you tap **Send $X**, the app asks for a fresh payment check. If the new maximum is higher, it stops with "Network fees changed. Return to review and approve the new fee ceiling." 3. The app builds the transaction with exactly that gas limit and gas price. 4. After signing, the app checks that the signed transaction still has that gas limit and gas price before it broadcasts it. A transaction can't spend more than its gas limit times its gas price, so you can't pay more than the maximum you approved. Savings deposits, withdrawals and rule registrations also add a 20% margin to the gas estimate and use the current gas price, but the app doesn't show a maximum for them before you approve. ## Floatless Savings fees Floatless Savings runs on Monad mainnet. On testnet the Save tab only shows a preview, nothing is deposited, and there's nothing to pay. - Performance fee: 10% of the interest your savings earn. The vault takes it by creating new vault shares for the Floatless fee address as interest builds up. Your deposits themselves aren't charged. - The rate on the Save tab, shown as a percentage "a year", already has the fee taken out, and a note on the card says "Rate after fees." It's Morpho's reported rate for the underlying vault without reward tokens, minus the 10% fee. - There's no deposit fee, no withdrawal fee and no management fee. The vault's management fee is set to 0. - Emergency exit fee: 0.01%. If the usual withdrawal path is paused, the app can offer **Withdraw straight from Morpho**, which pulls your money straight out of Morpho. The app shows the exact fee in AUSD first, and nothing happens unless you tap it. The fee comes out of your own savings and stays in the vault, so other savers don't pay for your exit. Changing any of these fees takes a proposal from the vault's curator and a 3-day public wait, so you'd see it coming and could withdraw first. [Keys and security](https://floatless.xyz/docs/security#who-controls-the-savings-vault) explains who holds which key, and [Floatless Savings](https://floatless.xyz/docs/floatless-savings) covers how saving works. ## Limits at a glance | Limit | Value | Where it's enforced | | --------------------------- | ------------------------------------------------------------------------- | ----------------------------------------------------------------- | | **Each payment up to** | You choose it, more than 0 | The payment check | | **Each day up to** | You choose it, at least your per-payment limit, counted from midnight UTC | The payment check | | **Always keep at least** | You choose it, 0 or more, for the currency you're paying with | The payment check | | **Currencies you can send** | At least one | The payment check | | **Rules last for** | 30, 90 or 180 days | The payment check and the rules registry | | Goal **Keep protected (optional)** | From 0 up to the goal's target | Checked when you save the goal, then applied by the payment check | | Payment amount | Up to your balance in that currency, typed in dollars with up to 2 decimal places | The app and the payment check | | Payment check | Good for up to one minute | The app | | Network fee on a payment | The maximum shown at review | The app, then the signed transaction | | Savings deposits | 100,000 AUSD in total, across all savers | The savings vault contract | | Savings withdrawals | What Morpho can pay out right now | The savings vault and Morpho | The payment check is run by the Floatless API, at `POST /v1/send/quote`, when you review a payment and again right before you sign. It covers payments made with **Send** in Floatless and doesn't stop transfers made outside Floatless. [Spending rules](https://floatless.xyz/docs/spending-rules#what-rules-can-and-can-t-stop) explains why. ## Spending rule limits You set most of the limits above in your [spending rules](https://floatless.xyz/docs/spending-rules), and you choose the numbers. - **Each day up to** adds up every payment Floatless recorded since midnight UTC, in all currencies and from all your devices, plus the one you're making. - **Always keep at least** is compared with your balance in the currency you're paying with. Your [goal floors](https://floatless.xyz/docs/savings-goals) work the same way, and Floatless applies whichever floor is larger. - When your rules expire, payments are declined until you register new ones. ## Savings limits - Floatless Savings accepts up to 100,000 AUSD in total, across all savers. A deposit that would go over the cap is refused by the vault, and the app says "Floatless Savings is full right now. Try a smaller amount, or try again later." Raising the cap takes a curator proposal and the 3-day wait. The owner can lower it right away, and a lower cap limits new deposits without blocking withdrawals. - Only AUSD goes into Floatless Savings, and you can deposit up to the AUSD in your wallet. - You can withdraw what Morpho can pay out right now. When it's less than your savings, the Save tab says "Only X AUSD can be withdrawn right now", and the **Withdraw** sheet shows the amount as "ready to withdraw". When Morpho's markets are heavily borrowed, that can be less than your full savings until borrowers repay. --- # Contracts and verification > Every contract Floatless uses on each network, with source verification and how to check the savings vault yourself. Source: https://floatless.xyz/docs/contracts This page lists the contracts Floatless deployed and the third-party contracts it relies on, on Monad mainnet and Monad testnet. It also covers how the savings vault was deployed, who controls it, and how you can check its configuration yourself. ## Mainnet contracts These run on Monad mainnet, chain ID 143. Source verified means the explorer holds the contract's source code and has matched it to the code deployed at that address. Monadscan shows the savings vault as a similar match, which means its bytecode matches another Morpho Vault V2 whose source Monadscan already holds. The adapter and the registry are full matches there. | Contract | Address | Source verified | | ------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Floatless Savings AUSD, a Morpho Vault V2 | [`0x35277466836C6cdb426F50DDF79db0e043e6bbFe`](https://monadscan.com/address/0x35277466836C6cdb426F50DDF79db0e043e6bbFe) | [Monadscan](https://monadscan.com/address/0x35277466836C6cdb426F50DDF79db0e043e6bbFe#code), [MonadVision](https://monadvision.com/address/0x35277466836C6cdb426F50DDF79db0e043e6bbFe) | | Morpho Vault V1 adapter for Floatless Savings | [`0xCe2b239dD33110f7c662Fe69D394DcA65A7fF1ab`](https://monadscan.com/address/0xCe2b239dD33110f7c662Fe69D394DcA65A7fF1ab) | [Monadscan](https://monadscan.com/address/0xCe2b239dD33110f7c662Fe69D394DcA65A7fF1ab#code), [MonadVision](https://monadvision.com/address/0xCe2b239dD33110f7c662Fe69D394DcA65A7fF1ab) | | Spending-rules registry, `FundingMandateRegistry` | [`0x14077b679274Eb5d8B95c60A5d9E94A68Ea4fDf0`](https://monadscan.com/address/0x14077b679274Eb5d8B95c60A5d9E94A68Ea4fDf0) | [Monadscan](https://monadscan.com/address/0x14077b679274Eb5d8B95c60A5d9E94A68Ea4fDf0#code), [MonadVision](https://monadvision.com/address/0x14077b679274Eb5d8B95c60A5d9E94A68Ea4fDf0) | The savings vault and its adapter are Morpho's code, created by Morpho's own factories. Floatless owns the vault and configured both, and [Floatless Savings](https://floatless.xyz/docs/floatless-savings) explains what they do for you. The spending-rules registry is Floatless's own contract, and the app uses it to record your [spending rules](https://floatless.xyz/docs/spending-rules). It holds no money and has no owner or admin. A wallet can only register or revoke its own rules, and registering needs that wallet's signature. ## Third-party contracts on mainnet | Contract | Address | How Floatless uses it | | -------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------- | | AUSD, issued by Agora | [`0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a`](https://monadscan.com/address/0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a) | The only asset Floatless Savings holds | | Grove x Steakhouse High Yield AUSD, a Morpho vault | [`0x32841A8511D5c2c5b253f45668780B99139e476D`](https://monadscan.com/address/0x32841A8511D5c2c5b253f45668780B99139e476D) | Where Floatless Savings lends every deposit | | Morpho `VaultV2Factory` | [`0x8B2F922162FBb60A6a072cC784A2E4168fB0bb0c`](https://monadscan.com/address/0x8B2F922162FBb60A6a072cC784A2E4168fB0bb0c) | Created the savings vault | | Morpho `MorphoVaultV1AdapterFactory` | [`0x9f3c0999425656fD189C69a8aD68cB64986D644A`](https://monadscan.com/address/0x9f3c0999425656fD189C69a8aD68cB64986D644A) | Created the adapter | | Morpho adapter registry | [`0x6a42f8b46224baA4DbBBc2F860F4675eeA7bd52B`](https://monadscan.com/address/0x6a42f8b46224baA4DbBBc2F860F4675eeA7bd52B) | The only source of adapters the savings vault can ever add | | USDC, issued by Circle | [`0x754704Bc059F8C67012fEd69BC8A327a5aafb603`](https://monadscan.com/address/0x754704Bc059F8C67012fEd69BC8A327a5aafb603) | A stablecoin listed in the mainnet app | | USDT0 | [`0xe7cd86e13AC4309349F30B3435a9d337750fC82D`](https://monadscan.com/address/0xe7cd86e13AC4309349F30B3435a9d337750fC82D) | A stablecoin listed in the mainnet app | ## Testnet contracts These run on Monad testnet, chain ID 10143. | Contract | Address | Source verified | | ------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Spending-rules registry, `FundingMandateRegistry` | [`0x127af791F0807584CaEAe5eDDfd8012972E9a3Da`](https://testnet.monadscan.com/address/0x127af791F0807584CaEAe5eDDfd8012972E9a3Da) | [Monadscan](https://testnet.monadscan.com/address/0x127af791F0807584CaEAe5eDDfd8012972E9a3Da#code), [MonadVision](https://testnet.monadvision.com/address/0x127af791F0807584CaEAe5eDDfd8012972E9a3Da) | | `AdapterRegistry` | [`0x9704d264DE3EC51401366cD815a193530C105AC8`](https://testnet.monadscan.com/address/0x9704d264DE3EC51401366cD815a193530C105AC8) | [Monadscan](https://testnet.monadscan.com/address/0x9704d264DE3EC51401366cD815a193530C105AC8#code), [MonadVision](https://testnet.monadvision.com/address/0x9704d264DE3EC51401366cD815a193530C105AC8) | | `FundingVault` | [`0xb179F1661567e494A671E85Af1E7B8CF087E601A`](https://testnet.monadscan.com/address/0xb179F1661567e494A671E85Af1E7B8CF087E601A) | [Monadscan](https://testnet.monadscan.com/address/0xb179F1661567e494A671E85Af1E7B8CF087E601A#code), [MonadVision](https://testnet.monadvision.com/address/0xb179F1661567e494A671E85Af1E7B8CF087E601A) | | `KuruAdapter` | [`0x0bE9633Cb7beacc399C723dC31011DF16dFCfB55`](https://testnet.monadscan.com/address/0x0bE9633Cb7beacc399C723dC31011DF16dFCfB55) | [Monadscan](https://testnet.monadscan.com/address/0x0bE9633Cb7beacc399C723dC31011DF16dFCfB55#code), [MonadVision](https://testnet.monadvision.com/address/0x0bE9633Cb7beacc399C723dC31011DF16dFCfB55) | The testnet app records spending rules in this registry, the same way as on mainnet. `AdapterRegistry`, `FundingVault` and `KuruAdapter` are deployed and verified, but the current app and API don't use them. There's no savings vault on testnet, because Morpho isn't deployed there. `SafeLock` is deployed on mainnet at [`0xFEd7EdE137062CBa02628bBd01A2956D354f3Ca5`](https://monadscan.com/address/0xFEd7EdE137062CBa02628bBd01A2956D354f3Ca5), source-verified on Monadscan and MonadVision. A Chainlink CRE workflow releases its mature locks. See [Proof](https://floatless.xyz/docs/proof#scheduled-release-with-chainlink-cre-on-mainnet). The repository also holds `MorphoVaultAdapter` and `FlexDollarVault`, which aren't deployed on either network. ## Third-party contracts on testnet | Contract | Address | How Floatless uses it | | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- | | aUSDC, Cleanverse's regulated dollar | [`0xaC0893567D43C3E7e6e35a72803df05416C1f20D`](https://testnet.monadscan.com/address/0xaC0893567D43C3E7e6e35a72803df05416C1f20D) | The regulated dollar, which only moves between wallets with a Cleanverse identity | | USDC, Cleanverse sandbox | [`0x534b2f3A21130d7a60830c2Df862319e593943A3`](https://testnet.monadscan.com/address/0x534b2f3A21130d7a60830c2Df862319e593943A3) | The USDC that Cleanverse converts 1:1 into aUSDC | | Cleanverse Access Core | [`0x8F118338a1fa41E7Fa86Be19A4e8B99Ed58A6EcC`](https://testnet.monadscan.com/address/0x8F118338a1fa41E7Fa86Be19A4e8B99Ed58A6EcC) | Locks deposited USDC and mints the same amount of aUSDC | | Cleanverse A-Pass | [`0xbA82D189540CaC9DC6FF46B6837CaC1BFdEC58B9`](https://testnet.monadscan.com/address/0xbA82D189540CaC9DC6FF46B6837CaC1BFdEC58B9) | The identity contract Cleanverse lists for aUSDC | | AUSD, issued by Agora | [`0xa9012a055bd4e0eDfF8Ce09f960291C09D5322dC`](https://testnet.monadscan.com/address/0xa9012a055bd4e0eDfF8Ce09f960291C09D5322dC) | Testnet AUSD. The savings preview uses your balance of it | | AUSD faucet | [`0xd236c18D274E54FAccC3dd9DDA4b27965a73ee6C`](https://testnet.monadscan.com/address/0xd236c18D274E54FAccC3dd9DDA4b27965a73ee6C) | Gives out testnet AUSD | | Kuru router | [`0x7EFbE105Ca7415dE98F96622173458ac1c054630`](https://testnet.monadscan.com/address/0x7EFbE105Ca7415dE98F96622173458ac1c054630) | The router that `KuruAdapter` was deployed to call | [Regulated dollars](https://floatless.xyz/docs/regulated-dollars) explains how aUSDC works in Floatless. ## How the savings vault was deployed The vault went live on October 13, 2026 in three transactions, all sent from the owner key. | Step | Transaction | | -------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | | Create the vault with Morpho's `VaultV2Factory` | [`0x51af1ce1…3cf499`](https://monadscan.com/tx/0x51af1ce1f465ddb672454e553eaaafd61bed2d7f3be0fe9f7b749402a33cf499) | | Create the adapter with Morpho's `MorphoVaultV1AdapterFactory` | [`0x03982239…a1913f`](https://monadscan.com/tx/0x039822397c26c98aa6461a87e97ff5c3412f7a4a00e7beb3fb949fab1aa1913f) | | Apply the whole configuration | [`0x8b7dfc71…5db830`](https://monadscan.com/tx/0x8b7dfc71c6da06a7b28d123e30c5d5cee3cd77cd9c6470146bcb0115185db830) | The configuration ran as one all-or-nothing transaction, so it either applied in full or not at all. It set up the following. - The name Floatless Savings AUSD and the share symbol fsAUSD - The owner as sentinel, and both the owner and the operations key as allocators - Morpho's adapter registry as the only source of adapters, with the power to change that given up for good - The one adapter, with a 100,000 AUSD cap - The 10% performance fee, paid to the owner, and the 0.01% fee for forcing funds out of Morpho - The adapter as the path for deposits and withdrawals - A 3-day timelock on all 17 timelocked functions - Finally, the separate curator key as curator ## Who can change the savings vault | Role | Address | What it can do | | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------- | | Owner, also sentinel, backup allocator and fee recipient | [`0x024Db1faC265D471C2a5eca95AD00C19e3394A07`](https://monadscan.com/address/0x024Db1faC265D471C2a5eca95AD00C19e3394A07) | Replace the curator, cancel any pending change, lower caps, and undo a bad allocator move right away | | Curator | [`0x7830200a9D5a4BB821B1C2327B8953f991E8F9C9`](https://monadscan.com/address/0x7830200a9D5a4BB821B1C2327B8953f991E8F9C9) | Propose higher caps or changes to adapters, fees, gates or allocators, each of which waits 3 days | | Allocator, the operations key | [`0xE1E55cB254feB8CBEA730AAe987777f12d8C5B25`](https://monadscan.com/address/0xE1E55cB254feB8CBEA730AAe987777f12d8C5B25) | Move funds between the vault and its one adapter, and set the liquidity path and maximum rate | A sentinel is a Morpho Vault V2 role that can cancel pending changes and lower caps. Every one of the vault's 17 timelocked functions waits 3 days, so adding or removing an adapter, raising a cap, or changing fees, gates or allocators is visible onchain for three days before it can take effect. Savers can leave first, and the owner can cancel the change during that window. Allocator moves and cap cuts aren't timelocked and take effect right away. The three keys are separate, held by the Floatless team, and not yet a multisig. ## Check the savings vault yourself You need [Foundry](https://getfoundry.sh) and a copy of the [Floatless repository](https://github.com/winsznx/floatless). Run these commands from the repository root. Both only read from Monad mainnet, and neither sends a transaction. ### Read the live configuration ```sh FLOATLESS_OWNER=0x024Db1faC265D471C2a5eca95AD00C19e3394A07 \ FLOATLESS_CURATOR=0x7830200a9D5a4BB821B1C2327B8953f991E8F9C9 \ FLOATLESS_ALLOCATOR=0xE1E55cB254feB8CBEA730AAe987777f12d8C5B25 \ FLOATLESS_FEE_RECIPIENT=0x024Db1faC265D471C2a5eca95AD00C19e3394A07 \ forge script contracts/script/DeployFloatlessSavings.s.sol:DeployFloatlessSavings \ --sig "verifyDeployed(address,address)" \ 0x35277466836C6cdb426F50DDF79db0e043e6bbFe 0xCe2b239dD33110f7c662Fe69D394DcA65A7fF1ab \ --rpc-url https://rpc.monad.xyz ``` `verifyDeployed` reads the live vault and adapter and checks that: - both came from Morpho's factories, and the vault's asset is AUSD - the owner, curator, sentinel and allocators are the addresses above - the vault has exactly one adapter, and it points at the Grove x Steakhouse vault - the adapter registry is Morpho's, and that setting is locked - the cap is 100,000 AUSD, the performance fee is 10% to the owner, there's no management fee, and the fee for forcing funds out of Morpho is 0.01% - no gates are set, every timelocked function waits 3 days, and no setup change is still pending If anything differs, the script stops with a `Misconfigured` error that names the first setting that doesn't match. ### Run the fork tests ```sh MONAD_MAINNET_RPC_URL=https://rpc.monad.xyz forge test --match-contract FloatlessSavingsFork -vv ``` This runs `contracts/test/FloatlessSavingsFork.t.sol` against a copy of Monad mainnet at a fixed block, using the live Morpho contracts. Each test deploys a fresh vault with the same script that deployed the real one, then exercises or attacks it. The suite has 12 attack and configuration tests, 4 fuzz tests and 5 invariants. Without `MONAD_MAINNET_RPC_URL`, the tests skip. --- # Live proof > Recorded transactions on Monad mainnet and testnet that show each part of Floatless working. Source: https://floatless.xyz/docs/proof Every transaction on this page was recorded on October 13, 2026, and each one is labeled with the network it ran on. You can open any of them on the explorer and check it yourself. ## What the labels mean | Label | Meaning | | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | Live mainnet | A real transaction on Monad mainnet, chain ID 143, with real money. Check it on [monadscan.com](https://monadscan.com). | | Live testnet | A real transaction on Monad testnet, chain ID 10143, with test money. Check it on [testnet.monadscan.com](https://testnet.monadscan.com). | | No transaction | Floatless stopped the payment before anything was signed, so there's nothing onchain to find. | | Simulated | The transfer was tried against live testnet state without being sent. No transaction exists and no fee was paid. | | CRE CLI simulation | The Chainlink CRE workflow ran in the official CRE CLI and broadcast a real Monad mainnet transaction through Chainlink's simulation forwarder. It isn't a production DON run. | | Cleanverse sandbox | A document Cleanverse's sandbox produced for a live testnet payment. | ## Floatless Savings on mainnet The deposit and withdrawal were recorded through the mainnet API, `api-mainnet.floatless.xyz`, using the same transactions the app builds. | Step | Label | What it shows | Transaction | | ---------------- | ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | | Vault configured | Live mainnet | One all-or-nothing transaction from the owner key applied the vault's whole setup. A read-only check then compared the result with live chain state. | [`0x8b7dfc71…5db830`](https://monadscan.com/tx/0x8b7dfc71c6da06a7b28d123e30c5d5cee3cd77cd9c6470146bcb0115185db830) | | Deposit 4 AUSD | Live mainnet | 4 AUSD moved into Floatless Savings. The API checked the vault's Deposit event and added **Moved to savings** to the wallet's history. | [`0x9cf5ca65…f143c5`](https://monadscan.com/tx/0x9cf5ca6564c77727d10130d9e8f0533a969e74e292089bb91edaeefac7f143c5) | | Withdraw 1 AUSD | Live mainnet | 1 AUSD came back to the wallet. The API checked the vault's Withdraw event and added **Withdrew from savings**. | [`0x63ddbe7c…123920`](https://monadscan.com/tx/0x63ddbe7c0be68f521d24283e9b5dd648399c0b6dce36b1cefd6b9adde5123920) | The two transactions that created the vault and its adapter are on [Contracts and verification](https://floatless.xyz/docs/contracts#how-the-savings-vault-was-deployed). ## Scheduled release with Chainlink CRE on mainnet SafeLock holds AUSD in Morpho's AUSD vault until a set date, then pays it to the beneficiary. A Chainlink CRE workflow checks for mature locks, confirms through node consensus over Morpho's API that the vault is still the configured AUSD venue, and sends the release. If CRE isn't running, anyone can release a mature lock, so money is never stuck. | Step | Label | What it shows | Transaction | | ----------------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------ | | SafeLock deployed | Live mainnet | SafeLock deployed on its own, bound to AUSD, Morpho's AUSD vault and the CRE simulation forwarder. Source-verified on Monadscan and MonadVision. | [`0xd7517318…a3a1ec`](https://monadscan.com/tx/0xd751731827eb5aa0838ae6a7a8be94fe7bf5a66cf869e12a5e517f616ca3a1ec) | | Lock 1 AUSD | Live mainnet | 1 AUSD locked for a team wallet, earning in Morpho until its release time. | [`0xb2050092…0b8b83`](https://monadscan.com/tx/0xb2050092a58dbbd8324a8f91f1e672e1e6545f4f74769cdfe640e528910b8b83) | | Released by CRE | CRE CLI simulation | The CRE workflow found the mature lock and released 1 AUSD to the beneficiary. The `LockReleased` event names the CRE forwarder as the executor. | [`0x97502d5a…738497`](https://monadscan.com/tx/0x97502d5a2d1c14d6456f6c21d0c6ebcd4e21006bb208e3160b97183220738497) | The first CRE attempt, [`0x56723a39…1804d5`](https://monadscan.com/tx/0x56723a399bf384a0ca16bd48e9b7febbcdb3b2cf20c6b6a1db4910b1771804d5), released nothing. Gas estimation couldn't see SafeLock's Morpho redeem, because the forwarder catches a receiver's revert. The workflow now sets the gas limit explicitly and fails when SafeLock rejects a report. ## Regulated dollars on testnet Regulated dollars, Cleanverse's aUSDC, run on Monad testnet only, with Cleanverse's sandbox. These steps were recorded with the testnet API, `api.floatless.xyz`, and that sandbox. The test wallets signed in through the same passkey flow the app uses. ### The test wallets | Wallet | Address | Cleanverse identity | | -------------------- | -------------------------------------------------------------------------------------------------------------------------------- | ------------------- | | Sender | [`0x21d12b78F83044AFc433b3493aBEF452dCFD450e`](https://testnet.monadscan.com/address/0x21d12b78F83044AFc433b3493aBEF452dCFD450e) | Verified | | Verified recipient | [`0xe0a65AE7A77EebA5AC464bD3C103Cb1D55EAFF2B`](https://testnet.monadscan.com/address/0xe0a65AE7A77EebA5AC464bD3C103Cb1D55EAFF2B) | Verified | | Unverified recipient | [`0x8BD784F56cd60ee1b7bd7e39F8043Be0983A10cE`](https://testnet.monadscan.com/address/0x8BD784F56cd60ee1b7bd7e39F8043Be0983A10cE) | None | ### What happened | Step | Label | What it shows | Proof | | -------------------------------- | ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- | | Sender identity issued | Live testnet | Cleanverse's sandbox issued a verified identity to the sender | [`0x69b21309…68cc49`](https://testnet.monadscan.com/tx/0x69b21309e732ed64bf19e1ffeb094d51c2be0cc2a4fd3d07e9e161fbb868cc49) | | Recipient identity issued | Live testnet | The same for the verified recipient | [`0x0888935b…e04092`](https://testnet.monadscan.com/tx/0x0888935b49b1ab5877ab1dc32d5e8da21351ba8a0075ef058573fb48cae04092) | | Sender funded | Live testnet | A setup step that gave the sender aUSDC from Cleanverse's sandbox faucet | [`0x0fc1fd3a…ae44b6`](https://testnet.monadscan.com/tx/0x0fc1fd3acdff66879a4435f87dfb88547433d8e40c14333d02d5acef35ae44b6) | | Spending rules registered | Live testnet | Version 1 of the sender's spending rules on the testnet registry | [`0xe68df9f3…48310a`](https://testnet.monadscan.com/tx/0xe68df9f3ccadcac5b076ad25ace387e2055e3292c1c424dd7dcb274c0a48310a) | | Payment to the unverified wallet | No transaction | Sending 0.01 aUSDC to the unverified recipient was declined before signing, because that wallet has no Cleanverse identity | Decision `09237790-c14a-473b-99b5-f64b10611fd3` | | Payment that skips Floatless | Simulated | The same 0.01 aUSDC transfer, tried straight on the aUSDC contract, was rejected by the contract itself. The same transfer to the verified recipient simulated successfully. | None | | Regulated payment settled | Live testnet | 0.01 aUSDC reached the verified recipient, and Floatless linked the payment to the Cleanverse decision that allowed it, `abd45186-6ead-4210-9136-f653af74f360` | [`0x2f24f858…577a11`](https://testnet.monadscan.com/tx/0x2f24f858f928a822474f82a0f1907c6af9e554ba3aa5b6b862f606e43e577a11) | | Travel Rule report | Cleanverse sandbox | Cleanverse's Travel Rule report for that payment | [Report PDF](https://github.com/winsznx/floatless/blob/main/docs/assets/cleanverse-travel-rule-report.pdf) | Decision IDs are the Floatless testnet API's records of each Cleanverse check. They aren't onchain, so the explorer can't show them. The report lists the sender's wallet, the 0.01 amount and a shortened form of the payment's transaction hash, so you can match it to the settled payment. [Regulated dollars](https://floatless.xyz/docs/regulated-dollars) explains the whole flow. ## Check a transaction yourself 1. Open the transaction link. Mainnet links go to monadscan.com and testnet links go to testnet.monadscan.com. A hash from one network won't show up on the other network's explorer. 2. Check that the transaction succeeded. 3. Check which wallet sent it and which contract it called. 4. Look at the tokens that moved and the event logs. | Transaction | Sent from | Contract called | What to look for | | ------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------- | | Vault configured | The owner, [`0x024Db1faC265D471C2a5eca95AD00C19e3394A07`](https://monadscan.com/address/0x024Db1faC265D471C2a5eca95AD00C19e3394A07) | The savings vault, [`0x35277466836C6cdb426F50DDF79db0e043e6bbFe`](https://monadscan.com/address/0x35277466836C6cdb426F50DDF79db0e043e6bbFe) | Events from the vault for the settings the transaction applied | | Deposit 4 AUSD | The saver's wallet | The savings vault | A Deposit event naming the wallet, and 4 AUSD leaving it | | Withdraw 1 AUSD | The saver's wallet | The savings vault | A Withdraw event naming the wallet, and 1 AUSD arriving in it | | Spending rules registered | The sender | The testnet registry, [`0x127af791F0807584CaEAe5eDDfd8012972E9a3Da`](https://testnet.monadscan.com/address/0x127af791F0807584CaEAe5eDDfd8012972E9a3Da) | A MandateRegistered event for the sender with version 1 | | Regulated payment settled | The sender | aUSDC, [`0xaC0893567D43C3E7e6e35a72803df05416C1f20D`](https://testnet.monadscan.com/address/0xaC0893567D43C3E7e6e35a72803df05416C1f20D) | 0.01 aUSDC moving from the sender to the verified recipient | Event logs show raw amounts. AUSD and aUSDC both use 6 decimal places, so 4 AUSD shows up as 4000000 and 0.01 aUSDC as 10000. ## The live proof console [floatless.xyz/proof](https://floatless.xyz/proof) reads the testnet API each time you open it. It shows whether the Floatless API is up, and which Cleanverse environment, aUSDC contract and identity contract the API is using right now. The API asks Cleanverse for that setup on every request instead of storing it. The console only reads, so it can't start a payment or change anything. It also has a receipt lookup, which works only for your own account and needs a receipt ID and a session token from a signed-in session. --- # API > Base URLs, authentication, response format and the main endpoints of the Floatless API. Source: https://floatless.xyz/docs/api The Floatless API is the backend the Floatless app talks to. This page covers its two deployments, sessions, the response format, limits and the main routes. > The API serves the Floatless app and doesn't issue API keys. Routes can change while the app is in private testing. ## Base URLs | Network | Base URL | Chain ID | | ------------- | ----------------------------------- | -------- | | Monad mainnet | `https://api-mainnet.floatless.xyz` | 143 | | Monad testnet | `https://api.floatless.xyz` | 10143 | Each deployment has its own database, so records on one network never show up on the other. Floatless Savings is live on the mainnet API, and the testnet API returns a preview of it. Regulated dollars, the `/v1/compliance` routes, work on the testnet API only. Spending rules work on both. [Mainnet and testnet](https://floatless.xyz/docs/networks) covers the split for app users. ## Check the network Every response carries an `x-floatless-chain-id` header with the chain ID the server runs on. The app refuses to use a server whose chain ID doesn't match its own network, and your client should do the same. Every response also carries an `x-request-id`, which error bodies repeat as `requestId`. You can send your own `X-Request-Id` to tag a request. ```sh curl -i https://api-mainnet.floatless.xyz/health/ready ``` These are the headers that matter here. ```text HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 x-request-id: pDU-xw9EAmblDfKxWoN04 x-floatless-chain-id: 143 ``` This is the body, with its `productEvidence` field left out. ```json { "ready": true, "scope": "service_dependencies_only", "checks": { "database": "ready", "monadRpc": "ready", "chainId": 143, "expectedChainId": 143, "fundingMandateRegistry": "ready", "kuruRouter": "ready", "kuruMarketData": "ready", "cleanverse": "not_required", "morpho": "configured" } } ``` `/health/ready` answers 200 when every dependency is ready and 503 when one isn't. It checks the database, the Monad RPC and chain ID, the spending-rules registry, the Kuru exchange's router and market data, and Cleanverse where regulated dollars are configured. As its `scope` field says, it checks dependencies only, so it doesn't prove payments work end to end. On testnet the same call returns chain ID 10143, `"cleanverse": "ready"` and `"morpho": "unconfigured"`. ## Sessions Send a session token as a bearer token on every route that needs one. ```text Authorization: Bearer ``` How you get the token depends on how the account signs in. ### Passkey accounts A passkey account proves it controls its wallet by signing a one-time message. 1. Call `POST /v1/account/session/challenge` with `{ "walletAddress": "0x..." }`. The response holds a `challenge`, the `message` to sign, and an `expiresAt` five minutes away. 2. Sign `message` with the wallet as a standard EIP-191 Ethereum signed message. 3. Call `POST /v1/account/session` with the `walletAddress`, the `challenge` and the `signature`. The response holds an `accessToken` that lasts one hour, so `expiresIn` is 3600. Each challenge works once. When the token expires, repeat the three steps. A new passkey account registers the same way with `POST /v1/account/passkey/challenge` and `POST /v1/account/passkey`, which also takes the passkey's credential ID and returns a session. ### Email accounts Email accounts sign in through Privy. The app sends its Privy access token as the bearer token, and the API checks it with Privy. The first time it sees a new Privy user, the API creates the Floatless account and an embedded wallet for it. From then on, the API signs for that wallet through Privy when the user confirms an action in the app. [Keys and security](https://floatless.xyz/docs/security) explains what that means for your money. ## Responses and errors A successful response wraps its result in an envelope. Some routes that create a record answer 201 instead of 200. ```json { "success": true, "data": {} } ``` An error uses the same envelope with an `error` object instead. ```json { "success": false, "error": { "code": "AUTHENTICATION_REQUIRED", "message": "A valid bearer session is required.", "requestId": "OzWUKy1zf0qvo_WaFX2NT" } } ``` Branch on `code`. The `message` is written in plain words, so you can show it to people. A 422 `VALIDATION_ERROR` adds `details` with the field problems, and a declined regulated transfer adds `reasons`. Some errors also carry a top-level `data` with context. A few routes don't use the envelope. `/health` and `/health/ready` return plain JSON, and `DELETE /v1/goals/:id` answers 204 with no body. When Cleanverse can't be used, the compliance config, registration link, deposit address and report routes answer 503 with `"success": false` and a `data` object whose `status` is `unavailable`. | Status | Code | When it happens | | ------ | --------------------------------- | ------------------------------------------------------------------- | | 401 | `AUTHENTICATION_REQUIRED` | The route needs a session and none was sent | | 401 | `AUTHENTICATION_INVALID` | The header isn't a bearer token, or the token is invalid or expired | | 403 | `ACCOUNT_NOT_ACTIVE` | The account behind the token isn't active | | 422 | `VALIDATION_ERROR` | The request body failed validation | | 428 | `IDEMPOTENCY_KEY_REQUIRED` | The route needs an `Idempotency-Key` and didn't get a valid one | | 409 | `IDEMPOTENCY_KEY_REUSED` | The key was already used with a different body | | 409 | `IDEMPOTENCY_REQUEST_IN_PROGRESS` | The first request with this key is still running | | 429 | `RATE_LIMITED` | Too many requests from your IP address | | 500 | `INTERNAL_ERROR` | An unexpected failure on the server | ## Idempotency keys Routes that record payments, savings receipts or spending rules need an `Idempotency-Key` header, so a retry never records the same thing twice. - `POST /v1/send/execute` - `POST /v1/deposit` - `POST /v1/earn/receipts` - `POST /v1/safe-locks/receipts` - `POST /v1/mandate/sign` - `POST /v1/mandate/registration` A key is 16 to 128 characters long. It starts with a letter or digit, and the rest can be letters, digits, `.`, `_`, `:` or `-`. Keys are scoped to your account and the route, and kept for 24 hours. - Sending the same key and body again returns the first response. Field order in the JSON body doesn't matter. - The first response is kept even when it's an error below 500, so after fixing a rejected request, send it with a new key. - Sending the same key with a different body gets 409 `IDEMPOTENCY_KEY_REUSED`. - If the first request failed with a server error, the key is released and you can retry with it. The app derives each key from what it records, such as the transaction hash for a payment or `earn:` for a savings receipt. ## Rate limits Limits count requests per IP address over a one-minute window. | Routes | Requests per minute | | -------------------------------------------------- | ------------------- | | Routes under `/v1/account/`, which include sign-in | 20 | | `POST /v1/waitlist` | 5 | | Everything else, including `/health` | 120 | Over the limit, the API answers 429 `RATE_LIMITED` with a `Retry-After` header that says how many seconds to wait. In a browser, only pages on the API's allowed origins can read its responses. Requests without an `Origin` header, such as from a server or curl, aren't affected. ## Endpoints Paths are relative to the base URL. Routes need a session unless they're marked public. ### Status and sign-in All of these are public. | Route | What it does | | ------------------------------------ | ----------------------------------------------------------------------- | | `GET /health` | Liveness check that returns `{ "message": "OK" }` | | `GET /health/ready` | Checks the service's dependencies, as described above | | `POST /v1/account/passkey/challenge` | Returns a one-time message to sign before registering a passkey account | | `POST /v1/account/passkey` | Registers the passkey account and returns a session | | `POST /v1/account/session/challenge` | Returns a one-time message to sign in to an existing passkey account | | `POST /v1/account/session` | Exchanges the signed message for a one-hour session | ### Account, balances and history | Route | What it does | | -------------------------------- | ----------------------------------------------------------------------------------------------------- | | `GET /v1/account` | Your Floatless account | | `GET /v1/portfolio` | The live onchain balance of each supported asset, plus your Floatless Savings position on mainnet | | `GET /v1/portfolio/availability` | Spendable balances only | | `GET /v1/activity` | Your history, newest first, 50 entries a page. Pass `?before=` with the last id for the next page | ### Spending rules and goals | Route | What it does | | ------------------------------- | ------------------------------------------------------------------------------------ | | `GET /v1/mandate` | Your active spending rules, or `null` | | `POST /v1/mandate/preview` | Turns proposed rules into the exact typed data to sign, with the next version number | | `POST /v1/mandate/sign` | Saves the rules you signed. Needs an `Idempotency-Key` | | `POST /v1/mandate/registration` | Links the onchain registration after checking its event. Needs an `Idempotency-Key` | | `GET /v1/goals` | Your savings goals | | `POST /v1/goals` | Creates a goal | | `PATCH /v1/goals/:id` | Changes a goal | | `DELETE /v1/goals/:id` | Archives a goal | | `GET /v1/goals/:id/history` | A goal's change history | ### Payments | Route | What it does | | --------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `GET /v1/ens/resolve?name=` | Resolves an ENS name to `{ name, address, source }`. `source` is `monad`, `evm` or `ethereum`, the first record the name set in that order. Refuses a contract wallet that exists only on Ethereum | | `POST /v1/send/quote` | Runs every check before you sign and returns `ALLOW` or `DECLINE` with reasons. When allowed, it adds the gas limit, gas price and maximum network fee. A quote lasts up to 60 seconds | | `POST /v1/send/execute` | Records a settled payment after verifying the transfer onchain. Needs an `Idempotency-Key` | | `GET /v1/send/:id` | One recorded payment receipt | | `POST /v1/deposit` | Records a transfer into your wallet after verifying it onchain. Needs an `Idempotency-Key` | | `GET /v1/proof/:receiptId` | A receipt with its decision and its history entry | ### Floatless Savings | Route | What it does | | ------------------------ | ------------------------------------------------------------------------------------------------------------ | | `GET /v1/earn` | Your savings: `live` with your position on mainnet, `preview` on testnet, or `unavailable` with a reason | | `POST /v1/earn/receipts` | Records a savings deposit or withdrawal after checking the vault's event onchain. Needs an `Idempotency-Key` | ### Scheduled releases | Route | What it does | | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `POST /v1/safe-locks/quote` | Runs the payment checks for a release of `amount` AUSD to `beneficiary` and returns `ALLOW` or `DECLINE` with reasons, plus the SafeLock address. Nothing is signed | | `GET /v1/safe-locks` | The releases you created, newest first, with each one's live state on Monad: amounts in base units, `unlockAt`, `released`, `releasable`, and who released it when that's recorded | | `GET /v1/safe-locks/:lockId` | One of your releases by its bytes32 ID | | `POST /v1/safe-locks/receipts` | Records a `create` or `release` after checking SafeLock's event onchain. A release by any wallet is accepted and attributed to Chainlink CRE or a wallet. Needs an `Idempotency-Key` | These routes answer 503 `SAFE_LOCK_UNAVAILABLE` on a network without SafeLock, which today means testnet. ### Regulated dollars These work on the testnet API only. | Route | What it does | | ---------------------------------------- | ------------------------------------------------------------------------------------- | | `GET /v1/compliance/config` | Public. Cleanverse's environment and the regulated assets it lists | | `GET /v1/compliance/apass` | Your wallet's Cleanverse identity status: `active`, `inactive` or `unavailable` | | `POST /v1/compliance/apass/magic-link` | Your personal Cleanverse registration link | | `POST /v1/compliance/preflight` | Runs the Cleanverse check for a transfer and records the decision | | `GET /v1/compliance/deposit` | Your deposit address for turning USDC into aUSDC | | `GET /v1/compliance/reports/:activityId` | A short-lived download link for the Travel Rule report of a settled regulated payment | ```sh curl https://api.floatless.xyz/v1/compliance/config ``` ```json { "success": true, "data": { "status": "available", "environment": "uat", "enforcement": "configured", "chain": "monad", "assets": [ { "symbol": "ausdc", "address": "0xaC0893567D43C3E7e6e35a72803df05416C1f20D", "decimals": 6, "origin": { "symbol": "usdc", "address": "0x534b2f3A21130d7a60830c2Df862319e593943A3", "decimals": 6 }, "accessCore": "0x8F118338a1fa41E7Fa86Be19A4e8B99Ed58A6EcC", "apassAddress": "0xbA82D189540CaC9DC6FF46B6837CaC1BFdEC58B9" } ] } } ``` The API also has routes the app uses internally, such as embedded-wallet signing under `/v1/wallet`, and routes for experimental features. They aren't covered here and aren't meant for other clients. To ask questions about Floatless from an AI assistant, see [Use Floatless in ChatGPT and Claude](https://floatless.xyz/docs/ai-assistants). --- # Use Floatless in ChatGPT and Claude > Connect the Floatless MCP server to ChatGPT, Claude or any MCP client and ask questions about Floatless. Source: https://floatless.xyz/docs/ai-assistants Floatless runs a public MCP server, so ChatGPT, Claude and other AI assistants can search these docs and read live Floatless data while they answer you. You add it once, then ask questions in plain words. ## The server | Setting | Value | | -------------- | ----------------------------------------- | | URL | `https://floatless.xyz/mcp` | | Transport | Streamable HTTP | | Authentication | None | | Access | Read-only. It can't see or move any money | MCP (Model Context Protocol) is the open standard that ChatGPT, Claude and many coding tools use to connect to outside data. The Floatless server only serves public information: these docs, the contract addresses, and live numbers anyone can read from Monad and the Floatless APIs. It never sees your account, balance or history. ## What your assistant can do with it | Tool | What it returns | | -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | | `search` | The docs pages and sections that match a question, each with an id | | `fetch` | The full text of a page or section, by the id from `search` or a docs URL | | `get_savings_rate` | The current Floatless Savings rate on Monad mainnet after the 10% Floatless fee, the underlying Morpho rate, and the total AUSD deposited | | `get_network_status` | Live health of the mainnet API (chain 143) and the testnet API (chain 10143), with each one's dependency checks | | `list_contracts` | Every contract Floatless deploys or uses on each network, with what it does and its Monadscan link | `search` and `fetch` follow the format ChatGPT uses for connectors and deep research. Every docs page is also available as a resource in Markdown, and the `ask_floatless` prompt starts a question that's answered from the docs with sources. The live tools read the same sources the app does. Rates change with Morpho borrowing demand, so ask for the current rate instead of relying on a number quoted in a page. ## ChatGPT 1. Open [ChatGPT Plugins](https://chatgpt.com/plugins), select the plus button, then **Add custom MCP server**. 2. Name it Floatless and add a short description, such as "Floatless docs and live savings data". 3. Under **Connection**, choose a public endpoint and enter `https://floatless.xyz/mcp`. 4. Floatless needs no sign-in, so leave authentication off. 5. Read the warning and select **I understand and want to continue**, then **Create as a plugin**. 6. Check the tools ChatGPT found, which should be the five listed above, and install the plugin. 7. In a new conversation, type `@` and pick Floatless, then ask your question. ChatGPT's menus have moved more than once. On some accounts, custom MCP servers live under **Settings**, then **Apps & Connectors**, after you turn on **Developer mode** in its advanced settings. What you can add depends on your plan and, for Business, Enterprise and Edu workspaces, on what your admin allows. Every Floatless tool is read-only, which is the kind of tool those limits allow most widely. ## Claude On claude.ai and in the Claude desktop app: 1. Open **Customize**, then **Connectors**. 2. Select **+ Add**, then **Add custom connector**. 3. Name it Floatless, enter `https://floatless.xyz/mcp` as the server URL, and select **Continue**. 4. Review the settings Claude detected and select **Continue**. 5. Under **Authentication**, choose **No sign in**, then select **Add**. 6. In a chat, select the **+** button at the lower left, open **Connectors**, and turn Floatless on. Free accounts can add one custom connector. On Team and Enterprise plans, an owner adds it first under **Organization settings**, then **Connectors**, by selecting **Add**, then **Custom**, then **Web**. Members then find it under **Customize**, then **Connectors**, and select **Connect**. ## Claude Code Run this once in your terminal: ```sh claude mcp add --transport http floatless https://floatless.xyz/mcp ``` Then ask Claude Code about Floatless in any session. `claude mcp list` shows whether it's connected. ## Other MCP clients Any client that supports remote MCP servers over Streamable HTTP can connect with the URL alone. Many clients take a JSON entry like this one: ```json { "mcpServers": { "floatless": { "url": "https://floatless.xyz/mcp" } } } ``` The server is stateless, so it doesn't issue a session id, and it answers every request with JSON. It doesn't offer a server-sent events stream, so a `GET` returns 405, as the MCP specification allows. ## Questions to try - What is Floatless, and how is it different from a normal crypto wallet? - What's the Floatless Savings rate right now, and what fee comes out of it? - How do spending rules work, and can Floatless change mine? - Which networks does Floatless run on, and which features work on each? - Show me the contracts Floatless uses on Monad mainnet and where they're verified. - How can I check for myself that the savings vault deposit and withdrawal really happened? ## Without MCP If your assistant can't use MCP, give it these instead: - [floatless.xyz/llms.txt](https://floatless.xyz/llms.txt), an index of every page for language models - [floatless.xyz/llms-full.txt](https://floatless.xyz/llms-full.txt), every page in one file - Any page as plain Markdown, by adding `.md` to its URL, such as [floatless.xyz/docs/floatless-savings.md](https://floatless.xyz/docs/floatless-savings.md) ## Check the server yourself This request lists the tools, the same way an assistant does when it connects: ```sh curl -s https://floatless.xyz/mcp \ -H 'Content-Type: application/json' \ -H 'Accept: application/json, text/event-stream' \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' ``` And this one searches the docs: ```sh curl -s https://floatless.xyz/mcp \ -H 'Content-Type: application/json' \ -H 'Accept: application/json, text/event-stream' \ -d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"search","arguments":{"query":"savings withdrawal"}}}' ``` --- # FAQ > Direct answers to the questions people ask about Floatless, its money, its rules and its networks. Source: https://floatless.xyz/docs/faq Short answers to the questions people ask most about Floatless, grouped by topic. Each answer links to the page with the details. ## Getting access ### How do I get Floatless? Floatless isn't in the App Store or Google Play yet. It's in private testing, so join the waitlist at https://floatless.xyz/#join and you'll get an email when your invite is ready. See [Getting started](https://floatless.xyz/docs/getting-started#get-access). ### Who can use Floatless? You need to be at least 18, or the age of majority where you live, according to the [Terms](https://floatless.xyz/terms). While Floatless is in private testing, access is by invite. See [Getting started](https://floatless.xyz/docs/getting-started#get-access). ### Which phones does Floatless work on? The app is built for iPhone and Android. Passkey sign-in needs a passkey provider that supports it, and the app suggests iCloud Keychain on iOS 18 or later, or Google Password Manager on Android. If your phone can't use one, sign in with email. See [Getting started](https://floatless.xyz/docs/getting-started#with-a-passkey). ### Do I need to understand crypto? You don't. You'll meet a few new ideas, like MON for network fees and wallet addresses that start with 0x, and the [glossary](https://floatless.xyz/docs/glossary) explains each one in plain words. ## Your money and keys ### Is Floatless a bank? No. Floatless is software for a wallet on Monad, and your balance is held in stablecoins. Stablecoins aren't bank deposits and aren't insured by the FDIC or any government agency. See [Keys and security](https://floatless.xyz/docs/security). ### Where is my money held? Your money sits at your own wallet address on Monad. Money in Floatless Savings goes through the savings vault into Morpho, and your wallet holds the vault's shares. Who can sign for your wallet depends on how you signed in. See [Keys and security](https://floatless.xyz/docs/security). ### What's the difference between passkey and email sign-in? With a passkey, your wallet key is made on your phone from the passkey each time you sign, and it never leaves your phone. With email, Privy holds an embedded wallet for you, and the Floatless API signs with it after you confirm in the app. See [Getting started](https://floatless.xyz/docs/getting-started#open-the-app-and-sign-in). ### Can Floatless move my money without me? If you sign in with a passkey, no. Floatless never receives your key, and every signature needs your passkey on your phone. If you sign in with email, the Floatless API can sign for your embedded wallet through Privy. The app only asks it to after you confirm, but you're trusting Floatless's servers and Privy with that power. Money in Floatless Savings also follows the vault's rules: Floatless's vault keys can move it between the vault and Morpho and propose settings changes that wait 3 days, but they can't move the vault shares in your wallet. See [Keys and security](https://floatless.xyz/docs/security). ### Is there a seed phrase or a recovery option? Floatless doesn't show a seed phrase, and it has no recovery feature yet. **Recovery** under **Security** in your profile explains that your passkey syncs to a new phone and that guardian recovery isn't available yet. A passkey wallet comes from your passkey, so if the passkey is deleted, Floatless can't rebuild the wallet. See [Keys and security](https://floatless.xyz/docs/security). ### What happens if I lose my phone? With email, sign in on your new phone with the same email to reach the same wallet. With a passkey, you need that same passkey on the new phone. A passkey saved in iCloud Keychain or Google Password Manager syncs to a new phone signed in to the same account, and then you tap **I already have an account** or **Sign in with your passkey**. **Create account** would make a new passkey and a new, empty wallet. See [Keys and security](https://floatless.xyz/docs/security). ### Why does my wallet balance include MON? MON is Monad's own token, and your wallet needs it to pay network fees. **Wallet balance** on **Home** adds up your stablecoins and MON in dollars, and tapping it opens **Your dollars**, which lists each coin you hold. See [Add money](https://floatless.xyz/docs/add-money). ## Payments and rules ### Why can't I send money yet? Floatless declines every payment until you've registered spending rules on Monad. Set them under **Spending rules** in your profile, and keep a little MON in your wallet for the network fee. See [Spending rules](https://floatless.xyz/docs/spending-rules). ### What does Floatless check before I sign a payment? It checks that you have enough of that currency, that your rules allow the currency, that the payment fits your per-payment and daily limits, and that it won't take you below your floor. It also checks that the rules registered on Monad are current and haven't expired. For aUSDC, it asks Cleanverse whether both wallets are verified. See [Send money](https://floatless.xyz/docs/send-money). ### What happens when a payment is declined? You see the reason, and nothing is signed or sent. Fix what the reason points to, like your rules or your balance, and review the payment again. See [Send money](https://floatless.xyz/docs/send-money). ### Does my floor count my whole balance? No. Floatless compares your floor with what you'd have left in the currency you're paying with. If **Always keep at least** is $100 and you send USDC, the payment is declined when it would leave you with less than 100 USDC, even if you hold other currencies. Goal floors count only against their own currency. See [Spending rules](https://floatless.xyz/docs/spending-rules). ### When does my daily limit reset? At midnight UTC. Floatless adds up the payments you've sent through Floatless on that network since then, and declines a payment that would take the total past **Each day up to**. See [Spending rules](https://floatless.xyz/docs/spending-rules). ### How do I change my spending rules? Open your profile, tap **Spending rules**, tap **Change rules**, enter the new values, then tap **Review rules** and **Approve and register**. The new rules get the next version number and replace the old ones, and registering them costs a small network fee in MON. See [Spending rules](https://floatless.xyz/docs/spending-rules). ### Do spending rules stop someone who has my wallet key? No. Floatless checks payments against your rules before you sign in the app, but token contracts don't read the registry, so a transfer made outside Floatless isn't blocked. Goal floors work the same way. See [Keys and security](https://floatless.xyz/docs/security). ### Can I send to an ENS name, a bank account or another network? ENS names, yes. Type a name like alice.eth and Floatless shows the address it points to before you continue, preferring the address the name set for Monad. See [Send to an ENS name](https://floatless.xyz/docs/send-money#send-to-an-ens-name). Bank accounts and other networks, no. Floatless sends stablecoins on the Monad network your app uses, and Send has no bank option because bank transfers aren't available yet. ### A payment seems stuck. What should I do? Don't send it again. Floatless saves the payment's transaction hash on your phone before broadcasting it, so reopen **Send** and tap **Check status** to find out whether it went through. See [Send money](https://floatless.xyz/docs/send-money). ### Can I cancel or reverse a payment? You can back out any time before you tap **Send $X**. Once a payment settles on Monad, Floatless can't reverse it. See [Send money](https://floatless.xyz/docs/send-money). ### Why doesn't money I received show in Activity? **Activity** lists what you do in Floatless: payments you send, savings moves, new goals and spending-rule changes. On Monad mainnet, money you receive appears there too, as **Received** with the sender's address. See [Activity and history](https://floatless.xyz/docs/activity). ## Savings ### Where does the interest come from? From borrowers. Floatless Savings supplies your AUSD to Morpho's Grove x Steakhouse High Yield AUSD vault, which lends it through Morpho, and borrowers pay interest. See [Floatless Savings](https://floatless.xyz/docs/floatless-savings). ### What rate will I earn? The **Floatless Savings** card shows the current rate after fees. It's Morpho's rate without reward tokens, which don't reach Floatless savers, minus the 10% Floatless fee, and it moves with the market. See [Floatless Savings](https://floatless.xyz/docs/floatless-savings). ### Can I withdraw whenever I want? You can withdraw whenever Morpho has unborrowed AUSD to pay out, and the card shows how much can be withdrawn now. If the usual withdrawal path ever breaks, the app offers **Withdraw straight from Morpho** for a 0.01% fee, and only after you agree. See [Floatless Savings](https://floatless.xyz/docs/floatless-savings). ### Which currency can I save? Only AUSD. Floatless Savings holds AUSD and nothing else, and the app doesn't swap other currencies into it. See [Floatless Savings](https://floatless.xyz/docs/floatless-savings). ### Do spending rules apply to savings? No. Spending rules and goal floors apply to payments you send. Moving AUSD into or out of Floatless Savings doesn't go through the payment check, though you still confirm each move. See [Floatless Savings](https://floatless.xyz/docs/floatless-savings). ### Why does testnet show a preview instead of real savings? Morpho isn't deployed on Monad testnet. The testnet Save tab applies the live mainnet vault's rate to your testnet AUSD and labels it **Preview**, and nothing is deposited. See [Mainnet and testnet](https://floatless.xyz/docs/networks#what-works-on-each-network). ### Is my savings balance guaranteed? No. Savings are lent through Morpho markets, so if a market takes bad debt, the last savers to leave could absorb the loss. Withdrawals depend on Morpho having AUSD available, and Floatless Savings holds only AUSD, a stablecoin issued by Agora. The vault's keys are held by the Floatless team, and they haven't moved to a multisig wallet that needs several signers yet. See [Floatless Savings](https://floatless.xyz/docs/floatless-savings). ### Who can change the savings vault? Three separate keys held by the Floatless team: an owner, a curator and an allocator. Every change the curator proposes waits 3 days before it can take effect, and the owner can cancel it in that window. See [Contracts and verification](https://floatless.xyz/docs/contracts). ## Regulated dollars ### What are regulated dollars? Digital dollars that may only move between identity-verified people. Floatless supports Cleanverse's aUSDC, which is backed 1:1 by USDC and runs on Monad testnet with Cleanverse's sandbox. See [Regulated dollars](https://floatless.xyz/docs/regulated-dollars). ### Why can't I see aUSDC in my app? aUSDC is only in the testnet app. The mainnet app doesn't list it, and the mainnet API has no Cleanverse connection. See [Mainnet and testnet](https://floatless.xyz/docs/networks). ### How do I verify my identity with Cleanverse? Tap **Verify with Cleanverse**, which opens Cleanverse's registration page for your wallet. You'll find it on the **Get aUSDC, verified dollars** card in **Add money**, and on the payment review when your wallet isn't verified. When you're done, tap **I’ve verified, check again** on the review. See [Regulated dollars](https://floatless.xyz/docs/regulated-dollars). ### What happens if the person I'm paying isn't verified? Floatless declines the payment before you sign and tells you the recipient hasn't verified with Cleanverse. Even outside Floatless, the aUSDC token rejects transfers to unverified wallets. See [Regulated dollars](https://floatless.xyz/docs/regulated-dollars). ### How do I get aUSDC? Once you're verified, the **Get aUSDC, verified dollars** card in **Add money** shows your personal Cleanverse deposit address. USDC sent there from a Cleanverse-approved source is locked by Cleanverse, and the same amount of aUSDC lands in your wallet. On testnet, the card links to Circle's faucet for test USDC. See [Add money](https://floatless.xyz/docs/add-money). ### What is a Travel Rule report? A PDF from Cleanverse about one regulated transfer. It summarizes the sender's verified identity, the transfer's amount and transaction, and the addresses its money came from. Floatless fetches it from Cleanverse for a settled aUSDC payment, and because the download link expires, it gets a fresh one each time instead of storing it. See [Regulated dollars](https://floatless.xyz/docs/regulated-dollars). ## Networks and fees ### What's the difference between mainnet and testnet? Mainnet is Monad's live network, where tokens are real money. Testnet is a practice network whose tokens aren't real money. Floatless Savings is live on mainnet, and regulated dollars run on testnet. See [Mainnet and testnet](https://floatless.xyz/docs/networks). ### How can I tell which network my app is on? Each app build uses one network. In the testnet app, Home shows a **Test network** badge beside your balance, the **Floatless Savings** card shows a **Preview** badge, and **Add money** has a **Get aUSDC, verified dollars** card. See [Mainnet and testnet](https://floatless.xyz/docs/networks#how-the-app-picks-its-network). ### Why do I need MON? Every transaction on Monad pays a network fee in MON: sending, registering spending rules, and moving money into or out of savings. Floatless doesn't cover these fees, so keep a little MON in your wallet. See [Fees and limits](https://floatless.xyz/docs/fees-and-limits). ### How much is the network fee on a payment? The review shows the **Network fee** as "Up to X MON" before you tap **Send $X**, and you pay it on top of the amount you send. If fees rise above that before signing, Floatless stops and asks you to review the new fee. See [Fees and limits](https://floatless.xyz/docs/fees-and-limits). ### Does Floatless charge any fees? Floatless doesn't add a fee to payments, savings deposits or withdrawals. Floatless Savings takes 10% of the interest the vault earns, and the emergency **Withdraw straight from Morpho** path costs 0.01%. Network fees go to the Monad network, and Floatless doesn't receive any of them. See [Fees and limits](https://floatless.xyz/docs/fees-and-limits). ## Trust and verification ### How can I check that Floatless does what these docs say? Look it up onchain. Floatless's contracts are source-verified on Monadscan and MonadVision, [Live proof](https://floatless.xyz/docs/proof) lists recorded transactions on both networks, and the code is public. [Contracts and verification](https://floatless.xyz/docs/contracts) shows how to check the savings vault yourself. ### Is the code open source? Yes. The app, the API, the contracts and the website are in the [Floatless repository on GitHub](https://github.com/winsznx/floatless) under the MIT license. ### How was the savings vault tested before launch? The vault is built from Morpho's Vault V2 contracts using Morpho's own factories. Before mainnet, the deploy ran first against a copy of Monad mainnet, and a fork test suite in the repository attacks the setup with leaked keys, griefing and random actions. After the deploy, a script checked the live vault against its intended settings. See [Contracts and verification](https://floatless.xyz/docs/contracts). ### How do I report a security problem? Report it privately, and don't open a public issue. On GitHub, open the repository's Security tab and choose Report a vulnerability. If you can't use that form, email hello@floatless.app with "Security" in the subject. See [Keys and security](https://floatless.xyz/docs/security), and the full policy in [SECURITY.md](https://github.com/winsznx/floatless/blob/main/SECURITY.md). ## For developers and AI assistants ### Is there an API? Yes. The mainnet API is at `https://api-mainnet.floatless.xyz` and the testnet API is at `https://api.floatless.xyz`. Most endpoints need a signed-in Floatless session, and `GET /health/ready` and `GET /v1/compliance/config` are open. See [API](https://floatless.xyz/docs/api). ### How do I tell which network an API serves? Read the `x-floatless-chain-id` header on any response, or `checks.chainId` in `GET /health/ready`. Mainnet returns 143 and testnet returns 10143. See [Mainnet and testnet](https://floatless.xyz/docs/networks#the-network-check-on-every-response). ### Can I ask ChatGPT or Claude about Floatless? Yes. You can connect ChatGPT, Claude or another assistant to these docs and ask about Floatless in plain words. [Use Floatless in ChatGPT and Claude](https://floatless.xyz/docs/ai-assistants) has the setup steps. ### Is there a plain-text version of these docs? Yes. Each page is also served as Markdown at its address plus .md, for example https://floatless.xyz/docs/faq.md. For the introduction, which lives at /docs, use https://floatless.xyz/docs/introduction.md. https://floatless.xyz/llms.txt lists every page, and https://floatless.xyz/llms-full.txt has them all in one file. See [Use Floatless in ChatGPT and Claude](https://floatless.xyz/docs/ai-assistants). ### Can I run Floatless myself? Yes. The [repository README](https://github.com/winsznx/floatless#readme) covers running the API and the app with Node 24 or later, pnpm and Postgres, plus Foundry for the contract tests. Passkeys need a native development build of the app, because Expo Go doesn't include the passkey modules. --- # Glossary > Plain-word definitions of the terms you meet in the app and these docs. Source: https://floatless.xyz/docs/glossary Plain definitions of the words you'll meet in the Floatless app and in these docs, from A to Z. Words in bold are labels exactly as the app shows them. ## A ### Access Core The Cleanverse contract that turns USDC into aUSDC on Monad testnet. When USDC reaches your Cleanverse deposit address from a Cleanverse-approved source, Access Core locks it and the same amount of aUSDC is added to your wallet. Its testnet address is [`0x8F118338a1fa41E7Fa86Be19A4e8B99Ed58A6EcC`](https://testnet.monadscan.com/address/0x8F118338a1fa41E7Fa86Be19A4e8B99Ed58A6EcC). ### Adapter A contract that connects a Morpho vault to the place it puts money. Floatless Savings has one adapter, at [`0xCe2b239dD33110f7c662Fe69D394DcA65A7fF1ab`](https://monadscan.com/address/0xCe2b239dD33110f7c662Fe69D394DcA65A7fF1ab), and it supplies AUSD to Morpho's Grove x Steakhouse High Yield AUSD vault. Only adapters approved in Morpho's adapter registry can ever be added. ### Address A wallet's public ID: 0x followed by 40 characters, made of digits and the letters a to f. You share it to receive money, and anyone can look it up in an explorer. Your Floatless address is shown as **Your Floatless address** in **Add money**, in groups of four characters. ### Agora The company that issues AUSD. ### Allocator A role on the Floatless Savings vault. The allocator moves money between the vault and its adapter and sets the vault's liquidity path and maximum interest rate. It's a separate operations key held by the Floatless team, and the vault's owner can step in as a backup allocator. ### A-Pass Cleanverse's onchain identity pass for a wallet. It carries the wallet's CVI, and Cleanverse looks it up when Floatless asks whether a wallet is verified. The A-Pass contract on Monad testnet is [`0xbA82D189540CaC9DC6FF46B6837CaC1BFdEC58B9`](https://testnet.monadscan.com/address/0xbA82D189540CaC9DC6FF46B6837CaC1BFdEC58B9). ### Approval A transaction that lets a contract take a set amount of one of your tokens. Before a savings deposit, Floatless asks for an approval for exactly the amount you're depositing, unless the vault already has one that covers it. For email accounts, Floatless's signing service refuses approvals on aUSDC, because they would let regulated dollars move later without a Cleanverse check. ### APY Annual percentage yield, the yearly rate your savings earn with interest compounding. The **Floatless Savings** card shows the rate after fees. It's Morpho's rate without reward tokens, minus the 10% Floatless fee, and it changes with the market. ### AUSD Agora Dollar, a dollar stablecoin issued by Agora, and the only currency Floatless Savings accepts. On mainnet it's at [`0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a`](https://monadscan.com/address/0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a). Testnet has its own test version. ### aUSDC Access USDC, Cleanverse's regulated dollar. It's backed 1:1 by USDC and only moves between wallets that hold a valid CVI, and the token itself rejects transfers to unverified wallets. Floatless supports it on Monad testnet only, at [`0xaC0893567D43C3E7e6e35a72803df05416C1f20D`](https://testnet.monadscan.com/address/0xaC0893567D43C3E7e6e35a72803df05416C1f20D). In the currency lists it appears as AUSDC. ## B ### Blockchain A public record of transactions that many computers keep together and anyone can read. Floatless runs on the Monad blockchain. ## C ### Chain ID The number that identifies a blockchain network. Monad mainnet is 143 and Monad testnet is 10143. Each Floatless API reports its chain ID on every response, and the app refuses an API on the wrong network. See [Mainnet and testnet](https://floatless.xyz/docs/networks#the-network-check-on-every-response). ### Circle The company that issues USDC. The testnet app links to Circle's faucet for test USDC. ### Cleanverse A compliance network that checks identities for regulated digital dollars. It gives verified people a CVI and runs aUSDC, which only moves between verified wallets. Floatless uses Cleanverse's sandbox on Monad testnet. ### Cleanverse deposit address The separate address Cleanverse gives you for aUSDC. USDC sent there from a Cleanverse-approved source turns into aUSDC in your wallet. It isn't your wallet address, which the app shows as **Your Floatless address** in **Add money**. On testnet, the **Get aUSDC, verified dollars** card in **Add money** shows it once you're verified. ### Curator A role on the Floatless Savings vault that proposes changes: adding or removing adapters, raising caps, and changing fees, gates or allocators. Each change waits 3 days before it can take effect, and the owner can cancel it during that time. The curator is a separate key held by the Floatless team. ### CVA Cleanverse Verified Asset, a token that only moves between wallets with a valid CVI. aUSDC is a CVA. ### CVI Cleanverse Verified Identity, a credential tied to your wallet once you pass Cleanverse's identity check. You need an active CVI to send, receive or mint aUSDC, and so does the person you pay. A CVI can expire or be frozen, and then aUSDC payments are declined. ## E ### Embedded wallet A wallet that a provider creates and holds for you, so you never handle the key. If you sign in with email, the Floatless API creates a Privy embedded wallet for you and signs with it through Privy when you confirm an action in the app. ### ENS Ethereum Name Service names, like name.eth. You can type one in Send instead of a 0x address. Floatless looks it up on Ethereum and shows the address before you continue. See [Send to an ENS name](https://floatless.xyz/docs/send-money#send-to-an-ens-name). ### EVM The Ethereum Virtual Machine, the kind of blockchain software Ethereum uses. Monad is EVM compatible, so its addresses and tokens work the same way as Ethereum's. ### Explorer A website that shows what's on a blockchain: balances, transactions and contracts. The app's links open Monadscan, and MonadVision is another explorer for Monad. ## F ### Face value Counting one stablecoin as one dollar. When there's no market price for a stablecoin, Floatless uses face value in your **Wallet balance**, and **Your dollars** says so. ### Faucet A service that gives out free test tokens on a test network. See [testnet tokens and faucets](https://floatless.xyz/docs/networks#testnet-tokens-and-faucets). ### Floatless Savings The savings vault on Monad mainnet where your AUSD earns interest. It's a Morpho Vault V2 at [`0x35277466836C6cdb426F50DDF79db0e043e6bbFe`](https://monadscan.com/address/0x35277466836C6cdb426F50DDF79db0e043e6bbFe) that lends through Morpho's Grove x Steakhouse High Yield AUSD vault, and Floatless takes 10% of the interest it earns. On testnet, the Save tab shows a preview. See [Floatless Savings](https://floatless.xyz/docs/floatless-savings). ### Floor An amount a payment can't take you below. Your spending rules set one with **Always keep at least**, and each savings goal can set one with **Keep protected (optional)**. Before a payment, Floatless takes the larger of your rules floor and the total of your goal floors in that currency, and declines a payment that would leave you with less of that currency. ## G ### Gas Another word for network fee. ## H ### Holdings The list of what's in your wallet: each coin you hold, with a dollar value, plus a **Savings** block when you have money in Floatless Savings. The app calls it **Your dollars**. Tap your balance on **Home** to open it. ## K ### Kuru A decentralized exchange on Monad. The Floatless API can read Kuru markets and price quotes, and a Floatless adapter contract for Kuru is deployed on testnet. The app doesn't trade through Kuru today. ## L ### Liquidity How much money can leave a vault right now. Floatless Savings can only pay out AUSD that Morpho borrowers aren't using, so the **Floatless Savings** card shows how much can be withdrawn now. ## M ### Mainnet The live Monad network, chain ID 143, where tokens are real money. See [Mainnet and testnet](https://floatless.xyz/docs/networks). ### Mandate The technical name for your signed spending rules. In the code it's called a Funding Mandate. You sign it with your wallet and register it in the registry on Monad, and each new set of rules gets the next version number. ### Mera The passkey wallet library behind passkey sign-in. It turns your passkey into a wallet key on your phone, and Floatless wipes that key from memory after each use. ### MON Monad's own token. Every transaction on Monad pays its network fee in MON, so you need a little in your wallet to send, register rules or move savings. Your **Wallet balance** counts MON, but **Send** only sends stablecoins. ### Monad The public blockchain Floatless runs on. It's EVM compatible, and it has a live network, mainnet, and a test network, testnet. ### Monadscan A Monad explorer at [monadscan.com](https://monadscan.com), with a testnet version at [testnet.monadscan.com](https://testnet.monadscan.com). The app's **View on Monadscan** links and the **Explorer** button on **Profile** open it. ### MonadVision Another Monad explorer, at [monadvision.com](https://monadvision.com), with a testnet version at [testnet.monadvision.com](https://testnet.monadvision.com). Floatless's contracts are source-verified there as well as on Monadscan. ### Morpho A lending protocol. Savers put money into Morpho vaults, and borrowers pay interest to use it. Floatless Savings is built from Morpho's Vault V2 contracts, and Floatless only configures them. ## N ### Network fee What you pay to have a transaction processed on Monad, charged in MON. Floatless doesn't pay it for you. Before you send a payment, the review shows the **Network fee** as "Up to X MON", which you pay on top of the amount you send. ## O ### Offramp Moving money out of stablecoins into a bank account. Floatless doesn't offer it yet, and **Send** has no bank option. ### Onchain Recorded on the blockchain, where anyone can check it in an explorer. ### Owner The top role on the Floatless Savings vault, held by the Floatless team. It can replace the curator, cancel a pending change, lower caps and act as a backup allocator right away. It also receives the 10% Floatless fee. ## P ### Passkey A sign-in key saved by your phone's passkey manager, which you confirm with your screen lock, like Face ID or a fingerprint. With passkey sign-in, Floatless makes your wallet key from your passkey on your phone, and the key never reaches Floatless's servers. ### Privy The wallet provider behind email sign-in. Privy holds your embedded wallet, and the Floatless API asks Privy to sign for it when you confirm an action in the app. ### Productive capital Money that's earning in Floatless Savings. **Home** shows it on the **Savings** card as "In savings". That figure is the vault value of your savings, and the amount you can withdraw at a given moment can be lower. ### Protected amount The amount a savings goal protects, which you enter as **Keep protected (optional)** in the goal form. Floatless declines a payment that would leave you with less than your goals' protected amounts in that currency, and the goal card on **Save** shows it as "protected". It guides Floatless's checks and doesn't lock money against transfers made outside Floatless. Elsewhere in these docs it's also called a goal's protected floor. ## Q ### Quote The check Floatless runs on a payment before you sign. It covers your balance, your rules and floors, and for aUSDC, Cleanverse. A quote is good for up to a minute, and Floatless checks again right before signing. ## R ### Registry The contract that records your spending rules on Monad, called FundingMandateRegistry. It stores a hash, a short fingerprint of your rules, along with their version and expiry date. It only accepts rules sent from the wallet they belong to, signed by that wallet. Mainnet: [`0x14077b679274Eb5d8B95c60A5d9E94A68Ea4fDf0`](https://monadscan.com/address/0x14077b679274Eb5d8B95c60A5d9E94A68Ea4fDf0). Testnet: [`0x127af791F0807584CaEAe5eDDfd8012972E9a3Da`](https://testnet.monadscan.com/address/0x127af791F0807584CaEAe5eDDfd8012972E9a3Da). ### Regulated dollars Digital dollars that may only move between people whose identity has been verified. In Floatless that's Cleanverse's aUSDC, on Monad testnet. See [Regulated dollars](https://floatless.xyz/docs/regulated-dollars). ## S ### SafeLock A Floatless contract that holds AUSD in Morpho until a set date while it earns, then releases it to the beneficiary. It's deployed on Monad mainnet at `0xFEd7EdE137062CBa02628bBd01A2956D354f3Ca5`, and the app uses it for [scheduled releases](https://floatless.xyz/docs/scheduled-releases). A Chainlink CRE workflow sends due releases when it runs, and anyone can release a due lock. See [Proof](https://floatless.xyz/docs/proof#scheduled-release-with-chainlink-cre-on-mainnet). ### Savings goal A named target in one currency, with an optional protected floor. Create one with **New goal** in **Save**. A goal doesn't keep money apart from your wallet. Its floor is what protects your balance. See [Savings goals](https://floatless.xyz/docs/savings-goals). ### Seed phrase A list of words that backs up a wallet's key. Floatless doesn't show you one or ask for one. A passkey wallet comes from your passkey, and an email wallet is held through Privy. ### Settlement asset The currency a savings goal is set in, which you pick with **Currency** in the goal form. It starts as AUSD, and the goal's floor only counts against payments in that currency. ### Shares Vault tokens that stand for your part of a vault. When you add to Floatless Savings, your wallet receives shares, and what they're worth in AUSD grows as interest comes in. ### Sign To approve something with your wallet key. With a passkey, you sign on your phone. With email, the Floatless API signs through Privy after you confirm in the app. ### Smart contract A program that runs on a blockchain. The spending-rules registry, the Floatless Savings vault and tokens like USDC are all smart contracts. ### Spending rules The limits you set and sign: **Each payment up to**, **Each day up to**, **Always keep at least**, the **Currencies you can send**, and how long the rules last. Floatless declines payments until your rules are registered on Monad, then checks every payment against them before you sign. See [Spending rules](https://floatless.xyz/docs/spending-rules). ### Stablecoin A digital dollar: a token built to stay worth one US dollar. The mainnet app lists USDC, USDT0 and AUSD, and the testnet app lists test USDC, AUSD and aUSDC. ## T ### Testnet Monad's test network, chain ID 10143. Its tokens are for testing and aren't real money. Floatless runs regulated dollars there with Cleanverse's sandbox. See [Mainnet and testnet](https://floatless.xyz/docs/networks). ### Timelock A waiting period before a change can take effect. On Floatless Savings, every change the curator proposes waits 3 days, so savers can see it coming and leave first, and the owner can cancel it. ### Transaction hash A transaction's ID: 0x followed by 64 characters. After a payment, Floatless shows its hash so you can tap to copy it and look it up in an explorer. ### Travel Rule Rules for regulated transfers that require information about the sender and the recipient to be collected for payments above a set amount. For a settled aUSDC payment, Floatless can fetch Cleanverse's Travel Rule report, a PDF with the sender's identity summary, the transfer's details and the addresses its money came from. ## U ### USDC USD Coin, a dollar stablecoin issued by Circle. On mainnet it's at [`0x754704Bc059F8C67012fEd69BC8A327a5aafb603`](https://monadscan.com/address/0x754704Bc059F8C67012fEd69BC8A327a5aafb603). Testnet uses the test USDC from Cleanverse's sandbox. ### USDT0 A dollar stablecoin that the app lists as Tether USD. Floatless lists it on mainnet only, at [`0xe7cd86e13AC4309349F30B3435a9d337750fC82D`](https://monadscan.com/address/0xe7cd86e13AC4309349F30B3435a9d337750fC82D). ## V ### Vault A smart contract that pools deposits and gives each depositor shares. Floatless Savings is a vault. ## W ### Wallet Your account on Monad: an address, plus a key that can sign for it. Floatless sets one up when you first sign in, from your passkey or as a Privy embedded wallet if you use email.