For wallets, brokers and apps
Offer yield.
Skip the backend.
Put an earn product on top of tokenized assets your users already hold on Robinhood Chain. Arter runs the vaults; your interface stays yours.
Where the money goes.
Your users
Hold USDG, GLD, SGOV or stock tokens
Your app
Shows an Earn balance and a deposit button
Arter vault
Shared or dedicated ERC-4626, one per asset
Isolated lending
overcollateralized USDG and asset loans
Liquidity ranges
narrow asset/USDG positions
Withdrawal buffer
idle, for instant exits
Income flows back the same way: converted into the deposited asset and added to the vault's share price every day.
Two ways in.
Shared vaults
Point your app at the public ERC-4626 vault for each asset. Deposit, withdraw and read balances with the same four calls every ERC-4626 integration already knows.
See the interfaceDedicated vault
A vault that only your users can enter, with its own asset list, caps, buffer size and fee split, so the product matches your terms and your controls.
Talk to usThe part you no longer build.
Idle balances earn
Assets your users already hold start compounding daily, while they keep the exposure they chose.
No yield desk to build
Allocation, rebalancing, liquidations and buffers run in the contracts. Your team ships the button.
Accounting on-chain
Share prices and accruals are contract state. Reconcile from events instead of a partner's spreadsheet.
Fits your controls
Allow-lists, per-user limits and blocklist checks come built in, and a dedicated vault can go further.
Integration preview.
Standard ERC-4626, so any library that speaks it works. This reads one user's position. The vault address is a placeholder until deployment.
1import { createPublicClient, http, parseAbi } from "viem";2 3// Interface preview. Vault addresses are published once deployed.4const VAULT = process.env.ARTER_USDG_VAULT as `0x${string}`;5 6const client = createPublicClient({7 transport: http("https://rpc.mainnet.chain.robinhood.com"),8});9 10const erc4626 = parseAbi([11 "function totalAssets() view returns (uint256)",12 "function convertToAssets(uint256 shares) view returns (uint256)",13 "function balanceOf(address owner) view returns (uint256)",14 "function deposit(uint256 assets, address receiver) returns (uint256)",15]);16 17// What one user's position is worth, in USDG.18export async function positionOf(user: `0x${string}`) {19 const shares = await client.readContract({20 address: VAULT, abi: erc4626, functionName: "balanceOf", args: [user],21 });22 return client.readContract({23 address: VAULT, abi: erc4626, functionName: "convertToAssets", args: [shares],24 });25}Build your earn tab.
Tell us what your users hold. We will sketch the vault setup that fits.