Overview
TRYD is a fully reserved digital Turkish lira. A single issuance of 650,000,000 tokens was created against a lira deposit, after which the mint authority was revoked. Tokens circulate on Ethereum, BNB Chain, Arbitrum One and Robinhood Chain, and every token in circulation can be redeemed for one lira by a verified account.
This document is the working specification. It covers the contracts, the bridge message format, how the reserve is measured, and the interfaces you need to accept or pay out TRYD.
What TRYD is not
- It is not an investment product. Holding TRYD pays no interest and carries no claim on reserve income.
- It is not algorithmic. There is no supply response to price; the peg is held by open redemption at par.
- It is not rebasing. Balances change only when tokens move.
Token specification
| Name | Digital Turkish Lira |
| Symbol | TRYD |
| Total issuance | 650,000,000 |
| Mint authority | Revoked at issuance; mint() reverts for every caller |
| Decimals | 6 on Ethereum and Robinhood Chain; 18 on the BNB Chain and Arbitrum mirrors |
| Standards | ERC-20 with EIP-2612 permit on Ethereum; the same contract at the same address on Robinhood Chain; LayerZero OFT on BNB Chain and Arbitrum |
| Supply split | ETH 300,000,000 · BNB 175,000,000 · ARB 110,000,000 · HOOD 65,000,000 |
| Redemption | 1 TRYD → ₺1.00, verified accounts, same business day under ₺1,000,000 |
| Freeze authority | Court-order compliance only; every freeze is published within 24 hours |
| Upgradeability | Token contracts are immutable. Vault and redemption desk sit behind a 48-hour timelock |
The 650,000,000 cap is enforced globally. The sum of balances across the four networks is invariant; bridging moves tokens between mirrors, it never creates them.
Contract addresses
Ethereum and Robinhood Chain are live. TRYD is deployed at the same address on both — 0xface679e147820a73526ebd1fbd82173e3481511; there is no other. BNB Chain and Arbitrum are not deployed yet and are marked as such — the supporting contracts further down this page are still placeholders for integration work and cannot receive funds. Each deployment is published here, on the landing page and in the project GitHub, together with the verified source on its explorer.
Verify every address against this page and the project GitHub before sending funds.
Supporting contracts
| Contract | Network | Address |
|---|---|---|
| Vault (bridge lock) | Ethereum | 0xF10a3B7c6D24e95Ab8135CF7092dE4a61bC3805f |
| Redemption desk | Ethereum | 0x37Bc9e4A15D8f602CbE1a7930d4F85c6E20b91Da |
| Proof-of-reserve feed | Ethereum | 0xC0dE5A1b47F9382eDb6c05A1f74e8B39d2c7104E |
| Rate limiter | All EVM | 0x9aE4D0c318B7f562A1d09cE3b8471fA5602dE7c1 |
Issuance and redemption
Issuance moves tokens out of the reserve-backed float into circulation; it does not create tokens. Redemption moves them back and releases lira.
Issuing TRYD
- Complete verification once. You receive an account reference such as
TRY-4821-KD. - Transfer lira to the account named in your dashboard, quoting the reference.
- The desk confirms the deposit, deducts the 0.10% issuance fee, and releases TRYD to your address on the network you selected.
- Release happens within one hour of confirmed settlement during banking days.
Redeeming TRYD
- Call
redeem(uint256 amount, bytes32 accountRef)on the redemption desk from any of the four networks. - Tokens are burned into the float. The event
Redeemed(address,uint256,bytes32)is your receipt. - Lira settle to the bank account bound to that reference, same business day under ₺1,000,000.
// Redemption, ethers v6
const desk = new ethers.Contract(DESK, [
"function redeem(uint256 amount, bytes32 accountRef)",
"event Redeemed(address indexed from, uint256 amount, bytes32 accountRef)"
], signer);
const ref = ethers.encodeBytes32String("TRY-4821-KD");
const tx = await desk.redeem(ethers.parseUnits("25000", 6), ref);
await tx.wait();
Sending TRYD directly to the vault or the token contract does not redeem it and cannot be reversed automatically. Always call redeem.
Bridge protocol
Ethereum is canonical. Moving TRYD to another network locks tokens in the vault and instructs the destination mirror to release the same amount. Moving back burns the mirror balance and unlocks the vault.
Message format
struct BridgeMessage {
uint16 srcChain; // LayerZero v2 endpoint id
uint16 dstChain;
bytes32 recipient; // left-padded EVM address
uint256 amount; // scaled to the destination token's decimals
uint64 nonce;
bytes32 lockHash; // keccak256(vault lock receipt)
}
Guarantees
- Conservation. The vault balance always equals the sum of mirror supplies. A mirror cannot mint without a matching lock receipt.
- Rate limit. 25,000,000 TRYD per rolling 24 hours per route, enforced on-chain. Above that, transfers queue rather than fail.
- Replay protection. Nonces are consumed per route; a repeated
lockHashreverts. - Delay window. Transfers over 5,000,000 TRYD wait 30 minutes before release, giving the monitor time to halt a suspicious route.
Routes
| Route | Transport | Typical time | Cost |
|---|---|---|---|
| Ethereum ⇄ BNB Chain | LayerZero v2 | ~3 min | ₺18.00 |
| Ethereum ⇄ Arbitrum | LayerZero v2 | ~2 min | ₺14.00 |
| BNB Chain ⇄ Arbitrum | LayerZero v2 | ~90 s | ₺2.40 |
| Ethereum ⇄ Robinhood Chain | LayerZero v2 | ~2 min | ₺14.00 |
| Arbitrum ⇄ Robinhood Chain | LayerZero v2 | ~60 s | ₺1.60 |
Reserve methodology
The reserve is measured against circulating supply, defined as total issuance minus tokens held in the float address and minus tokens locked in the vault against mirrors already counted.
| Instrument | Share | Constraint |
|---|---|---|
| Demand deposits | 71% | Segregated accounts at two custodian banks, neither above 45% |
| Treasury bills | 27% | Turkish government paper, residual maturity under 90 days |
| Overnight repo | 2% | Collateralised against government paper only |
Attestation
An independent accounting firm confirms balances on the last business day of each month and signs a report published here within ten days. Between reports, a Chainlink proof-of-reserve feed publishes the custodian balance every six hours, and the redemption desk halts automatically if coverage reads below 99.5% for two consecutive updates.
// Read live coverage
const feed = new ethers.Contract(POR, [
"function latestRoundData() view returns (uint80,int256,uint256,uint256,uint80)"
], provider);
const [, reserve, , updatedAt] = await feed.latestRoundData();
const coverage = Number(reserve) / 1e18 / circulatingSupply;
Fee schedule
| Action | Fee | Paid in |
|---|---|---|
| Issuance | 0.10% | Deducted from the lira deposit |
| Redemption under ₺1,000,000 | 0.10% | Deducted from the payout |
| Redemption above ₺1,000,000 | 0.05% | Deducted from the payout |
| Transfer | none | Network gas only |
| Bridging | none | Messaging and destination gas only |
| Merchant settlement | 0.25% | Invoiced monthly |
There is no fee on holding and no minimum balance. Issuance and redemption have a ₺100 minimum per instruction.
Integration guide
Accepting TRYD on an EVM network
import { ethers } from "ethers";
const TRYD = "0xface679e147820a73526ebd1fbd82173e3481511"; // Ethereum
const abi = [
"function balanceOf(address) view returns (uint256)",
"function transfer(address to, uint256 value) returns (bool)",
"event Transfer(address indexed from, address indexed to, uint256 value)"
];
const token = new ethers.Contract(TRYD, abi, provider);
// Watch a merchant address for incoming payments
token.on(token.filters.Transfer(null, MERCHANT), (from, to, value) => {
const lira = ethers.formatUnits(value, 6); // TRYD is 6 decimals on Ethereum
console.log(`received ₺${lira} from ${from}`);
});
Gasless payment with permit
// The payer signs; your relayer pays gas
const sig = await signer.signTypedData(domain, types, {
owner: payer, spender: MERCHANT, value, nonce, deadline
});
const { v, r, s } = ethers.Signature.from(sig);
await token.connect(relayer).permit(payer, MERCHANT, value, deadline, v, r, s);
await token.connect(relayer).transferFrom(payer, MERCHANT, value);
Robinhood Chain
// Same ERC-20 interface — only the RPC and the token address change
const provider = new ethers.JsonRpcProvider("https://rpc.mainnet.chain.robinhood.com"); // chainId 4663
const TRYD = "0xface679e147820a73526ebd1fbd82173e3481511"; // same address as on Ethereum
const token = new ethers.Contract(TRYD, ERC20_ABI, signer.connect(provider));
await token.transfer(MERCHANT, ethers.parseUnits("25000", 6)); // 6 decimals, gas paid in ETH
Decimals differ by network: 6 on Ethereum and Robinhood Chain, 18 on the OFT mirrors. Always read decimals(). Convert through a decimal type, never through a JavaScript float.
REST API
Base URL https://api.tryd.finance/v1. Public endpoints need no key. Issuance and redemption endpoints require a bearer token bound to a verified account.
GET /supply
{
"total": "650000000",
"circulating": "417260000",
"byChain": {
"ethereum": "300000000",
"bnb": "175000000",
"arbitrum": "110000000",
"robinhood": "65000000"
},
"asOf": "2026-09-18T06:00:00Z"
}
GET /reserve
{
"reserveTry": "418940000",
"circulating": "417260000",
"coverage": 1.004,
"lastAttestation": "2026-08-31",
"feed": "0xC0dE5A1b47F9382eDb6c05A1f74e8B39d2c7104E"
}
POST /issue
curl -X POST https://api.tryd.finance/v1/issue \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"amountTry": "25000.00",
"chain": "arbitrum",
"recipient": "0xYourAddress",
"reference": "TRY-4821-KD"
}'
GET /transactions/:hash
Returns the settlement state of one issuance, redemption or bridge transfer, including the lira leg where one exists.
Limits
- 60 requests per minute for public endpoints, 600 with a key.
- Amounts are decimal strings. Never send floats.
- Idempotency: pass
Idempotency-Keyon every POST; repeats return the original result.
Security and audits
| Scope | Firm | Date | Result |
|---|---|---|---|
| Token, vault, redemption desk | CertiK | 2025-09 | 2 medium, 5 low — all resolved |
| OFT mirrors and rate limiter | Halborn | 2026-01 | 1 medium, 3 low — all resolved |
| Robinhood Chain token (same contract as Ethereum) | CertiK | 2025-09 | Covered by the token audit |
Operational controls
- Vault and desk are behind a 4-of-7 multisig with a 48-hour timelock on parameter changes.
- A monitor account can pause a single bridge route without a timelock. It cannot move funds.
- Rate limits are enforced in the contract, not by the relayer.
- Disclosure:
security@tryd.finance, PGP key on the GitHub organisation. Bounty up to ₺4,000,000 for a critical finding.
Governance
TRYD has no governance token and no on-chain vote over the reserve. Holders cannot vote to change what backs their claim, which is the point.
Parameters that are governed — bridge rate limits, route additions, fee changes within a published band, and treasury spending — are proposed publicly, held for 48 hours in the timelock, and executed by the multisig. Every proposal, its calldata and its execution hash are published in the changelog.
Fee changes outside the band, reserve composition changes, and any change to the 650,000,000 cap require a signed attestation of the new state before they take effect. The cap itself cannot be raised: the mint function no longer exists on any deployment.
Glossary
| Float | Issued but not circulating. Tokens held by the issuer against the reserve, released on issuance. |
| Mirror | The TRYD contract on a non-canonical network. Its supply is backed by locked tokens in the Ethereum vault. |
| Lock receipt | The event emitted when the vault locks tokens for a bridge transfer. Its hash authorises release on the destination. |
| Coverage | Reserve divided by circulating supply. Published every six hours on-chain. |
| Account reference | The identifier binding an on-chain address to a verified bank account for redemption. |
| Kuruş | One hundredth of a lira. The practical unit for network costs on Arbitrum and Robinhood Chain. |