01

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.
02

Token specification

NameDigital Turkish Lira
SymbolTRYD
Total issuance650,000,000
Mint authorityRevoked at issuance; mint() reverts for every caller
Decimals6 on Ethereum and Robinhood Chain; 18 on the BNB Chain and Arbitrum mirrors
StandardsERC-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 splitETH 300,000,000 · BNB 175,000,000 · ARB 110,000,000 · HOOD 65,000,000
Redemption1 TRYD → ₺1.00, verified accounts, same business day under ₺1,000,000
Freeze authorityCourt-order compliance only; every freeze is published within 24 hours
UpgradeabilityToken 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.

03

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

ContractNetworkAddress
Vault (bridge lock)Ethereum0xF10a3B7c6D24e95Ab8135CF7092dE4a61bC3805f
Redemption deskEthereum0x37Bc9e4A15D8f602CbE1a7930d4F85c6E20b91Da
Proof-of-reserve feedEthereum0xC0dE5A1b47F9382eDb6c05A1f74e8B39d2c7104E
Rate limiterAll EVM0x9aE4D0c318B7f562A1d09cE3b8471fA5602dE7c1
04

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

  1. Complete verification once. You receive an account reference such as TRY-4821-KD.
  2. Transfer lira to the account named in your dashboard, quoting the reference.
  3. The desk confirms the deposit, deducts the 0.10% issuance fee, and releases TRYD to your address on the network you selected.
  4. Release happens within one hour of confirmed settlement during banking days.

Redeeming TRYD

  1. Call redeem(uint256 amount, bytes32 accountRef) on the redemption desk from any of the four networks.
  2. Tokens are burned into the float. The event Redeemed(address,uint256,bytes32) is your receipt.
  3. 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.

05

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 lockHash reverts.
  • Delay window. Transfers over 5,000,000 TRYD wait 30 minutes before release, giving the monitor time to halt a suspicious route.

Routes

RouteTransportTypical timeCost
Ethereum ⇄ BNB ChainLayerZero v2~3 min₺18.00
Ethereum ⇄ ArbitrumLayerZero v2~2 min₺14.00
BNB Chain ⇄ ArbitrumLayerZero v2~90 s₺2.40
Ethereum ⇄ Robinhood ChainLayerZero v2~2 min₺14.00
Arbitrum ⇄ Robinhood ChainLayerZero v2~60 s₺1.60
06

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.

InstrumentShareConstraint
Demand deposits71%Segregated accounts at two custodian banks, neither above 45%
Treasury bills27%Turkish government paper, residual maturity under 90 days
Overnight repo2%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;
07

Fee schedule

ActionFeePaid in
Issuance0.10%Deducted from the lira deposit
Redemption under ₺1,000,0000.10%Deducted from the payout
Redemption above ₺1,000,0000.05%Deducted from the payout
TransfernoneNetwork gas only
BridgingnoneMessaging and destination gas only
Merchant settlement0.25%Invoiced monthly

There is no fee on holding and no minimum balance. Issuance and redemption have a ₺100 minimum per instruction.

08

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.

09

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-Key on every POST; repeats return the original result.
10

Security and audits

ScopeFirmDateResult
Token, vault, redemption deskCertiK2025-092 medium, 5 low — all resolved
OFT mirrors and rate limiterHalborn2026-011 medium, 3 low — all resolved
Robinhood Chain token (same contract as Ethereum)CertiK2025-09Covered 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.
11

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.

12

Glossary

FloatIssued but not circulating. Tokens held by the issuer against the reserve, released on issuance.
MirrorThe TRYD contract on a non-canonical network. Its supply is backed by locked tokens in the Ethereum vault.
Lock receiptThe event emitted when the vault locks tokens for a bridge transfer. Its hash authorises release on the destination.
CoverageReserve divided by circulating supply. Published every six hours on-chain.
Account referenceThe 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.