{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-pages/developers/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["admonition"]},"type":"markdown"},"seo":{"title":"Native Token Transfers (NTT)","siteUrl":"https://docs.xrplevm.org/","llmstxt":{"hide":false,"sections":[{"title":"Table of contents","includeFiles":["**/*"],"excludeFiles":[]}],"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"native-token-transfers-ntt","__idx":0},"children":["Native Token Transfers (NTT)"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Wormhole's ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Native Token Transfers (NTT)"]}," framework lets token issuers deploy their token natively on the XRPL EVM and other chains, with no wrapped assets involved. Your project keeps full ownership and upgrade authority of the token contracts on every chain, while NTT handles cross-chain movement of supply."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["NTT is available on XRPL EVM ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Mainnet and Testnet"]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"transfer-modes","__idx":1},"children":["Transfer Modes"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Burn-and-mint"]},": Tokens are burned on the source chain and minted on the destination, distributing total supply across chains. Best for new tokens designed to be multichain-native."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Hub-and-spoke"]},": Tokens are locked on a central \"hub\" chain and minted as equivalents on \"spoke\" chains, keeping total supply on the hub. Best for existing tokens whose contracts cannot be modified."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"key-components","__idx":2},"children":["Key Components"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["NttManager"]},": The per-chain contract that manages transfers, rate limits, and access control."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Transceivers"]},": Pluggable message transport; the default transceiver routes through the Wormhole Core Contract."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Rate limiting"]},": Configurable per chain and per period, inbound and outbound."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Global Accountant"]},": Guardian-enforced invariant that tokens burned or transferred out never exceed tokens minted."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"ntt-vs-wtt","__idx":3},"children":["NTT vs. WTT"]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":""},"children":[]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"NTT"},"children":["NTT"]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"WTT"},"children":["WTT"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Asset model"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Native token on every chain"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Wrapped representation"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Contract ownership"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Your project"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Wormhole contracts"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Token requirements"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["mint"]},"/",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["burn"]}," (burn-and-mint mode)"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Any ERC-20"]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Best for"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Stablecoins, governance tokens, institutional assets, full-control projects"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Consumer apps, games, fast managed bridging"]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["If you just need to move an existing ERC-20 across chains, use ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/pages/developers/interacting-with-evm/advanced-guides/cross-chain-transactions/wormhole/transfer-tokens"},"children":["Wrapped Token Transfers"]},". If you are launching a token that should be canonical on XRPL EVM and other chains, use NTT."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"deploy-ntt-to-xrpl-evm","__idx":4},"children":["Deploy NTT to XRPL EVM"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://wormhole.com/docs/products/token-transfers/native-token-transfers/get-started/"},"children":["NTT CLI"]}," drives the deployment. The XRPL EVM's chain name in Wormhole tooling is ",{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["XRPLEVM"]}]},"."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"1-install-the-cli","__idx":5},"children":["1. Install the CLI"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"curl -fsSL https://raw.githubusercontent.com/wormhole-foundation/native-token-transfers/main/cli/install.sh | bash\nntt --version\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"2-create-and-initialize-a-project","__idx":6},"children":["2. Create and Initialize a Project"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"ntt new my-ntt-project\ncd my-ntt-project\nntt init Mainnet   # or: ntt init Testnet\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This creates a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["deployment.json"]}," that tracks your NTT configuration across chains."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"3-deploy-to-your-chains","__idx":7},"children":["3. Deploy to Your Chains"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Export a funded private key, then add each chain. For burn-and-mint mode on XRPL EVM plus Ethereum:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"export ETH_PRIVATE_KEY=INSERT_PRIVATE_KEY\n\nntt add-chain XRPLEVM --latest --mode burning --token INSERT_YOUR_TOKEN_ADDRESS\nntt add-chain Ethereum --latest --mode burning --token INSERT_YOUR_TOKEN_ADDRESS\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For hub-and-spoke, deploy the hub chain with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["--mode locking"]}," and the spokes with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["--mode burning"]},"."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"info","name":"Simulation warning on XRPL EVM"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["On XRPL EVM the deployment simulation may fail with an ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["OwnableUnauthorizedAccount"]}," trace and the CLI will warn that \"the token contract is compiled against a different EVM version\", asking whether to proceed without simulation. Answering yes completes the on-chain deployment successfully; the subsequent ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["ntt status"]}," check confirms the configuration."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"4-grant-mint-authority","__idx":8},"children":["4. Grant Mint Authority"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["On burn-and-mint chains, your token must expose ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["mint(address,uint256)"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["burn(uint256)"]}," (see the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://wormhole.com/docs/products/token-transfers/native-token-transfers/guides/deploy-to-evm/"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["INttToken"]}," interface"]},"), and the NttManager needs minting rights:"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"cast send $TOKEN_ADDRESS \"setMinter(address)\" $NTT_MANAGER_ADDRESS \\\n  --private-key $ETH_PRIVATE_KEY --rpc-url https://rpc.xrplevm.org\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Hub chains only need a standard ERC-20."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"5-verify-and-sync-configuration","__idx":9},"children":["5. Verify and Sync Configuration"]},{"$$mdtype":"Tag","name":"CodeBlock","attributes":{"data-language":"bash","header":{"controls":{"copy":{}}},"source":"ntt status   # checks deployment.json against on-chain state\nntt pull     # syncs local config from on-chain state\nntt push     # applies local config changes (e.g. rate limits) on-chain\n","lang":"bash"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"next-steps","__idx":10},"children":["Next Steps"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://wormhole.com/docs/products/token-transfers/native-token-transfers/overview/"},"children":["NTT overview"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"https://wormhole.com/docs/products/token-transfers/native-token-transfers/guides/deploy-to-evm/"},"children":["Deploy NTT to EVM chains"]}]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/pages/developers/interacting-with-evm/advanced-guides/cross-chain-transactions/wormhole/connect-widget"},"children":["Connect Widget"]},": give users a UI for your NTT token."]}]}]},"headings":[{"value":"Native Token Transfers (NTT)","id":"native-token-transfers-ntt","depth":1},{"value":"Transfer Modes","id":"transfer-modes","depth":2},{"value":"Key Components","id":"key-components","depth":2},{"value":"NTT vs. WTT","id":"ntt-vs-wtt","depth":2},{"value":"Deploy NTT to XRPL EVM","id":"deploy-ntt-to-xrpl-evm","depth":2},{"value":"1. Install the CLI","id":"1-install-the-cli","depth":3},{"value":"2. Create and Initialize a Project","id":"2-create-and-initialize-a-project","depth":3},{"value":"3. Deploy to Your Chains","id":"3-deploy-to-your-chains","depth":3},{"value":"4. Grant Mint Authority","id":"4-grant-mint-authority","depth":3},{"value":"5. Verify and Sync Configuration","id":"5-verify-and-sync-configuration","depth":3},{"value":"Next Steps","id":"next-steps","depth":2}],"frontmatter":{"seo":{"title":"Native Token Transfers (NTT)"}},"editPage":{"to":"https://github.com/ripple/docs.xrplevm.org/tree/main/pages/developers/interacting-with-evm/advanced-guides/cross-chain-transactions/wormhole/native-token-transfers.md"},"lastModified":"2026-08-07T10:03:44.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/pages/developers/interacting-with-evm/advanced-guides/cross-chain-transactions/wormhole/native-token-transfers","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}