Verify USDMD
Check the reserves without trusting us.
Five steps, each against the chain or a file whose hash the chain holds. Step 5 applies from mainnet, when there is real gold to count.
The latest epoch, to check against
2026-09-30 09:50 UTC · block 611,211
79,471.707226
0.000000
1.3282
0xecf298c3adbbeeb9bef22120c0d1a10e6040b15c17da0faaff8da4629e844c3b
Read the latest epoch
Open the ProofOfReserves contract on the explorer, go to Read contract, call epochCount() and then epoch(n) with that number. Note supply, onchainValue, docsRoot and the off-chain lines.
Recompute supply and the on-chain reserve
Call totalSupply() on the USDMD token and holdings(asset) on the ReserveManager for each registry asset. Value each holding at the price from OracleAdapter.read(keccak256("XAU/USD")), less its haircut from CollateralRegistry.asset(asset). The total should match onchainValue for the block the epoch was published in; the contract refuses an epoch where they differ, and this step checks that it did.
Hash the statement
Download the epoch's statement from the documents page and compute its SHA-256. It must equal docsRoot. On testnet each epoch has one document, so docsRoot is that document's hash; with several documents it becomes the root of a Merkle tree of their hashes.
Check the hedge on the venue
The statement names the venue account that holds the hedge. Look that account up on the venue's public account endpoint; its position must match the hedge line. On testnet the hedge keeper has not yet opened a position, and the statement says so.
Count the gold (from mainnet)
From mainnet, check the custodian's bar list against its signed statement and against the independent auditor's attestation, each of which is published here with its hash on chain. On testnet there is no custodian and no bar list, because there is no gold.
Commands for step 2
With Foundry's cast installed. Each returns a raw integer: USDMD has 6 decimals, the gold tokens 18, and the price 18.
RPC=https://rpc.testnet.onmidas.xyz # the latest epoch cast call 0x056Ede5c54dDf3e753fb033d269Dab059f2D6B89 "epochCount()(uint256)" --rpc-url $RPC cast call 0x056Ede5c54dDf3e753fb033d269Dab059f2D6B89 \ "epoch(uint256)((uint64,uint64,uint256,uint256,uint256,int256,uint256,uint256,bytes32,string,bytes32,string))" <n> \ --rpc-url $RPC # supply (6 decimals) cast call 0xc63b4Bd2120faC3ea8f1Ff8658B8285E29918D14 "totalSupply()(uint256)" --rpc-url $RPC # on-chain holdings per asset (18 decimals) cast call 0xa0A2896c1ae3139752e67DeC9172964b3D37133a "holdings(address)(uint256)" 0xd47F0EcD6f53bA48524c6C2E454aE716bC6174D5 --rpc-url $RPC cast call 0xa0A2896c1ae3139752e67DeC9172964b3D37133a "holdings(address)(uint256)" 0x0Da5029c9567dAa3926d5754146F59606007026a --rpc-url $RPC # XAU/USD (18 decimals): median, updatedAt, fresh sources, usable cast call 0x8d5c3Ee7Ee4363a66aC40819C38DbD182bEC4F26 "read(bytes32)(uint256,uint256,uint256,bool)" $(cast keccak "XAU/USD") --rpc-url $RPC # an asset's haircut: (decimals, status, testnetOnly, haircutBps, maxShareBps, oracleId, hedge) cast call 0x7ab4C04DcAB052376998959670A3Bf3F021De803 "asset(address)((uint8,uint8,bool,uint16,uint16,bytes32,bytes32))" 0xd47F0EcD6f53bA48524c6C2E454aE716bC6174D5 --rpc-url $RPC
Nothing on these pages is an offer, a solicitation or a recommendation to buy, sell or hold any asset, in any jurisdiction. Test USDMD is not sold and has no value.