Developer Hub

Build on
USDAO.

USDAO is a standard ERC-20 token with live Proof of Reserves data available on-chain and via REST API. If you can build with USDC, you can build with USDAO.

Quick Start

Up and running in minutes.

ERC-20 Compatible

USDAO implements the standard ERC-20 interface. Any wallet, exchange, or protocol that supports ERC-20 tokens supports USDAO out of the box.

REST API

Server-side REST API for protocol data: supply, reserve status, minting and settlement records. Built for straightforward application integration.

On-Chain Reads

Read supply, reserve balance, and events directly from Ethereum. Use viem, ethers.js, or web3.js. Contracts are verified on Etherscan.

Read USDAO Supply & ReservesTypeScript · viem
import { createPublicClient, http, formatUnits } from 'viem'
import { mainnet } from 'viem/chains'

const client = createPublicClient({
  chain: mainnet,
  transport: http()
})

// Read USDAO total supply
const supply = await client.readContract({
  address: '0x...USDAO_TOKEN_ADDRESS',
  abi: [{ name: 'totalSupply', type: 'function',
    stateMutability: 'view', inputs: [],
    outputs: [{ type: 'uint256' }] }],
  functionName: 'totalSupply'
})

// Supply in USD (6 decimals)
const usdSupply = formatUnits(supply, 6)
console.log(`Total Supply: $${usdSupply}`)
Accept USDAO as PaymentTypeScript · viem
// Accept USDAO as payment in your app
import { parseUnits, erc20Abi } from 'viem'

const USDAO = '0x...USDAO_TOKEN_ADDRESS'
const AMOUNT = parseUnits('100', 6) // $100 USDAO

// Check user balance
const balance = await client.readContract({
  address: USDAO,
  abi: erc20Abi,
  functionName: 'balanceOf',
  args: [userAddress]
})

if (balance < AMOUNT) throw new Error('Insufficient balance')

// Request transfer (user signs in their wallet)
const hash = await walletClient.writeContract({
  address: USDAO,
  abi: erc20Abi,
  functionName: 'transferFrom',
  args: [userAddress, YOUR_TREASURY, AMOUNT]
})
Watch for Protocol EventsTypeScript · viem
// Watch for new enterprise settlement / minting events (event name per verified deployment)
const unwatch = client.watchContractEvent({
  address: '0x...', // registry contract; see docs for mainnet address
  abi: DIVIDEND_REGISTRY_ABI,
  eventName: 'DistributionEventRegistered',
  onLogs: (logs) => {
    logs.forEach(log => {
      const { id, enterprise, amountUSD } = log.args
      console.log(`New event #${id}:`)
      console.log(`  Amount: ${formatUnits(amountUSD, 6)} USD`)
      console.log(`  Enterprise: ${enterprise}`)
    })
  }
})

// Stop watching
unwatch()
REST API

Protocol data via HTTP.

GET/api/protocol/supplyTotal supply, reserve balance, status, recent events
GET/api/protocol/healthProtocol health check: oracle status and custodian connectivity
GET/api/protocol/reservesDetailed reserve data including historical snapshots
GET/api/protocol/eventsList of protocol minting and settlement records with filtering by status and enterprise
Resources

Everything you need.