Transparency
Every section below reduces to a read against Base mainnet.
Start here: the cap is a number
maxSupply() on the LOAM contract returns 1,000,000,000. That is the cap, written once at genesis and never raised. totalSupply() returns what has actually been issued โ the LOAM that exists. The difference, reserveBox(), is unissued capacity: a counter, not a balance. The token contract holds no LOAM.
Until 2026-09 the unissued capacity was pre-minted and held at the token's own address, and every automated risk scorer read that balance as a single holder of 99.4% of supply. It was never a holding โ it could leave the contract only when someone paid NAV in Pinto โ but a scanner keys on the balance, not the explanation. The pre-minted reserve was burned in one timelocked upgrade (tx); nothing about NAV, circulating supply, fees or redemption changed, and this page shows the three reads that let you check that.
The rest of this page is the evidence: the allocation identity and the calls behind each term, the founder escrow's schedule, both pools read from chain, the upgrade path and who controls it.
Allocation
Three independently checkable reads. totalSupply() is outstanding LOAM; the protocol's own liquidity position is part of it; the cap is what may ever exist.
The token contract's own balance of LOAM is zero โ balanceOf(0x473BโฆA31b) โ and the deployer's balance is zero.
Vesting
There is one founder allocation, it is locked, and it is the largest non-protocol balance in the system. It sits in a stock OpenZeppelin VestingWallet, deployed at genesis and used unmodified โ no custom escrow contract was written, and the deployed bytecode is checkable against the library's own.
The schedule above is not a policy anyone promises to follow โ it is start and duration on a deployed contract, and the same read anyone can make. Nothing releases before start(); that IS the widely-described "cliff" โ the contract has no separate cliff mechanism, it is simply a start timestamp in the future. From that point release is linear over duration.
โ ๏ธ Two accepted properties, disclosed rather than papered over. OpenZeppelin's VestingWallet is Ownable with the beneficiary as owner, so the position itself is transferable โ the beneficiary could sell it. That changes who eventually receives the tokens, never when: a buyer inherits the identical start and duration and cannot release a single token early. The escrow is also non-revocable โ stock VestingWallet has no claw-back function, and none was added. The beneficiary is readable at any time via owner() on the escrow.
Liquidity
LOAM trades against USDC in two Aerodrome pools on Base. Each pool's balances are read live from the token contracts themselves โ the same balanceOf call anyone can make โ and LOAM's price is derived from the v2 pool's own reserves, never fetched from a price API.
โ ๏ธ There is no liquidity lock. The protocol's liquidity is protocol-owned โ protocolLpSurco() reports the LOAM side of it โ but it is not deposited in any third-party locker, and "protocol-owned" is not the same claim as "locked". What constrains this protocol is stated elsewhere on this page: a 48-hour timelock on every upgrade, a non-revocable founder escrow that has released nothing, and a staking contract with no admin at all.
Governance
Every protocol upgrade runs through one path: the Safe proposes, the TimelockController holds the proposal for 48 hours, and only then can diamondCut execute. There is no direct-call path from the Safe (or anywhere else) to diamondCut that skips the timelock โ the diamond's cut function accepts calls only from the timelock's own address.
The canceller and the guardian are not independent parties. getOwners() on the Safe returns three signers with a threshold of 2, and two of those signers are the canceller and guardian addresses above. These are role separations inside one signer set, not separate organisations โ one call exposes it, so it is stated here rather than left to be found.
The only executable target on the diamond that changes code is diamondCut itself, and it runs through the queue above. So does every other change that could redirect value or control: role grants, the mint and redeem fees, the venue adapter, and devAddr. None of those can take effect on a timeline shorter than 48 hours, and each is visible on Basescan the moment it is queued โ not the moment it lands. Nothing about the facet set, the allocation, the vesting escrow, or the protocol's liquidity position can move faster than that.
โ ๏ธ Two things are not delayed, and this page does not claim they are. The guardian can call AdminFacet.latchRedemption(string) or AdminFacet.latchMint(string) โ both onlyRole(GUARDIAN_ROLE) โ and halt every redemption, or every mint, immediately. Each takes a non-empty reason string that is emitted on-chain with the latch, and the Safe can lift a latch, also immediately. Separately, AdminFacet carries parameter setters gated on DEFAULT_ADMIN_ROLE, which the Safe holds, and they take effect the moment they are called: the cushion floor and ceiling, the performance fee, the referrer, the Field exposure cap, the earmark ceiling, the max swap slippage, the stem-scan budget, and disableVenueDivergenceGate (that last one is callable by the guardian as well). They change parameters rather than code. The full list is in src/facets/AdminFacet.sol, and every one of them is an onlyRole(DEFAULT_ADMIN_ROLE) or onlyRole(GUARDIAN_ROLE) line a reader can grep for.
Contract safety
The sections above are about what can change and who can change it. This one is the opposite: properties that hold in the deployed source. Each is checkable without trusting this page: the contracts are verified on Basescan, so the source is readable at the address itself, and the repository they are built from is public at github.com/Project-Loam/loam-contracts.
Addresses
Every contract referenced anywhere on this page, in one place. Facet addresses are deliberately not listed here โ they are read live from the diamond's own loupe on /technical, because a transcribed facet address is wrong the moment an upgrade lands; everything below is stable across upgrades.
Facets: read live from IDiamondLoupe.facets() on the diamond above, rendered on /technical.
Not yet claimed
The rest of this page is evidence for what LOAM does. This section is deliberately the opposite: what a reviewer would otherwise have to find on their own.
Verify it yourself
Every figure on this page reduces to one of these reads. Run them yourself against Base mainnet with cast; nothing here depends on trusting this site.
L=0x473B392018B05ecbB7Edf4C3CF2B1F8593A9A31b E=0xEa29F43467be0f004c331DD8015FC5F80d8B0A92 cast call $L "maxSupply()(uint256)" # the cap: totalSupply() + reserveBox() cast call $L "totalSupply()(uint256)" # issued cast call $L "circulatingSupply()(uint256)" cast call $L "protocolLpSurco()(uint256)" cast call $L "reserveBox()(uint256)" # unissued capacity โ a counter, not a balance cast call $L "balanceOf(address)(uint256)" $L # the token contract's own LOAM balance: 0 cast call $L "mintFeeBps()(uint256)" ; cast call $L "redeemFeeBps()(uint256)" cast call $L "perfFeeBps()(uint256)" ; cast call $L "devAddr()(address)" # 1000 bps, paid to the founder escrow cast call $E "released(address)(uint256)" $L ; cast call $E "releasable(address)(uint256)" $L cast call $E "start()(uint256)" ; cast call $E "duration()(uint256)" cast call 0x6Cf2879291A343514F62c55448306a3f5E45EF9f "getMinDelay()(uint256)" cast call 0x4280F2b1fc6edbBbaE69b7F651f09357057b8D0F "getOwners()(address[])" # the Safe's three signers cast call $L "balanceOf(address)(uint256)" 0x6d0bfe8fd0d8e725044f41750353f58368eb2a95 # deployer EOA: 0 cast call $L "previewMint(uint256)(uint256,uint256)" 1000000 # quote a mint without signing anything V=0x3e17f7b0c50509099c99A7E3512b793ca03213ac cast call $V "grantBps()(uint256)" ; cast call $V "ramp()(uint256)" # vLOAM immutables; no setter exists