You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
USDT0 is live on Stellar mainnet. It is Tether's USDT delivered over LayerZero's OFT standard, and it is the first production OFT on Stellar's LayerZero endpoint. The skills do not mention USDT0, LayerZero, or OFT. An agent using cross-chain cannot route "bridge USDT to Stellar". An agent using assets has no example of a live asset whose admin is a contract and that ships without a stellar.toml.
LayerZero coverage was pulled from #67 on 2026-08-04 because Stellar testnet could not send (#1213 UnsupportedMessageLib). USDT0 now runs on the mainnet endpoint in production, so the follow-up promised there has a concrete anchor.
Docs side is covered by stellar/stellar-docs#2795 (short link-out page). This issue is the skill side, which should carry the verification detail the docs page leaves out.
Verified on mainnet (2026-08-25, read-only RPC and Horizon)
Issuer flags: auth_revocable and auth_clawback_enabled set. auth_required and auth_immutable not set. USDC on Stellar sets auth_revocable only.
Issuer account is locked: master key weight 0, no other signers. Flags cannot change through SetOptions.
No home_domain, so no SEP-1 stellar.toml. Any check keyed on home_domain or [[CURRENCIES]] fails. SAC name() returns USDT0:G..., symbol() returns USDT0.
SAC admin() is the adapter contract above. Its interface exposes mint, set_authorized, clawback, set_admin, upgrade, role gated. Its owner() is another contract, CBCZ5CETG3XR5MZVDC7QBDOTIH6P7MOLUH2SSC52J3NVBYIV45D4QKR6.
Decimals: SAC decimals() is 7. OFT shared_decimals() is 6, decimal_conversion_rate() is 10. quote_oft with amount_ld 10000001 returns amount_sent_ld 10000000. Dust below 6 decimals is dropped on send.
OFT: oft_type() is MintBurn(adapter). token() equals the SAC. is_paused() false. default_fee_bps() null. Rate limits exist per pathway (rate_limit_config).
Peers set for EIDs 30101 (Ethereum), 30110 (Arbitrum), 30111 (Optimism). None for 30184 (Base) or 30102 (BSC). Peers are live data. Query peer(eid), do not hardcode.
Fees for outbound sends are paid in XLM. quote_send returns MessagingFee. quote_oft returns OFTLimit, fee details, and OFTReceipt.
USDT0 publishes no testnet deployment. Everdawn Labs builds and operates USDT0 (usdt0.to footer).
Proposed changes
skills/cross-chain
Add a companion file layerzero.md. Mirror the cctp.md structure:
Contracts and addresses (endpoint, ULN, executor, DVNs from the LayerZero metadata API; USDT0 addresses above).
The rule that saves funds: recipient trustline before inbound; pin code and issuer; 7 vs 6 decimals with a worked dust example.
OFT concept in one screen: peers, DVNs, executor, lz_receive, mint/burn vs lock/unlock.
Inbound flow (EVM to Stellar) and outbound flow (Stellar to EVM) with the exact SendParam struct, quote_oft, quote_send, send, and CLI arg shapes. Read-only simulation examples first.
Tracking on LayerZero Scan. Timing stays qualitative: minutes, driven by source-chain finality.
Limitations and status notes: pause flag, rate limits, fee bps, no USDT0 testnet, testnet send status.
Update SKILL.md:
Router row: move native USDT between Stellar and an EVM chain, use USDT0 over LayerZero OFT, see layerzero.md.
Frontmatter description and "Rules of thumb" mention the new rail.
Shared pitfall 2 (decimals): add OFT shared decimals and dust removal.
Shared pitfall 5 (testnet first): state that USDT0 has no testnet deployment and give the rehearsal path.
In the "SAC admin contract" note under "Use Custom Contract Tokens When", cite USDT0 as the live example: locked issuer, contract admin with mint, set_authorized, clawback.
In "Security" best practices, add two lines. Some live assets have no stellar.toml; validate by issuer plus SAC derivation, not by home_domain. When auth_revocable and auth_clawback_enabled are set, identify who holds the admin role before listing.
Add a short read-only "pre-listing check" recipe with USDT0 as the example: stellar ledger entry fetch account, stellar contract id asset, stellar contract invoke ... -- decimals|name|symbol|admin, and the OFT reads token, shared_decimals, oft_type, endpoint, is_paused. No keys, no signing. The docs page dropped this on purpose; the skill is the right home for it.
Site
site/src/data/skills.ts: the cross-chain card reads "Cross-Chain (CCTP, Axelar)". Add LayerZero.
Verification plan for the PR
Re-run every read-only check above against mainnet and record the date. Fail the PR if any value moved without an explanation.
Compile the OApp skeleton to wasm32v1-none against current LayerZero crates.
Re-test Stellar testnet send. If #1213 UnsupportedMessageLib still reproduces, document it as a status note instead of blocking the file.
Mainnet: simulation only (quote_oft, quote_send). No funds moved by the PR.
Summary
USDT0 is live on Stellar mainnet. It is Tether's USDT delivered over LayerZero's OFT standard, and it is the first production OFT on Stellar's LayerZero endpoint. The skills do not mention USDT0, LayerZero, or OFT. An agent using
cross-chaincannot route "bridge USDT to Stellar". An agent usingassetshas no example of a live asset whose admin is a contract and that ships without astellar.toml.LayerZero coverage was pulled from #67 on 2026-08-04 because Stellar testnet could not send (
#1213 UnsupportedMessageLib). USDT0 now runs on the mainnet endpoint in production, so the follow-up promised there has a concrete anchor.Docs side is covered by stellar/stellar-docs#2795 (short link-out page). This issue is the skill side, which should carry the verification detail the docs page leaves out.
Verified on mainnet (2026-08-25, read-only RPC and Horizon)
USDT0:GATISXX6BZ6NC7IKQBY37CJD4SOZL3CYZJWXEDG6JVIY4WBS6KXJHN6QCBSJZEIO5C7KC2SF3MKSNXXJSW5G3VTNBX4ATMKUI3B2MR4JKM4R26YF(derivation verified)CBOWOLFSDM5PZXNFIVDMP5NZ7U2GSIHED6H6R446QOHF266XINKUMMF6CA3GUWLOS3QKN6WNRAELSUDSKLDTVTWEDJ3KLGAJG3SIWGA5L3KZYWGJCCQLLRE5JBAWYCW3KTWOIWLMFDUOKROQVZNSALQMGOSXNW3ERUOWTZGKCALTBA5S6GRJEHAXFP45LGGLKWWAF7HTZCPNUBUJF2HWWRRLQNV35AIVFacts an agent needs:
auth_revocableandauth_clawback_enabledset.auth_requiredandauth_immutablenot set. USDC on Stellar setsauth_revocableonly.SetOptions.home_domain, so no SEP-1stellar.toml. Any check keyed onhome_domainor[[CURRENCIES]]fails. SACname()returnsUSDT0:G...,symbol()returnsUSDT0.admin()is the adapter contract above. Its interface exposesmint,set_authorized,clawback,set_admin,upgrade, role gated. Itsowner()is another contract,CBCZ5CETG3XR5MZVDC7QBDOTIH6P7MOLUH2SSC52J3NVBYIV45D4QKR6.decimals()is 7. OFTshared_decimals()is 6,decimal_conversion_rate()is 10.quote_oftwithamount_ld10000001 returnsamount_sent_ld10000000. Dust below 6 decimals is dropped on send.oft_type()isMintBurn(adapter).token()equals the SAC.is_paused()false.default_fee_bps()null. Rate limits exist per pathway (rate_limit_config).peer(eid), do not hardcode.quote_sendreturnsMessagingFee.quote_oftreturnsOFTLimit, fee details, andOFTReceipt.Proposed changes
skills/cross-chainlayerzero.md. Mirror thecctp.mdstructure:lz_receive, mint/burn vs lock/unlock.SendParamstruct,quote_oft,quote_send,send, and CLI arg shapes. Read-only simulation examples first.SKILL.md:layerzero.md.descriptionand "Rules of thumb" mention the new rail.631db31removed it, thecustom = [receiver]footgun fix is ina79b4df). Re-verify against current crates before it ships.skills/assetsmint,set_authorized,clawback.stellar.toml; validate by issuer plus SAC derivation, not byhome_domain. Whenauth_revocableandauth_clawback_enabledare set, identify who holds the admin role before listing.stellar ledger entry fetch account,stellar contract id asset,stellar contract invoke ... -- decimals|name|symbol|admin, and the OFT readstoken,shared_decimals,oft_type,endpoint,is_paused. No keys, no signing. The docs page dropped this on purpose; the skill is the right home for it.Site
site/src/data/skills.ts: the cross-chain card reads "Cross-Chain (CCTP, Axelar)". Add LayerZero.Verification plan for the PR
wasm32v1-noneagainst current LayerZero crates.#1213 UnsupportedMessageLibstill reproduces, document it as a status note instead of blocking the file.quote_oft,quote_send). No funds moved by the PR.Out of scope
quote_send,quote_oft, andrate_limit_config.References