# Glide > Glide lets users pay for on-chain transactions with any token on any chain. These docs cover the Glide widgets and the headless TypeScript SDK (@paywithglide/glide-js). ## Docs - [Introduction](https://docs.buildwithglide.com/introduction) - [How it works](https://docs.buildwithglide.com/how-it-works) - [Supported chains & tokens](https://docs.buildwithglide.com/resources/supported-chains-and-tokens) - [Pay](https://docs.buildwithglide.com/guides/embed-glide-pay) - [Deposit / Withdrawal](https://docs.buildwithglide.com/guides/embed-glide-deposit) - [Installation](https://docs.buildwithglide.com/installation) - [Quickstart](https://docs.buildwithglide.com/quickstart) - [Sessions](https://docs.buildwithglide.com/sessions) - [Payments](https://docs.buildwithglide.com/guides/payments) - [Deposits / Withdrawals](https://docs.buildwithglide.com/guides/deposits-withdrawals) - [Custodial Withdrawals](https://docs.buildwithglide.com/guides/custodial-withdrawals) - [Testing](https://docs.buildwithglide.com/testing) - [Error handling](https://docs.buildwithglide.com/errors) - [Webhooks](https://docs.buildwithglide.com/webhooks) - [List payment options](https://docs.buildwithglide.com/typescript/list-payment-options) - [Create session](https://docs.buildwithglide.com/typescript/create-session) - [Create payment session](https://docs.buildwithglide.com/typescript/create-payment-session) - [Execute session](https://docs.buildwithglide.com/typescript/execute-session) - [Pay with signature](https://docs.buildwithglide.com/typescript/pay-with-signature) - [Pay with transfer](https://docs.buildwithglide.com/typescript/pay-with-transfer) - [Wait for transfer](https://docs.buildwithglide.com/typescript/wait-for-transfer) - [Wait for session](https://docs.buildwithglide.com/typescript/wait-for-session) - [Get session by ID](https://docs.buildwithglide.com/typescript/get-session-by-id) - [Get session by payment transaction](https://docs.buildwithglide.com/typescript/get-session-by-payment-transaction) - [List sessions](https://docs.buildwithglide.com/typescript/list-sessions) - [List supported chains](https://docs.buildwithglide.com/typescript/list-supported-chains) - [List supported currencies](https://docs.buildwithglide.com/typescript/list-supported-currencies) - [Create SVM transfer message](https://docs.buildwithglide.com/typescript/create-svm-transfer-message) - [Create widget session](https://docs.buildwithglide.com/typescript/create-widget-session) - [Get widget session](https://docs.buildwithglide.com/typescript/get-widget-session) - [Create session from widget](https://docs.buildwithglide.com/typescript/create-session-from-widget) - [Get session by widget session](https://docs.buildwithglide.com/typescript/get-session-by-widget-session) - [Media kit](https://docs.buildwithglide.com/resources/media-kit) --- # Introduction Welcome to Glide. It's the easiest way to let your users pay for on-chain transactions with any token on any chain. Now, users don't need to swap, bridge, or on-ramp before they can start making transactions. Glide supports the most popular smart contracts, tokens, and chains for maximum coverage. And, we continue to add more every week! If you would like us to add support for a smart contract, token, or chain, please get in touch. This guide will take you through the steps for adding Glide to your dapp or wallet so your users can start paying with Glide. --- # How it Works ## Table of Contents 1. [Introduction](#introduction) 2. [Transaction Modes](#transaction-modes) 3. [Protocol Goals](#protocol-goals) 4. [System Architecture](#system-architecture) 1. [Transaction Lifecycle](#transaction-lifecycle) 2. [Bridging Flow (EVM & Solana)](#bridging-flow-evm--solana) 3. [Relayer Flow (Instant Execution)](#relayer-flow-instant-execution) 5. [Instant Relayer Model](#instant-relayer-model) 6. [Role of Glide](#role-of-glide) ## Introduction Glide is a cross-chain transaction protocol that enables transparent, on-chain asset transfers and contract interactions across multiple blockchain ecosystems. It supports two primary transaction modes—relayer-based instant execution and bridging-based routes (with optional DEX swaps)—dynamically selected based on speed, cost, and liquidity. By operating fully on-chain, Glide ensures verifiable and trust-minimized execution. ## Transaction Modes 1. **Relayer-Based Transactions** — Near-instant cross-chain execution using a relayer. Best for speed. 2. **Bridging-Based Routes** — Canonical or third-party bridges plus optional DEX swaps. Slower but often lower cost. ## Protocol Goals - **Instant Execution & Flexibility** — Use a relayer for rapid execution; default to bridging or DEX swaps when necessary. - **Arbitrary Transaction Support** — Facilitate transfers, swaps, and cross-chain contract interactions. - **Cross-Chain Compatibility** — Support EVM, Solana, Bitcoin, and more. - **Security & Trustlessness** — Leverage on-chain verifiability to ensure transparency where possible. - **Optimized UX** — Provide single-click transactions. - **Scalability** — Expand multi-chain support with minimal overhead. - **On-Chain Transparency** — Keep all fund movements auditable and trackable. ## System Architecture ### Transaction Lifecycle 1. **Session Initialization** — The user specifies their payment token, the transaction details, and execution preference (fastest, cheapest, or auto). 2. **Route Determination** — Glide selects the optimal path: | Option | Speed | Cost | Capacity | Supported Chains | | ------------------------------ | ------- | ------ | --------- | ---------------- | | **Instant Relayer** | Fastest | Higher | Limited | Many | | **Canonical Bridges + DEXs** | Slowest | Lowest | Unlimited | Limited | | **Third-Party Bridges + DEXs** | Varies | Varies | Very High | Moderate | 3. **Payment Transaction** — The user performs a single-action payment transaction on the origin chain. 4. **Execution** — Glide completes final settlement on the destination chain. ### Bridging Flow (EVM & Solana) 1. **Deposit Wallet Creation** – Glide generates a dedicated deposit wallet for the user. On EVM, this wallet is created using the `create2` opcode, ensuring deterministic address generation. 2. **User Transfer** – The user transfers tokens to the deposit wallet. 3. **Automated Swap & Bridge** – If required, the wallet executes an on-chain DEX swap before bridging the resulting tokens via a canonical or third-party bridge. The deposit wallet contains predefined logic for these steps. 4. **Destination Execution** – The bridged tokens arrive at either: - **The User’s Final Wallet**, if no further operations are needed. - **An Execution Wallet**, if additional contract calls or swaps are specified. 5. **Completion** – If an execution wallet was used, it finalizes the requested logic. The user ultimately receives their assets or the resulting contract outputs in their wallet. ### Relayer Flow (Instant Execution) 1. **Origin Transfer** – The user sends tokens to Glide’s relayer address on the origin chain. 2. **Relayer Destination Liquidity** – After confirmation on the origin chain, Glide (operating as the relayer) provides assets on the destination chain. 3. **Instant Execution** – Glide executes the user’s transaction within seconds, bypassing conventional bridges. ## Instant Relayer Model Today, Glide operates its own relayer service to enable immediate cross-chain settlement, removing dependency on bridging steps. Glide maintains liquidity on destination chains, allowing prompt execution of user transactions. Dispute resolution is currently handled off-chain via Glide’s customer support. If users encounter issues, they reach out to Glide’s support, and Glide investigates and resolves the matter. ## Role of Glide Glide acts as the orchestrator and core technology provider in the cross-chain transaction process. It offers APIs for users and integrators to query fee estimates, pricing, and available routes, ensuring they can select the optimal transaction path. Glide also manages user sessions, collecting necessary transaction parameters and fulfilling them via its in-house relayer. --- # Supported Chains & Tokens Glide offers support for a wide range of chains and tokens, ensuring comprehensive coverage. See below for the list of supported chains and tokens. ## Supported Chains Chain support comes in two aspects: - **Execution** - Glide can execute transactions on the chain. - **Payment Origin** - Glide can accept payments from the chain. ### Mainnet | **Chain** | **Cross-chain ID** | **Execution** | **Payment Origin** | | :-------- | :----------------: | :-----------: | :----------------: | | Arbitrum | eip155:42161 | ✅ | ✅ | | Arbitrum Nova | eip155:42170 | ✅ | ✅ | | Assetchain | eip155:42420 | ✅ | ✅ | | Avalanche | eip155:43114 | ✅ | ✅ | | Base | eip155:8453 | ✅ | ✅ | | Berachain | eip155:80094 | ✅ | ✅ | | Bitcoin | bip122:000000000019d6689c085ae165831e93 | ✅ | ✅ | | Blast | eip155:81457 | ✅ | ✅ | | Bob | eip155:60808 | ✅ | ✅ | | Boba | eip155:288 | ✅ | ✅ | | Bsc | eip155:56 | ✅ | ✅ | | Cyber | eip155:7560 | ✅ | ✅ | | Degen | eip155:666666666 | ✅ | ✅ | | Ethereum | eip155:1 | ✅ | ✅ | | Fantom | eip155:250 | ✅ | ✅ | | Funkichain | eip155:33979 | ✅ | ✅ | | Gnosis | eip155:100 | ✅ | ✅ | | Ham | eip155:5112 | ✅ | ✅ | | Hypercore | hypercore:mainnet | ✅ | ✅ | | Hyperevm | eip155:999 | ✅ | ✅ | | Ink | eip155:57073 | ✅ | ✅ | | Lightning | bitcoin:lightning | ✅ | ✅ | | Linea | eip155:59144 | ✅ | ✅ | | Lisk | eip155:1135 | ✅ | ✅ | | Manta | eip155:169 | ✅ | ✅ | | Mantle | eip155:5000 | ✅ | ✅ | | Mint | eip155:185 | ✅ | ✅ | | Mode | eip155:34443 | ✅ | ✅ | | Monad | eip155:143 | ✅ | ✅ | | Optimism | eip155:10 | ✅ | ✅ | | Paradex | starknet:PRIVATE_SN_PARACLEAR_MAINNET | ✅ | ✅ | | Polygon | eip155:137 | ✅ | ✅ | | Polygon Zkevm | eip155:1101 | ✅ | ✅ | | Rari | eip155:1380012617 | ✅ | ✅ | | Real | eip155:111188 | ✅ | ✅ | | Redstone | eip155:690 | ✅ | ✅ | | Scroll | eip155:534352 | ✅ | ✅ | | Solana | solana:101 | ✅ | ✅ | | Sx | eip155:4162 | ✅ | ✅ | | Taiko | eip155:167000 | ✅ | ✅ | | Tron | tron:0x2b6653dc | ✅ | ✅ | | Unichain | eip155:130 | ✅ | ✅ | | World Chain | eip155:480 | ✅ | ✅ | | Zksync | eip155:324 | ✅ | ✅ | | Zora | eip155:7777777 | ✅ | ✅ | ### Testnet | **Chain** | **Cross-chain ID** | **Execution** | **Payment Origin** | | :-------- | :----------------: | :-----------: | :----------------: | | Arbitrum Sepolia | eip155:421614 | ✅ | ✅ | | Assetchain Testnet | eip155:42421 | ✅ | ✅ | | Avalanche Fuji | eip155:43113 | ✅ | ✅ | | Base Sepolia | eip155:84532 | ✅ | ✅ | | Bitcoin Testnet | bip122:000000000933ea01ad0ee984209779ba | ✅ | ✅ | | Blast Sepolia | eip155:168587773 | ✅ | ✅ | | Ethereum Sepolia | eip155:11155111 | ✅ | ✅ | | Fantom Testnet | eip155:4002 | ✅ | ✅ | | Gnosis Chiado | eip155:10200 | ✅ | ✅ | | Linea Sepolia | eip155:59141 | ✅ | ✅ | | Manta Sepolia | eip155:3441006 | ✅ | ✅ | | Mantle Sepolia | eip155:5003 | ✅ | ✅ | | Mode Testnet | eip155:919 | ✅ | ✅ | | Monad Testnet | eip155:10143 | ✅ | ✅ | | Optimism Sepolia | eip155:11155420 | ✅ | ✅ | | Polygon Amoy | eip155:80002 | ✅ | ✅ | | Solana Devnet | solana:103 | ✅ | ✅ | | Sx Toronto | eip155:79479957 | ✅ | ✅ | | Tron Shasta | tron:0x94a9059e | ✅ | ✅ | | Zora Sepolia | eip155:999999999 | ✅ | ✅ | ### Virtual Testnet :::info Virtual TestNets are simulated blockchain networks, designed to replicate real networks for various stages of dapp development. Use them as risk-free development and staging infrastructure that fully tracks real network state without the need to use real cryptocurrency or assets. ::: | **Chain** | **Cross-chain ID** | **Execution** | **Payment Origin** | | :-------- | :----------------: | :-----------: | :----------------: | | Base Virtual Testnet | eip155:454338453 | ✅ | ✅ | | Optimism Virtual Testnet | eip155:4543310 | ✅ | ✅ | We are constantly expanding the list. If you would like us to add support for a specific chain, please feel free to reach out to founders@buildwithglide.com. ## Supported Tokens ### Arbitrum | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | ETH | eip155:42161/slip44:60 | Major | | ARB | eip155:42161/erc20:0x912ce59144191c1204e64559fe8253a0e49e6548 | Major | | WETH | eip155:42161/erc20:0x82af49447d8a07e3bd95bd0d56f35241523fbab1 | Major | | PYUSD | eip155:42161/erc20:0x46850ad61c2b7d64d08c9c754f45254596696984 | Stablecoin | | USDC | eip155:42161/erc20:0xaf88d065e77c8cc2239327c5edb3a432268e5831 | Stablecoin | | USDC.e | eip155:42161/erc20:0xff970a61a04b1ca14834a43f5de4533ebddb5cc8 | Stablecoin | | USDGLO | eip155:42161/erc20:0x4f604735c1cf31399c6e711d5962b2b3e0225ad3 | Stablecoin | | USDT0 | eip155:42161/erc20:0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9 | Stablecoin | ### Arbitrum Nova | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | ETH | eip155:42170/slip44:60 | Major | ### Arbitrum Sepolia | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | ETH | eip155:421614/slip44:60 | Major | ### Assetchain | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | RWA | eip155:42420/slip44:0 | Volatile | | USDC | eip155:42420/erc20:0x2b7c1342cc64add10b2a79c8f9767d2667de64b2 | Stablecoin | | USDT | eip155:42420/erc20:0x26e490d30e73c36800788dc6d6315946c4bbea24 | Stablecoin | ### Assetchain Testnet | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | RWA | eip155:42421/slip44:0 | Volatile | ### Avalanche | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | AVAX | eip155:43114/slip44:9000 | Major | | WETH | eip155:43114/erc20:0x49d5c2bdffac6ce2bfdb6640f4f80f226bc10bab | Major | | EURC | eip155:43114/erc20:0xc891eb4cbdeff6e073e859e987815ed1505c2acd | Stablecoin | | USDC | eip155:43114/erc20:0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e | Stablecoin | ### Avalanche Fuji | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | AVAX | eip155:43113/slip44:9000 | Major | ### Bsc | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | BNB | eip155:56/slip44:0 | Major | | CNGN | eip155:56/erc20:0xa8aea66b361a8d53e8865c62d142167af28af058 | Stablecoin | | USD1 | eip155:56/erc20:0x8d0d000ee44948fc98c9b98a4fa4921476f08b0d | Stablecoin | | USDC | eip155:56/erc20:0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d | Stablecoin | | USDT | eip155:56/erc20:0x55d398326f99059ff775485246999027b3197955 | Stablecoin | ### Base | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | ETH | eip155:8453/slip44:60 | Major | | AERO | eip155:8453/erc20:0x940181a94a35a4569e4529a3cdfb74e38fd98631 | Major | | cbBTC | eip155:8453/erc20:0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf | Major | | cbXRP | eip155:8453/erc20:0xcb585250f852c6c6bf90434ab21a00f02833a4af | Major | | WETH | eip155:8453/erc20:0x4200000000000000000000000000000000000006 | Major | | CNGN | eip155:8453/erc20:0x46c85152bfe9f96829aa94755d9f915f9b10ef5f | Stablecoin | | EURC | eip155:8453/erc20:0x60a3e35cc302bfa44cb288bc5a4f316fdb1adb42 | Stablecoin | | GTT | eip155:8453/erc20:0xf706a9b5594a423012245ca46cf6092690418951 | Stablecoin | | USDC | eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913 | Stablecoin | | USDGLO | eip155:8453/erc20:0x4f604735c1cf31399c6e711d5962b2b3e0225ad3 | Stablecoin | | USDT | eip155:8453/erc20:0xfde4c96c8593536e31f229ea8f37b2ada2699bb2 | Stablecoin | | $MFER | eip155:8453/erc20:0xe3086852a4b125803c815a158249ae468a3254ca | Volatile | | 9-5 | eip155:8453/erc20:0xd727e37dccd5720d1e3849606d3ab669cb68c368 | Volatile | | BRACKY | eip155:8453/erc20:0x06f71fb90f84b35302d132322a3c90e4477333b0 | Volatile | | BUILD | eip155:8453/erc20:0x3c281a39944a2319aa653d81cfd93ca10983d234 | Volatile | | CLANKER | eip155:8453/erc20:0x1bc0c42215582d5a085795f4badbac3ff36d1bcb | Volatile | | CRASH | eip155:8453/erc20:0x621e87af48115122cd96209f820fe0445c2ea90e | Volatile | | DEGEN | eip155:8453/erc20:0x4ed4e862860bed51a9570b96d89af5e1b0efefed | Volatile | | DOG | eip155:8453/erc20:0xafb89a09d82fbde58f18ac6437b3fc81724e4df6 | Volatile | | DOGINME | eip155:8453/erc20:0x6921b130d297cc43754afba22e5eac0fbf8db75b | Volatile | | FARTHER | eip155:8453/erc20:0x8ad5b9007556749de59e088c88801a3aaa87134b | Volatile | | HIGHER | eip155:8453/erc20:0x0578d8a44db98b23bf096a382e016e29a5ce0ffe | Volatile | | HUNT | eip155:8453/erc20:0x37f0c2915cecc7e977183b8543fc0864d03e064c | Volatile | | LUM | eip155:8453/erc20:0x0fd7a301b51d0a83fcaf6718628174d527b373b6 | Volatile | | MOXIE | eip155:8453/erc20:0x8c9037d1ef5c6d1f6816278c7aaf5491d24cd527 | Volatile | | ONCHAIN | eip155:8453/erc20:0xfef2d7b013b88fec2bfe4d2fee0aeb719af73481 | Volatile | | STABLE | eip155:8453/erc20:0xc74d23c560536c7c67ad5e7a04367055e233a096 | Volatile | | TALENT | eip155:8453/erc20:0x9a33406165f562e16c3abd82fd1185482e01b49a | Volatile | | TN100X | eip155:8453/erc20:0x5b5dee44552546ecea05edea01dcd7be7aa6144a | Volatile | | TYBG | eip155:8453/erc20:0x0d97f261b1e88845184f678e2d1e7a98d9fd38de | Volatile | ### Base Sepolia | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | ETH | eip155:84532/slip44:60 | Major | | WETH | eip155:84532/erc20:0x4200000000000000000000000000000000000006 | Major | | USDC | eip155:84532/erc20:0x036cbd53842c5426634e7929541ec2318f3dcf7e | Stablecoin | ### Base Virtual Testnet | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | ETH | eip155:454338453/slip44:60 | Major | | AERO | eip155:454338453/erc20:0x940181a94a35a4569e4529a3cdfb74e38fd98631 | Major | | USDC | eip155:454338453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913 | Stablecoin | | $MFER | eip155:454338453/erc20:0xe3086852a4b125803c815a158249ae468a3254ca | Volatile | | DEGEN | eip155:454338453/erc20:0x4ed4e862860bed51a9570b96d89af5e1b0efefed | Volatile | | TYBG | eip155:454338453/erc20:0x0d97f261b1e88845184f678e2d1e7a98d9fd38de | Volatile | ### Berachain | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | BERA | eip155:80094/slip44:0 | Major | | WBTC | eip155:80094/erc20:0x0555E30da8f98308EdB960aa94C0Db47230d2B9c | Major | | HONEY | eip155:80094/erc20:0xfcbd14dc51f0a4d49d5e53c2e0950e0bc26d0dce | Stablecoin | | USD₮0 | eip155:80094/erc20:0x779ded0c9e1022225f8e0630b35a9b54be713736 | Stablecoin | | USDC.e | eip155:80094/erc20:0x549943e04f40284185054145c6e4e9568c1d3241 | Stablecoin | ### Bitcoin | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | BTC | bip122:000000000019d6689c085ae165831e93/slip44:0 | Major | ### Bitcoin Testnet | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | BTC | bip122:000000000933ea01ad0ee984209779ba/slip44:0 | Major | ### Blast | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | ETH | eip155:81457/slip44:60 | Major | | WETH | eip155:81457/erc20:0x4300000000000000000000000000000000000004 | Major | ### Blast Sepolia | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | ETH | eip155:168587773/slip44:60 | Major | ### Bob | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | ETH | eip155:60808/slip44:60 | Major | ### Boba | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | ETH | eip155:288/slip44:60 | Major | ### Cyber | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | ETH | eip155:7560/slip44:60 | Major | ### Degen | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | DEGEN | eip155:666666666/slip44:33436 | Volatile | | WDEGEN | eip155:666666666/erc20:0xeb54dacb4c2ccb64f8074eceea33b5ebb38e5387 | Volatile | ### Ethereum | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | ETH | eip155:1/slip44:60 | Major | | APE | eip155:1/erc20:0x4d224452801aced8b2f0aebe155379bb5d594381 | Major | | ARB | eip155:1/erc20:0xb50721bcf8d664c30412cfbc6cf7a15145234ad1 | Major | | cbBTC | eip155:1/erc20:0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf | Major | | cbETH | eip155:1/erc20:0xbe9895146f7af43049ca1c1ae358b0541ea49704 | Major | | ENS | eip155:1/erc20:0xc18360217d8f7ab5e7c516566761ea12ce7f9d72 | Major | | MNT | eip155:1/erc20:0x3c3a81e81dc49a522a592e7622a7e711c06bf354 | Major | | mUSD | eip155:1/erc20:0xaca92e438df0b2401ff60da7e4337b687a2435da | Major | | POL | eip155:1/erc20:0x455e53cbb86018ac2b8092fdcd39d8444affc3f6 | Major | | SAND | eip155:1/erc20:0x3845badade8e6dff049820680d1f14bd3903a5d0 | Major | | UNI | eip155:1/erc20:0x1f9840a85d5af5bf1d1762f925bdaddc4201f984 | Major | | WBTC | eip155:1/erc20:0x2260fac5e5542a773aa44fbcfedf7c193bc2c599 | Major | | CNGN | eip155:1/erc20:0x17cdb2a01e7a34cbb3dd4b83260b05d0274c8dab | Stablecoin | | DAI | eip155:1/erc20:0x6b175474e89094c44da98b954eedeac495271d0f | Stablecoin | | PYUSD | eip155:1/erc20:0x6c3ea9036406852006290770bedfcaba0e23a0e8 | Stablecoin | | USD1 | eip155:1/erc20:0x8d0d000ee44948fc98c9b98a4fa4921476f08b0d | Stablecoin | | USDC | eip155:1/erc20:0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48 | Stablecoin | | USDGLO | eip155:1/erc20:0x4f604735c1cf31399c6e711d5962b2b3e0225ad3 | Stablecoin | | USDT | eip155:1/erc20:0xdac17f958d2ee523a2206206994597c13d831ec7 | Stablecoin | | 1INCH | eip155:1/erc20:0x111111111117dc0aa78b770fa6a738034120c302 | Volatile | | aAAVE | eip155:1/erc20:0xba3d9687cf50fe253cd2e1cfeede1d6787344ed5 | Volatile | | AGIX | eip155:1/erc20:0x5b7533812759b45c2b44c19e320ba2cd2681b542 | Volatile | | ANT | eip155:1/erc20:0xa117000000f279d81a1d3cc75430faa017fa5a2e | Volatile | | BAL | eip155:1/erc20:0xba100000625a3754423978a60c9317c58a424e3d | Volatile | | BAND | eip155:1/erc20:0xba11d00c5f74255f56a5e366f4f77f5a186d7f55 | Volatile | | BAT | eip155:1/erc20:0x0d8775f648430679a709e98d2b0cb6250d2887ef | Volatile | | BIT | eip155:1/erc20:0x1a4b46696b2bb4794eb3d4c26f1c55f9170fa4c5 | Volatile | | BLUR | eip155:1/erc20:0x5283d291dbcf85356a21ba090e6db59121208b44 | Volatile | | BNB | eip155:1/erc20:0xb8c77482e45f1f44de1745f52c74426c631bdd52 | Volatile | | BTT | eip155:1/erc20:0xc669928185dbce49d2230cc9b0979be6dc797957 | Volatile | | BUSD | eip155:1/erc20:0x4fabb145d64652a948d72533023f6e7a623c7c53 | Volatile | | Cake | eip155:1/erc20:0x152649ea73beab28c5b49b26eb48f7ead6d4c898 | Volatile | | CDAI | eip155:1/erc20:0x5d3a536e4d6dbd6114cc1ead35777bab948e3643 | Volatile | | CETH | eip155:1/erc20:0x4ddc2d193948926d02f9b1fe9e1daa0718270ed5 | Volatile | | CHZ | eip155:1/erc20:0x3506424f91fd33084466f402d5d97f05f8e3b4af | Volatile | | COMP | eip155:1/erc20:0xc00e94cb662c3520282e6f5717214004a7f26888 | Volatile | | CRO | eip155:1/erc20:0xa0b73e1ff0b80914ab6fe0444e65848c4c34450b | Volatile | | CUSDC | eip155:1/erc20:0x39aa39c021dfbae8fac545936693ac917d5e7563 | Volatile | | CUSDT | eip155:1/erc20:0xf650c3d88d12db855b8bf7d11be6c55a4e07dcc9 | Volatile | | CVX | eip155:1/erc20:0x4e3fbd56cd56c3e72c1403e103b45db9da5b9d2b | Volatile | | DFI | eip155:1/erc20:0x8fc8f8269ebca376d046ce292dc7eac40c8d358a | Volatile | | DYDX | eip155:1/erc20:0x92d6c1e31e14520e676a687f0a93788b716beff5 | Volatile | | ENJ | eip155:1/erc20:0xf629cbd94d3791c9250152bd8dfbdf380e2a3b9c | Volatile | | EURT | eip155:1/erc20:0xc581b735a1688071a1746c968e0798d642ede491 | Volatile | | FET | eip155:1/erc20:0xaea46a60368a7bd060eec7df8cba43b7ef41ad85 | Volatile | | FLOKI | eip155:1/erc20:0xcf0c122c6b73ff809c693db761e7baebe62b6a2e | Volatile | | FRAX | eip155:1/erc20:0x853d955acef822db058eb8505911ed77f175b99e | Volatile | | FRXETH | eip155:1/erc20:0x5e8422345238f34275888049021821e8e08caa1f | Volatile | | FTM | eip155:1/erc20:0x4e15361fd6b4bb609fa63c81a2be19d873717870 | Volatile | | FXS | eip155:1/erc20:0x3432b6a60d23ca0dfca7761b7ab56459d9c964d0 | Volatile | | GLM | eip155:1/erc20:0x7dd9c5cba05e151c895fde1cf355c9a1d5da6429 | Volatile | | GMT | eip155:1/erc20:0xe3c408bd53c31c085a1746af401a4042954ff740 | Volatile | | GNO | eip155:1/erc20:0x6810e776880c02933d47db1b9fc05908e5386b96 | Volatile | | GRT | eip155:1/erc20:0xc944e90c64b2c07662a292be6244bdf05cda44a7 | Volatile | | GUSD | eip155:1/erc20:0x056fd409e1d7a124bd7017459dfea2f387b6d5cd | Volatile | | HBTC | eip155:1/erc20:0x0316eb71485b0ab14103307bf65a021042c6d380 | Volatile | | HEX | eip155:1/erc20:0x2b591e99afe9f32eaa6214f7b7629768c40eeb39 | Volatile | | HOT | eip155:1/erc20:0x6c6ee5e31d828de241282b9606c8e98ea48526e2 | Volatile | | HT | eip155:1/erc20:0x6f259637dcd74c767781e37bc6133cd6a68aa161 | Volatile | | HUNT | eip155:1/erc20:0x9aab071b4129b083b01cb5a0cb513ce7eca26fa5 | Volatile | | ILV | eip155:1/erc20:0x767fe9edc9e0df98e07454847909b5e959d7ca0e | Volatile | | IMX | eip155:1/erc20:0xf57e7e7c23978c3caec3c3548e3d615c346e79ff | Volatile | | INJ | eip155:1/erc20:0xe28b3b32b6c345a34ff64674606124dd5aceca30 | Volatile | | IOST | eip155:1/erc20:0xfa1a856cfa3409cfa145fa4e20eb270df3eb21ab | Volatile | | IOTX | eip155:1/erc20:0x6fb3e0a217407efff7ca062d46c26e5d60a14d69 | Volatile | | KCS | eip155:1/erc20:0xf34960d9d60be18cc1d5afc1a6f012a723a28811 | Volatile | | LDO | eip155:1/erc20:0x5a98fcbea516cf06857215779fd812ca3bef1b32 | Volatile | | LEO | eip155:1/erc20:0x2af5d2ad76741191d15dfe7bf6ac92d4bd912ca3 | Volatile | | LINK | eip155:1/erc20:0x514910771af9ca656af840dff83e8264ecf986ca | Volatile | | LRC | eip155:1/erc20:0xbbbbca6a901c926f240b89eacb641d8aec7aeafd | Volatile | | MANA | eip155:1/erc20:0x0f5d2fb29fb7d3cfee444a200298f468908cc942 | Volatile | | MASK | eip155:1/erc20:0x69af81e73a73b40adf4f3d4223cd9b1ece623074 | Volatile | | MATIC | eip155:1/erc20:0x7d1afa7b718fb893db30a3abc0cfc608aacfebb0 | Volatile | | MCO | eip155:1/erc20:0xb63b606ac810a52cca15e44bb630fd42d8d1d83d | Volatile | | MKR | eip155:1/erc20:0x9f8f72aa9304c8b593d555f12ef6589cc3a579a2 | Volatile | | MX | eip155:1/erc20:0x11eef04c884e24d9b7b4760e7476d06ddf797f36 | Volatile | | NEAR | eip155:1/erc20:0x85f17cf997934a597031b2e18a9ab6ebd4b9f6a4 | Volatile | | NEXO | eip155:1/erc20:0xb62132e35a6c13ee1ee0f84dc5d40bad8d815206 | Volatile | | NXM | eip155:1/erc20:0xd7c49cee7e9188cca6ad8ff264c1da2e69d4cf3b | Volatile | | OCEAN | eip155:1/erc20:0x967da4048cd07ab37855c090aaf366e4ce1b9f48 | Volatile | | OHM | eip155:1/erc20:0x64aa3364f17a4d01c6f1751fd97c2bd3d7e7f1d5 | Volatile | | OKB | eip155:1/erc20:0x75231f58b43240c9718dd58b4967c5114342a86c | Volatile | | ONE | eip155:1/erc20:0x799a4202c12ca952cb311598a024c80ed371a41e | Volatile | | PAXG | eip155:1/erc20:0x45804880de22913dafe09f4980848ece6ecbaf78 | Volatile | | PEPE | eip155:1/erc20:0x6982508145454ce325ddbe47a25d4ec3d2311933 | Volatile | | QNT | eip155:1/erc20:0x4a220e6096b25eadb88358cb44068a3248254675 | Volatile | | RAILS | eip155:1/erc20:0x19645c760affdd9cac0b805a80de227cbe506538 | Volatile | | RETH | eip155:1/erc20:0xae78736cd615f374d3085123a210448e74fc6393 | Volatile | | RNDR | eip155:1/erc20:0x6de037ef9ad2725eb40118bb1702ebb27e4aeb24 | Volatile | | RPL | eip155:1/erc20:0xd33526068d116ce69f19a9ee46f0bd304f21a51f | Volatile | | SFRXETH | eip155:1/erc20:0xac3e018457b222d93114458476f3e3416abbe38f | Volatile | | SHIB | eip155:1/erc20:0x95ad61b0a150d79219dcf64e1e6cc01f0b64c4ce | Volatile | | SNX | eip155:1/erc20:0xc011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f | Volatile | | stETH | eip155:1/erc20:0xae7ab96520de3a18e5e111b5eaab095312d7fe84 | Volatile | | stkAAVE | eip155:1/erc20:0x4da27a545c0c5b758a6ba100e3a049001de870f5 | Volatile | | SXP | eip155:1/erc20:0x8ce9137d39326ad0cd6491fb5cc0cba0e089b6a9 | Volatile | | THETA | eip155:1/erc20:0x3883f5e181fccaf8410fa61e12b59bad963fb645 | Volatile | | TONCOIN | eip155:1/erc20:0x582d872a1b094fc48f5de31d3b73f2d9be47def1 | Volatile | | TRX | eip155:1/erc20:0x50327c6c5a14dcade707abad2e27eb517df87ab5 | Volatile | | TUSD | eip155:1/erc20:0x0000000000085d4780b73119b644ae5ecd22b376 | Volatile | | USDD | eip155:1/erc20:0x0c10bf8fcb7bf5412187a595ab97a3609160b5c6 | Volatile | | USDP | eip155:1/erc20:0x8e870d67f660d95d5be530380d0ec0bd388289e1 | Volatile | | VEN | eip155:1/erc20:0xd850942ef8811f2a866692a623011bde52a462c1 | Volatile | | WAX | eip155:1/erc20:0x39bb259f66e1c59d5abef88375979b4d20d98022 | Volatile | | WCELO | eip155:1/erc20:0xe452e6ea2ddeb012e20db73bf5d3863a3ac8d77a | Volatile | | wMANA | eip155:1/erc20:0xfd09cf7cfffa9932e33668311c4777cb9db3c9be | Volatile | | WOO | eip155:1/erc20:0x4691937a7508860f876c9c0a2a617e7d9e945d4b | Volatile | | WQTUM | eip155:1/erc20:0x3103df8f05c4d8af16fd22ae63e406b97fec6938 | Volatile | | XAUT | eip155:1/erc20:0x68749665ff8d2d112fa859aa293f07a622782f38 | Volatile | | YFI | eip155:1/erc20:0x0bc529c00c6401aef6d220be8c6ea1667f6ad93e | Volatile | | ZIL | eip155:1/erc20:0x05f4a42e251f2d52b8ed15e9fedaacfcef1fad27 | Volatile | | ZRX | eip155:1/erc20:0xe41d2489571d322189246dafa5ebde1f4699f498 | Volatile | ### Ethereum Sepolia | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | ETH | eip155:11155111/slip44:60 | Major | | USDC | eip155:11155111/erc20:0x1c7d4b196cb0c7b01d743fbc6116a902379c7238 | Stablecoin | ### Fantom | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | FTM | eip155:250/slip44:1007 | Major | ### Fantom Testnet | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | FTM | eip155:4002/slip44:1007 | Major | ### Funkichain | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | ETH | eip155:33979/slip44:60 | Major | ### Gnosis | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | XDAI | eip155:100/slip44:700 | Stablecoin | ### Gnosis Chiado | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | XDAI | eip155:10200/slip44:700 | Stablecoin | ### Ham | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | ETH | eip155:5112/slip44:60 | Major | | TN100X | eip155:5112/erc20:0xe8dd44d0791b73afe9066c3a77721f42d0844beb | Volatile | ### Hypercore | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | HYPE | hypercore:mainnet/slip44:0 | Volatile | | USDC | hypercore:mainnet/erc20:0x2000000000000000000000000000000000000000 | Stablecoin | | USDH | hypercore:mainnet/erc20:0x2000000000000000000000000000000000000001 | Stablecoin | ### Hyperevm | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | HYPE | eip155:999/slip44:0 | Volatile | | USDC | eip155:999/erc20:0xb88339CB7199b77E23DB6E890353E22632Ba630f | Stablecoin | ### Ink | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | ETH | eip155:57073/slip44:60 | Major | | USD₮0 | eip155:57073/erc20:0x0200c29006150606b650577bbe7b6248f58470c1 | Stablecoin | | USDC.e | eip155:57073/erc20:0xf1815bd50389c46847f0bda824ec8da914045d14 | Stablecoin | ### Lightning | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | BTC | bitcoin:lightning/slip44:0 | Major | ### Linea | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | ETH | eip155:59144/slip44:60 | Major | ### Linea Sepolia | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | ETH | eip155:59141/slip44:60 | Major | ### Lisk | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | ETH | eip155:1135/slip44:60 | Major | ### Manta | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | ETH | eip155:169/slip44:60 | Major | | STONE | eip155:169/erc20:0xec901da9c68e90798bbbb74c11406a32a70652c3 | Volatile | | wUSDM | eip155:169/erc20:0xbdad407f77f44f7da6684b416b1951eca461fb07 | Volatile | ### Manta Sepolia | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | ETH | eip155:3441006/slip44:60 | Volatile | ### Mantle | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | MNT | eip155:5000/slip44:626853 | Major | ### Mantle Sepolia | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | MNT | eip155:5003/slip44:626853 | Major | ### Mint | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | ETH | eip155:185/slip44:60 | Major | ### Mode | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | ETH | eip155:34443/slip44:60 | Major | ### Mode Testnet | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | ETH | eip155:919/slip44:60 | Major | ### Monad | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | MON | eip155:143/slip44:0 | Volatile | ### Monad Testnet | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | MON | eip155:10143/slip44:0 | Volatile | ### Optimism | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | ETH | eip155:10/slip44:60 | Major | | OP | eip155:10/erc20:0x4200000000000000000000000000000000000042 | Major | | WETH | eip155:10/erc20:0x4200000000000000000000000000000000000006 | Major | | DAI | eip155:10/erc20:0xda10009cbd5d07dd0cecc66161fc93d7c9000da1 | Stablecoin | | LUSD | eip155:10/erc20:0xc40f949f8a4e094d1b49a23ea9241d289b7b2819 | Stablecoin | | USD₮0 | eip155:10/erc20:0x01bff41798a0bcf287b996046ca68b395dbc1071 | Stablecoin | | USDC | eip155:10/erc20:0x0b2c639c533813f4aa9d7837caf62653d097ff85 | Stablecoin | | USDC.e | eip155:10/erc20:0x7f5c764cbc14f9669b88837ca1490cca17c31607 | Stablecoin | | USDGLO | eip155:10/erc20:0x4f604735c1cf31399c6e711d5962b2b3e0225ad3 | Stablecoin | | USDT | eip155:10/erc20:0x94b008aa00579c1307b0ef2c499ad98a8ce58e58 | Stablecoin | | MASKS | eip155:10/erc20:0x3925f9820c312d968644f12ebd314c13558a7c05 | Volatile | | POOL | eip155:10/erc20:0x395ae52bb17aef68c2888d941736a71dc6d4e125 | Volatile | ### Optimism Sepolia | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | ETH | eip155:11155420/slip44:60 | Major | ### Optimism Virtual Testnet | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | ETH | eip155:4543310/slip44:60 | Major | | USDC | eip155:4543310/erc20:0x0b2c639c533813f4aa9d7837caf62653d097ff85 | Stablecoin | ### Paradex | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | FUEL | starknet:PRIVATE_SN_PARACLEAR_MAINNET/erc20:0x047adc7dee88eec362d71a52c25d40559a921434b2d90e75b6a4a6e4e9fb9ab1 | Volatile | | USDC | starknet:PRIVATE_SN_PARACLEAR_MAINNET/erc20:0x07348407ebad690fec0cc8597e87dc16ef7b269a655ff72587dafff83d462be2 | Volatile | ### Polygon | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | POL | eip155:137/slip44:966 | Major | | AAVE | eip155:137/erc20:0xd6df932a45c0f255f85145f286ea0b292b21c90b | Major | | SAND | eip155:137/erc20:0xbbba073c31bf03b8acf7c28ef0738decf3695683 | Major | | UNI | eip155:137/erc20:0xb33eaad8d922b1083446dc23f610c2567fb5180f | Major | | WBTC | eip155:137/erc20:0x1bfd67037b42cf73acf2047067bd4f2c47d9bfd6 | Major | | WETH | eip155:137/erc20:0x7ceb23fd6bc0add59e62ac25578270cff1b9f619 | Major | | CNGN | eip155:137/erc20:0x52828daa48c1a9a06f37500882b42daf0be04c3b | Stablecoin | | DAI | eip155:137/erc20:0x8f3cf7ad23cd3cadbd9735aff958023239c6a063 | Stablecoin | | pUSD | eip155:137/erc20:0xc011a7e12a19f7b1f670d46f03b03f3342e82dfb | Stablecoin | | USDC | eip155:137/erc20:0x3c499c542cef5e3811e1192ce70d8cc03d5c3359 | Stablecoin | | USDC.e | eip155:137/erc20:0x2791bca1f2de4661ed88a30c99a7a9449aa84174 | Stablecoin | | USDGLO | eip155:137/erc20:0x4f604735c1cf31399c6e711d5962b2b3e0225ad3 | Stablecoin | | USDT0 | eip155:137/erc20:0xc2132d05d31c914a87c6611c10748aeb04b58e8f | Stablecoin | | 1INCH | eip155:137/erc20:0x9c2c5fd7b07e95ee044ddeba0e97a665f142394f | Volatile | | AGIX | eip155:137/erc20:0x190eb8a183d22a4bdf278c6791b152228857c033 | Volatile | | AMP | eip155:137/erc20:0x0621d647cecbfb64b79e44302c1933cb4f27054d | Volatile | | ANKR | eip155:137/erc20:0x101a023270368c0d50bffb62780f4afd4ea79c35 | Volatile | | ankrETH | eip155:137/erc20:0xc4e82ba0fe6763cbe5e9cbca0ba7cbd6f91c6018 | Volatile | | APE | eip155:137/erc20:0xb7b31a6bc18e48888545ce79e83e06003be70930 | Volatile | | AVAX | eip155:137/erc20:0x2c89bbc92bd86f8075d1decc58c7f4e0107f286b | Volatile | | AXL | eip155:137/erc20:0x6e4e624106cb12e168e6533f8ec7c82263358940 | Volatile | | BAL | eip155:137/erc20:0x9a71012b13ca4d3d0cdc72a177df3ef03b0e76a3 | Volatile | | BAND | eip155:137/erc20:0xa8b1e0764f85f53dfe21760e8afe5446d82606ac | Volatile | | BAT | eip155:137/erc20:0x3cef98bb43d732e2f285ee605a8158cde967d219 | Volatile | | BEPRO | eip155:137/erc20:0x07cc1cc3628cc1615120df781ef9fc8ec2feae09 | Volatile | | BNB | eip155:137/erc20:0x3ba4c387f786bfee076a58914f5bd38d668b42c3 | Volatile | | BNT | eip155:137/erc20:0xc26d47d5c33ac71ac5cf9f776d63ba292a4f7842 | Volatile | | BOB | eip155:137/erc20:0xb0b195aefa3650a6908f15cdac7d92f8a5791b0b | Volatile | | BUSD | eip155:137/erc20:0xdab529f40e671a1d4bf91361c21bf9f0c9712ab7 | Volatile | | C98 | eip155:137/erc20:0x77f56cf9365955486b12c4816992388ee8606f0e | Volatile | | CEL | eip155:137/erc20:0xd85d1e945766fea5eda9103f918bd915fbca63e6 | Volatile | | CHSB | eip155:137/erc20:0x67ce67ec4fcd4aca0fcb738dd080b2a21ff69d75 | Volatile | | CHZ | eip155:137/erc20:0xf1938ce12400f9a761084e7a80d37e732a4da056 | Volatile | | COMP | eip155:137/erc20:0x8505b9d2254a7ae468c0e9dd10ccea3a837aef5c | Volatile | | CRO | eip155:137/erc20:0xada58df0f643d959c2a47c9d4d4c1a4defe3f11c | Volatile | | CRV | eip155:137/erc20:0x172370d5cd63279efa6d502dab29171933a610af | Volatile | | ELON | eip155:137/erc20:0xe0339c80ffde91f3e20494df88d4206d86024cdf | Volatile | | ENJ | eip155:137/erc20:0x7ec26842f195c852fa843bb9f6d8b583a274a157 | Volatile | | EURS | eip155:137/erc20:0xe111178a87a3bff0c8d18decba5798827539ae99 | Volatile | | EWTB | eip155:137/erc20:0x43e4b063f96c33f0433863a927f5bad34bb4b03d | Volatile | | FET | eip155:137/erc20:0x7583feddbcefa813dc18259940f76a02710a8905 | Volatile | | FRAX | eip155:137/erc20:0x45c32fa6df82ead1e2ef74d17b76547eddfaff89 | Volatile | | FRXETH | eip155:137/erc20:0xee327f889d5947c1dc1934bb208a1e792f953e96 | Volatile | | FTM | eip155:137/erc20:0xc9c1c1c20b3658f8787cc2fd702267791f224ce1 | Volatile | | FXS | eip155:137/erc20:0x1a3acf6d19267e2d3e7f898f42803e90c9219062 | Volatile | | GHST | eip155:137/erc20:0x385eeac5cb85a38a9a07a70c73e0a3271cfb54a7 | Volatile | | GLM | eip155:137/erc20:0x0b220b82f3ea3b7f6d9a1d8ab58930c064a2b5bf | Volatile | | GNO | eip155:137/erc20:0x5ffd62d3c3ee2e81c00a7b9079fb248e7df024a8 | Volatile | | GNS | eip155:137/erc20:0xe5417af564e4bfda1c483642db72007871397896 | Volatile | | GRT | eip155:137/erc20:0x5fe2b58c013d7601147dcdd68c143a77499f5531 | Volatile | | GTC | eip155:137/erc20:0xdb95f9188479575f3f718a245eca1b3bf74567ec | Volatile | | GUSD | eip155:137/erc20:0xc8a94a3d3d2dabc3c1caffffdca6a7543c3e3e65 | Volatile | | HOT | eip155:137/erc20:0x0c51f415cf478f8d08c246a6c6ee180c5dc3a012 | Volatile | | HT | eip155:137/erc20:0xfad65eb62a97ff5ed91b23afd039956aaca6e93b | Volatile | | INJ | eip155:137/erc20:0x4e8dc2149eac3f3def36b1c281ea466338249371 | Volatile | | IOTX | eip155:137/erc20:0xf6372cdb9c1d3674e83842e3800f2a62ac9f3c66 | Volatile | | IQ | eip155:137/erc20:0xb9638272ad6998708de56bbc0a290a1de534a578 | Volatile | | KEEP | eip155:137/erc20:0x42f37a1296b2981f7c3caced84c5096b2eb0c72c | Volatile | | KNC | eip155:137/erc20:0x1c954e8fe737f99f68fa1ccda3e51ebdb291948c | Volatile | | LDO | eip155:137/erc20:0xc3c7d422809852031b44ab29eec9f1eff2a58756 | Volatile | | LEO | eip155:137/erc20:0x06d02e9d62a13fc76bb229373fb3bbbd1101d2fc | Volatile | | LINK | eip155:137/erc20:0xb0897686c545045afc77cf20ec7a532e3120e0f1 | Volatile | | LINK | eip155:137/erc20:0x53e0bca35ec356bd5dddfebbd1fc0fd03fabad39 | Volatile | | LPT | eip155:137/erc20:0x3962f4a0a0051dcce0be73a7e09cef5756736712 | Volatile | | LRC | eip155:137/erc20:0x84e1670f61347cdaed56dcc736fb990fbb47ddc1 | Volatile | | MANA | eip155:137/erc20:0xa1c57f48f0deb89f569dfbe6e2b7f46d33606fd4 | Volatile | | MASK | eip155:137/erc20:0x2b9e7ccdf0f4e5b24757c1e1a80e311e34cb10c7 | Volatile | | MATICX | eip155:137/erc20:0xfa68fb4628dff1028cfec22b4162fccd0d45efb6 | Volatile | | MKR | eip155:137/erc20:0x6f7c932e7684666c9fd1d44527765433e01ff61d | Volatile | | mOCEAN | eip155:137/erc20:0x282d8efce846a88b159800bd4130ad77443fa1a1 | Volatile | | NEST | eip155:137/erc20:0x98f8669f6481ebb341b522fcd3663f79a3d1a6a7 | Volatile | | NEXO | eip155:137/erc20:0x41b3966b4ff7b427969ddf5da3627d6aeae9a48e | Volatile | | OMG | eip155:137/erc20:0x62414d03084eeb269e18c970a21f45d2967f0170 | Volatile | | ORBS | eip155:137/erc20:0x614389eaae0a6821dc49062d56bda3d9d45fa2ff | Volatile | | PAX | eip155:137/erc20:0x6f3b3286fd86d8b47ec737ceb3d0d354cc657b3e | Volatile | | PAXG | eip155:137/erc20:0x553d3d295e0f695b9228246232edf400ed3560b5 | Volatile | | pBORA | eip155:137/erc20:0x0ef39e52704ad52e2882bbfa6781167e1b6c4510 | Volatile | | POLY | eip155:137/erc20:0xcb059c5573646047d6d88dddb87b745c18161d3b | Volatile | | POND | eip155:137/erc20:0x73580a2416a57f1c4b6391dba688a9e4f7dbece0 | Volatile | | POWR | eip155:137/erc20:0x0aab8dc887d34f00d50e19aee48371a941390d14 | Volatile | | PYR | eip155:137/erc20:0x430ef9263e76dae63c84292c3409d61c598e9682 | Volatile | | REQ | eip155:137/erc20:0xb25e20de2f2ebb4cffd4d16a55c7b395e8a94762 | Volatile | | RLC | eip155:137/erc20:0xbe662058e00849c3eef2ac9664f37fefdf2cdbfe | Volatile | | RNDR | eip155:137/erc20:0x61299774020da444af134c82fa83e3810b309991 | Volatile | | RPL | eip155:137/erc20:0x7205705771547cf79201111b4bd8aaf29467b9ec | Volatile | | SFRXETH | eip155:137/erc20:0x6d1fdbb266fcc09a16a22016369210a15bb95761 | Volatile | | SHIB | eip155:137/erc20:0x6f8a06447ff6fcf75d803135a7de15ce88c1d4ec | Volatile | | SNX | eip155:137/erc20:0x50b728d8d964fd00c2d0aad81718b71311fef68a | Volatile | | STG | eip155:137/erc20:0x2f6f07cdcf3588944bf4c42ac74ff24bf56e7590 | Volatile | | SUSHI | eip155:137/erc20:0x0b3f868e0be5597d5db7feb59e1cadbb0fdda50a | Volatile | | SX | eip155:137/erc20:0x840195888db4d6a99ed9f73fcd3b225bb3cb1a79 | Volatile | | SXP | eip155:137/erc20:0x6abb753c1893194de4a83c6e8b4eadfc105fd5f5 | Volatile | | SYN | eip155:137/erc20:0xf8f9efc0db77d8881500bb06ff5d6abc3070e695 | Volatile | | TEL | eip155:137/erc20:0xdf7837de1f2fa4631d716cf2502f8b230f1dcc32 | Volatile | | THETA | eip155:137/erc20:0xb46e0ae620efd98516f49bb00263317096c114b2 | Volatile | | TUSD | eip155:137/erc20:0x2e1ad108ff1d8c782fcbbb89aad783ac49586756 | Volatile | | ULT | eip155:137/erc20:0xf0059cc2b3e980065a906940fbce5f9db7ae40a7 | Volatile | | UMA | eip155:137/erc20:0x3066818837c5e6ed6601bd5a91b0762877a6b731 | Volatile | | USDD | eip155:137/erc20:0xffa4d863c96e743a2e1513824ea006b8d0353c57 | Volatile | | UST | eip155:137/erc20:0x692597b009d13c4049a947cab2239b7d6517875f | Volatile | | W$C | eip155:137/erc20:0x77a6f2e9a9e44fd5d5c3f9be9e52831fc1c3c0a0 | Volatile | | WOO | eip155:137/erc20:0x1b815d120b3ef02039ee11dc2d33de7aa4a8c603 | Volatile | | XSGD | eip155:137/erc20:0xdc3326e71d45186f113a2f448984ca0e8d201995 | Volatile | | YFI | eip155:137/erc20:0xda537104d6a5edd53c6fbba9a898708e465260b6 | Volatile | | ZRX | eip155:137/erc20:0x5559edb74751a0ede9dea4dc23aee72cca6be3d5 | Volatile | ### Polygon Amoy | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | POL | eip155:80002/slip44:966 | Major | | USDC | eip155:80002/erc20:0x41e94eb019c0762f9bfcf9fb1e58725bfb0e7582 | Stablecoin | ### Polygon Zkevm | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | ETH | eip155:1101/slip44:60 | Major | ### Rari | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | ETH | eip155:1380012617/slip44:60 | Major | ### Real | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | reETH | eip155:111188/slip44:0 | Volatile | ### Redstone | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | ETH | eip155:690/slip44:60 | Major | ### Sx | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | SX | eip155:4162/slip44:0 | Volatile | | USDC | eip155:4162/erc20:0x6629ce1cf35cc1329ebb4f63202f3f197b3f050b | Stablecoin | ### Sx Toronto | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | SX | eip155:79479957/slip44:0 | Volatile | | USDC | eip155:79479957/erc20:0x1bc6326ea6af2ab8e4b6bc83418044b1923b2956 | Stablecoin | ### Scroll | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | ETH | eip155:534352/slip44:60 | Major | ### Solana | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | SOL | solana:101/erc20:So11111111111111111111111111111111111111112 | Major | | PYUSD | solana:101/erc20:2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo | Stablecoin | | USDC | solana:101/erc20:EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v | Stablecoin | | USDT | solana:101/erc20:Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB | Stablecoin | ### Solana Devnet | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | SOL | solana:103/slip44:0 | Major | | USDC | solana:103/erc20:4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU | Stablecoin | ### Taiko | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | ETH | eip155:167000/slip44:60 | Major | ### Tron | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | TRX | tron:0x2b6653dc/slip44:0 | Major | | USD1 | tron:0x2b6653dc/erc20:TPFqcBAaaUMCSVRCqPaQ9QnzKhmuoLR6Rc | Stablecoin | | USDT | tron:0x2b6653dc/erc20:TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t | Stablecoin | ### Unichain | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | ETH | eip155:130/slip44:60 | Major | | USDC | eip155:130/erc20:0x078d782b760474a361dda0af3839290b0ef57ad6 | Stablecoin | ### World Chain | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | ETH | eip155:480/slip44:60 | Major | | WLD | eip155:480/erc20:0x2cfc85d8e48f8eab294be644d9e25c3030863003 | Major | | USDC | eip155:480/erc20:0x79a02482a880bce3f13e09da970dc34db4cd24d1 | Stablecoin | ### Zksync | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | ETH | eip155:324/slip44:60 | Major | ### Zora | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | ETH | eip155:7777777/slip44:60 | Major | | ENJOY | eip155:7777777/erc20:0xa6b280b42cb0b7c4a4f789ec6ccc3a7609a1bc39 | Volatile | | IMAGINE | eip155:7777777/erc20:0x078540eecc8b6d89949c9c7d5e8e91eab64f6696 | Volatile | ### Zora Sepolia | **Token** | **Cross-chain ID** | **Category** | | :-------- | :----------------- | :----------- | | ETH | eip155:999999999/slip44:60 | Major | We are constantly expanding the list. If you would like us to add support for a specific token, please feel free to reach out to founders@buildwithglide.com. --- # Embed Glide Pay [Use pre-built React components in your app] Let users pay with hundreds of tokens, their exchange balance, or fiat using Glide's pre-built React components. You can customize the components to match your app's design and branding. ## Setup Install the Glide React SDK on your frontend app :::code-group ```sh [npm] npm install @paywithglide/glide-react ``` ```sh [yarn] yarn add @paywithglide/glide-react ``` ```sh [bun] bun install @paywithglide/glide-react ``` ::: If you are using NodeJS / Typescript on the backend, install and configure the Glide JS SDK. [See instructions here](/installation) ## Widget Session On the backend, create a widget session with the mode and amount pre-configured: :::code-group ```ts [NodeJS] const { id } = await createWidgetSession(config, { mode: 'pay', amount: '5', // The amount is denominated in your preferred currency configured in the Glide Dashboard }); console.log("Widget Session created with id: " + id); ``` ```sh [curl] curl --request POST \ --url https://api.paywithglide.xyz/widget/create-session \ --header 'X-Glide-Project-ID: ' \ --header 'Authorization: Bearer wkm_xxx' \ --header 'Content-Type: application/json' \ --data '{ "mode": "pay", "amount": "5" }' ``` ::: Once the session is created, pass the session ID to the frontend. See the [create widget session](/typescript/create-widget-session) reference for all the options you can configure server-side, including commission rates. ## Payment Widget The Glide React SDK comes with a `useGlidePay` hook that you can use to open the pay modal. ```tsx const { openGlidePay } = useGlidePay({ /* Your App ID, provided by the Glide Team */ app: "my-app", /* The Widget Session ID from the previous step */ sessionId, }); ``` ### Open the Pay Modal You can now call the `openGlidePay` function to open the pay modal. ```tsx ``` ### That's it! Your users can now pay using any token, their exchange balance, or fiat using Glide's pre-built React components. ## Optional - Wallet Provider If users have already connected a wallet in your app, you can pass the wallet provider to the `useGlidePay` hook. This will allow users to pay using their connected wallet. ```tsx const { openGlidePay } = useGlidePay({ ... /* The walletProvider object acts as a bridge between your app * and the embedded pay modal. * This bridge is used to send transactions to the user's * connected wallet, along with other wallet-related operations. */ walletProvider: { /* A list of chain ids that the user's connected wallet supports */ availableChainIds: [1, ...], /* The current chain id that the user's connected wallet is on */ currentChainId: 1, /* The user's connected wallet address */ address: "0x0...", switchChainAsync: async ({chainId}) => { // Switch the user's connected wallet to the new chain }, sendTransactionAsync: async (tx) => { // Send the transaction to the user's connected wallet // Return the transaction hash }, }, }); ``` :::tip[Using wagmi?] If you're using wagmi, use the following code snippet: ```ts const currentChainId = useChainId(); const { address } = useAccount(); const { switchChainAsync } = useSwitchChain(); const { sendTransactionAsync } = useSendTransaction(); const { openGlidePay } = useGlidePay({ ..., walletProvider: { availableChainIds: wagmiConfig.chains.map((c) => c.id), address, currentChainId, switchChainAsync, sendTransactionAsync, }, }); ``` ::: ## Optional - Gasless transactions If you want the user to be able to pay without having to hold gas, you can enable gasless transactions. Many tokens such as USDC support this. All you have to do is update your `walletProvider` and implement the `signTypedDataAsync` function to handle gasless payments. This function prompts the user's connected wallet to sign a message and returns the signature. ```tsx const { openGlidePay } = useGlidePay({ ... walletProvider: { ... signTypedDataAsync: async (data) => { // [!code ++] // Sign the message using the user's connected wallet // [!code ++] // Return the signature // [!code ++] }, // [!code ++] }, }); ``` :::tip[Using wagmi?] If you're using wagmi, use the following code snippet: ```ts const { signTypedDataAsync } = useSignTypedData(); // [!code ++] const { openGlidePay } = useGlidePay({ ..., walletProvider: { ..., signTypedDataAsync, // [!code ++] }, }); ``` ::: ## Optional - Success callback If you need to perform any actions after a successful payment, you can pass a `onSuccess` callback to the `useGlidePay` hook. ```tsx const { openGlidePay } = useGlidePay({ ... onSuccess: (txHash) => { // [!code ++] // Perform actions after a successful payment // [!code ++] }, // [!code ++] }); ``` ## Optional - Webhooks You can configure Glide to publish webhooks as the user progresses through their payment journey - from intent creation to final settlement. Head over to the Webhooks page in Glide Dashboard and add a webhook pointing to your server. Now, you will receive webhooks like so: ```json { "webhookId": "d5fa3629-9187-4ca6-9f2b-d70f7816ce4b", "entityId": "a44ac1a5-5b73-4cbe-83a1-7e937189d470", "type": "SESSION_UPDATE", "payload": { "sessionId": "a44ac1a5-5b73-4cbe-83a1-7e937189d470", "createdAt": "2025-10-30T13:31:42.43371Z", "expiresAt": "2025-10-30T13:41:42.43371Z", "expired": false, "paymentStatus": "paid", "paymentChainId": "eip155:11155111", "paymentCurrency": "eip155:11155111/slip44:60", "paymentCurrencySymbol": "ETH", "paymentCurrencyTier": "tier2", "paymentAmount": "0.0013331552440739", "paymentAmountUSD": "5.0904", "payerAccount": "0x18B78BDF556451D3EAEEdBb553d9db39898C19d1", "payerAccounts": [ "0x18B78BDF556451D3EAEEdBb553d9db39898C19d1" ], "payerWalletAddress": "0x18B78BDF556451D3EAEEdBb553d9db39898C19d1", "payerEmail": "asdsad@gmal.cpm", "enableRefundEmails": true, "paymentAction": "signAndSendTransaction", "paymentTransactionHash": "0x96500a48d4e6413a4dfba545f6791c01243b7956d07b0b2dcfe743cea238f7cb", "paymentTransactionUrl": "https://sepolia.etherscan.io/tx/0x96500a48d4e6413a4dfba545f6791c01243b7956d07b0b2dcfe743cea238f7cb", "unsignedTransaction": { "chainId": "eip155:11155111", "to": "0x4328cbD2b15345Cc1ea0cb53bE52E0260C541179", "value": "0x4bc7f64c0e3ac" }, "sponsoredTransactionChainId": "solana:103", "sponsoredTransactionStatus": "success", "sponsoredTransactionHash": "3j4p7dbeWmu3xKw3UXu2XZucCV7rqiy6ZYJiHCa3adyeythyeKzdGDQkMTcb5VP9SUe9w7bFMD9qhaHovBzSZ3Q", "sponsoredTransactionUrl": "https://explorer.solana.com/tx/3j4p7dbeWmu3xKw3UXu2XZucCV7rqiy6ZYJiHCa3adyeythyeKzdGDQkMTcb5VP9SUe9w7bFMD9qhaHovBzSZ3Q?cluster=devnet", "sponsoredTransaction": "AQADBhT5qiBZ4skr+LUDMYgefXgbQvF7t6kraR5m5gqINWjhgq7ItRo5hO9EqB6GS1ybQ886O+Cf4S33uzu2hPN8xyaJJGCvGZOdwkJMwynqGDbrzcQc7hEo74dsO7TyIyymYwMGRm/lIRcy/+ytunLDm+e8jOW7xfcSayxDmzpAAAAABt324ddloZPZy+FGzut5rBy0he1fWzeROoz1hX7/AKk7RCyzkSFX8TqTPQE0KC0DK1/+zQGi2/G3eQYI3wAup+JGH/j2DTkKs2Z1lo9DWrr2AZWAPkQsHwQumKgAokwAAgMACQOghgEAAAAAAAQFAQUCAAAKDIDnTAAAAAAABg==", "sponsoredTransactionAmount": "5.04", "sponsoredTransactionCurrency": "solana:103/token:4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", "sponsoredTransactionCurrencySymbol": "USDC", "sponsoredTransactionAmountUSD": "5.04", "gasRefuelAmount": "0", "gasRefuelUSD": "0", "gasRefuelTransactionStatus": "", "gasRefuelTransactionHash": null, "gasRefuelTransactionUrl": null, "gasCurrencySymbol": "", "gasCurrencyLogoUrl": "", "gasFeeUSD": "0.004747798", "serviceFeeUSD": "0.02522373899", "totalFeeUSD": "0.0504", "etaInSeconds": 10, "metadata": "", "allowArbitraryDeposit": false, "actualPaymentChainId": "eip155:11155111", "actualPaymentCurrency": "eip155:11155111/slip44:60", "actualPaymentCurrencySymbol": "ETH", "actualPaymentCurrencyTier": "tier2", "actualPaymentAmount": "0.0013331552440739", "actualPaymentAmountUSD": "5.0904000000000000000342009878193" } } ``` ### Validate webhook integrity Before processing the webhook payload, always check for the `X-Glide-Signature` header and validate its value against the Webhook Signing Secret found in the Glide Dashboard. The signature is the hex-encoded result of computing an HMAC-SHA256 hash of the request body using the webhook signing secret as the key. See the [Webhooks](/webhooks) guide for a complete verification code sample and reliability best practices. --- # Embed Glide Deposit [Use pre-built React components in your app] Let users deposit tokens into your app using Glide's pre-built React components. You can customize the components to match your app's design and branding. ## Setup Install the Glide React SDK :::code-group ```sh [npm] npm install @paywithglide/glide-react ``` ```sh [yarn] yarn add @paywithglide/glide-react ``` ```sh [bun] bun install @paywithglide/glide-react ``` ::: ## The Hook The Glide React SDK comes with a `useGlideDeposit` hook that you can use to open the deposit modal. ```tsx const { openGlideDeposit } = useGlideDeposit({ /* Your App ID, provided by the Glide Team */ app: "my-app", /* The wallet address that will receive the deposit. * This is usually the user's connected wallet address. */ recipient: "0x0...", }); ``` ### Open the Deposit Modal You can now call the `openGlideDeposit` function to open the deposit modal. ```tsx ``` ### That's it! You can now monitor the user's wallet address for balance updates. ## Optional - Wallet Provider If users have already connected a wallet in your app, you can pass the wallet provider to the `useGlideDeposit` hook. This will allow users to deposit from their connected wallet. ```tsx const { openGlideDeposit } = useGlideDeposit({ ... /* The walletProvider object acts as a bridge between your app * and the embedded pay modal. * This bridge is used to send transactions to the user's * connected wallet, along with other wallet-related operations. */ walletProvider: { /* A list of chain ids that the user's connected wallet supports */ availableChainIds: [1, ...], /* The current chain id that the user's connected wallet is on */ currentChainId: 1, /* The user's connected wallet address */ address: "0x0...", switchChainAsync: async ({chainId}) => { // Switch the user's connected wallet to the new chain }, sendTransactionAsync: async (tx) => { // Send the transaction to the user's connected wallet // Return the transaction hash }, }, }); ``` :::tip[Using wagmi?] If you're using wagmi, use the following code snippet: ```ts const currentChainId = useChainId(); const { address } = useAccount(); const { switchChainAsync } = useSwitchChain(); const { sendTransactionAsync } = useSendTransaction(); const { openGlideDeposit } = useGlideDeposit({ ..., walletProvider: { availableChainIds: wagmiConfig.chains.map((c) => c.id), address, currentChainId, switchChainAsync, sendTransactionAsync, }, }); ``` ::: ## Optional - Gasless transactions If you want the user to be able to transfer certain tokens without having to hold gas, you can enable gasless transactions. Many tokens such as USDC support this. All you have to do is update your `walletProvider` and implement the `signTypedDataAsync` function to handle gasless transactions. This function prompts the user's connected wallet to sign a message and returns the signature. ```tsx const { openGlideDeposit } = useGlideDeposit({ ... walletProvider: { ... signTypedDataAsync: async (data) => { // [!code ++] // Sign the message using the user's connected wallet // [!code ++] // Return the signature // [!code ++] }, // [!code ++] }, }); ``` :::tip[Using wagmi?] If you're using wagmi, use the following code snippet: ```ts const { signTypedDataAsync } = useSignTypedData(); // [!code ++] const { openGlideDeposit } = useGlideDeposit({ ..., walletProvider: { ..., signTypedDataAsync, // [!code ++] }, }); ``` ::: ## Optional - Success callback If you need to perform any actions after a successful deposit/withdrawal, you can pass a `onSuccess` callback to the `useGlideDeposit` hook. ```tsx const { openGlideDeposit } = useGlideDeposit({ ... onSuccess: (txHash) => { // [!code ++] // Perform actions after a successful deposit/withdrawal // [!code ++] }, // [!code ++] }); ``` ## Optional - Commission rates If you want to earn a commission on deposits and withdrawals, configure it server-side with a widget session. Commission rates are set on your backend — not in the frontend hook — so they can't be tampered with by the client. ### 1. Create a widget session on your backend Set the commission rates per currency tier (`tier1` = stablecoins, `tier2` = major tokens, `tier3` = volatile tokens). Rates are percentages of the transaction amount — `"0.5"` means a 0.5% commission: :::code-group ```ts [NodeJS] const { id } = await createWidgetSession(config, { mode: "deposit", commissionRates: { tier1: "0.5", tier2: "1", tier3: "1", }, }); // Pass `id` to your frontend ``` ```sh [curl] curl --request POST \ --url https://api.paywithglide.xyz/widget/create-session \ --header 'X-Glide-Project-ID: ' \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data '{ "mode": "deposit", "commissionRates": { "tier1": "0.5", "tier2": "1", "tier3": "1" } }' ``` ::: See the [create widget session](/typescript/create-widget-session) reference for all the options you can configure server-side. ### 2. Initialize the widget with the session Pass the widget session ID to the `useGlideDeposit` hook: ```tsx const { openGlideDeposit } = useGlideDeposit({ app: "my-app", recipient: "0x0...", /* The widget session ID from your backend */ // [!code ++] sessionId, // [!code ++] walletProvider: { ... }, }); ``` The widget now applies the server-configured commission rates to every deposit and withdrawal. ## Default Mode If you want to open the deposit modal with a specific mode, you can set the `mode` property to either "withdraw" or "deposit". This will skip the mode selection screen and directly open the specified mode. ```tsx const { openGlideDeposit } = useGlideDeposit({ app: "my-app", recipient: "0x0...", /* Set the mode to "withdraw" or "deposit" */ // [!code ++] mode: "withdraw" | "deposit", // [!code ++] walletProvider: { ... }, }); ``` You can now call the `openGlideDeposit` function to open the withdraw modal. ```tsx ``` --- # Installation [Setup Glide in just a few lines of code] ## Install Glide SDK :::code-group ```sh [npm] npm install @paywithglide/glide-js ``` ```sh [yarn] yarn add @paywithglide/glide-js ``` ```sh [bun] bun install @paywithglide/glide-js ``` ::: ## Configure ```ts [config.ts] // [!include ~/snippets/config.ts] ``` :::tip[Don't have a project id?] Get a project id by [signing up here](https://buildwithglide.com). It's free! ::: You can now pass the config to any action in the Glide SDK. ```ts // [!code word:config] const paymentOptions = await listPaymentOptions(config, { // [!code focus] ... }); ``` ## Next steps - [Quickstart](/quickstart) — accept your first payment in 5 minutes - [Payments](/guides/payments) — accept cross-chain payments with the headless SDK - [Deposits / Withdrawals](/guides/deposits-withdrawals) — let users move funds in and out of your app - [Custodial Withdrawals](/guides/custodial-withdrawals) — send tokens from your Glide wallet to user wallets --- # Quickstart [Accept your first cross-chain payment in 5 minutes] In this quickstart, you'll accept a payment with the headless SDK from a plain TypeScript script — no wallet connection or frontend required. You'll create a payment session, get a deposit address, and watch the payment settle. ## 1. Install the SDK :::code-group ```sh [npm] npm install @paywithglide/glide-js ``` ```sh [yarn] yarn add @paywithglide/glide-js ``` ```sh [bun] bun install @paywithglide/glide-js ``` ::: ## 2. Configure Create a config with your project ID and the chains you want to accept payments on: ```ts [config.ts] export const config = createGlideConfig({ projectId: "your-project-id", chains: [base, ethereum], }); ``` :::tip[Don't have a project id?] Get a project id by [signing up here](https://buildwithglide.com). It's free! ::: ## 3. Accept a payment Create a payment session, show the deposit address, and wait for the payment to settle: ```ts [index.ts] // Create a session: the payer sends USDC on Ethereum, // and you receive USDC on Base const session = await createPaymentSession(config, { paymentCurrency: usdc.on(ethereum), settleCurrency: usdc.on(base), recipientWallet: "0x742d35Cc6634C0532925a3b844Bc454e4438f44e", // your wallet paymentAmount: "10", }); console.log("Pay", session.paymentAmount, session.paymentCurrencySymbol); console.log("On", session.paymentChainName); console.log("To", session.depositAddress); // Poll until the payment arrives and settlement completes const completed = await waitForSession(config, { sessionId: session.sessionId, onUpdate: (s) => console.log("Status:", s.paymentStatus, "/", s.sponsoredTransactionStatus), }); console.log("Settled!", completed.sponsoredTransactionUrl); ``` ## 4. Run it ```sh npx tsx index.ts ``` You'll see output like: ``` Pay 10 USDC On Ethereum To 0x93f480a6b0e6D02271D8e70d9d05Ac5cee01D379 Status: unpaid / created ``` Send the payment to the deposit address (from any wallet or exchange), and the script keeps polling until settlement: ``` Status: waiting_confirmations / created Status: paid / pending Status: paid / success Settled! https://basescan.org/tx/0x36145cfe... ``` That's it — you've accepted a cross-chain payment. The payer sent USDC on Ethereum, and you received USDC on Base. ## Which flow do I need? Every Glide flow uses the same session primitive — pick the guide that matches who pays and who receives: | Flow | Payer | Recipient | Guide | | --- | --- | --- | --- | | **Payments** | your user/customer | you | [Payments](/guides/payments) | | **Deposits** | the user (from anywhere) | the user's in-app wallet | [Deposits / Withdrawals](/guides/deposits-withdrawals) | | **Withdrawals** | the user's in-app wallet | the user's external address | [Deposits / Withdrawals](/guides/deposits-withdrawals) | | **Payouts** | your project's Glide wallet | your user | [Custodial Withdrawals](/guides/custodial-withdrawals) | ## Next steps - [Sessions](/sessions) — understand the session lifecycle and statuses - [Webhooks](/webhooks) — track payments server-side in production - [Testing](/testing) — develop without moving real funds - [Error handling](/errors) — handle every failure mode --- # Sessions [Understand the lifecycle of a Glide session] A session represents one intent to move money through Glide: someone pays with one token on one chain, and Glide settles with a (possibly different) token on a (possibly different) chain. Every flow — payments, deposits, withdrawals, payouts — creates a session with [`createSession`](/typescript/create-session) or [`createPaymentSession`](/typescript/create-payment-session), and everything you need to track it lives on the session object. A session is valid for a limited time (generally 10 minutes, see `expiresAt`). If the payment isn't completed in time, the session expires and a new one must be created. A payment made to an expired session is refunded. ## The two sides of a session Session fields are grouped by prefix, and understanding the naming makes the whole object readable: | Prefix | Side | Meaning | | --- | --- | --- | | `payment*` | payment | What the payer is quoted: currency, chain, amount, and the transaction they make | | `sponsoredTransaction*` | settlement | The transaction **Glide executes on the destination chain** on your behalf — what the recipient receives | | `actualPayment*` | payment | Set when the payer pays with a different account or currency than quoted — these override the `payment*` fields | | `gasRefuel*` | settlement | The optional gas top-up sent to the recipient on the destination chain | | `refund*` | payment | Set when a payment is refunded | "Sponsored transaction" is Glide's term for the settlement: Glide sponsors (executes and pays gas for) the destination-chain transaction, whether that's a contract call or a simple transfer to the recipient. ## Payment status `paymentStatus` tracks the payer's side: ``` unpaid ──► waiting_confirmations ──► paid │ pending_refund ◄─┘ (overpaid / underpaid / expired) │ ▼ refunded ``` - **`unpaid`** — the session was created and is waiting for the payment. - **`waiting_confirmations`** — the payment transaction was detected and is waiting for chain confirmations. - **`paid`** — the payment is confirmed. Settlement proceeds. - **`pending_refund`** — the payment can't be settled (for example, the amount was insufficient or the session had expired) and a refund is queued. - **`refunded`** — the refund was sent. See `refundTransactionHash` and `refundTransactionUrl`. ## Settlement status `sponsoredTransactionStatus` tracks Glide's destination-chain transaction: ``` created ──► signed ──► submitted ──► pending ──► success │ ├──► failed └──► dropped ``` Treat **`success`** as the single signal that money has arrived — at that point `sponsoredTransactionHash` and `sponsoredTransactionUrl` are set. `failed` and `dropped` are terminal failure states; [`waitForSession`](/typescript/wait-for-session) surfaces them as a `SponsoredTransactionFailedError`. ## Payment actions When a session is created, `paymentAction` tells you what the payer must do: - **`signAndSendTransaction`** — send `unsignedTransaction` (EVM) or `unsignedSolanaTransaction` (Solana) from their wallet. - **`signTypedData`** — sign `unsignedTypedData` for a gasless permit-based payment. - **`redirectToUrl`** — complete the payment at `redirectUrl` (e.g., an onramp). - **`transfer`** — send funds to `depositAddress` from any wallet or exchange. For connected wallets, [`executeEVMSession`](/typescript/execute-session) handles the first two actions end to end. ## Chain and currency identifiers Glide identifies chains with [CAIP-2](https://github.com/ChainAgnostic/CAIPs/blob/main/CAIPs/caip-2.md) IDs and assets with [CAIP-19](https://github.com/ChainAgnostic/CAIPs/blob/main/CAIPs/caip-19.md) IDs, so a single format works across EVM, Solana, Bitcoin, and more: ``` eip155:8453 // Base (CAIP-2) eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913 // USDC on Base (CAIP-19) eip155:1/slip44:60 // Native ETH on Ethereum solana:101/token:EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v // USDC on Solana ``` You rarely need to construct these by hand — use the chain and currency helpers: ```ts base.id; // "eip155:8453" usdc.on(base); // "eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913" ``` For working with IDs you receive back from Glide, the SDK exports three helpers: ```ts getEIP155ChainId, caip2FromCAIP19, erc20AddressFromCAIP19, } from "@paywithglide/glide-js"; // Numeric EVM chain ID, e.g. for wallet chain switching. // Throws for non-EVM IDs. getEIP155ChainId(session.paymentCurrency); // 8453 // The CAIP-2 chain ID of an asset caip2FromCAIP19(session.paymentCurrency); // "eip155:8453" // The token contract address of an ERC-20 asset. // Throws for non-ERC-20 IDs (e.g., native currencies). erc20AddressFromCAIP19(session.paymentCurrency); // "0x8335...2913" ``` ## Fees All fees are quoted upfront on the session, denominated in USD: - **`serviceFeeUSD`** — Glide's service fee. - **`gasFeeUSD`** — the estimated destination-chain gas, paid by Glide. - **`paymentTransactionGasFeeUSD`** — the gas the payer pays for their own payment transaction. - **`totalFeeUSD`** — the total, including any developer commission. --- # Payments [Accept cross-chain payments with the headless SDK] Glide lets you accept payments from users in any supported token on any supported chain, while you settle in the currency and chain of your choice. The user pays in whatever they hold, and Glide handles the routing, conversion, and settlement. The payment flow has three steps: 1. **Create a payment session** — get a firm quote with exchange rates and fees. 2. **Let the user pay** — complete the payment action returned by the session. 3. **Track completion** — wait for the session in your app, or receive webhooks on your server. ## 1. Create a payment session Create a session with the currency the user will pay in, the currency you want to receive, and the wallet that should receive the funds. :::code-group ```ts [index.ts] const session = await createPaymentSession(config, { paymentCurrency: usdc.on(base), settleCurrency: usdc.on(polygon), recipientWallet: "0x742d35Cc6634C0532925a3b844Bc454e4438f44e", paymentAmount: "100", // Optional: attach your own identifiers to the session metadata: JSON.stringify({ orderId: "order-12345" }), }); ``` ```ts [config.ts] // [!include ~/snippets/config.ts] ``` ::: The session is valid for a limited time, during which the user should complete the payment. If a payment is made for an expired session, the payment is refunded. See the [create payment session](/typescript/create-payment-session) reference for all parameters, including commissions, refund emails, and stable deposit addresses. ## 2. Let the user pay The session's `paymentAction` field tells you what the user needs to do: - **`transfer`** — the user sends the payment to `session.depositAddress`. Show the address, the `paymentAmount`, and the `paymentCurrency` to the user. This is the most common flow for headless, server-driven payments. - **`signAndSendTransaction`** — the user signs and sends `session.unsignedTransaction` from their connected wallet. - **`signTypedData`** — the user signs `session.unsignedTypedData` for a gasless payment. - **`redirectToUrl`** — redirect the user to `session.redirectUrl` to complete the payment through an external service. If the user pays from a connected wallet in your app, use [`executeEVMSession`](/typescript/execute-session) — it switches chains, triggers the transaction or signature, reports the payment to Glide, and waits for the session to complete in a single call. ## 3. Track completion ### Wait for the session Use [`waitForSession`](/typescript/wait-for-session) to poll the session until the settlement transaction succeeds: ```ts const completedSession = await waitForSession(config, { sessionId: session.sessionId, onUpdate: (session) => { console.log("Payment status:", session.paymentStatus); console.log("Settlement status:", session.sponsoredTransactionStatus); }, }); console.log("Settled:", completedSession.sponsoredTransactionHash); ``` You can also fetch the session on demand with [`getSessionById`](/typescript/get-session-by-id) — for example, when the user returns to your app after paying. ### Webhooks For production, track payments server-side with webhooks — Glide sends a `SESSION_UPDATE` event with the full session object every time the session changes, so your backend can fulfill the order even if the user closes the tab. Use the `metadata` field to correlate the session with your own records. See the [Webhooks](/webhooks) guide for setup, signature verification, and reliability best practices. --- # Deposits / Withdrawals [Move funds in and out of your app with the headless SDK] If your users hold a self-custodial balance in your app — for example, in an embedded or connected wallet — Glide lets them move funds in and out across any supported chain and token: - **Deposits** — the user brings funds into your app from any wallet or exchange, in any supported token. Your app receives your canonical token on your chain. - **Withdrawals** — the user sends funds from their in-app wallet to an external address, receiving any supported token on any chain. This is the headless equivalent of the [Deposit / Withdrawal widget](/guides/embed-glide-deposit) — use it when you want full control over the UI. ## Deposits The user deposits from anywhere — their exchange account, another wallet, a friend's wallet — and your app receives the token it credits balances in. ### Step 1: Create a payment session The `settleCurrency` is the token your app credits balances in, and the `recipientWallet` is the user's in-app wallet address. :::code-group ```ts [index.ts] const userId = "user-123"; const userInAppWalletAddress = "0x742d35Cc6634C0532925a3b844Bc454e4438f44e"; const session = await createPaymentSession(config, { // The token the user will deposit with paymentCurrency: usdc.on(ethereum), // The token and chain your app credits balances in settleCurrency: usdc.on(base), recipientWallet: userInAppWalletAddress, // Omit paymentAmount to let the user deposit any amount // A consistent key returns the same deposit address for this // user across sessions, so they can save it in their exchange stableDepositAddressKey: `deposit-${userId}`, }); ``` ```ts [config.ts] // [!include ~/snippets/config.ts] ``` ::: ### Step 2: Show the deposit address When the session's `paymentAction` is `transfer`, show the user the `depositAddress` along with the payment currency and chain. The user sends funds to it from their exchange or wallet: ```ts if (session.paymentAction === "transfer" && session.depositAddress) { console.log("Send", session.paymentCurrencySymbol, "on", session.paymentChainName); console.log("To:", session.depositAddress); } ``` With a `stableDepositAddressKey`, the same address is returned every time for that key — users can save it as a withdrawal address in their exchange and deposit repeatedly without creating a new session each time. :::tip If the user is depositing from a wallet connected to your app, you can skip the deposit address and execute the payment directly with [`executeEVMSession`](/typescript/execute-session). ::: ### Step 3: Credit the deposit Track the session until the funds arrive at the user's in-app wallet, then credit their balance. Use [`waitForSession`](/typescript/wait-for-session) in your app: ```ts const completedSession = await waitForSession(config, { sessionId: session.sessionId, }); // Funds have arrived at the user's in-app wallet creditBalance(userId, completedSession.sponsoredTransactionAmount); ``` Or configure webhooks to credit balances server-side — see the [Payments guide](/guides/payments#webhooks) for details. ## Withdrawals The user withdraws from their own wallet to an external address — for example, sending their in-app USDC balance on Base to their exchange deposit address on Arbitrum. The user signs the withdrawal transaction themselves. ### Step 1: Create a payment session The `paymentCurrency` is the token the user holds in your app, and the `settleCurrency` is what the destination address receives. :::code-group ```ts [index.ts] const userWalletAddress = "0x742d35Cc6634C0532925a3b844Bc454e4438f44e"; const destinationAddress = "0x82D83c72590f745fe734c64DcD8c37179C6D98C7"; const session = await createPaymentSession(config, { // The token and chain the user holds in your app paymentCurrency: usdc.on(base), payerAccount: userWalletAddress, // The token, chain, and address the user withdraws to settleCurrency: usdc.on(arbitrum), recipientWallet: destinationAddress, // The amount to withdraw. Use settleAmount instead if the // destination should receive an exact amount. paymentAmount: "50", }); ``` ```ts [config.ts] // [!include ~/snippets/config.ts] ``` ::: The session includes the exchange rate and fees, so you can show the user exactly what the destination will receive (`session.sponsoredTransactionAmount`) before they sign. ### Step 2: Execute from the user's wallet Use [`executeEVMSession`](/typescript/execute-session) to complete the withdrawal with the user's wallet. It switches to the right chain, prompts the user to sign, and waits for the funds to arrive at the destination: ```ts const { sponsoredTransactionHash } = await executeEVMSession(config, { session, currentChainId, switchChainAsync, sendTransactionAsync, signTypedDataAsync, // optional, enables gasless withdrawals }); console.log("Withdrawal settled:", sponsoredTransactionHash); ``` That's it — once `executeEVMSession` resolves, the funds have arrived at the destination address. :::tip If withdrawals are funded from a centralized balance your project holds instead of the user's own wallet, see the [Custodial Withdrawals](/guides/custodial-withdrawals) guide. ::: --- # Custodial Withdrawals [Send tokens from your project's Glide wallet to user wallets] ## Overview Custodial withdrawals let you send tokens to your users' wallets from a centralized balance your project holds. Withdrawals are funded from your Glide wallet, so you'll need to maintain a sufficient balance. Users can choose to receive funds in any supported currency, and Glide handles the conversion automatically. The withdrawal process works in two steps: 1. **Create a payment session** — Get a firm quote with exchange rates and fees 2. **Confirm the payment** — Execute the transaction using your wallet secret :::tip If your users hold funds in their own wallets instead, see the [Deposits / Withdrawals](/guides/deposits-withdrawals) guide for the self-custodial flow. ::: ## Setup Custodial withdrawals run on your backend and require your Glide API key in addition to your project ID: ```ts [config.ts] export const config = createGlideConfig({ projectId: "", chains: [base, polygon], // Do not expose this key to the frontend apiKey: "", }); ``` :::warning The Glide API key controls your Glide wallet and should never be exposed to the frontend. The project ID is okay to use on the frontend. ::: ## Withdrawal Flow ### Step 1: Create a payment session Create a payment session to get a quote with exchange rates and fees. The `paymentCurrency` is the token in your Glide wallet, and the `settleCurrency` is the token the user will receive. ```ts const session = await createPaymentSession(config, { // The token in your Glide wallet that funds the withdrawal paymentCurrency: usdc.on(base), paymentAmount: "10.5", // Your Glide wallet address payerAccount: "0x97F02157be8e7c1Fe3058860cD1B6Ae069f1e594", // The token and wallet the user will receive funds in settleCurrency: usdc.on(polygon), recipientWallet: "0x742d35Cc6634C0532925a3b844Bc454e4438f44e", // Optional: attach your own identifier to the session metadata: "withdrawal-12345", }); ``` The returned session includes the exchange rate, fees, and settlement details. The session remains `unpaid` until confirmed. See the [create payment session](/typescript/create-payment-session) reference for all parameters and the full return type. ### Step 2: Confirm the payment After reviewing the session details (exchange rate, fees, etc.), confirm the payment using your wallet secret. There is no dedicated SDK action for this endpoint yet, so use the SDK's `makeRequest` helper — it applies the base URL and authentication headers from your config: ```ts const { success } = await makeRequest<{ success: boolean }>(config, { url: "/sessions/pay-with-wallet", body: { sessionId: session.sessionId, // Your Glide wallet address and secret payerAccount: "0x97F02157be8e7c1Fe3058860cD1B6Ae069f1e594", walletSecret: "", }, }); ``` On failure, `makeRequest` throws a `ResponseNotOkError` with the response status: | Status | Description | | --- | --- | | 401 | Invalid wallet secret | | 404 | Session not found | | 500 | Internal server error | ### Step 3: Track completion Once confirmed, use [`waitForSession`](/typescript/wait-for-session) to wait for the settlement transaction to complete: ```ts const completedSession = await waitForSession(config, { sessionId: session.sessionId, }); console.log("Withdrawal settled:", completedSession.sponsoredTransactionHash); ``` You can also configure webhooks to track completion server-side — see the [Payments guide](/guides/payments#webhooks) for details. ## Building the Withdrawal UI You are responsible for building the withdrawal UI in your app — typically a simple form where the user picks the chain and currency they want to receive, and enters their destination wallet address. To populate the chain and currency pickers, use the [listSupportedChains](/typescript/list-supported-chains) and [listSupportedCurrencies](/typescript/list-supported-currencies) actions. Use `currency.on(chain)` to get the CAIP-19 ID for the `settleCurrency` parameter. Note that withdrawals are currently EVM only, so filter for chains whose `id` starts with `eip155:`. --- # Testing [Develop your Glide integration without moving real funds] ## Use testnets Glide supports testnets alongside mainnets. Testnet chains are exported from `@paywithglide/glide-js/chains` just like mainnets — configure them the same way: ```ts [config.ts] export const config = createGlideConfig({ projectId: "your-project-id", chains: [baseSepolia, ethereumSepolia], }); ``` Sessions created against testnet chains behave exactly like mainnet sessions — same statuses, same payment actions, same webhooks — but use testnet funds from a faucet. To discover available testnets programmatically, pass `all: true` to [`listSupportedChains`](/typescript/list-supported-chains) and filter on `isTestnet`: ```ts const chains = await listSupportedChains(config, { all: true }); const testnets = chains.filter((chain) => chain.isTestnet); ``` The same flag exists on [`listSupportedCurrencies`](/typescript/list-supported-currencies) for testnet tokens. See [Supported chains & tokens](/resources/supported-chains-and-tokens) for the full list, including virtual testnets. ## Dry mode [`createPaymentSession`](/typescript/create-payment-session) accepts a `dryMode` flag that creates the session for testing without processing a real payment — useful for exercising your session-handling code end to end: ```ts const session = await createPaymentSession(config, { paymentCurrency: usdc.on(base), settleCurrency: usdc.on(polygon), recipientWallet: "0x742d35Cc6634C0532925a3b844Bc454e4438f44e", paymentAmount: "100", dryMode: true, }); ``` ## Testing cheaply on mainnet For an end-to-end test of the real thing, small amounts on low-fee chains (like Base) keep the cost of a full payment-to-settlement round trip to a few cents. The [quickstart](/quickstart) script is a good harness: run it with a small `paymentAmount`, pay the deposit address from any wallet, and watch the statuses progress. ## Testing webhooks Run your webhook endpoint locally by exposing it with a tunnel (e.g., `ngrok` or `cloudflared`) and pointing a webhook at the tunnel URL in the Glide Dashboard. Remember to verify the `X-Glide-Signature` header even in development — see [Webhooks](/webhooks). --- # Error Handling [Handle every failure mode of the Glide SDK] Every error the SDK throws is a typed error class exported from `@paywithglide/glide-js`, so you can branch on failure modes with `instanceof`: ```ts createSession, executeEVMSession, NoPaymentOptionsError, SessionExpiredError, SponsoredTransactionFailedError, InsufficientPaymentAmountError, } from "@paywithglide/glide-js"; try { const session = await createSession(config, { ... }); await executeEVMSession(config, { session, ... }); } catch (e) { if (e instanceof NoPaymentOptionsError) { // The user has no balance that can cover this transaction } else if (e instanceof SessionExpiredError) { // Create a fresh session and let the user retry } else if (e instanceof InsufficientPaymentAmountError) { // The amount paid was too low; the payment will be refunded } else if (e instanceof SponsoredTransactionFailedError) { // Settlement failed; contact Glide support with the session ID } else { // The user rejected in their wallet, a network error, etc. throw e; } } ``` ## Error reference ### Session lifecycle
**`SessionExpiredError`** — the session expired (or is within 30 seconds of expiring) before the payment was completed. Thrown by `executeEVMSession`, `executeSolanaSession`, and `waitForSession`. **Recovery:** create a new session and let the user retry — quotes are only valid for the session's lifetime. **`SponsoredTransactionFailedError`** — the settlement transaction on the destination chain failed. Thrown by `waitForSession` (and the execute actions, which wait internally). **Recovery:** this is rare and terminal for the session; surface it to the user and contact Glide support with the session ID. **`InsufficientPaymentAmountError`** — the amount paid doesn't cover the required payment amount, and the payment is queued for refund (`paymentStatus` becomes `pending_refund`). Thrown by `waitForSession`, `payWithTransfer`, and other actions when the backend reports it. **Recovery:** the payer is refunded automatically; create a new session for another attempt. **`PaymentPendingError`** — the payment hasn't been detected or confirmed yet. Thrown by `payWithTransfer`, `payWithCoinbaseOnramp`, and `payWithCoinbaseApp`. **Recovery:** retry after a short delay — `waitForTransfer` does exactly this loop for you. **`TransactionNotFoundError`** — the payment transaction hash can't be found on chain yet. Thrown by `updatePaymentTransaction` and the pay actions. **Recovery:** the transaction may not have propagated yet; retry with a short delay (the execute actions retry this for up to a minute internally).
### Session creation
**`NoPaymentOptionsError`** — thrown by `createSession` when no `paymentCurrency` was specified and the user has no balance that can cover the transaction. **Recovery:** prompt the user to fund their wallet, or use `listPaymentOptions` with `includeInsufficientBalanceOptions: true` to show what they could pay with. **`GlideOverCapacityError`** — Glide is temporarily over capacity for the requested route. **Recovery:** retry later. **`CurrencyNotSupportedError`** — thrown by a currency's `on(chain)` or `contractAddressOn(chain)` helper when the currency doesn't exist on that chain. **Recovery:** only offer chain and currency combinations returned by [`listSupportedCurrencies`](/typescript/list-supported-currencies).
### Transport
**`ResponseNotOkError`** — the catch-all for any non-OK API response that doesn't map to a more specific error. It exposes `statusCode` (the HTTP status) and `response` (the raw body) for debugging: ```ts if (e instanceof ResponseNotOkError) { console.error("Glide API error", e.statusCode, e.response); } ``` **Recovery:** a `4xx` usually means invalid parameters — check `response` for the reason; a `5xx` is safe to retry.
## Wallet errors Errors from the user's wallet — rejecting a transaction or signature, or failing to switch chains — are thrown by the callbacks you pass to `executeEVMSession`/`executeSolanaSession` (e.g., wagmi's `UserRejectedRequestError`), not by Glide. Handle them alongside the Glide errors in your catch block; the session remains valid until it expires, so the user can simply retry. --- # Webhooks [Track payments server-side as they progress] Glide can publish webhooks to your server as a session progresses — from creation to final settlement. Events fire for every session regardless of how it was created: through the [embedded widgets](/guides/embed-glide-pay) or the [headless SDK](/quickstart). Webhooks are the recommended way to track money movement in production: unlike client-side polling, they keep working if the user closes the tab, and they let your backend be the source of truth for order fulfillment and balance updates. ## Setup Head over to the Webhooks page in the [Glide Dashboard](https://buildwithglide.com) and add a webhook pointing to an HTTPS endpoint on your server. ## The event Glide sends a `SESSION_UPDATE` event every time a session changes. The payload is the full session object — the same shape returned by [`getSessionById`](/typescript/get-session-by-id): ```json { "webhookId": "d5fa3629-9187-4ca6-9f2b-d70f7816ce4b", "entityId": "a44ac1a5-5b73-4cbe-83a1-7e937189d470", "type": "SESSION_UPDATE", "payload": { "sessionId": "a44ac1a5-5b73-4cbe-83a1-7e937189d470", "paymentStatus": "paid", "sponsoredTransactionStatus": "success", "sponsoredTransactionHash": "0x36145cfe...", "metadata": "{\"orderId\":\"order-12345\"}" // ... the full session object } } ``` - **`webhookId`** — unique ID for this delivery. Use it to deduplicate. - **`entityId`** — the ID of the entity the event is about (the session ID for `SESSION_UPDATE`). - **`payload`** — the full session object. See [Sessions](/sessions) for the field reference and status lifecycles. ## Verify the signature Every delivery includes an `X-Glide-Signature` header: the hex-encoded HMAC-SHA256 of the raw request body, keyed with the Webhook Signing Secret from the Glide Dashboard. Always verify it before processing the payload. ```ts [server.ts] const app = express(); app.post( "/glide-webhook", // Verify against the *raw* body — parsing and re-serializing // JSON can change the bytes and break the signature express.raw({ type: "application/json" }), (req, res) => { const signature = req.header("X-Glide-Signature"); const expected = crypto .createHmac("sha256", process.env.GLIDE_WEBHOOK_SECRET!) .update(req.body) .digest("hex"); if ( !signature || signature.length !== expected.length || !crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected)) ) { return res.status(401).send("Invalid signature"); } const event = JSON.parse(req.body.toString()); if (event.type === "SESSION_UPDATE") { const session = event.payload; // Handle the update, e.g. fulfill the order when settled } res.status(200).send("ok"); }, ); ``` ## Handling events reliably - **Treat delivery as at-least-once.** The same update can arrive more than once — deduplicate by `webhookId`, and make your handlers idempotent (fulfilling the same order twice should be a no-op). - **Don't rely on ordering.** Process events based on the session state in the payload, not the order deliveries arrive in. - **Act on the settled signal.** `paymentStatus: "paid"` together with `sponsoredTransactionStatus: "success"` means the money has fully arrived — that's the signal to fulfill an order or credit a balance. - **Correlate with your own records.** Set the `metadata` field when creating the session (e.g., your order ID) and read it back from the payload, or key off `sessionId`. - **Respond quickly.** Return a `200` as soon as the event is persisted, and do heavy work asynchronously. ## Webhooks vs. polling Client-side, [`waitForSession`](/typescript/wait-for-session) is often all you need — it polls until settlement and works great for showing live status in your UI. Use webhooks whenever the outcome matters to your backend: order fulfillment, balance crediting, or any flow where the user may leave before settlement completes. The two complement each other — poll for UI feedback, webhook for the source of truth. --- # List payment options Lists the payment options available for a transaction for the user's wallet based on their balance across chains and tokens and the required transaction amount. ## Import ```ts ``` ## Usage :::code-group ```ts [index.ts] const fabricAbi = [/* your contract's ABI */]; const paymentOptions = await listPaymentOptions(config, { chainId: base.id, account: "0xc6FfEB1298Eb33Da430d14e5Eb789256ec344625", evm: { address: "0x1169c6769c4F4B3cA1944AF0F26B36582fd5279d", value: 999999907200n, data: encodeFunctionData({ abi: fabricAbi, functionName: "mintFor", args: ["0xc6FfEB1298Eb33Da430d14e5Eb789256ec344625", 999999907200n], }), }, }); ``` ```ts [config.ts] // [!include ~/snippets/config.ts] ``` ::: ## Parameters
The CAIP-2 chain ID of the chain where the transaction will be executed (e.g., `eip155:8453` for Base). Use the `id` field of a chain imported from `@paywithglide/glide-js/chains`. The wallet address that will be used to pay for the transaction. If set, only the payment options for which the user has a balance will be returned. The EVM transaction to be executed on the destination chain. Exactly one of `evm`, `solana`, or `transfer` must be provided. The contract's address, or the recipient's address if the transaction is not a contract call. Value in the smallest unit (ex. wei) to be sent with the transaction. The encoded calldata for the transaction. Use viem's `encodeFunctionData` to encode a contract call. The approval object, required if the transaction requires spending of an ERC-20 token. Contains `token` (the token's contract address as `Hex`) and `amount` (the amount to approve, as `bigint` in the token's smallest unit). The Solana transaction to be executed on the destination chain. Exactly one of `evm`, `solana`, or `transfer` must be provided. The base64-encoded Solana transaction message to be executed. A simple token transfer to be executed on the destination chain, instead of a contract call. Exactly one of `evm`, `solana`, or `transfer` must be provided. The token to send to the recipient on the destination chain. The address that will receive the tokens. The amount to transfer, in a human-readable format. List of payment currencies that should be considered for the transaction, either in the CAIP-19 format or as currency objects imported from `@paywithglide/glide-js/currencies`. Cannot be used with paymentChainIds. List of CAIP-2 chain IDs that should be considered for the transaction. Cannot be used with paymentCurrencies. Defaults to the chains set in the config. The commission amount in USD that will be added on top of the transaction cost and will be paid out to the developer. Commission rates per currency tier (`tier1`, `tier2`, `tier3`) that will be added on top of the transaction cost and paid out to the developer, as a percentage of the transaction amount (e.g., `"0.5"` = 0.5%). Cannot be used with commissionUSD. When set to true, payment options for which the user does not have a sufficient balance are also returned, with `hasSufficientBalance` set to false. Defaults to false. A Coinbase OAuth access token. When provided, the user's Coinbase account balances are also considered as payment options. List of CAIP-2 chain IDs to exclude from the returned payment options. List of currency tiers to exclude from the returned payment options. The amount of native gas currency to send to the user on the destination chain along with the transaction, in a human-readable format.
## Return Type Returns an array of payment options, each with the following fields:
The account of the user that will pay for the transaction. The currency in which the user pays in CAIP-19 format. The payment amount required for the transaction in the payment currency, in a human-readable format. The payment amount required for the transaction in USD. The user's current balance of the payment currency, in a human-readable format. The user's current balance of the payment currency in USD. The name of the payment currency. The symbol of the payment currency. The URL of the payment currency's logo. The CAIP-2 chain ID of the chain on which the user pays. The name of the chain on which the user pays. The URL of the chain's logo. The estimated amount required to complete the transaction in the transaction currency. The currency required by the transaction to be executed, in CAIP-19 format. The estimated amount required to complete the transaction in USD. The name of the transaction currency. Ex. "Ethereum". The symbol of the transaction currency. Ex. "ETH". The URL of the transaction currency's logo. The total fee covering the relayer fee and the destination transaction gas cost paid by the relayer, in USD. Boolean indicating whether the user has sufficient balance to pay for the transaction.
--- # Create session [Create a new Glide session to make a cross-chain, cross-token, or gasless payment] A Glide session should be created once a user has shown intent to pay for a transaction using Glide. A session is valid for 10 minutes, during which the user should complete the payment process. If the user does not complete the payment within this time, the session will expire and the user will need to create a new session. If a payment is made for an expired session, the payment will be refunded automatically. Once a session is created, use the [`executeEVMSession`](/typescript/execute-session) action to complete the payment process. ## Import ```ts ``` ## Usage :::code-group ```ts [index.ts] const fabricAbi = [/* your contract's ABI */]; const session = await createSession(config, { chainId: base.id, account: "0xc6FfEB1298Eb33Da430d14e5Eb789256ec344625", paymentCurrency: usdc, evm: { address: "0x1169c6769c4F4B3cA1944AF0F26B36582fd5279d", value: 999999907200n, data: encodeFunctionData({ abi: fabricAbi, functionName: "mintFor", args: ["0xc6FfEB1298Eb33Da430d14e5Eb789256ec344625", 999999907200n], }), }, }); ``` ```ts [config.ts] // [!include ~/snippets/config.ts] ``` ::: ## Parameters
The CAIP-2 chain ID of the chain where the transaction will be executed (e.g., `eip155:8453` for Base). Use the `id` field of a chain imported from `@paywithglide/glide-js/chains`. The wallet address that will be used to pay for the transaction. Required when `paymentCurrency` is not set, so the best payment option can be selected based on the user's balances. The currency in which the user pays, either in the CAIP-19 format or as a currency object imported from `@paywithglide/glide-js/currencies`. Defaults to the first currency returned by `listPaymentOptions` for the user's account. The amount the user wants to pay, denominated in the paymentCurrency, can be set for transactions that support variable payment amounts (ex. p2p transfers). The amount the user wants to pay, denominated in USD. Alternative to paymentAmount. How the user pays for the session: `wallet`, `transfer`, `coinbase_onramp`, `coinbase_app`, `moonpay`, `onramp`, or `onramper`. Defaults to `wallet`. When set to true and if supported by the payment currency, the user will be able to pay with a signature only, requiring no gas. Defaults to false. The EVM transaction to be executed on the destination chain. Exactly one of `evm`, `solana`, or `transfer` must be provided. The contract's address, or the recipient's address if the transaction is not a contract call. Value in the smallest unit (ex. wei) to be sent with the transaction. The encoded calldata for the transaction. Use viem's `encodeFunctionData` to encode a contract call. The approval object, required if the transaction requires spending of an ERC-20 token. Contains `token` (the token's contract address as `Hex`) and `amount` (the amount to approve, as `bigint` in the token's smallest unit). The Solana transaction to be executed on the destination chain. Exactly one of `evm`, `solana`, or `transfer` must be provided. The base64-encoded Solana transaction message to be executed. A simple token transfer to be executed on the destination chain, instead of a contract call. Exactly one of `evm`, `solana`, or `transfer` must be provided. The token to send to the recipient on the destination chain. The address that will receive the tokens. The amount to transfer, in a human-readable format. The commission amount in USD that will be added on top of the transaction cost and will be paid out to the developer. Commission rates per currency tier (`tier1`, `tier2`, `tier3`) that will be added on top of the transaction cost and paid out to the developer, as a percentage of the transaction amount (e.g., `"0.5"` = 0.5%). Cannot be used with commissionUSD. The wallet secret that was used when creating the wallet. Required if the `account` wallet was created on Glide. Custom string metadata to attach to the session (e.g., order ID, user ID, JSON-encoded objects). The amount of native gas currency to send to the user on the destination chain along with the transaction, in a human-readable format. When set to true and the payment method is `transfer`, any amount deposited to the deposit address is accepted, instead of requiring the exact payment amount. An identifier for generating a stable deposit address. When the payment method is `transfer`, providing a consistent key ensures the same deposit address is returned for repeat sessions. The wallet address that owns the deposit. Used with transfer payments to attribute the deposit address to a specific user. When set to true, the payer will receive an email if their payment is refunded. The email address of the payer, used for refund notifications. Configuration for Glide-hosted payment pages. Contains an optional `appMetadata` object (`id`, `name`, `logoUrl`, `faviconUrl`) and an optional `theme` object with custom theme values. The priority to use when selecting a route for the payment: optimize for the fastest route or the cheapest route.
## Return Type --- # Create payment session [Create a payment session for cross-chain cryptocurrency transactions] A payment session should be created when a user wants to send cryptocurrency from one blockchain to another, or convert between different tokens. Glide handles the routing, conversion, and transaction execution. A session is valid for a limited time, during which the user should complete the payment process. If the user does not complete the payment within this time, the session will expire and the user will need to create a new session. If a payment is made for an expired session, the payment will be refunded. The payment session enables users to pay in one currency on one blockchain while settling in a different currency on a potentially different blockchain, with all fees and conversion rates calculated upfront. ## Import ```ts ``` ## Usage :::code-group ```ts [index.ts] const session = await createPaymentSession(config, { paymentCurrency: usdc.on(ethereum), settleCurrency: usdc.on(polygon), recipientWallet: "0x742d35Cc6634C0532925a3b844Bc454e4438f44e", paymentAmount: "100", // Omit for arbitrary payment amounts }); console.log("Session ID:", session.sessionId); console.log("Payment action:", session.paymentAction); console.log("Settlement amount:", session.sponsoredTransactionAmount); ``` ```ts [config.ts] // [!include ~/snippets/config.ts] ``` ::: ## Parameters
The cryptocurrency the user will use to pay, in CAIP-19 format (e.g., `eip155:1/erc20:0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48` for USDC on Ethereum). The cryptocurrency the recipient will receive, in CAIP-19 format. Can be the same as or different from paymentCurrency. The blockchain wallet address that will receive the settled funds. The address format depends on the settle currency's blockchain. The amount the user will pay, specified as a string in human-readable format (not wei/smallest unit). Either paymentAmount OR settleAmount should be specified, but not both. The amount the recipient will receive, specified as a string in human-readable format. Mutually exclusive with paymentAmount. An identifier for generating a stable deposit address. When the payment method is transfer, providing a consistent key ensures the same deposit address is returned for repeat sessions. Custom string metadata to attach to the session (e.g., order ID, user ID, JSON-encoded objects). Maximum length is typically 1024 characters. The account of the user that will pay for the session, when known upfront. The wallet secret that was used when creating the wallet. Required if the payer wallet was created on Glide. When set to true, the payer will receive an email if their payment is refunded. The email address of the payer, used for refund notifications. Configuration for Glide-hosted payment pages. Contains an optional `appMetadata` object (`id`, `name`, `logoUrl`, `faviconUrl`) and an optional `theme` object with custom theme values. The commission amount in USD that will be added on top of the payment amount and will be paid out to the developer. Commission rates per currency tier (`tier1`, `tier2`, `tier3`) that will be added on top of the payment amount and paid out to the developer, as a percentage of the transaction amount (e.g., `"0.5"` = 0.5%). Cannot be used with commissionUSD. When set to true, the session is created in dry mode for testing and no real payment is processed.
## Return Type The session object includes: - **Payment details**: Currency, amount, chain, and transaction hash - **Settlement details**: Final amount and destination after fees - **Payment action**: What the user needs to do (`signAndSendTransaction`, `signTypedData`, `redirectToUrl`, or `transfer`) - **Fee breakdown**: Service fees, gas fees, and total costs - **Status tracking**: Payment and transaction status fields for polling ## Payment Actions After creating a session, the `paymentAction` field determines what the user needs to do: ### signAndSendTransaction Most common action. User signs and sends a blockchain transaction using the `unsignedTransaction` field. ### signTypedData User signs EIP-712 typed data (permit) using the `unsignedTypedData` field. Used for gasless approvals. ### redirectToUrl User needs to complete payment through an external service (e.g., Coinbase onramp) using the `redirectUrl` field. ### transfer User manually transfers cryptocurrency to the `depositAddress`. Poll the session to detect when payment is received. ## Examples ### Settle a fixed amount Ensure the recipient receives exactly 50 USDC: ```ts const session = await createPaymentSession(config, { paymentCurrency: "eip155:1/erc20:0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", settleCurrency: "eip155:137/erc20:0x2791bca1f2de4661ed88a30c99a7a9449aa84174", recipientWallet: "0x742d35Cc6634C0532925a3b844Bc454e4438f44e", settleAmount: "50", // Recipient gets exactly 50 USDC }); console.log("User needs to pay:", session.paymentAmount); console.log("Total fees:", session.totalFeeUSD); ``` ### With metadata Track sessions with custom metadata: ```ts const session = await createPaymentSession(config, { paymentCurrency: "eip155:1/erc20:0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", settleCurrency: "eip155:137/erc20:0x2791bca1f2de4661ed88a30c99a7a9449aa84174", recipientWallet: "0x742d35Cc6634C0532925a3b844Bc454e4438f44e", paymentAmount: "100", metadata: JSON.stringify({ orderId: "order-12345", userId: "user-789", }), }); const orderInfo = JSON.parse(session.metadata); console.log("Order ID:", orderInfo.orderId); ``` ### Stable deposit address For recurring payments or saved addresses: ```ts const userId = "user-123"; const depositKey = `deposit-${userId}`; const session = await createPaymentSession(config, { paymentCurrency: "eip155:1/erc20:0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", settleCurrency: "eip155:137/erc20:0x2791bca1f2de4661ed88a30c99a7a9449aa84174", recipientWallet: "0x742d35Cc6634C0532925a3b844Bc454e4438f44e", paymentAmount: "100", stableDepositAddressKey: depositKey, }); if (session.paymentAction === "transfer" && session.depositAddress) { console.log("Send payment to:", session.depositAddress); // User can save this address for future payments } ``` ### Native to token Pay with native ETH, settle USDC: ```ts const session = await createPaymentSession(config, { paymentCurrency: eth.on(ethereum), settleCurrency: usdc.on(ethereum), recipientWallet: "0x742d35Cc6634C0532925a3b844Bc454e4438f44e", paymentAmount: "0.1", // Pay 0.1 ETH }); console.log("Recipient will receive:", session.sponsoredTransactionAmount, "USDC"); ``` --- # Execute session The `executeEVMSession` and `executeSolanaSession` actions orchestrate the process required to complete a Glide session using the user's wallet. More specifically, they: 1. Switch the user's wallet to the correct chain (EVM only). 2. Trigger the payment transaction using the user's wallet and update Glide with the transaction hash. 3. If gasless payment is available (EVM only), instead of a payment transaction, the user is prompted to sign a message to authorize the payment. The signature is submitted to Glide. 4. Wait for the Glide session to be completed. 5. Return the completed session object, including the `sponsoredTransactionHash`. If the session is expired, or is about to expire in the next 30 seconds, a `SessionExpiredError` is thrown without prompting the user. ## Import ```ts ``` ## Usage ### EVM :::code-group ```ts [index.ts] const session = await createSession(config, {...}); const { sponsoredTransactionHash } = await executeEVMSession(config, { session, currentChainId: 1, switchChainAsync: async ({ chainId }) => { // switch current chain to chainId on the user's wallet }, sendTransactionAsync: async (tx) => { // send tx to the chain using the user's wallet // return the transaction hash }, signTypedDataAsync: async (typedData) => { // sign the typed data using the user's wallet // return the signature }, }); ``` ```ts [config.ts] // [!include ~/snippets/config.ts] ``` ::: ### Solana :::code-group ```ts [index.ts] const session = await createSession(config, {...}); const { sponsoredTransactionHash } = await executeSolanaSession(config, { session, signAndSendTransaction: async (tx) => { // sign and send the VersionedTransaction using the user's Solana wallet // return the transaction signature }, }); ``` ```ts [config.ts] // [!include ~/snippets/config.ts] ``` ::: ## Parameters ### executeEVMSession
The session object returned from the `createSession` action. The EIP-155 chain ID of the chain that the user's wallet is currently connected to. A function that switches the user's wallet to the specified chain. A function that sends a transaction to the specified chain using the user's wallet. Returns the transaction hash. A function that signs typed data using the user's wallet. Returns the signature. Required for gasless payments, i.e. when the session's `paymentAction` is `signTypedData`. A callback invoked right after the user has completed their payment transaction or signature, before waiting for the session to complete. A callback invoked with the latest session object every time the session is polled while waiting for it to complete.
### executeSolanaSession
The session object returned from the `createSession` action. A function that signs and sends the Solana transaction using the user's wallet. Returns the transaction signature. A callback invoked right after the user has completed their payment transaction, before waiting for the session to complete. A callback invoked with the latest session object every time the session is polled while waiting for it to complete.
## Return Type Returns the completed session object with `sponsoredTransactionHash` guaranteed to be set. --- # Pay with signature [Pay for a gasless session with a signature] ## Import ```ts ``` ## Usage :::code-group ```ts [index.ts] const { success } = await payWithSignature(config, { sessionId: "c165e159-1f0e-44a1-8fa8-8c963444752e", signature: "0x...", }); ``` ```ts [config.ts] // [!include ~/snippets/config.ts] ``` ::: ## Parameters
The unique identifier of the session. The signature of the session's `unsignedTypedData`, signed by the payer's wallet, that will be used to pay for the session.
## Return Type Indicates whether the payment was successful. --- # Pay with transfer [Settle a session paid via deposit address] Asks Glide to check for and process the payment for a session whose `paymentAction` is `transfer`. Call it after the user has sent funds to the session's `depositAddress`. Throws a `PaymentPendingError` while the transfer hasn't been detected or confirmed yet — use [`waitForTransfer`](/typescript/wait-for-transfer) to poll until it succeeds. ## Import ```ts ``` ## Usage :::code-group ```ts [index.ts] const { success } = await payWithTransfer(config, { sessionId: "c165e159-1f0e-44a1-8fa8-8c963444752e", }); ``` ```ts [config.ts] // [!include ~/snippets/config.ts] ``` ::: ## Parameters The unique identifier of the session. ## Return Type Indicates whether the payment was processed successfully. ## Errors - `PaymentPendingError` — the transfer hasn't been detected or confirmed yet; retry after a short delay. - `TransactionNotFoundError` — no transfer transaction was found for the session. - `InsufficientPaymentAmountError` — the transferred amount doesn't cover the required payment amount; the payment will be refunded. --- # Wait for transfer [Wait for a deposit-address payment to be received] Polls [`payWithTransfer`](/typescript/pay-with-transfer) every 2 seconds until the transfer payment for a session is received and processed. Use it after showing the user the session's `depositAddress`. ## Import ```ts ``` ## Usage :::code-group ```ts [index.ts] const { success } = await waitForTransfer(config, { sessionId: "c165e159-1f0e-44a1-8fa8-8c963444752e", }); ``` ```ts [config.ts] // [!include ~/snippets/config.ts] ``` ::: ## Parameters The unique identifier of the session. ## Return Type Indicates whether the payment was processed successfully. ## Errors Rejects with the same errors as [`payWithTransfer`](/typescript/pay-with-transfer) — except `PaymentPendingError`, which it handles by continuing to poll. Note that this action resolves when the **payment** is received. To wait for the settlement transaction as well, follow up with [`waitForSession`](/typescript/wait-for-session). --- # Wait for session [Wait for a session to be completed after the payment has been made] Polls the session every 2 seconds until the sponsored transaction succeeds, and returns the completed session object. If you use [`executeEVMSession`](/typescript/execute-session) or `executeSolanaSession`, this is done for you automatically. ## Import ```ts ``` ## Usage :::code-group ```ts [index.ts] const completedSession = await waitForSession(config, { sessionId: "74f9fc21-9ca9-41dd-a16f-121703543eaa", onUpdate: (session) => { console.log("Session status:", session.sponsoredTransactionStatus); }, }); ``` ```ts [config.ts] // [!include ~/snippets/config.ts] ``` ::: ## Parameters
The unique identifier of the session. A callback invoked with the latest session object on every poll. A callback invoked when a poll request fails. Polling continues after the error. An abort signal to cancel waiting. When aborted, the returned promise rejects with an `AbortError`.
## Errors The returned promise rejects with one of the following errors: - `SponsoredTransactionFailedError` — the sponsored transaction failed. - `InsufficientPaymentAmountError` — the payment made was insufficient and is pending a refund. - `SessionExpiredError` — the session expired before the payment was completed. ## Return Type Returns the completed session object with `sponsoredTransactionHash` guaranteed to be set. --- # Get session by ID [Retrieve a session by its unique ID] ## Import ```ts ``` ## Usage :::code-group ```ts [index.ts] const session = await getSessionById(config, 'c165e159-1f0e-44a1-8fa8-8c963444752e'); ``` ```ts [config.ts] // [!include ~/snippets/config.ts] ``` ::: ## Parameters The unique identifier of the session. ## Return Type --- # Get session by payment transaction [Retrieve a session by its payment transaction] ## Import ```ts ``` ## Usage :::code-group ```ts [index.ts] const session = await getSessionByPaymentTransaction(config, { chainId: chains.base.id, hash: "0x36145cfe6fd2b2c3c60ef52f16e86d9fdb825f59f82f8c3cdd0c6ac398cab48c", }); ``` ```ts [config.ts] // [!include ~/snippets/config.ts] ``` ::: ## Parameters
The CAIP-2 chain ID of the chain where the payment transaction was made (e.g., `eip155:8453` for Base). Use the `id` field of a chain imported from `@paywithglide/glide-js/chains`. The payment transaction hash.
## Return Type --- # List sessions Lists previously created sessions by various filters. ## Import ```ts ``` ## Usage :::code-group ```ts [index.ts] const sessions = await listSessions(config, { account: "0xc6FfEB1298Eb33Da430d14e5Eb789256ec344625", paymentStatus: "paid", }); ``` ```ts [config.ts] // [!include ~/snippets/config.ts] ``` ::: ## Parameters
The wallet address that was used when creating the session. Filter sessions by their payment status.
## Return Type Returns an array of session objects: --- # List supported chains Lists the chains supported by Glide. Useful for building chain pickers in deposit and withdrawal UIs. ## Import ```ts ``` ## Usage :::code-group ```ts [index.ts] const chains = await listSupportedChains(config); const evmChains = chains.filter((chain) => chain.id.startsWith("eip155:")); ``` ```ts [config.ts] // [!include ~/snippets/config.ts] ``` ::: ## Parameters When set to true, all supported chains are returned, including testnets. Defaults to false. ## Return Type Returns an array of chain objects:
The CAIP-2 chain ID (e.g., `eip155:8453` for Base). The name of the chain. The URL of the chain's logo. Whether the chain is a testnet.
--- # List supported currencies Lists the currencies supported by Glide on one or more chains. Useful for building currency pickers in deposit and withdrawal UIs. ## Import ```ts ``` ## Usage :::code-group ```ts [index.ts] const currencies = await listSupportedCurrencies(config, { chainId: base.id, }); // Get the CAIP-19 ID of a currency on a chain const usdcOnBase = currencies .find((currency) => currency.symbol === "USDC")! .on(base); // "eip155:8453/erc20:0x833589fcd6edb6e08f4c7c32d4f71b54bda02913" ``` ```ts [config.ts] // [!include ~/snippets/config.ts] ``` ::: ## Parameters
The CAIP-2 chain ID to list currencies for (e.g., `eip155:8453` for Base). Use the `id` field of a chain imported from `@paywithglide/glide-js/chains`. A list of CAIP-2 chain IDs to list currencies for. Alternative to chainId. When set to true, all supported currencies are returned. Defaults to false.
## Return Type Returns an array of currency objects:
The unique identifier of the currency. The name of the currency. Ex. "USD Coin". The symbol of the currency. Ex. "USDC". The number of decimals of the currency. The URL of the currency's logo. The tier of the currency. Stablecoins are `tier1`, major tokens are `tier2`, and volatile tokens are `tier3`. Returns the CAIP-19 ID of the currency on the given chain. Throws a `CurrencyNotSupportedError` if the currency is not supported on that chain. Returns the token's contract address on the given chain. Only present for tokens with a contract address (i.e., not native currencies).
--- # Create SVM transfer message [Build a Solana transfer message for a session] Builds a base64-encoded Solana transfer message that sends a currency to a recipient. Pass the resulting `message` as the `solana.message` parameter of [`createSession`](/typescript/create-session) or [`listPaymentOptions`](/typescript/list-payment-options) when the destination transaction is a simple Solana transfer. ## Import ```ts ``` ## Usage :::code-group ```ts [index.ts] const userWalletAddress = "6VxUx4M6heF5g9EDXbCEV3AhtnJhrAxUdz4JXHrX43GB"; const { message } = await createSVMTransferMessage(config, { chain: solana, currency: usdc, recipient: "7C4jsPZpht42Tw6MjXWF56Q5RQUocjBBmciEjDa8HRtp", amount: "25", }); const session = await createSession(config, { chainId: solana.id, account: userWalletAddress, solana: { message }, }); ``` ```ts [config.ts] // [!include ~/snippets/config.ts] ``` ::: ## Parameters
The Solana chain, imported from `@paywithglide/glide-js/chains`. The currency to transfer, imported from `@paywithglide/glide-js/currencies`. The Solana address that receives the transfer. The amount to transfer, in a human-readable format.
## Return Type The base64-encoded Solana transfer message. --- # Create widget session [Create a session for the embedded widgets] Creates a widget session on your backend to pre-configure the [Pay](/guides/embed-glide-pay) or [Deposit / Withdrawal](/guides/embed-glide-deposit) widget — the mode, amount, allowed chains, and funding sources. Pass the returned `id` to the widget on your frontend. ## Import ```ts ``` ## Usage :::code-group ```ts [index.ts] const { id } = await createWidgetSession(config, { mode: "pay", amount: "5", }); // Pass `id` to the useGlidePay hook on your frontend ``` ```ts [config.ts] // [!include ~/snippets/config.ts] ``` ::: ## Parameters
The widget mode the session is for. The amount, denominated in your preferred currency configured in the Glide Dashboard. The wallet address that receives the funds. The chains the user can pay from. Defaults to the chains set in the config. The funding sources to offer: `wallet`, `external_wallet`, `transfer`, `coinbase`, `coinbase_app`, `fiat`, `interac`, `onramp`, or `onramper`. Chains to exclude from the payment options. Currency tiers to exclude from the payment options. Funding sources to exclude: `transfer`, `coinbase`, `coinbase_app`, `fiat`, `interac`, `onramp`, or `onramper`. Custom string metadata to attach to the session. Commission rates per currency tier (`tier1`, `tier2`, `tier3`) paid out to the developer, as a percentage of the transaction amount (e.g., `"0.5"` = 0.5%). The maximum destination-chain gas fee, in USD, that will be sponsored. When set to true, the payer will receive an email if their payment is refunded. The email address of the payer, used for refund notifications. The phone number of the user. An identifier for generating a stable deposit address across sessions.
## Return Type Returns a widget session object:
The unique identifier of the widget session. Pass this to the widget on your frontend. The widget mode. The metadata attached to the session.
The widget session also echoes back the configuration it was created with (`chainIds`, `excludeChainIds`, `excludeCurrencyTiers`, `excludeFundingSources`, `commissionRates`, `maxSponsoredGasFeeUSD`, `stableDepositAddressKey`, `widgetConfig`). --- # Get widget session [Retrieve the session for a widget session ID] Retrieves the session for a widget session ID. Use it to check the state of a payment made through the widget. ## Import ```ts ``` ## Usage :::code-group ```ts [index.ts] const session = await getWidgetSession(config, "c165e159-1f0e-44a1-8fa8-8c963444752e"); ``` ```ts [config.ts] // [!include ~/snippets/config.ts] ``` ::: ## Parameters The unique identifier of the widget session. ## Return Type --- # Create session from widget [Create a Glide session from a widget session] Creates a Glide session from a widget session, with the user's chosen payment method and currency. Use it to build your own payment UI on top of widget sessions instead of using the pre-built widget. ## Import ```ts ``` ## Usage :::code-group ```ts [index.ts] const widgetSessionId = "c165e159-1f0e-44a1-8fa8-8c963444752e"; const userWalletAddress = "0xc6FfEB1298Eb33Da430d14e5Eb789256ec344625"; const session = await createSessionFromWidget(config, { sessionId: widgetSessionId, account: userWalletAddress, paymentMethod: "wallet", paymentCurrency: usdc.on(base), }); ``` ```ts [config.ts] // [!include ~/snippets/config.ts] ``` ::: ## Parameters
The unique identifier of the widget session, from `createWidgetSession`. The wallet address that will pay for the session. How the user pays: `wallet`, `transfer`, `coinbase_onramp`, `coinbase_app`, `moonpay`, `onramp`, or `onramper`. The currency the user pays with, in CAIP-19 format. When set to true and if supported by the payment currency, the user pays with a signature only, requiring no gas. Defaults to false. The amount to pay. Defaults to the amount configured on the widget session. When set to true, the widget session's `stableDepositAddressKey` is not applied, so a fresh deposit address is generated. The wallet address that owns the deposit. Used with transfer payments to attribute the deposit address to a specific user. Configuration for Glide-hosted payment pages. Contains an optional `appMetadata` object (`name`, `logoUrl`, `faviconUrl`) and an optional `theme` object with custom theme values.
## Return Type --- # Get session by widget session [Retrieve the Glide session associated with a widget session] Retrieves the Glide session that was created from a widget session — for example, via [`createSessionFromWidget`](/typescript/create-session-from-widget) or by the widget itself. ## Import ```ts ``` ## Usage :::code-group ```ts [index.ts] const session = await getSessionByWidgetSession( config, "c165e159-1f0e-44a1-8fa8-8c963444752e", ); ``` ```ts [config.ts] // [!include ~/snippets/config.ts] ``` ::: ## Parameters The unique identifier of the widget session. ## Return Type --- # Media Kit You can download the Glide media kit here. It contains the Glide logo in various formats. You can use the Glide logo in your dapp or wallet to attribute the payment option to Glide. [Download the Glide media kit here](https://static.buildwithglide.com/Glide_Media_Kit.zip) ---