Part II: The backing
6. ADRs, ratios, and what custody actually holds
The promise is one token, one ordinary share. The thing sitting in a US brokerage account is frequently not an ordinary share, and pretending otherwise is how a reserve quietly becomes fractional. This section is the whole of that problem.
6.1 What an ADR is
An American Depositary Receipt is a US-listed certificate issued by a depositary bank against home-market shares that bank holds through a local custodian. It trades in dollars, settles US-style, and clears through US infrastructure. That is its entire purpose: it is a wrapper that lets American plumbing hold a foreign asset.
It is a receipt, not the share. The depositary is a real counterparty in the chain, and the receipt can be cancelled, the programme can be terminated, and the ratio can be changed.
Sponsored means the company itself set the programme up with the depositary, so there is one programme, disclosure obligations, and usually a real exchange listing. Unsponsored means a depositary created it without the company's involvement, which is why several banks can run competing programmes on the same company and why the terms are the depositary's to change. Most of Float's target names trade unsponsored on the US OTC market: Nintendo and Tencent both do.
Level I is OTC and light on disclosure. Level II is exchange-listed. Level III raises capital. Almost everything in the missing 1,880 that has a wrapper at all has a Level I one.
6.2 The ratio, which is the whole difficulty
One ADR is almost never one share. The depositary picks a ratio to put the receipt in a comfortable dollar price range, and it differs by name. From Float's own market table:
| company | line | one receipt is | kind |
|---|---|---|---|
| Nintendo | NTDOY | 0.25 ordinary shares | ADR, unsponsored |
| Tencent | TCEHY | 1 | ADR, unsponsored |
| Nestle | NSRGY | 1 | ADR, sponsored |
| LVMH | LVMUY | 0.2 | ADR |
| SoftBank | SFTBY | 0.5 | ADR |
| Hermes | HESAY | 0.1 | ADR, not fractionable |
Get that number wrong and the reserve is wrong by exactly that factor. Ship 1.0 where the truth is 0.2 and the market is running a 5x fractional reserve while every on-chain view agrees with itself, because every view is derived from the same wrong constant.
We learned this the expensive way. A published fact sheet gave the NTDOY ratio as 1:8. Float derived it from live prices instead and got 1:0.25, a 32x discrepancy against the document. The live price relationship was right. So the rule is now explicit: verify a ratio from prices, never from a fact sheet, and check it continuously. A depositary can change the ratio on an unsponsored programme without asking anyone.
6.3 How Float encodes it
The custodian always reports the units on its statement, whatever those units are, and the contract converts:
setCustodyUnit(assetId, sharesPerUnit, kind) // 1e18 = one unit is one ordinary share
// 2.5e17 = one unit is a quarter of a share
sharesHeld = unitsHeld * sharesPerUnit / 1e18
custodyKind is stored as a string, "ordinary" or "ADR" or "GDR", so the
reserve page can say plainly what is actually held rather than implying the
ordinary share everywhere.
Two guards make the ratio safe to change:
A ratio change restates the existing position. setCustodyUnit recomputes
attestedShares and sharesInFlight from the stored units, so the book never
keeps crediting the old conversion against shares it already holds. On a
verified market it deliberately does not restate, because sharesHeld reads a
live balance and rewriting the dormant attested record from stale units produced
a figure no custodian had ever reported.
The keeper refuses to trade on a mismatch. The order size comes from the
keeper and the ceiling comes from the contract, so the keeper reads
sharesPerUnit off the chain every cycle and halts the market if its own config
disagrees. It prints the two numbers and says to fix it with setCustodyUnit
rather than guessing.
6.4 The flow, end to end
The ratio is not a footnote in this process, it is the unit conversion sitting between every step. Here is a purchase from the buyer to settled custody, with Nintendo as the worked example because its 0.25 makes every conversion visible.
1. Someone buys. $500 of fNINTENDO at the Desk. USDG lands in the vault and the token is minted only if the issuance gate passes. At this instant the position is cash backed: the money is in the vault and no share has been bought yet.
2. The keeper sees the shortfall. outstanding now exceeds
sharesHeld + inFlightLive, and the difference is what has to be acquired.
3. The ratio is checked before anything is ordered. From live prices, never
from a fact sheet, and against the sharesPerUnit the chain already holds. This
is the step the NTDOY incident added: a document said 1:8 where the market said
1:0.25.
4. The order is sized in shares and placed in units. The obligation is in ordinary shares; the broker trades ADRs. So
units to buy = ordinary shares owed / sharesPerUnit
Covering 100 ordinary Nintendo shares at 0.25 means buying 400 NTDOY, not 100. Getting this backwards is the 32x error, and in the direction that leaves the reserve short rather than long.
5. The order id is derived, not generated. It is a hash of the on-chain state that justified it, so a keeper that dies between placing and reporting restarts, computes the same id, and the broker rejects it as a duplicate rather than buying twice.
6. The fill is reported in the statement's own units.
reportExecuted(assetId, units, ref) records 400, not 100, along with the
reference it came from. The contract converts on the way in:
sharesHeld = unitsHeld * sharesPerUnit / 1e18
so 400 units at 2.5e17 becomes 100 ordinary-share equivalents. The chain stores what custody literally holds and converts to what the token promises, rather than storing a converted number nobody reported.
7. Settlement. T+2 in most markets. reportSettled moves the units out of
in-flight and writes the absolute held figure from the statement, not a
delta, so a missed report cannot leave the book drifting.
8. The market becomes share backed. sharesHeld now covers outstanding,
and the cash allowance that was standing in for it shrinks to nothing on its
own. Nothing switches modes; the cash term simply stops being the binding one.
9. If the depositary moves the ratio, setCustodyUnit restates the existing
position from the stored units, so the book never keeps crediting an old
conversion against shares it already holds. On a verified market it deliberately
does not restate, because there sharesHeld reads a live balance.
10. Redemption runs the same path backwards and is never gated. Selling burns the fSHARE and releases the share behind it. A market that cannot prove its cover goes settle-only, which stops issuance and still lets holders leave.
The thing to hold on to: Float's obligation is denominated in ordinary shares
and its custody is denominated in whatever the broker sells. Every number on
chain is one of those two, explicitly, and sharesPerUnit is the only bridge
between them.
6.5 Who holds it, and who prices it
Three different counterparties sit behind an ADR-backed market, and they fail in different ways, so they are worth naming separately.
The depositary bank issues the receipt, and Float does not choose it. Float buys whatever line already exists. On an unsponsored programme, which is what most of these names trade on, the depositary set the programme up without the company and owns its terms: it can change the ratio, and it can terminate the programme. That is a counterparty Float holds exposure to and cannot negotiate with, which is the honest reason section 6.8 exists.
The broker holds the position. Custody is a real brokerage account, and the attestation service reads it rather than being told about it:
buy fSHARE on the Desk ──gate──▶ ReserveBook.isFullyReserved(asset)
▲
│ attest(asset, UNITS, ref)
the attestor ─┘ units = what the statement says
▲
│ GET /v2/positions
the broker (holds the ADRs)
services/attestor is written against Alpaca and reads its positions
endpoint directly. Interactive Brokers is the other broker the reserve work
targets, for a cash entity account.
The conversion happens on chain, not on the way in. attest takes the
number of units the custody statement reports, whatever those units are, and
the contract converts:
attest(assetId, units, custodyRef) // onlyCustodian
sharesHeld = units * sharesPerUnit / 1e18
So a statement showing 400 NTDOY receipts is attested as 400 units, and the book records 100 shares. Passing an already-converted share count is the error this paragraph used to invite: it would be converted a second time and credit a quarter of the backing that exists.
The trust point here is the broker plus the custodian key. That is stated rather than hidden: an attested market is only as good as the key that signs for it, which is why the attestation history is kept on chain as a series rather than a single current figure.
Verified custody removes the key entirely, where it is available. If the
backing is itself an on-chain token that is redeemable for the share, the chain
reads a balance instead of believing a signature, and attest,
reportExecuted and reportSettled all revert on that market so nobody can
quietly go back to trusting a key. A Dinari adapter for that mode is
prototyped and not deployed.
The price comes from two vendors, not one. The oracle is a median hub with independent posters, so a single vendor being wrong or unreachable does not move the mark:
| poster | vendor | note |
|---|---|---|
| one | EODHD, paid, All World Extended | does not carry Tokyo on this plan |
| two | Yahoo | reachable over IPv6, which EODHD is not |
That split is forced rather than chosen. EODHD is unreachable over IPv6 and the
second host is IPv6 only, so it cannot ever be the EODHD poster. And because
EODHD does not carry Tokyo on this plan, Japanese names are priced through their
US line and an FX leg: Nintendo through NTDOY and JPY/USD, with a Nikkei futures
proxy as a further fallback. The same ADR ratio problem therefore appears twice,
once in custody and once in pricing, and it is the same sharesPerUnit number
both times.
6.6 Picking the line is its own problem
Knowing you want Nintendo is not enough to place an order. Search results for these names return the ordinary share, several ADR tiers, look-alike tickers, and restricted tranches that a US account may not be able to hold at all (Reliance's 144A against its Reg S line is the canonical trap). Float's research notes record four wrong lines we picked by name before pinning contract ids, and the broker adapter now refuses to trade any line without a pinned contract id. A name is not an instrument.
6.7 Fees and dividends, stated rather than glossed
Depositary programmes charge a service fee, typically one to five cents per receipt per year, deducted from dividends or billed directly. Home-market withholding applies before that: 22% on Korean dividends by default, reclaimable only by filing treaty paperwork.
Float does not currently pass dividends through to holders, and does not claim to. That is a real gap rather than a design choice, and it is item 6 in section 14. Where the underlying pays, the economics accrue to the reserve.
6.8 Why ADRs are not the answer on their own
They are the easy path, and for many names they are also the only path a US broker can take today, which is why Float supports them properly rather than avoiding them. But they are not sufficient for the set Float exists to list:
- Many head names have no ADR at all. SK Hynix delisted its programme years ago. There is no wrapper to buy.
- The ones that exist are thin. An unsponsored Level I OTC line can trade at a visible spread to the home print, and its price is not the company's price.
- The depositary is a counterparty. Terminate the programme and the receipt is unwound.
So the ADR is a supported custody unit, not the plan. The architecture is
deliberately unit-agnostic: sharesPerUnit plus custodyKind means the same
market can be backed by ordinary shares through a home-market custodian, by an
ADR through a US broker, or by a verified on-chain share token, and every
downstream number keeps meaning ordinary-share equivalents. Crossing the wall
properly means holding the ordinary share. The ADR is how you list the name
while that pipe is being built.