# Claude Code setup Source: https://docs.bungee.exchange/ai-tools/claude-code Configure Claude Code for your documentation workflow Claude Code is Anthropic's official CLI tool. This guide will help you set up Claude Code to help you write and maintain your documentation. ## Prerequisites * Active Claude subscription (Pro, Max, or API access) ## Setup 1. Install Claude Code globally: ```bash theme={null} npm install -g @anthropic-ai/claude-code ``` 2. Navigate to your docs directory. 3. (Optional) Add the `CLAUDE.md` file below to your project. 4. Run `claude` to start. ## Create `CLAUDE.md` Create a `CLAUDE.md` file at the root of your documentation repository to train Claude Code on your specific documentation standards: ```markdown theme={null} # Mintlify documentation ## Working relationship - You can push back on ideas-this can lead to better documentation. Cite sources and explain your reasoning when you do so - ALWAYS ask for clarification rather than making assumptions - NEVER lie, guess, or make up information ## Project context - Format: MDX files with YAML frontmatter - Config: docs.json for navigation, theme, settings - Components: Mintlify components ## Content strategy - Document just enough for user success - not too much, not too little - Prioritize accuracy and usability of information - Make content evergreen when possible - Search for existing information before adding new content. Avoid duplication unless it is done for a strategic reason - Check existing patterns for consistency - Start by making the smallest reasonable changes ## Frontmatter requirements for pages - title: Clear, descriptive page title - description: Concise summary for SEO/navigation ## Writing standards - Second-person voice ("you") - Prerequisites at start of procedural content - Test all code examples before publishing - Match style and formatting of existing pages - Include both basic and advanced use cases - Language tags on all code blocks - Alt text on all images - Relative paths for internal links ## Git workflow - NEVER use --no-verify when committing - Ask how to handle uncommitted changes before starting - Create a new branch when no clear branch exists for changes - Commit frequently throughout development - NEVER skip or disable pre-commit hooks ## Do not - Skip frontmatter on any MDX file - Use absolute URLs for internal links - Include untested code examples - Make assumptions - always ask for clarification ``` # Cursor setup Source: https://docs.bungee.exchange/ai-tools/cursor Configure Cursor for your documentation workflow Use Cursor to help write and maintain your documentation. This guide shows how to configure Cursor for better results on technical writing tasks and using Mintlify components. ## Prerequisites * Cursor editor installed * Access to your documentation repository ## Project rules Create project rules that all team members can use. In your documentation repository root: ```bash theme={null} mkdir -p .cursor ``` Create `.cursor/rules.md`: ````markdown theme={null} # Mintlify technical writing rule You are an AI writing assistant specialized in creating exceptional technical documentation using Mintlify components and following industry-leading technical writing practices. ## Core writing principles ### Language and style requirements - Use clear, direct language appropriate for technical audiences - Write in second person ("you") for instructions and procedures - Use active voice over passive voice - Employ present tense for current states, future tense for outcomes - Avoid jargon unless necessary and define terms when first used - Maintain consistent terminology throughout all documentation - Keep sentences concise while providing necessary context - Use parallel structure in lists, headings, and procedures ### Content organization standards - Lead with the most important information (inverted pyramid structure) - Use progressive disclosure: basic concepts before advanced ones - Break complex procedures into numbered steps - Include prerequisites and context before instructions - Provide expected outcomes for each major step - Use descriptive, keyword-rich headings for navigation and SEO - Group related information logically with clear section breaks ### User-centered approach - Focus on user goals and outcomes rather than system features - Anticipate common questions and address them proactively - Include troubleshooting for likely failure points - Write for scannability with clear headings, lists, and white space - Include verification steps to confirm success ## Mintlify component reference ### Callout components #### Note - Additional helpful information Supplementary information that supports the main content without interrupting flow #### Tip - Best practices and pro tips Expert advice, shortcuts, or best practices that enhance user success #### Warning - Important cautions Critical information about potential issues, breaking changes, or destructive actions #### Info - Neutral contextual information Background information, context, or neutral announcements #### Check - Success confirmations Positive confirmations, successful completions, or achievement indicators ### Code components #### Single code block Example of a single code block: ```javascript config.js const apiConfig = { baseURL: 'https://api.example.com', timeout: 5000, headers: { 'Authorization': `Bearer ${process.env.API_TOKEN}` } }; ``` #### Code group with multiple languages Example of a code group: ```javascript Node.js const response = await fetch('/api/endpoint', { headers: { Authorization: `Bearer ${apiKey}` } }); ``` ```python Python import requests response = requests.get('/api/endpoint', headers={'Authorization': f'Bearer {api_key}'}) ``` ```curl cURL curl -X GET '/api/endpoint' \ -H 'Authorization: Bearer YOUR_API_KEY' ``` #### Request/response examples Example of request/response documentation: ```bash cURL curl -X POST 'https://api.example.com/users' \ -H 'Content-Type: application/json' \ -d '{"name": "John Doe", "email": "john@example.com"}' ``` ```json Success { "id": "user_123", "name": "John Doe", "email": "john@example.com", "created_at": "2024-01-15T10:30:00Z" } ``` ### Structural components #### Steps for procedures Example of step-by-step instructions: Run `npm install` to install required packages. Verify installation by running `npm list`. Create a `.env` file with your API credentials. ```bash API_KEY=your_api_key_here ``` Never commit API keys to version control. #### Tabs for alternative content Example of tabbed content: ```bash brew install node npm install -g package-name ``` ```powershell choco install nodejs npm install -g package-name ``` ```bash sudo apt install nodejs npm npm install -g package-name ``` #### Accordions for collapsible content Example of accordion groups: - **Firewall blocking**: Ensure ports 80 and 443 are open - **Proxy configuration**: Set HTTP_PROXY environment variable - **DNS resolution**: Try using 8.8.8.8 as DNS server ```javascript const config = { performance: { cache: true, timeout: 30000 }, security: { encryption: 'AES-256' } }; ``` ### Cards and columns for emphasizing information Example of cards and card groups: Complete walkthrough from installation to your first API call in under 10 minutes. Learn how to authenticate requests using API keys or JWT tokens. Understand rate limits and best practices for high-volume usage. ### API documentation components #### Parameter fields Example of parameter documentation: Unique identifier for the user. Must be a valid UUID v4 format. User's email address. Must be valid and unique within the system. Maximum number of results to return. Range: 1-100. Bearer token for API authentication. Format: `Bearer YOUR_API_KEY` #### Response fields Example of response field documentation: Unique identifier assigned to the newly created user. ISO 8601 formatted timestamp of when the user was created. List of permission strings assigned to this user. #### Expandable nested fields Example of nested field documentation: Complete user object with all associated data. User profile information including personal details. User's first name as entered during registration. URL to user's profile picture. Returns null if no avatar is set. ### Media and advanced components #### Frames for images Wrap all images in frames: Main dashboard showing analytics overview Analytics dashboard with charts #### Videos Use the HTML video element for self-hosted video content: Embed YouTube videos using iframe elements: #### Tooltips Example of tooltip usage: API #### Updates Use updates for changelogs: ## New features - Added bulk user import functionality - Improved error messages with actionable suggestions ## Bug fixes - Fixed pagination issue with large datasets - Resolved authentication timeout problems ## Required page structure Every documentation page must begin with YAML frontmatter: ```yaml --- title: "Clear, specific, keyword-rich title" description: "Concise description explaining page purpose and value" --- ``` ## Content quality standards ### Code examples requirements - Always include complete, runnable examples that users can copy and execute - Show proper error handling and edge case management - Use realistic data instead of placeholder values - Include expected outputs and results for verification - Test all code examples thoroughly before publishing - Specify language and include filename when relevant - Add explanatory comments for complex logic - Never include real API keys or secrets in code examples ### API documentation requirements - Document all parameters including optional ones with clear descriptions - Show both success and error response examples with realistic data - Include rate limiting information with specific limits - Provide authentication examples showing proper format - Explain all HTTP status codes and error handling - Cover complete request/response cycles ### Accessibility requirements - Include descriptive alt text for all images and diagrams - Use specific, actionable link text instead of "click here" - Ensure proper heading hierarchy starting with H2 - Provide keyboard navigation considerations - Use sufficient color contrast in examples and visuals - Structure content for easy scanning with headers and lists ## Component selection logic - Use **Steps** for procedures and sequential instructions - Use **Tabs** for platform-specific content or alternative approaches - Use **CodeGroup** when showing the same concept in multiple programming languages - Use **Accordions** for progressive disclosure of information - Use **RequestExample/ResponseExample** specifically for API endpoint documentation - Use **ParamField** for API parameters, **ResponseField** for API responses - Use **Expandable** for nested object properties or hierarchical information ```` # Windsurf setup Source: https://docs.bungee.exchange/ai-tools/windsurf Configure Windsurf for your documentation workflow Configure Windsurf's Cascade AI assistant to help you write and maintain documentation. This guide shows how to set up Windsurf specifically for your Mintlify documentation workflow. ## Prerequisites * Windsurf editor installed * Access to your documentation repository ## Workspace rules Create workspace rules that provide Windsurf with context about your documentation project and standards. Create `.windsurf/rules.md` in your project root: ````markdown theme={null} # Mintlify technical writing rule ## Project context - This is a documentation project on the Mintlify platform - We use MDX files with YAML frontmatter - Navigation is configured in `docs.json` - We follow technical writing best practices ## Writing standards - Use second person ("you") for instructions - Write in active voice and present tense - Start procedures with prerequisites - Include expected outcomes for major steps - Use descriptive, keyword-rich headings - Keep sentences concise but informative ## Required page structure Every page must start with frontmatter: ```yaml --- title: "Clear, specific title" description: "Concise description for SEO and navigation" --- ``` ## Mintlify components ### Callouts - `` for helpful supplementary information - `` for important cautions and breaking changes - `` for best practices and expert advice - `` for neutral contextual information - `` for success confirmations ### Code examples - When appropriate, include complete, runnable examples - Use `` for multiple language examples - Specify language tags on all code blocks - Include realistic data, not placeholders - Use `` and `` for API docs ### Procedures - Use `` component for sequential instructions - Include verification steps with `` components when relevant - Break complex procedures into smaller steps ### Content organization - Use `` for platform-specific content - Use `` for progressive disclosure - Use `` and `` for highlighting content - Wrap images in `` components with descriptive alt text ## API documentation requirements - Document all parameters with `` - Show response structure with `` - Include both success and error examples - Use `` for nested object properties - Always include authentication examples ## Quality standards - Test all code examples before publishing - Use relative paths for internal links - Include alt text for all images - Ensure proper heading hierarchy (start with h2) - Check existing patterns for consistency ```` # Build Manual transaction Source: https://docs.bungee.exchange/api-reference/core-api/build-manual-transaction https://public-backend.bungee.exchange/swagger-json get /api/v1/bungee/build-tx # Get Bungee quote Source: https://docs.bungee.exchange/api-reference/core-api/get-bungee-quote https://public-backend.bungee.exchange/swagger-json get /api/v1/bungee/quote # Get Bungee transaction history Source: https://docs.bungee.exchange/api-reference/core-api/get-bungee-transaction-history https://public-backend.bungee.exchange/swagger-json get /api/v1/bungee-auto/history # Get Request status Source: https://docs.bungee.exchange/api-reference/core-api/get-request-status https://public-backend.bungee.exchange/swagger-json get /api/v1/bungee/status # Submit request (Auto) Source: https://docs.bungee.exchange/api-reference/core-api/submit-request-auto https://public-backend.bungee.exchange/swagger-json post /api/v1/bungee/submit # Get all supported chains Source: https://docs.bungee.exchange/api-reference/supported-chains/get-all-supported-chains https://public-backend.bungee.exchange/swagger-json get /api/v1/supported-chains # Get token list Source: https://docs.bungee.exchange/api-reference/token/get-token-list https://public-backend.bungee.exchange/swagger-json get /api/v1/tokens/list # Search or import tokens Source: https://docs.bungee.exchange/api-reference/token/search-or-import-tokens https://public-backend.bungee.exchange/swagger-json get /api/v1/tokens/search # Migrate to Tempo Source: https://docs.bungee.exchange/for-agents/fund-tempo Migrate funds from any EVM chain to Tempo so your agent can start transacting. Tempo is a chain purpose-built for autonomous agents. To get started, your agent needs funds on Tempo. Bungee handles the migration — any token from any supported EVM chain arrives as USDC.E on Tempo. ## Get the skill The `fund-tempo` skill gives your agent everything it needs to migrate funds to a Tempo wallet: balance checks, deposit quotes, transaction execution, and status tracking. ```bash theme={null} curl https://docs.bungee.exchange/for-agents/fund-tempo.md ``` ````markdown theme={null} --- name: fund-tempo description: "Use when the user wants to fund a Tempo wallet, bridge tokens to Tempo, top up Tempo, move assets to Tempo, or exit to Tempo from any EVM chain. Also matches: migrate to Tempo, transfer to Tempo, deposit to Tempo." --- # fund-tempo Bridge tokens from any EVM chain to a Tempo wallet. All tokens arrive as USDC.E on Tempo. Powered by Bungee. Tempo chain ID is `4217`. USDC.E on Tempo is `0x20c000000000000000000000b9537d11c60e8b50`. ## Step 1: Get the Tempo wallet address Run this to get the user's Tempo wallet address: ``` tempo wallet whoami ``` Use the returned address as `receiverAddress` in the quote request. This is the address that will receive USDC.E on Tempo. ## Step 2: Check what the user has Ask the user for their wallet address on the origin chain, then check their balances: ``` GET https://public-backend.bungee.exchange/api/v1/tokens/list?userAddress=0xUSER_ADDRESS ``` This returns all tokens with balances across all chains. Use this to confirm what the user has and on which chain. ## Step 3: Get a deposit quote ``` GET https://public-backend.bungee.exchange/api/v1/bungee/quote?originChainId=ORIGIN_CHAIN&destinationChainId=4217&inputAmount=AMOUNT&inputToken=INPUT_TOKEN&outputToken=0x20c000000000000000000000b9537d11c60e8b50&receiverAddress=TEMPO_ADDRESS&refundAddress=USER_ADDRESS&enableDepositAddress=true ``` - `originChainId`: the chain the user's tokens are on - `inputToken`: the token address on that chain - `outputToken`: always `0x20c000000000000000000000b9537d11c60e8b50` (USDC.E on Tempo) - `inputAmount`: amount in the token's smallest unit (e.g. 6 decimals for USDC, so `100000000` = 100 USDC) - `receiverAddress`: the user's Tempo wallet address - `refundAddress`: the user's address on the origin chain - `enableDepositAddress`: always `true` Important: Check the tempo wallet address via `tempo wallet whoami`. and use that for the `receiverAddress`. **Common USDC examples:** - 100 USDC from Base: `originChainId=8453&inputToken=0x833589fcd6edb6e08f4c7c32d4f71b54bda02913&inputAmount=100000000` - 100 USDC from Arbitrum: `originChainId=42161&inputToken=0xaf88d065e77c8cc2239327c5edb3a432268e5831&inputAmount=100000000` - 100 USDC from Ethereum: `originChainId=1&inputToken=0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48&inputAmount=100000000` - 100 USDC from Optimism: `originChainId=10&inputToken=0x0b2c639c533813f4aa9d7837caf62653d097ff85&inputAmount=100000000` - 100 USDC from Polygon: `originChainId=137&inputToken=0x3c499c542cef5e3811e1192ce70d8cc03d5c3359&inputAmount=100000000` ## Step 4: Present deposit instructions From the response, present clearly to the user: - **Amount**: convert `deposit.depositData.amount` to human-readable using `result.input.token.decimals` - **Token**: `result.input.token.symbol` - **Send to**: `deposit.depositData.address` - **On chain**: `deposit.depositData.chainId` - **You will receive**: `deposit.output.effectiveAmount` converted with `deposit.output.token.decimals` USDC.E on Tempo - **Your Tempo wallet address**: `deposit.depositData.receiverAddress` - **Estimated time**: `deposit.estimatedTime` seconds - **Track**: `https://socketscan.io/tx/{deposit.requestHash}` If the agent has wallet access, submit `deposit.txData` as a transaction instead. ## Step 5: Track status ``` GET https://public-backend.bungee.exchange/api/v1/bungee/status?requestHash=REQUEST_HASH ``` Status `3` or `4` = completed. Status `5`, `6`, or `7` = failed. Poll every 10 seconds. ## Notes - Always use `enableDepositAddress=true`. - `refundAddress` is required. Use the user's address on the origin chain. - Amounts are in smallest units (6 decimals for USDC: 1 USDC = 1000000). - Tempo has no native gas token. Gas fees are paid in the user's chosen fee token. ```` ## What the skill does 1. **Gets the Tempo wallet address** via `tempo wallet whoami`. 2. **Checks balances** across all chains for the user's wallet. 3. **Gets a deposit quote** to bridge tokens to Tempo (chain `4217`). 4. **Executes the transfer** programmatically or displays deposit instructions. 5. **Tracks status** until the funds arrive as USDC.E on Tempo. All tokens are converted to USDC.E on arrival. Your agent can bridge ETH, USDC, USDT, or any supported token from any EVM chain. ## Learn more * [Deposit address flow](/integrate/integration-guides/deposit) for the full deposit API reference * [For Agents](/for-agents/intro) for other machine-readable resources # For Agents Source: https://docs.bungee.exchange/for-agents/intro Use Bungee docs from coding agents and other LLM-powered tools. If you are using Bungee from a coding agent or automation workflow, start with the machine-readable files. If you were looking for `skills.md`, Bungee exposes this file as [`skill.md`](https://docs.bungee.exchange/skill.md). **Best for agent planning and tool selection.** A structured capability summary of what Bungee can do, what inputs it needs, and what constraints apply. Start here. ```bash theme={null} curl https://docs.bungee.exchange/skill.md ``` **Best for fast discovery.** A map of documentation pages and descriptions. Use this to find the right page before loading full docs. ```bash theme={null} curl https://docs.bungee.exchange/llms.txt ``` **Best for single-shot grounding.** The entire docs site combined into one text file for broad context in a single fetch. ```bash theme={null} curl https://docs.bungee.exchange/llms-full.txt ``` ## Recommended order 1. Load [`skill.md`](https://docs.bungee.exchange/skill.md) to understand the Bungee capability surface. 2. Load [`llms.txt`](https://docs.bungee.exchange/llms.txt) to find the most relevant integration pages. 3. Fetch the specific pages you need, or use [`llms-full.txt`](https://docs.bungee.exchange/llms-full.txt) if your tool can handle the larger context window. ## Using skills-compatible tooling If your agent supports the Skills CLI, you can add Bungee directly from the docs domain: ```bash theme={null} npx skills add https://docs.bungee.exchange ``` After that, use the regular integration guides for implementation details such as [Permit2 integration](/integrate/integration-guides/auto-erc20-permit2), and [onchain requests](/integrate/integration-guides/auto-onchain-requests). # Bungee Docs Source: https://docs.bungee.exchange/index Explore guides and examples to integrate Bungee swaps into your application
Bungee Bungee

Understand Bungee.
Build faster.

Learn the product, then move into APIs, widgets, and routing guides for cross-chain swaps, bridges, and deposit flows.

Create credentials and start integrating. Use the widget for the quickest embed. Use Bungee docs from coding agents and other LLM-powered tools.

Resources

Get help when you hit integration or product questions. Download logos, brand assets, and design resources. Inspect the raw API schema when you need the reference directly.
# Bungee Link Source: https://docs.bungee.exchange/integrate/bungee-link Redirect users to Bungee with chain/tokens for bridging pre-selected. The bridging amount can also be pre-selected. Users then simply need to choose a route & start bridging with 2 clicks! You can link Bungee in your DApp and pass URL params to specify which chains/tokens should be pre-selected for bridging. The parameters are highlighted below: | Parameter | Description | | -------------------- | -------------------------------------- | | `originChainId` | Chain ID of sending chain | | `inputToken` | Address of sending token | | `destinationChainId` | Chain ID of destination chain | | `outputToken` | Address of destination receiving token | ### Examples:[​](#examples "Direct link to Examples:") * ETH from Ethereum to USDC on Optimism: ``` https://bungee.exchange/?originChainId=1&inputToken=0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee&destinationChainId=10&outputToken=0x0b2c639c533813f4aa9d7837caf62653d097ff85 ``` * USDC from Polygon to Aave on Arbitrum: ``` https://bungee.exchange/?originChainId=137&inputToken=0x3c499c542cef5e3811e1192ce70d8cc03d5c3359&destinationChainId=42161&outputToken=0xba5ddd1f9d7f570dc94a51479a000e3bce967196 ``` ### Integration Tips[​](#integration-tips "Direct link to Integration Tips") * For native tokens (ETH, POL, etc.), use the address `0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee` * Chain IDs follow the standard EVM chain ID format (e.g., 1 for Ethereum, 10 for Optimism) # Bungee Widget Source: https://docs.bungee.exchange/integrate/bungee-widget Bungee Widget is a powerful React widget that enables seamless token swaps and bridging across multiple blockchains. It can be quickly integrated into any modern web app, giving your users the full bridging UX from within your app. Bungee Widget can be integrated quickly to add swaps and bridging features to any web app. ## Why Use Bungee Widget?[​](#why-use-bungee-widget "Direct link to Why Use Bungee Widget?") * Swaps & bridging in one component * Customizable appearance & configuration * Integrates easily with wallet connection solutions * Fully up-to-date on [npm](https://www.npmjs.com/package/@socket.tech/bungee) ## Quick Integration Guide[​](#quick-integration-guide "Direct link to Quick Integration Guide") For the full implementation details, advanced usage, and examples—including configuration, theming, and customization options—always refer to the [npm README](https://www.npmjs.com/package/@socket.tech/bungee). ### 1. Install the package[​](#1-install-the-package "Direct link to 1. Install the package") ``` npm install @socket.tech/bungee ``` ### 2. Basic Usage[​](#2-basic-usage "Direct link to 2. Basic Usage") ```typescript theme={null} import { Bungee, type BungeeConfig } from "@socket.tech/bungee"; const config: BungeeConfig = { apiKey: "your-api-key-here", }; export default function App() { return ; } ``` ## More Resources & Support[​](#more-resources--support "Direct link to More Resources & Support") Refer to the package README for comprehensive integration guidance: * Installation steps and peer dependencies * Importing and usage in your React app * Theming and configuration options * Event and imperative APIs * TypeScript types & advanced customization # Contract Addresses Source: https://docs.bungee.exchange/integrate/contract-addresses Reference the latest Bungee contract addresses for each supported network. This file has been auto-generated on 2026-04-10 # Contract Addresses Scroll through the list below to find the contract addresses for each network.
| name | address | | -------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | | AcrossImpl | 0x9951846aC51102F7082128558a6F6759E9382b43
[see in explorer](https://arbiscan.io/address/0x9951846aC51102F7082128558a6F6759E9382b43) | | AcrossImplV3 | 0x740EA79e2FccDDB4eE8bB8Fc8ccAC5eb6dFa0b40
[see in explorer](https://arbiscan.io/address/0x740EA79e2FccDDB4eE8bB8Fc8ccAC5eb6dFa0b40) | | AcrossStakedRoute AUTO | 0x125ac5a530ece0a06dd3cd3da711c054eadb57b9
[see in explorer](https://arbiscan.io/address/0x125ac5a530ece0a06dd3cd3da711c054eadb57b9) | | AcrossV3WethUnwrapper | 0x36f0B62E4eE3d30939cBccABA9D983579799D931
[see in explorer](https://arbiscan.io/address/0x36f0B62E4eE3d30939cBccABA9D983579799D931) | | AnyswapL2Impl | 0x09BBE4DacBf631994F2f1b70c1B18d62c19466E6
[see in explorer](https://arbiscan.io/address/0x09BBE4DacBf631994F2f1b70c1B18d62c19466E6) | | AnyswapV6L2Impl | 0xC6415B61f0459331261516F463a3Ea9E473015d0
[see in explorer](https://arbiscan.io/address/0xC6415B61f0459331261516F463a3Ea9E473015d0) | | BungeeDepository AUTO | 0xa6cd293ba20873b3cbbbf78f156a1d56d8ab9347
[see in explorer](https://arbiscan.io/address/0xa6cd293ba20873b3cbbbf78f156a1d56d8ab9347) | | BungeeGateway AUTO | 0xCdEa28Ee7BD5bf7710B294d9391e1b6A318d809a
[see in explorer](https://arbiscan.io/address/0xCdEa28Ee7BD5bf7710B294d9391e1b6A318d809a) | | BungeeInbox AUTO | 0x5e0f8e7337c8955d2124b8e85ca74af884b3e124
[see in explorer](https://arbiscan.io/address/0x5e0f8e7337c8955d2124b8e85ca74af884b3e124) | | BungeeInboxOld AUTO | 0xA3BF43451CdEb6DEC588B8833838fC419CE4F54c
[see in explorer](https://arbiscan.io/address/0xA3BF43451CdEb6DEC588B8833838fC419CE4F54c) | | CalldataExecutor AUTO | 0xa873aab6a98cb764ad6d52820d129d0e3667d9f9
[see in explorer](https://arbiscan.io/address/0xa873aab6a98cb764ad6d52820d129d0e3667d9f9) | | CctpImpl | 0x3a9140d872778eC3837Bb996683038532DA2AF19
[see in explorer](https://arbiscan.io/address/0x3a9140d872778eC3837Bb996683038532DA2AF19) | | CCTPRouterSingleOutput AUTO | 0x3b4817827d06600f92296c5d1491818d69fc955f
[see in explorer](https://arbiscan.io/address/0x3b4817827d06600f92296c5d1491818d69fc955f) | | CctpV2Impl | 0x2a6dcEc445Ac3B9F9111605857eCEA4E9baf9b3f
[see in explorer](https://arbiscan.io/address/0x2a6dcEc445Ac3B9F9111605857eCEA4E9baf9b3f) | | CCTPV2RouterSingleOutput AUTO | 0x6faec2944071b2a5ebfd1b08f43f29597aad8ca1
[see in explorer](https://arbiscan.io/address/0x6faec2944071b2a5ebfd1b08f43f29597aad8ca1) | | CelerImpl | 0x4E7f21d92b70fCBBcB6AFCb8Bf59420622c158B3
[see in explorer](https://arbiscan.io/address/0x4E7f21d92b70fCBBcB6AFCb8Bf59420622c158B3) | | CelerStakedRoute AUTO | 0xf1c07b6dddc480602d0304c31e6b13ff711b5828
[see in explorer](https://arbiscan.io/address/0xf1c07b6dddc480602d0304c31e6b13ff711b5828) | | CelerStorageWrapper | 0x1768C1D2900f1408D44FbB1EdCc306F94aF852ae
[see in explorer](https://arbiscan.io/address/0x1768C1D2900f1408D44FbB1EdCc306F94aF852ae) | | CelerV2Impl | 0xAE39460140D6307c83592b5501F406c49e886277
[see in explorer](https://arbiscan.io/address/0xAE39460140D6307c83592b5501F406c49e886277) | | ConnextImpl | 0x4f2b1fbb51bdFE1471B3De6E88c909e77C042B61
[see in explorer](https://arbiscan.io/address/0x4f2b1fbb51bdFE1471B3De6E88c909e77C042B61) | | DisabledSocketRoute | 0x0f34A522FF82151c90679b73211955068FD854F1
[see in explorer](https://arbiscan.io/address/0x0f34A522FF82151c90679b73211955068FD854F1) | | Entrypoint AUTO | 0xdF5F746C18D367Ff9641656b355d54903DE1B2A9
[see in explorer](https://arbiscan.io/address/0xdF5F746C18D367Ff9641656b355d54903DE1B2A9) | | FeeCollector AUTO | 0xf791765B58270Eb6DabFf00D9E3bcD8c0C0567a3
[see in explorer](https://arbiscan.io/address/0xf791765B58270Eb6DabFf00D9E3bcD8c0C0567a3) | | FeesTakerController | 0xb3f1271c809fF47767205851E7334407354A862F
[see in explorer](https://arbiscan.io/address/0xb3f1271c809fF47767205851E7334407354A862F) | | GenericStakedRoute AUTO | 0x5013c0b3defd8f832d1b6dec750382946de5c13b
[see in explorer](https://arbiscan.io/address/0x5013c0b3defd8f832d1b6dec750382946de5c13b) | | HopCctpImpl | 0xFd010e8C1005FB5f0b9Bce7c86fA78734A4F6575
[see in explorer](https://arbiscan.io/address/0xFd010e8C1005FB5f0b9Bce7c86fA78734A4F6575) | | HopImplL2 | 0x2d0EeB574cC98f6d57c72FFe730D5C8a8f2eac37
[see in explorer](https://arbiscan.io/address/0x2d0EeB574cC98f6d57c72FFe730D5C8a8f2eac37) | | HopImplL2V2 | 0xfEfFE1D89542C111845648a107811Fb272EaE0Da
[see in explorer](https://arbiscan.io/address/0xfEfFE1D89542C111845648a107811Fb272EaE0Da) | | HyphenImpl | 0x653a03b511E6FE9e80eeCb2bBbD36DCaf93cF147
[see in explorer](https://arbiscan.io/address/0x653a03b511E6FE9e80eeCb2bBbD36DCaf93cF147) | | KyberSwapImpl | 0x59057Df54637e716614fF11b54eeB74257CEb2fc
[see in explorer](https://arbiscan.io/address/0x59057Df54637e716614fF11b54eeB74257CEb2fc) | | MagpieSwapImpl | 0x67cFfb3A94EDDbd50a475136c4ADB1340DE2B346
[see in explorer](https://arbiscan.io/address/0x67cFfb3A94EDDbd50a475136c4ADB1340DE2B346) | | MayanBridgeImpl | 0xbBCe84e3418493d03C83973c06A9d2c8f4B0e3b1
[see in explorer](https://arbiscan.io/address/0xbBCe84e3418493d03C83973c06A9d2c8f4B0e3b1) | | MayanBridgeImplV2 | 0x0E1E7Dad45c0baF66956d0b9D82a29129a85FA0A
[see in explorer](https://arbiscan.io/address/0x0E1E7Dad45c0baF66956d0b9D82a29129a85FA0A) | | OneInchImpl | 0x27D6c81b2688F28D8ffF55940CDBb8B5b3A0Ed0f
[see in explorer](https://arbiscan.io/address/0x27D6c81b2688F28D8ffF55940CDBb8B5b3A0Ed0f) | | RainbowSwapImpl | 0x85FddF7450B9E9b3f97C91316cF4e731a3220F6B
[see in explorer](https://arbiscan.io/address/0x85FddF7450B9E9b3f97C91316cF4e731a3220F6B) | | RefuelBridgeImpl | 0xBAde7653492f1a70c3725EdeB2D28F3C84369809
[see in explorer](https://arbiscan.io/address/0xBAde7653492f1a70c3725EdeB2D28F3C84369809) | | RefuelSwapAndBridgeController | 0xFC42BcAA16a54e7E48D0c39e4713dC5923BD551D
[see in explorer](https://arbiscan.io/address/0xFC42BcAA16a54e7E48D0c39e4713dC5923BD551D) | | RFQRouterSingleOutput AUTO | 0xc4088d6e5a2027e784efc0491c322a3e2621bd9e
[see in explorer](https://arbiscan.io/address/0xc4088d6e5a2027e784efc0491c322a3e2621bd9e) | | SingleOutputRequestImpl AUTO | 0xac7615255677f28B09DA637714E45Ffb5fE76B58
[see in explorer](https://arbiscan.io/address/0xac7615255677f28B09DA637714E45Ffb5fE76B58) | | SocketDeployFactory | 0x71630095e3F08A86aFC73f7b07342192adf39C55
[see in explorer](https://arbiscan.io/address/0x71630095e3F08A86aFC73f7b07342192adf39C55) | | SocketGateway | 0x3a23F943181408EAC424116Af7b7790c94Cb97a5
[see in explorer](https://arbiscan.io/address/0x3a23F943181408EAC424116Af7b7790c94Cb97a5) | | Solver AUTO | 0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042
[see in explorer](https://arbiscan.io/address/0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042) | | StakedRouterExecutor AUTO | 0x12efda5e4d410c5da723ceb7e43942779e3fe49b
[see in explorer](https://arbiscan.io/address/0x12efda5e4d410c5da723ceb7e43942779e3fe49b) | | StakedRouterReceiver AUTO | 0x5d84f33b7c9214df23fd86a0861ac923af99954d
[see in explorer](https://arbiscan.io/address/0x5d84f33b7c9214df23fd86a0861ac923af99954d) | | StakedRouterSingleOutput AUTO | 0x167d49f106bbea59587ef3c63b33e6a421af1b8d
[see in explorer](https://arbiscan.io/address/0x167d49f106bbea59587ef3c63b33e6a421af1b8d) | | StargateImplL2 | 0x6e520F25E66450397d02ece0166edaF46c9BF28b
[see in explorer](https://arbiscan.io/address/0x6e520F25E66450397d02ece0166edaF46c9BF28b) | | StargateImplL2V2 | 0xE485d8c074E02Ae762D849D261BBF4D692AF66a6
[see in explorer](https://arbiscan.io/address/0xE485d8c074E02Ae762D849D261BBF4D692AF66a6) | | StargateImplV2 | 0xBf6fa3f58113139E7437dA5dcCE1CB005DA387f3
[see in explorer](https://arbiscan.io/address/0xBf6fa3f58113139E7437dA5dcCE1CB005DA387f3) | | StargateReceiver | 0x445C6E5E5347590Bc855d2178DE8A4642261DcCF
[see in explorer](https://arbiscan.io/address/0x445C6E5E5347590Bc855d2178DE8A4642261DcCF) | | StargateReceiverTest | 0x926Dbc695BeAA3E78643883e066d65F0709Bc6dE
[see in explorer](https://arbiscan.io/address/0x926Dbc695BeAA3E78643883e066d65F0709Bc6dE) | | SuperBridgeImpl | 0x072c90625c9f3932C243EB4d0AfaA26662650AC8
[see in explorer](https://arbiscan.io/address/0x072c90625c9f3932C243EB4d0AfaA26662650AC8) | | SwapExecutor AUTO | 0x0DF289D53fC45f20044b793cEDBB228928953F4B
[see in explorer](https://arbiscan.io/address/0x0DF289D53fC45f20044b793cEDBB228928953F4B) | | SwapRequestCallback AUTO | 0x4682e8315B80cF757e2077280E0471729c992Ed3
[see in explorer](https://arbiscan.io/address/0x4682e8315B80cF757e2077280E0471729c992Ed3) | | SwapRequestImpl AUTO | 0x5f2295051cC021e8DE247DC052B8CE4429D73E7F
[see in explorer](https://arbiscan.io/address/0x5f2295051cC021e8DE247DC052B8CE4429D73E7F) | | SwitchboardPlug AUTO | 0x8EAeE07f8FFF38695708be900c1F9aacFB8b3C09
[see in explorer](https://arbiscan.io/address/0x8EAeE07f8FFF38695708be900c1F9aacFB8b3C09) | | SwitchboardRouter AUTO | 0x3C54883Ce0d86b3abB26A63744bEb853Ea99a403
[see in explorer](https://arbiscan.io/address/0x3C54883Ce0d86b3abB26A63744bEb853Ea99a403) | | SymbiosisBridgeImpl | 0x1Ae456dD12CE646EbeDDc5541787a93094963a1f
[see in explorer](https://arbiscan.io/address/0x1Ae456dD12CE646EbeDDc5541787a93094963a1f) | | SynapseBridgeImpl | 0x978dC2A6d51769867e7eC893459bCe68E83b7661
[see in explorer](https://arbiscan.io/address/0x978dC2A6d51769867e7eC893459bCe68E83b7661) | | UniswapV3Impl | 0x44abeb2B4dC28712fFf5dD3B94A9be503b0ED59E
[see in explorer](https://arbiscan.io/address/0x44abeb2B4dC28712fFf5dD3B94A9be503b0ED59E) | | UnwrapAndForward AUTO | 0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad
[see in explorer](https://arbiscan.io/address/0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad) | | WrappedTokenSwapperImpl | 0x2B8A6e6Db1f65ddf44586fc1f881e83b8FfB8ec8
[see in explorer](https://arbiscan.io/address/0x2B8A6e6Db1f65ddf44586fc1f881e83b8FfB8ec8) | | ZeroXSwapImpl | 0x84502e430b8Fc064756d3034ad303d1456D23bfe
[see in explorer](https://arbiscan.io/address/0x84502e430b8Fc064756d3034ad303d1456D23bfe) | | ZeroxV2SwapImpl | 0xF472FbAC2DFd555E3674EB50eFDD9da51da7f2A0
[see in explorer](https://arbiscan.io/address/0xF472FbAC2DFd555E3674EB50eFDD9da51da7f2A0) | | ZeroxV2Wrapper AUTO | 0x05b108fD88d042eF0145DCcd564DCd6471852FC2
[see in explorer](https://arbiscan.io/address/0x05b108fD88d042eF0145DCcd564DCd6471852FC2) |
| name | address | | ----------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | | CelerImpl | 0x5CddbecAF8603E5e0bC771A46D48e148593351eA
[see in explorer](https://aurorascan.dev/address/0x5CddbecAF8603E5e0bC771A46D48e148593351eA) | | CelerStorageWrapper | 0x2d0EeB574cC98f6d57c72FFe730D5C8a8f2eac37
[see in explorer](https://aurorascan.dev/address/0x2d0EeB574cC98f6d57c72FFe730D5C8a8f2eac37) | | CelerV2Impl | 0x3E2D2ed0FB483d76e54850014D73AfCeA42263fB
[see in explorer](https://aurorascan.dev/address/0x3E2D2ed0FB483d76e54850014D73AfCeA42263fB) | | DisabledSocketRoute | 0x0f34A522FF82151c90679b73211955068FD854F1
[see in explorer](https://aurorascan.dev/address/0x0f34A522FF82151c90679b73211955068FD854F1) | | FeesTakerController | 0x555118B2aF4b6e2027cF766FB5a0Aa6a77e8ED8a
[see in explorer](https://aurorascan.dev/address/0x555118B2aF4b6e2027cF766FB5a0Aa6a77e8ED8a) | | OneInchImpl | 0x0Adf13F9Eb24b56b641fE2112854CE2B78C11c1a
[see in explorer](https://aurorascan.dev/address/0x0Adf13F9Eb24b56b641fE2112854CE2B78C11c1a) | | RefuelBridgeImpl | 0x8F22b246e2d380f5F5786dE28847BE17ACaAA2B8
[see in explorer](https://aurorascan.dev/address/0x8F22b246e2d380f5F5786dE28847BE17ACaAA2B8) | | RefuelSwapAndBridgeController | 0x653a03b511E6FE9e80eeCb2bBbD36DCaf93cF147
[see in explorer](https://aurorascan.dev/address/0x653a03b511E6FE9e80eeCb2bBbD36DCaf93cF147) | | SocketDeployFactory | 0x71630095e3F08A86aFC73f7b07342192adf39C55
[see in explorer](https://aurorascan.dev/address/0x71630095e3F08A86aFC73f7b07342192adf39C55) | | SocketGateway | 0x3a23F943181408EAC424116Af7b7790c94Cb97a5
[see in explorer](https://aurorascan.dev/address/0x3a23F943181408EAC424116Af7b7790c94Cb97a5) | | SynapseBridgeImpl | 0xA32609F188d896F527Aa67384079B944639D8135
[see in explorer](https://aurorascan.dev/address/0xA32609F188d896F527Aa67384079B944639D8135) |
| name | address | | -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | | AnyswapL2Impl | 0x09BBE4DacBf631994F2f1b70c1B18d62c19466E6
[see in explorer](https://snowtrace.io/address/0x09BBE4DacBf631994F2f1b70c1B18d62c19466E6) | | AnyswapV6L2Impl | 0x5Cb5A509beD96B2d168DC8aD85736B0b90da8473
[see in explorer](https://snowtrace.io/address/0x5Cb5A509beD96B2d168DC8aD85736B0b90da8473) | | BungeeDepository AUTO | 0xa6cd293ba20873b3cbbbf78f156a1d56d8ab9347
[see in explorer](https://snowtrace.io/address/0xa6cd293ba20873b3cbbbf78f156a1d56d8ab9347) | | BungeeGateway AUTO | 0xfe191a43dc4F3d57d7D942717D259005967e4e0D
[see in explorer](https://snowtrace.io/address/0xfe191a43dc4F3d57d7D942717D259005967e4e0D) | | BungeeInbox AUTO | 0x5e0f8e7337c8955d2124b8e85ca74af884b3e124
[see in explorer](https://snowtrace.io/address/0x5e0f8e7337c8955d2124b8e85ca74af884b3e124) | | BungeeInboxOld AUTO | 0xEd69eD4Bcdf4cd5E590f383853d73e93Cc383681
[see in explorer](https://snowtrace.io/address/0xEd69eD4Bcdf4cd5E590f383853d73e93Cc383681) | | CalldataExecutor AUTO | 0xa873aab6a98cb764ad6d52820d129d0e3667d9f9
[see in explorer](https://snowtrace.io/address/0xa873aab6a98cb764ad6d52820d129d0e3667d9f9) | | CctpImpl | 0xC6415B61f0459331261516F463a3Ea9E473015d0
[see in explorer](https://snowtrace.io/address/0xC6415B61f0459331261516F463a3Ea9E473015d0) | | CCTPRouterSingleOutput AUTO | 0x3b4817827d06600f92296c5d1491818d69fc955f
[see in explorer](https://snowtrace.io/address/0x3b4817827d06600f92296c5d1491818d69fc955f) | | CctpV2Impl | 0x65fEABBcfBc796Ee3d8bF1aDd02963468F3Eb8C2
[see in explorer](https://snowtrace.io/address/0x65fEABBcfBc796Ee3d8bF1aDd02963468F3Eb8C2) | | CCTPV2RouterSingleOutput AUTO | 0x6faec2944071b2a5ebfd1b08f43f29597aad8ca1
[see in explorer](https://snowtrace.io/address/0x6faec2944071b2a5ebfd1b08f43f29597aad8ca1) | | CelerImpl | 0x739C791e48b2AEDF6dcE5304e7Da6172Fcc38416
[see in explorer](https://snowtrace.io/address/0x739C791e48b2AEDF6dcE5304e7Da6172Fcc38416) | | CelerStakedRoute AUTO | 0xf1c07b6dddc480602d0304c31e6b13ff711b5828
[see in explorer](https://snowtrace.io/address/0xf1c07b6dddc480602d0304c31e6b13ff711b5828) | | CelerStorageWrapper | 0x7c6C373190421988fA31E64f369C45205676C1f0
[see in explorer](https://snowtrace.io/address/0x7c6C373190421988fA31E64f369C45205676C1f0) | | CelerV2Impl | 0x8B7e6Be0e12207604cF5858b4CB8d987926a4754
[see in explorer](https://snowtrace.io/address/0x8B7e6Be0e12207604cF5858b4CB8d987926a4754) | | DisabledSocketRoute | 0x0f34A522FF82151c90679b73211955068FD854F1
[see in explorer](https://snowtrace.io/address/0x0f34A522FF82151c90679b73211955068FD854F1) | | Entrypoint AUTO | 0x64e36517BaCc2b634944658F8bE124C043054F3e
[see in explorer](https://snowtrace.io/address/0x64e36517BaCc2b634944658F8bE124C043054F3e) | | FeeCollector AUTO | 0x717bC2FeCad574ec68Cc1eb074abFD93AdaAb754
[see in explorer](https://snowtrace.io/address/0x717bC2FeCad574ec68Cc1eb074abFD93AdaAb754) | | FeesTakerController | 0x9D4Ec3eae994A8b35e8FE52082e3e3D0240c7694
[see in explorer](https://snowtrace.io/address/0x9D4Ec3eae994A8b35e8FE52082e3e3D0240c7694) | | GenericStakedRoute AUTO | 0x5013c0b3defd8f832d1b6dec750382946de5c13b
[see in explorer](https://snowtrace.io/address/0x5013c0b3defd8f832d1b6dec750382946de5c13b) | | HyphenImpl | 0xE186a05FB020324a7cA61d80138BB1EA66DDDbDF
[see in explorer](https://snowtrace.io/address/0xE186a05FB020324a7cA61d80138BB1EA66DDDbDF) | | KyberSwapImpl | 0x70ce162b46C172d20df5573fF86055a12A658873
[see in explorer](https://snowtrace.io/address/0x70ce162b46C172d20df5573fF86055a12A658873) | | MagpieSwapImpl | 0x55ef72cdEA218BA33AE31e7Bdf1CDa176FD80965
[see in explorer](https://snowtrace.io/address/0x55ef72cdEA218BA33AE31e7Bdf1CDa176FD80965) | | MayanBridgeImpl | 0x4b335E4F4CFd6da9463B31269BD753fBaEe8FEe9
[see in explorer](https://snowtrace.io/address/0x4b335E4F4CFd6da9463B31269BD753fBaEe8FEe9) | | MayanBridgeImplV2 | 0xf4f62E1D36B0Be2a701EDaa25967b6204C6b5aBE
[see in explorer](https://snowtrace.io/address/0xf4f62E1D36B0Be2a701EDaa25967b6204C6b5aBE) | | OneInchImpl | 0x368d506fC5c8C8AC36F48B383Eb1fCEdc4b8Ca69
[see in explorer](https://snowtrace.io/address/0x368d506fC5c8C8AC36F48B383Eb1fCEdc4b8Ca69) | | OpenOceanSwapImpl AUTO | 0xbb03B17C3D63e9707Cff789beD922Bf0Ab98d0c2
[see in explorer](https://snowtrace.io/address/0xbb03B17C3D63e9707Cff789beD922Bf0Ab98d0c2) | | RefuelBridgeImpl | 0xBAde7653492f1a70c3725EdeB2D28F3C84369809
[see in explorer](https://snowtrace.io/address/0xBAde7653492f1a70c3725EdeB2D28F3C84369809) | | RefuelSwapAndBridgeController | 0xAe21DC9F43d335BF7925E69E2d272288492d91c5
[see in explorer](https://snowtrace.io/address/0xAe21DC9F43d335BF7925E69E2d272288492d91c5) | | RFQRouterSingleOutput AUTO | 0xc4088d6e5a2027e784efc0491c322a3e2621bd9e
[see in explorer](https://snowtrace.io/address/0xc4088d6e5a2027e784efc0491c322a3e2621bd9e) | | SingleOutputRequestImpl AUTO | 0x92612711D4d07dEbe4964D4d1401D7d7B5a11737
[see in explorer](https://snowtrace.io/address/0x92612711D4d07dEbe4964D4d1401D7d7B5a11737) | | SocketDeployFactory | 0x71630095e3F08A86aFC73f7b07342192adf39C55
[see in explorer](https://snowtrace.io/address/0x71630095e3F08A86aFC73f7b07342192adf39C55) | | SocketGateway | 0x3a23F943181408EAC424116Af7b7790c94Cb97a5
[see in explorer](https://snowtrace.io/address/0x3a23F943181408EAC424116Af7b7790c94Cb97a5) | | Solver AUTO | 0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042
[see in explorer](https://snowtrace.io/address/0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042) | | StakedRouterExecutor AUTO | 0x12efda5e4d410c5da723ceb7e43942779e3fe49b
[see in explorer](https://snowtrace.io/address/0x12efda5e4d410c5da723ceb7e43942779e3fe49b) | | StakedRouterReceiver AUTO | 0x5d84f33b7c9214df23fd86a0861ac923af99954d
[see in explorer](https://snowtrace.io/address/0x5d84f33b7c9214df23fd86a0861ac923af99954d) | | StakedRouterSingleOutput AUTO | 0x167d49f106bbea59587ef3c63b33e6a421af1b8d
[see in explorer](https://snowtrace.io/address/0x167d49f106bbea59587ef3c63b33e6a421af1b8d) | | StargateImplL2 | 0x235c819eB6877c2ffDE5AF457464131Db47500Dc
[see in explorer](https://snowtrace.io/address/0x235c819eB6877c2ffDE5AF457464131Db47500Dc) | | StargateImplL2V2 | 0xf166678776d22016DdC7415003acFEcEFe8b07dd
[see in explorer](https://snowtrace.io/address/0xf166678776d22016DdC7415003acFEcEFe8b07dd) | | StargateImplV2 | 0xd0389e84178f809903cbFE7D1EfAE3EFa9c1769c
[see in explorer](https://snowtrace.io/address/0xd0389e84178f809903cbFE7D1EfAE3EFa9c1769c) | | SwapExecutor AUTO | 0xbc481539Be2e6990900D34F0Ab54873a177ba019
[see in explorer](https://snowtrace.io/address/0xbc481539Be2e6990900D34F0Ab54873a177ba019) | | SwapRequestCallback AUTO | 0x4682e8315B80cF757e2077280E0471729c992Ed3
[see in explorer](https://snowtrace.io/address/0x4682e8315B80cF757e2077280E0471729c992Ed3) | | SwapRequestImpl AUTO | 0xb701aB56ACB5897eEc7905afF72b52706638a2ec
[see in explorer](https://snowtrace.io/address/0xb701aB56ACB5897eEc7905afF72b52706638a2ec) | | SwitchboardPlug AUTO | 0x2261Fe33C0858a4Bb5178e429bF90C3652da961E
[see in explorer](https://snowtrace.io/address/0x2261Fe33C0858a4Bb5178e429bF90C3652da961E) | | SwitchboardRouter AUTO | 0x8d00Ad02DF0C7B0C379bc1cb49fD74aA10698bFc
[see in explorer](https://snowtrace.io/address/0x8d00Ad02DF0C7B0C379bc1cb49fD74aA10698bFc) | | SymbiosisBridgeImpl | 0x76E3e322DDf6EF4C50696Ea63b87C07D5f1AfA34
[see in explorer](https://snowtrace.io/address/0x76E3e322DDf6EF4C50696Ea63b87C07D5f1AfA34) | | SynapseBridgeImpl | 0x5adde24B6a11B86C23a4f61c236A8795BD4aa2bB
[see in explorer](https://snowtrace.io/address/0x5adde24B6a11B86C23a4f61c236A8795BD4aa2bB) | | UniswapV3Impl | 0xf510A87f6E28B4AE71c87123026617aBB6CE1420
[see in explorer](https://snowtrace.io/address/0xf510A87f6E28B4AE71c87123026617aBB6CE1420) | | UnwrapAndForward AUTO | 0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad
[see in explorer](https://snowtrace.io/address/0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad) | | WrappedTokenSwapperImpl | 0x6163484b8d0Db43238C1875bcD7dA987e1824273
[see in explorer](https://snowtrace.io/address/0x6163484b8d0Db43238C1875bcD7dA987e1824273) | | ZeroXSwapImpl | 0x45362caA305D15A12D2AC781049069d87Dc6372c
[see in explorer](https://snowtrace.io/address/0x45362caA305D15A12D2AC781049069d87Dc6372c) | | ZeroxV2SwapImpl | 0x413d1edcF7C0837F09e0DB6375DdE6D5F066ABaC
[see in explorer](https://snowtrace.io/address/0x413d1edcF7C0837F09e0DB6375DdE6D5F066ABaC) | | ZeroxV2Wrapper AUTO | 0x05b108fD88d042eF0145DCcd564DCd6471852FC2
[see in explorer](https://snowtrace.io/address/0x05b108fD88d042eF0145DCcd564DCd6471852FC2) |
| name | address | | ----------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | | DisabledSocketRoute | 0x0f34A522FF82151c90679b73211955068FD854F1
[see in explorer](https://explorer.b3.fun/address/0x0f34A522FF82151c90679b73211955068FD854F1) | | FeesTakerController | 0xa16FD999AF50931C9e501177de4A2f288D1cfD6f
[see in explorer](https://explorer.b3.fun/address/0xa16FD999AF50931C9e501177de4A2f288D1cfD6f) | | RefuelSwapAndBridgeController | 0xbD99719C412f0cF440439f328B93622DeBB601b2
[see in explorer](https://explorer.b3.fun/address/0xbD99719C412f0cF440439f328B93622DeBB601b2) | | SocketDeployFactory | 0x71630095e3F08A86aFC73f7b07342192adf39C55
[see in explorer](https://explorer.b3.fun/address/0x71630095e3F08A86aFC73f7b07342192adf39C55) | | SocketGateway | 0x3a23F943181408EAC424116Af7b7790c94Cb97a5
[see in explorer](https://explorer.b3.fun/address/0x3a23F943181408EAC424116Af7b7790c94Cb97a5) | | SuperBridgeImpl | 0x63B448cea2cA0EFD2B20969C6D619E469b1A9a8C
[see in explorer](https://explorer.b3.fun/address/0x63B448cea2cA0EFD2B20969C6D619E469b1A9a8C) |
| name | address | | -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | | AcrossImpl | 0x880ca65d29496a7eCDeE3143719050Fe40C5AD01
[see in explorer](https://basescan.org/address/0x880ca65d29496a7eCDeE3143719050Fe40C5AD01) | | AcrossImplV3 | 0x740EA79e2FccDDB4eE8bB8Fc8ccAC5eb6dFa0b40
[see in explorer](https://basescan.org/address/0x740EA79e2FccDDB4eE8bB8Fc8ccAC5eb6dFa0b40) | | AcrossStakedRoute AUTO | 0x125ac5a530ece0a06dd3cd3da711c054eadb57b9
[see in explorer](https://basescan.org/address/0x125ac5a530ece0a06dd3cd3da711c054eadb57b9) | | AcrossV3WethUnwrapper | 0x36f0B62E4eE3d30939cBccABA9D983579799D931
[see in explorer](https://basescan.org/address/0x36f0B62E4eE3d30939cBccABA9D983579799D931) | | BungeeDepository AUTO | 0xa6cd293ba20873b3cbbbf78f156a1d56d8ab9347
[see in explorer](https://basescan.org/address/0xa6cd293ba20873b3cbbbf78f156a1d56d8ab9347) | | BungeeGateway AUTO | 0x84F06fBaCc4b64CA2f72a4B26191DAD97f2b52BA
[see in explorer](https://basescan.org/address/0x84F06fBaCc4b64CA2f72a4B26191DAD97f2b52BA) | | BungeeInbox AUTO | 0x5e0f8e7337c8955d2124b8e85ca74af884b3e124
[see in explorer](https://basescan.org/address/0x5e0f8e7337c8955d2124b8e85ca74af884b3e124) | | BungeeInboxOld AUTO | 0x3C54883Ce0d86b3abB26A63744bEb853Ea99a403
[see in explorer](https://basescan.org/address/0x3C54883Ce0d86b3abB26A63744bEb853Ea99a403) | | CalldataExecutor AUTO | 0xa873aab6a98cb764ad6d52820d129d0e3667d9f9
[see in explorer](https://basescan.org/address/0xa873aab6a98cb764ad6d52820d129d0e3667d9f9) | | CCTPRouterSingleOutput AUTO | 0x3b4817827d06600f92296c5d1491818d69fc955f
[see in explorer](https://basescan.org/address/0x3b4817827d06600f92296c5d1491818d69fc955f) | | CctpV2Impl | 0x8EAeE07f8FFF38695708be900c1F9aacFB8b3C09
[see in explorer](https://basescan.org/address/0x8EAeE07f8FFF38695708be900c1F9aacFB8b3C09) | | CCTPV2RouterSingleOutput AUTO | 0x6faec2944071b2a5ebfd1b08f43f29597aad8ca1
[see in explorer](https://basescan.org/address/0x6faec2944071b2a5ebfd1b08f43f29597aad8ca1) | | CelerStakedRoute AUTO | 0xf1c07b6dddc480602d0304c31e6b13ff711b5828
[see in explorer](https://basescan.org/address/0xf1c07b6dddc480602d0304c31e6b13ff711b5828) | | DisabledSocketRoute | 0x0f34A522FF82151c90679b73211955068FD854F1
[see in explorer](https://basescan.org/address/0x0f34A522FF82151c90679b73211955068FD854F1) | | Entrypoint AUTO | 0x574A7fF7758c18e7985cda39b0Ae6a0B82fCFf87
[see in explorer](https://basescan.org/address/0x574A7fF7758c18e7985cda39b0Ae6a0B82fCFf87) | | FeeCollector AUTO | 0x1337B8Af481f3d7d245De35dFfCF30B825C20836
[see in explorer](https://basescan.org/address/0x1337B8Af481f3d7d245De35dFfCF30B825C20836) | | FeesTakerController | 0x6808dC8Fc272827c9236cb3bBf3d77e3e9A9B056
[see in explorer](https://basescan.org/address/0x6808dC8Fc272827c9236cb3bBf3d77e3e9A9B056) | | GenericStakedRoute AUTO | 0x5013c0b3defd8f832d1b6dec750382946de5c13b
[see in explorer](https://basescan.org/address/0x5013c0b3defd8f832d1b6dec750382946de5c13b) | | HopCctpImpl | 0xb5406449c46A97eb8BA2bE53279EC9c923D58db3
[see in explorer](https://basescan.org/address/0xb5406449c46A97eb8BA2bE53279EC9c923D58db3) | | HopImplL2V2 | 0x3E2D2ed0FB483d76e54850014D73AfCeA42263fB
[see in explorer](https://basescan.org/address/0x3E2D2ed0FB483d76e54850014D73AfCeA42263fB) | | KyberSwapImpl | 0x70ce162b46C172d20df5573fF86055a12A658873
[see in explorer](https://basescan.org/address/0x70ce162b46C172d20df5573fF86055a12A658873) | | MagpieSwapImpl | 0x8d4e38721A6471fd9F890A71E2e32736b5919bc7
[see in explorer](https://basescan.org/address/0x8d4e38721A6471fd9F890A71E2e32736b5919bc7) | | MayanBridgeImpl | 0xAC150EF0a9064F2357e2f520A7B6D44729ec356E
[see in explorer](https://basescan.org/address/0xAC150EF0a9064F2357e2f520A7B6D44729ec356E) | | MayanBridgeImplV2 | 0xf4f62E1D36B0Be2a701EDaa25967b6204C6b5aBE
[see in explorer](https://basescan.org/address/0xf4f62E1D36B0Be2a701EDaa25967b6204C6b5aBE) | | NativeB3Bridge AUTO | 0x1dAc95E6937da99b09bDf6b683A7F1428aA0De7A
[see in explorer](https://basescan.org/address/0x1dAc95E6937da99b09bDf6b683A7F1428aA0De7A) | | OneInchImpl | 0x555118B2aF4b6e2027cF766FB5a0Aa6a77e8ED8a
[see in explorer](https://basescan.org/address/0x555118B2aF4b6e2027cF766FB5a0Aa6a77e8ED8a) | | OpenOceanSwapImpl AUTO | 0x4F5Ab12A90fC5467d6cd43888E4Ef877ec304954
[see in explorer](https://basescan.org/address/0x4F5Ab12A90fC5467d6cd43888E4Ef877ec304954) | | RainbowSwapImpl | 0x34395136584ea7A0C1928f53131eB7F6D1B9B45d
[see in explorer](https://basescan.org/address/0x34395136584ea7A0C1928f53131eB7F6D1B9B45d) | | RefuelBridgeImpl | 0xDf7f484607E5D97917692FA199dDAD2e0Df0cd43
[see in explorer](https://basescan.org/address/0xDf7f484607E5D97917692FA199dDAD2e0Df0cd43) | | RefuelSwapAndBridgeController | 0x5ce6d37c2fd66Fe1531F44C5141e815b7c9aC8a4
[see in explorer](https://basescan.org/address/0x5ce6d37c2fd66Fe1531F44C5141e815b7c9aC8a4) | | RFQRouterSingleOutput AUTO | 0xc4088d6e5a2027e784efc0491c322a3e2621bd9e
[see in explorer](https://basescan.org/address/0xc4088d6e5a2027e784efc0491c322a3e2621bd9e) | | SingleOutputRequestImpl AUTO | 0xbEB2Ef8B61Ae41611e6656d21551303e4a1E11ba
[see in explorer](https://basescan.org/address/0xbEB2Ef8B61Ae41611e6656d21551303e4a1E11ba) | | SocketDeployFactory | 0x71630095e3F08A86aFC73f7b07342192adf39C55
[see in explorer](https://basescan.org/address/0x71630095e3F08A86aFC73f7b07342192adf39C55) | | SocketGateway | 0x3a23F943181408EAC424116Af7b7790c94Cb97a5
[see in explorer](https://basescan.org/address/0x3a23F943181408EAC424116Af7b7790c94Cb97a5) | | Solver AUTO | 0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042
[see in explorer](https://basescan.org/address/0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042) | | StakedRouterExecutor AUTO | 0x12efda5e4d410c5da723ceb7e43942779e3fe49b
[see in explorer](https://basescan.org/address/0x12efda5e4d410c5da723ceb7e43942779e3fe49b) | | StakedRouterReceiver AUTO | 0x5d84f33b7c9214df23fd86a0861ac923af99954d
[see in explorer](https://basescan.org/address/0x5d84f33b7c9214df23fd86a0861ac923af99954d) | | StakedRouterSingleOutput AUTO | 0x167d49f106bbea59587ef3c63b33e6a421af1b8d
[see in explorer](https://basescan.org/address/0x167d49f106bbea59587ef3c63b33e6a421af1b8d) | | StargateImplL2V2 | 0xb1f01b0723c74eA99b1187c30b876941f49adb39
[see in explorer](https://basescan.org/address/0xb1f01b0723c74eA99b1187c30b876941f49adb39) | | StargateImplV2 | 0x0CB0552405846a4fcd83FBD791eF4a1F43ab3D94
[see in explorer](https://basescan.org/address/0x0CB0552405846a4fcd83FBD791eF4a1F43ab3D94) | | StargateReceiver | 0xa4dCB24c6F16Bffec01d4E3Dc3D2d9092239BDA9
[see in explorer](https://basescan.org/address/0xa4dCB24c6F16Bffec01d4E3Dc3D2d9092239BDA9) | | SwapExecutor AUTO | 0x056d246A858B3b53cE5A446868FA4abeAb66B1aA
[see in explorer](https://basescan.org/address/0x056d246A858B3b53cE5A446868FA4abeAb66B1aA) | | SwapRequestCallback AUTO | 0xd0389e84178f809903cbFE7D1EfAE3EFa9c1769c
[see in explorer](https://basescan.org/address/0xd0389e84178f809903cbFE7D1EfAE3EFa9c1769c) | | SwapRequestImpl AUTO | 0xF4DB5105aF0A71542a5650Ef017876C38cc0CFeB
[see in explorer](https://basescan.org/address/0xF4DB5105aF0A71542a5650Ef017876C38cc0CFeB) | | SwitchboardPlug AUTO | 0x464A517d77183051211235641d9304D4BE3f36E1
[see in explorer](https://basescan.org/address/0x464A517d77183051211235641d9304D4BE3f36E1) | | SwitchboardRouter AUTO | 0x1b243044d1d78E027C4c5ceF8624C7bcAF90CE4a
[see in explorer](https://basescan.org/address/0x1b243044d1d78E027C4c5ceF8624C7bcAF90CE4a) | | SymbiosisBridgeImpl | 0xfe82ABBcbAda39000C451b334D91DbF8990cCE49
[see in explorer](https://basescan.org/address/0xfe82ABBcbAda39000C451b334D91DbF8990cCE49) | | SynapseBridgeImpl | 0x090E83668b7136075d3f76F7D6533B7256538667
[see in explorer](https://basescan.org/address/0x090E83668b7136075d3f76F7D6533B7256538667) | | UniswapV3Impl | 0x095ceD394C018a7E28ADc7a1748DCB4f0d25fdED
[see in explorer](https://basescan.org/address/0x095ceD394C018a7E28ADc7a1748DCB4f0d25fdED) | | UnwrapAndForward AUTO | 0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad
[see in explorer](https://basescan.org/address/0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad) | | WrappedTokenSwapperImpl | 0x4153a9cD0319B0C67B4c215d8750376130C948D6
[see in explorer](https://basescan.org/address/0x4153a9cD0319B0C67B4c215d8750376130C948D6) | | ZeroXSwapImpl | 0x0Ad69c903626faD4f6d3bcdAdD6875152d09E20f
[see in explorer](https://basescan.org/address/0x0Ad69c903626faD4f6d3bcdAdD6875152d09E20f) | | ZeroxV2SwapImpl | 0x413d1edcF7C0837F09e0DB6375DdE6D5F066ABaC
[see in explorer](https://basescan.org/address/0x413d1edcF7C0837F09e0DB6375DdE6D5F066ABaC) | | ZeroxV2Wrapper AUTO | 0xC8E67b4D14A84D3408932a7ED01789d20864B624
[see in explorer](https://basescan.org/address/0xC8E67b4D14A84D3408932a7ED01789d20864B624) |
| name | address | | -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | | BungeeGateway AUTO | 0x8f503B6d9fFdae8d375d1E226b71B4B3144D3849
[see in explorer](https://berascan.com/address/0x8f503B6d9fFdae8d375d1E226b71B4B3144D3849) | | BungeeInbox AUTO | 0x5e0f8e7337c8955d2124b8e85ca74af884b3e124
[see in explorer](https://berascan.com/address/0x5e0f8e7337c8955d2124b8e85ca74af884b3e124) | | BungeeInboxOld AUTO | 0xA23D36E54D95F123c81DDC0D8ff1B5CDfd0bB502
[see in explorer](https://berascan.com/address/0xA23D36E54D95F123c81DDC0D8ff1B5CDfd0bB502) | | CalldataExecutor AUTO | 0xa873aab6a98cb764ad6d52820d129d0e3667d9f9
[see in explorer](https://berascan.com/address/0xa873aab6a98cb764ad6d52820d129d0e3667d9f9) | | CCTPRouterSingleOutput AUTO | 0x0000000000000000000000000000000000000000
[see in explorer](https://berascan.com/address/0x0000000000000000000000000000000000000000) | | CCTPV2RouterSingleOutput AUTO | 0x0000000000000000000000000000000000000000
[see in explorer](https://berascan.com/address/0x0000000000000000000000000000000000000000) | | Entrypoint AUTO | 0xc8807bD5b5c87Fe7Fc73D644Cb7800d1A4e4F09D
[see in explorer](https://berascan.com/address/0xc8807bD5b5c87Fe7Fc73D644Cb7800d1A4e4F09D) | | FeeCollector AUTO | 0xE12D0CE29B916fbc067f49a8ebC203ffB66E8ded
[see in explorer](https://berascan.com/address/0xE12D0CE29B916fbc067f49a8ebC203ffB66E8ded) | | FeesTakerController | 0xa16FD999AF50931C9e501177de4A2f288D1cfD6f
[see in explorer](https://berascan.com/address/0xa16FD999AF50931C9e501177de4A2f288D1cfD6f) | | GenericStakedRoute AUTO | 0x5013c0b3defd8f832d1b6dec750382946de5c13b
[see in explorer](https://berascan.com/address/0x5013c0b3defd8f832d1b6dec750382946de5c13b) | | KyberSwapImpl | 0x70ce162b46C172d20df5573fF86055a12A658873
[see in explorer](https://berascan.com/address/0x70ce162b46C172d20df5573fF86055a12A658873) | | MagpieSwapImpl | 0x413d1edcF7C0837F09e0DB6375DdE6D5F066ABaC
[see in explorer](https://berascan.com/address/0x413d1edcF7C0837F09e0DB6375DdE6D5F066ABaC) | | RefuelSwapAndBridgeController | 0xbD99719C412f0cF440439f328B93622DeBB601b2
[see in explorer](https://berascan.com/address/0xbD99719C412f0cF440439f328B93622DeBB601b2) | | RFQRouterSingleOutput AUTO | 0xc4088d6e5a2027e784efc0491c322a3e2621bd9e
[see in explorer](https://berascan.com/address/0xc4088d6e5a2027e784efc0491c322a3e2621bd9e) | | SingleOutputRequestImpl AUTO | 0xcC42AE193E97a228BbC1e747Ea4af3aa170acCA2
[see in explorer](https://berascan.com/address/0xcC42AE193E97a228BbC1e747Ea4af3aa170acCA2) | | SocketDeployFactory | 0x71630095e3F08A86aFC73f7b07342192adf39C55
[see in explorer](https://berascan.com/address/0x71630095e3F08A86aFC73f7b07342192adf39C55) | | SocketGateway | 0x3a23F943181408EAC424116Af7b7790c94Cb97a5
[see in explorer](https://berascan.com/address/0x3a23F943181408EAC424116Af7b7790c94Cb97a5) | | Solver AUTO | 0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042
[see in explorer](https://berascan.com/address/0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042) | | StakedRouterExecutor AUTO | 0x12efda5e4d410c5da723ceb7e43942779e3fe49b
[see in explorer](https://berascan.com/address/0x12efda5e4d410c5da723ceb7e43942779e3fe49b) | | StakedRouterReceiver AUTO | 0x5d84f33b7c9214df23fd86a0861ac923af99954d
[see in explorer](https://berascan.com/address/0x5d84f33b7c9214df23fd86a0861ac923af99954d) | | StakedRouterSingleOutput AUTO | 0x167d49f106bbea59587ef3c63b33e6a421af1b8d
[see in explorer](https://berascan.com/address/0x167d49f106bbea59587ef3c63b33e6a421af1b8d) | | StargateImplV2 | 0x4682e8315B80cF757e2077280E0471729c992Ed3
[see in explorer](https://berascan.com/address/0x4682e8315B80cF757e2077280E0471729c992Ed3) | | SwapExecutor AUTO | 0x6e8338B0c56f598809e72D6a31456f9D5452de72
[see in explorer](https://berascan.com/address/0x6e8338B0c56f598809e72D6a31456f9D5452de72) | | SwapRequestCallback AUTO | 0xEFB37Bd3a9ed2f768bf6f79d0379fe7f9BE50F49
[see in explorer](https://berascan.com/address/0xEFB37Bd3a9ed2f768bf6f79d0379fe7f9BE50F49) | | SwapRequestImpl AUTO | 0x79b5380FF38462b72e14667742f634c6610158B8
[see in explorer](https://berascan.com/address/0x79b5380FF38462b72e14667742f634c6610158B8) | | SwitchboardPlug AUTO | 0xc5C38A15A9D3D9dC5Fc7dE4426779B695677e45D
[see in explorer](https://berascan.com/address/0xc5C38A15A9D3D9dC5Fc7dE4426779B695677e45D) | | SwitchboardRouter AUTO | 0x3416daBEAf259FBE5ba455E361f23e58BAB91E3E
[see in explorer](https://berascan.com/address/0x3416daBEAf259FBE5ba455E361f23e58BAB91E3E) | | SymbiosisBridgeImpl | 0x63B448cea2cA0EFD2B20969C6D619E469b1A9a8C
[see in explorer](https://berascan.com/address/0x63B448cea2cA0EFD2B20969C6D619E469b1A9a8C) | | UnwrapAndForward AUTO | 0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad
[see in explorer](https://berascan.com/address/0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad) | | ZeroxV2Wrapper AUTO | 0x614595189d16995Fe22a5c267B220C803e50966F
[see in explorer](https://berascan.com/address/0x614595189d16995Fe22a5c267B220C803e50966F) |
| name | address | | -------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | | AcrossImplV3 | 0x740EA79e2FccDDB4eE8bB8Fc8ccAC5eb6dFa0b40
[see in explorer](https://bscscan.com/address/0x740EA79e2FccDDB4eE8bB8Fc8ccAC5eb6dFa0b40) | | AcrossStakedRoute AUTO | 0x125ac5a530ece0a06dd3cd3da711c054eadb57b9
[see in explorer](https://bscscan.com/address/0x125ac5a530ece0a06dd3cd3da711c054eadb57b9) | | AcrossV3WethUnwrapper | 0x36f0B62E4eE3d30939cBccABA9D983579799D931
[see in explorer](https://bscscan.com/address/0x36f0B62E4eE3d30939cBccABA9D983579799D931) | | AnyswapL2Impl | 0x89800A17CEA97dB4A8F0705d7f8da770032397f5
[see in explorer](https://bscscan.com/address/0x89800A17CEA97dB4A8F0705d7f8da770032397f5) | | AnyswapV6L2Impl | 0xAe21DC9F43d335BF7925E69E2d272288492d91c5
[see in explorer](https://bscscan.com/address/0xAe21DC9F43d335BF7925E69E2d272288492d91c5) | | BungeeDepository AUTO | 0xa6cd293ba20873b3cbbbf78f156a1d56d8ab9347
[see in explorer](https://bscscan.com/address/0xa6cd293ba20873b3cbbbf78f156a1d56d8ab9347) | | BungeeGateway AUTO | 0x9aF2b913679049c966b77934af4CbE7Bb36Cf9D3
[see in explorer](https://bscscan.com/address/0x9aF2b913679049c966b77934af4CbE7Bb36Cf9D3) | | BungeeInbox AUTO | 0x5e0f8e7337c8955d2124b8e85ca74af884b3e124
[see in explorer](https://bscscan.com/address/0x5e0f8e7337c8955d2124b8e85ca74af884b3e124) | | BungeeInboxOld AUTO | 0x002cd45978F556D817e5FBB4020f7Dd82Bb10941
[see in explorer](https://bscscan.com/address/0x002cd45978F556D817e5FBB4020f7Dd82Bb10941) | | CalldataExecutor AUTO | 0xa873aab6a98cb764ad6d52820d129d0e3667d9f9
[see in explorer](https://bscscan.com/address/0xa873aab6a98cb764ad6d52820d129d0e3667d9f9) | | CCTPRouterSingleOutput AUTO | 0x0000000000000000000000000000000000000000
[see in explorer](https://bscscan.com/address/0x0000000000000000000000000000000000000000) | | CCTPV2RouterSingleOutput AUTO | 0x0000000000000000000000000000000000000000
[see in explorer](https://bscscan.com/address/0x0000000000000000000000000000000000000000) | | CelerImpl | 0x331c0edE78230d842132189C1496B31b9e7923e2
[see in explorer](https://bscscan.com/address/0x331c0edE78230d842132189C1496B31b9e7923e2) | | CelerStakedRoute AUTO | 0xf1c07b6dddc480602d0304c31e6b13ff711b5828
[see in explorer](https://bscscan.com/address/0xf1c07b6dddc480602d0304c31e6b13ff711b5828) | | CelerStorageWrapper | 0x2d0EeB574cC98f6d57c72FFe730D5C8a8f2eac37
[see in explorer](https://bscscan.com/address/0x2d0EeB574cC98f6d57c72FFe730D5C8a8f2eac37) | | CelerV2Impl | 0x1A8f60f05239EEAd23A27f32416B160D6a14277e
[see in explorer](https://bscscan.com/address/0x1A8f60f05239EEAd23A27f32416B160D6a14277e) | | DisabledSocketRoute | 0x0f34A522FF82151c90679b73211955068FD854F1
[see in explorer](https://bscscan.com/address/0x0f34A522FF82151c90679b73211955068FD854F1) | | Entrypoint AUTO | 0xF070dae0a1eae99A27aE2496093F913a2d26E3b3
[see in explorer](https://bscscan.com/address/0xF070dae0a1eae99A27aE2496093F913a2d26E3b3) | | FeeCollector AUTO | 0xE8746d664059067FD9337eb81CEdD632Ffa4325e
[see in explorer](https://bscscan.com/address/0xE8746d664059067FD9337eb81CEdD632Ffa4325e) | | FeesTakerController | 0x21185370305A12d71CFd8ceA619905DEc4118F99
[see in explorer](https://bscscan.com/address/0x21185370305A12d71CFd8ceA619905DEc4118F99) | | GenericStakedRoute AUTO | 0x5013c0b3defd8f832d1b6dec750382946de5c13b
[see in explorer](https://bscscan.com/address/0x5013c0b3defd8f832d1b6dec750382946de5c13b) | | HyphenImpl | 0xA898821781ba5dd78a485Bcb610b8a60bbC5357E
[see in explorer](https://bscscan.com/address/0xA898821781ba5dd78a485Bcb610b8a60bbC5357E) | | KyberSwapImpl | 0x59057Df54637e716614fF11b54eeB74257CEb2fc
[see in explorer](https://bscscan.com/address/0x59057Df54637e716614fF11b54eeB74257CEb2fc) | | MagpieSwapImpl | 0x831e9cDe2Ee7070203559CDd6Ec60745b9565B95
[see in explorer](https://bscscan.com/address/0x831e9cDe2Ee7070203559CDd6Ec60745b9565B95) | | MayanBridgeImpl | 0x9959767cd114F1f0A1550AeFB82B0317Fd787979
[see in explorer](https://bscscan.com/address/0x9959767cd114F1f0A1550AeFB82B0317Fd787979) | | MayanBridgeImplV2 | 0xFBd820d7C4aFB954532107b8DD37D0515C90eBb0
[see in explorer](https://bscscan.com/address/0xFBd820d7C4aFB954532107b8DD37D0515C90eBb0) | | OneInchImpl | 0x3E7118a8b22272B8f2A0BE804da75750eAc23c22
[see in explorer](https://bscscan.com/address/0x3E7118a8b22272B8f2A0BE804da75750eAc23c22) | | OpenOceanSwapImpl AUTO | 0xbb03B17C3D63e9707Cff789beD922Bf0Ab98d0c2
[see in explorer](https://bscscan.com/address/0xbb03B17C3D63e9707Cff789beD922Bf0Ab98d0c2) | | RainbowSwapImpl | 0x41e06c1Cafa528413A5430BC3A56dF59Ad84ebF8
[see in explorer](https://bscscan.com/address/0x41e06c1Cafa528413A5430BC3A56dF59Ad84ebF8) | | RefuelBridgeImpl | 0x653a03b511E6FE9e80eeCb2bBbD36DCaf93cF147
[see in explorer](https://bscscan.com/address/0x653a03b511E6FE9e80eeCb2bBbD36DCaf93cF147) | | RefuelSwapAndBridgeController | 0x77cf21917FF767e2FDEd80760Ee847CAb99BE13b
[see in explorer](https://bscscan.com/address/0x77cf21917FF767e2FDEd80760Ee847CAb99BE13b) | | RFQRouterSingleOutput AUTO | 0xc4088d6e5a2027e784efc0491c322a3e2621bd9e
[see in explorer](https://bscscan.com/address/0xc4088d6e5a2027e784efc0491c322a3e2621bd9e) | | SingleOutputRequestImpl AUTO | 0x5e01dbBBe59F8987673FAdD1469DdD2Be71e00af
[see in explorer](https://bscscan.com/address/0x5e01dbBBe59F8987673FAdD1469DdD2Be71e00af) | | SocketDeployFactory | 0x71630095e3F08A86aFC73f7b07342192adf39C55
[see in explorer](https://bscscan.com/address/0x71630095e3F08A86aFC73f7b07342192adf39C55) | | SocketGateway | 0x3a23F943181408EAC424116Af7b7790c94Cb97a5
[see in explorer](https://bscscan.com/address/0x3a23F943181408EAC424116Af7b7790c94Cb97a5) | | Solver AUTO | 0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042
[see in explorer](https://bscscan.com/address/0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042) | | StakedRouterExecutor AUTO | 0x12efda5e4d410c5da723ceb7e43942779e3fe49b
[see in explorer](https://bscscan.com/address/0x12efda5e4d410c5da723ceb7e43942779e3fe49b) | | StakedRouterReceiver AUTO | 0x5d84f33b7c9214df23fd86a0861ac923af99954d
[see in explorer](https://bscscan.com/address/0x5d84f33b7c9214df23fd86a0861ac923af99954d) | | StakedRouterSingleOutput AUTO | 0x167d49f106bbea59587ef3c63b33e6a421af1b8d
[see in explorer](https://bscscan.com/address/0x167d49f106bbea59587ef3c63b33e6a421af1b8d) | | StargateImplL2 | 0x216314f5E2FCD984f54c3ba1e51035Ea29d6BE37
[see in explorer](https://bscscan.com/address/0x216314f5E2FCD984f54c3ba1e51035Ea29d6BE37) | | StargateImplL2V2 | 0x214578E8efBCFF8259d410Ee84187A8B7caf38ce
[see in explorer](https://bscscan.com/address/0x214578E8efBCFF8259d410Ee84187A8B7caf38ce) | | StargateImplV2 | 0x4682e8315B80cF757e2077280E0471729c992Ed3
[see in explorer](https://bscscan.com/address/0x4682e8315B80cF757e2077280E0471729c992Ed3) | | SuperBridgeImpl | 0x2D448cDa76D352fC2cB4C7d6f8b55e3cB0817d9e
[see in explorer](https://bscscan.com/address/0x2D448cDa76D352fC2cB4C7d6f8b55e3cB0817d9e) | | SwapExecutor AUTO | 0x6b1a31Af8A9DC9E8e489035859ca98D6335a0bcB
[see in explorer](https://bscscan.com/address/0x6b1a31Af8A9DC9E8e489035859ca98D6335a0bcB) | | SwapRequestCallback AUTO | 0xEFB37Bd3a9ed2f768bf6f79d0379fe7f9BE50F49
[see in explorer](https://bscscan.com/address/0xEFB37Bd3a9ed2f768bf6f79d0379fe7f9BE50F49) | | SwapRequestImpl AUTO | 0xdcf83CC9CCDfa57aE757021f9457567F67BABeA9
[see in explorer](https://bscscan.com/address/0xdcf83CC9CCDfa57aE757021f9457567F67BABeA9) | | SwitchboardPlug AUTO | 0x4743a14Dd1B32Bf7c89dBB905A83fC513455d2C7
[see in explorer](https://bscscan.com/address/0x4743a14Dd1B32Bf7c89dBB905A83fC513455d2C7) | | SwitchboardRouter AUTO | 0xD22ef0dEA27049484bF9b4B748eC715dB8c9d646
[see in explorer](https://bscscan.com/address/0xD22ef0dEA27049484bF9b4B748eC715dB8c9d646) | | SymbiosisBridgeImpl | 0xf510A87f6E28B4AE71c87123026617aBB6CE1420
[see in explorer](https://bscscan.com/address/0xf510A87f6E28B4AE71c87123026617aBB6CE1420) | | SynapseBridgeImpl | 0xFd9f91749C5738FE27aA50FE42Df43A6D9616B1C
[see in explorer](https://bscscan.com/address/0xFd9f91749C5738FE27aA50FE42Df43A6D9616B1C) | | UniswapV3Impl | 0xD50bc8CDfbDdA240306E7f689D95bCA3E8038ECB
[see in explorer](https://bscscan.com/address/0xD50bc8CDfbDdA240306E7f689D95bCA3E8038ECB) | | UnwrapAndForward AUTO | 0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad
[see in explorer](https://bscscan.com/address/0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad) | | WrappedTokenSwapperImpl | 0x76E3e322DDf6EF4C50696Ea63b87C07D5f1AfA34
[see in explorer](https://bscscan.com/address/0x76E3e322DDf6EF4C50696Ea63b87C07D5f1AfA34) | | ZeroXSwapImpl | 0xD79c6bAc601ca92cb9F8Db61976CCdbb0588C5F6
[see in explorer](https://bscscan.com/address/0xD79c6bAc601ca92cb9F8Db61976CCdbb0588C5F6) | | ZeroxV2SwapImpl | 0x413d1edcF7C0837F09e0DB6375DdE6D5F066ABaC
[see in explorer](https://bscscan.com/address/0x413d1edcF7C0837F09e0DB6375DdE6D5F066ABaC) | | ZeroxV2Wrapper AUTO | 0x614595189d16995Fe22a5c267B220C803e50966F
[see in explorer](https://bscscan.com/address/0x614595189d16995Fe22a5c267B220C803e50966F) |
| name | address | | -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | | AcrossImplV3 | 0x740EA79e2FccDDB4eE8bB8Fc8ccAC5eb6dFa0b40
[see in explorer](https://blastscan.io/address/0x740EA79e2FccDDB4eE8bB8Fc8ccAC5eb6dFa0b40) | | AcrossStakedRoute AUTO | 0x125ac5a530ece0a06dd3cd3da711c054eadb57b9
[see in explorer](https://blastscan.io/address/0x125ac5a530ece0a06dd3cd3da711c054eadb57b9) | | AcrossV3WethUnwrapper | 0x36f0B62E4eE3d30939cBccABA9D983579799D931
[see in explorer](https://blastscan.io/address/0x36f0B62E4eE3d30939cBccABA9D983579799D931) | | BungeeGateway AUTO | 0x5525e0700390A12995aC181eFF656E4aC0246b29
[see in explorer](https://blastscan.io/address/0x5525e0700390A12995aC181eFF656E4aC0246b29) | | BungeeInbox AUTO | 0x5e0f8e7337c8955d2124b8e85ca74af884b3e124
[see in explorer](https://blastscan.io/address/0x5e0f8e7337c8955d2124b8e85ca74af884b3e124) | | BungeeInboxOld AUTO | 0x5f1169dDBC089Ecd46979f610F9779220bA52b5f
[see in explorer](https://blastscan.io/address/0x5f1169dDBC089Ecd46979f610F9779220bA52b5f) | | CalldataExecutor AUTO | 0xa873aab6a98cb764ad6d52820d129d0e3667d9f9
[see in explorer](https://blastscan.io/address/0xa873aab6a98cb764ad6d52820d129d0e3667d9f9) | | CCTPRouterSingleOutput AUTO | 0x0000000000000000000000000000000000000000
[see in explorer](https://blastscan.io/address/0x0000000000000000000000000000000000000000) | | CCTPV2RouterSingleOutput AUTO | 0x0000000000000000000000000000000000000000
[see in explorer](https://blastscan.io/address/0x0000000000000000000000000000000000000000) | | DisabledSocketRoute | 0x0f34A522FF82151c90679b73211955068FD854F1
[see in explorer](https://blastscan.io/address/0x0f34A522FF82151c90679b73211955068FD854F1) | | Entrypoint AUTO | 0x79C7a69499Cf1866734E8D3154200a05aE41c865
[see in explorer](https://blastscan.io/address/0x79C7a69499Cf1866734E8D3154200a05aE41c865) | | FeeCollector AUTO | 0x264f55044465A3d8d574D87168F2c2344D1e8c8c
[see in explorer](https://blastscan.io/address/0x264f55044465A3d8d574D87168F2c2344D1e8c8c) | | GenericStakedRoute AUTO | 0x5013c0b3defd8f832d1b6dec750382946de5c13b
[see in explorer](https://blastscan.io/address/0x5013c0b3defd8f832d1b6dec750382946de5c13b) | | KyberSwapImpl | 0x70ce162b46C172d20df5573fF86055a12A658873
[see in explorer](https://blastscan.io/address/0x70ce162b46C172d20df5573fF86055a12A658873) | | MagpieSwapImpl | 0xfb9fDe2b893C9438e3b0393D8f94000ea95f15E6
[see in explorer](https://blastscan.io/address/0xfb9fDe2b893C9438e3b0393D8f94000ea95f15E6) | | OpenOceanSwapImpl AUTO | 0x413d1edcF7C0837F09e0DB6375DdE6D5F066ABaC
[see in explorer](https://blastscan.io/address/0x413d1edcF7C0837F09e0DB6375DdE6D5F066ABaC) | | RFQRouterSingleOutput AUTO | 0xc4088d6e5a2027e784efc0491c322a3e2621bd9e
[see in explorer](https://blastscan.io/address/0xc4088d6e5a2027e784efc0491c322a3e2621bd9e) | | SingleOutputRequestImpl AUTO | 0x79b5380FF38462b72e14667742f634c6610158B8
[see in explorer](https://blastscan.io/address/0x79b5380FF38462b72e14667742f634c6610158B8) | | SocketDeployFactory | 0x71630095e3F08A86aFC73f7b07342192adf39C55
[see in explorer](https://blastscan.io/address/0x71630095e3F08A86aFC73f7b07342192adf39C55) | | SocketGateway | 0x3a23F943181408EAC424116Af7b7790c94Cb97a5
[see in explorer](https://blastscan.io/address/0x3a23F943181408EAC424116Af7b7790c94Cb97a5) | | Solver AUTO | 0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042
[see in explorer](https://blastscan.io/address/0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042) | | StakedRouterExecutor AUTO | 0x12efda5e4d410c5da723ceb7e43942779e3fe49b
[see in explorer](https://blastscan.io/address/0x12efda5e4d410c5da723ceb7e43942779e3fe49b) | | StakedRouterReceiver AUTO | 0x5d84f33b7c9214df23fd86a0861ac923af99954d
[see in explorer](https://blastscan.io/address/0x5d84f33b7c9214df23fd86a0861ac923af99954d) | | StakedRouterSingleOutput AUTO | 0x167d49f106bbea59587ef3c63b33e6a421af1b8d
[see in explorer](https://blastscan.io/address/0x167d49f106bbea59587ef3c63b33e6a421af1b8d) | | StargateImplV2 | 0x4682e8315B80cF757e2077280E0471729c992Ed3
[see in explorer](https://blastscan.io/address/0x4682e8315B80cF757e2077280E0471729c992Ed3) | | SwapExecutor AUTO | 0x6e8338B0c56f598809e72D6a31456f9D5452de72
[see in explorer](https://blastscan.io/address/0x6e8338B0c56f598809e72D6a31456f9D5452de72) | | SwapRequestCallback AUTO | 0xEFB37Bd3a9ed2f768bf6f79d0379fe7f9BE50F49
[see in explorer](https://blastscan.io/address/0xEFB37Bd3a9ed2f768bf6f79d0379fe7f9BE50F49) | | SwapRequestImpl AUTO | 0x8f503B6d9fFdae8d375d1E226b71B4B3144D3849
[see in explorer](https://blastscan.io/address/0x8f503B6d9fFdae8d375d1E226b71B4B3144D3849) | | SwitchboardPlug AUTO | 0xBB1F279f61a7faC35cF4DDED87986Ab927083efb
[see in explorer](https://blastscan.io/address/0xBB1F279f61a7faC35cF4DDED87986Ab927083efb) | | SwitchboardRouter AUTO | 0xc5C38A15A9D3D9dC5Fc7dE4426779B695677e45D
[see in explorer](https://blastscan.io/address/0xc5C38A15A9D3D9dC5Fc7dE4426779B695677e45D) | | UniswapV3Impl | 0x4153a9cD0319B0C67B4c215d8750376130C948D6
[see in explorer](https://blastscan.io/address/0x4153a9cD0319B0C67B4c215d8750376130C948D6) | | UnwrapAndForward AUTO | 0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad
[see in explorer](https://blastscan.io/address/0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad) | | ZeroxV2SwapImpl | 0xCFee2171DC6c670eF1E0Df832df0cF37C31705E9
[see in explorer](https://blastscan.io/address/0xCFee2171DC6c670eF1E0Df832df0cF37C31705E9) | | ZeroxV2Wrapper AUTO | 0x614595189d16995Fe22a5c267B220C803e50966F
[see in explorer](https://blastscan.io/address/0x614595189d16995Fe22a5c267B220C803e50966F) |
| name | address | | ---------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | | AcrossImpl | 0xdBdA9499F22a149b3870Aee4B745f57fF6Ca6942
[see in explorer](https://etherscan.io/address/0xdBdA9499F22a149b3870Aee4B745f57fF6Ca6942) | | AcrossImplV3 | 0x740EA79e2FccDDB4eE8bB8Fc8ccAC5eb6dFa0b40
[see in explorer](https://etherscan.io/address/0x740EA79e2FccDDB4eE8bB8Fc8ccAC5eb6dFa0b40) | | AcrossStakedRoute AUTO | 0x125ac5a530ece0a06dd3cd3da711c054eadb57b9
[see in explorer](https://etherscan.io/address/0x125ac5a530ece0a06dd3cd3da711c054eadb57b9) | | AcrossV3WethUnwrapper | 0x36f0B62E4eE3d30939cBccABA9D983579799D931
[see in explorer](https://etherscan.io/address/0x36f0B62E4eE3d30939cBccABA9D983579799D931) | | AnyswapL2Impl | 0x6D4F89284e06554eeEEF79215A823B6F9d7b48D8
[see in explorer](https://etherscan.io/address/0x6D4F89284e06554eeEEF79215A823B6F9d7b48D8) | | AnyswapV6L2Impl | 0x8fB9eCD91723FE037012133Ef8c4C767cf0D4514
[see in explorer](https://etherscan.io/address/0x8fB9eCD91723FE037012133Ef8c4C767cf0D4514) | | BungeeGateway AUTO | 0xe772551F88E2c14aEcC880dF6b7CBd574561bf82
[see in explorer](https://etherscan.io/address/0xe772551F88E2c14aEcC880dF6b7CBd574561bf82) | | BungeeInbox AUTO | 0x5e0f8e7337c8955d2124b8e85ca74af884b3e124
[see in explorer](https://etherscan.io/address/0x5e0f8e7337c8955d2124b8e85ca74af884b3e124) | | BungeeInboxOld AUTO | 0x92612711D4d07dEbe4964D4d1401D7d7B5a11737
[see in explorer](https://etherscan.io/address/0x92612711D4d07dEbe4964D4d1401D7d7B5a11737) | | CalldataExecutor AUTO | 0xa873aab6a98cb764ad6d52820d129d0e3667d9f9
[see in explorer](https://etherscan.io/address/0xa873aab6a98cb764ad6d52820d129d0e3667d9f9) | | CctpImpl | 0xe72edEc20D6c65A046Ae96c3DdecFB93F5CfA52C
[see in explorer](https://etherscan.io/address/0xe72edEc20D6c65A046Ae96c3DdecFB93F5CfA52C) | | CCTPRouterSingleOutput AUTO | 0x3b4817827d06600f92296c5d1491818d69fc955f
[see in explorer](https://etherscan.io/address/0x3b4817827d06600f92296c5d1491818d69fc955f) | | CctpV2Impl | 0xb701aB56ACB5897eEc7905afF72b52706638a2ec
[see in explorer](https://etherscan.io/address/0xb701aB56ACB5897eEc7905afF72b52706638a2ec) | | CCTPV2RouterSingleOutput AUTO | 0x6faec2944071b2a5ebfd1b08f43f29597aad8ca1
[see in explorer](https://etherscan.io/address/0x6faec2944071b2a5ebfd1b08f43f29597aad8ca1) | | CelerImpl | 0x7c6C373190421988fA31E64f369C45205676C1f0
[see in explorer](https://etherscan.io/address/0x7c6C373190421988fA31E64f369C45205676C1f0) | | CelerStakedRoute AUTO | 0xf1c07b6dddc480602d0304c31e6b13ff711b5828
[see in explorer](https://etherscan.io/address/0xf1c07b6dddc480602d0304c31e6b13ff711b5828) | | CelerStorageWrapper | 0x1768C1D2900f1408D44FbB1EdCc306F94aF852ae
[see in explorer](https://etherscan.io/address/0x1768C1D2900f1408D44FbB1EdCc306F94aF852ae) | | CelerV2Impl | 0x1904bC76723dc82D57083876E913d42E8DDbfDc0
[see in explorer](https://etherscan.io/address/0x1904bC76723dc82D57083876E913d42E8DDbfDc0) | | ConnextImpl | 0x4899210551F6a5cb8C1b9A1D78Eb56CAF0fc8820
[see in explorer](https://etherscan.io/address/0x4899210551F6a5cb8C1b9A1D78Eb56CAF0fc8820) | | DisabledSocketRoute | 0x0f34A522FF82151c90679b73211955068FD854F1
[see in explorer](https://etherscan.io/address/0x0f34A522FF82151c90679b73211955068FD854F1) | | Entrypoint AUTO | 0x2837593949F6c5f7abB66dd848ed4E5b774D4ef5
[see in explorer](https://etherscan.io/address/0x2837593949F6c5f7abB66dd848ed4E5b774D4ef5) | | FeeCollector AUTO | 0xd718CDD6f19BEb30b50AF96659C309eB85B79535
[see in explorer](https://etherscan.io/address/0xd718CDD6f19BEb30b50AF96659C309eB85B79535) | | FeesTakerController | 0xF37561Cd1C4b42f8c004C977fb140a4679089526
[see in explorer](https://etherscan.io/address/0xF37561Cd1C4b42f8c004C977fb140a4679089526) | | GenericStakedRoute AUTO | 0x5013c0b3defd8f832d1b6dec750382946de5c13b
[see in explorer](https://etherscan.io/address/0x5013c0b3defd8f832d1b6dec750382946de5c13b) | | GnosisBridgeRouterImpl AUTO | 0xBd2891271DD664eC0ed809B7614dC6bEC785bBF4
[see in explorer](https://etherscan.io/address/0xBd2891271DD664eC0ed809B7614dC6bEC785bBF4) | | GnosisNativeBridgeImpl AUTO | 0x0d9275945E905F0b0E827Ff802A7265Ffb301C71
[see in explorer](https://etherscan.io/address/0x0d9275945E905F0b0E827Ff802A7265Ffb301C71) | | HopImplL1 AUTO | 0x8F22b246e2d380f5F5786dE28847BE17ACaAA2B8
[see in explorer](https://etherscan.io/address/0x8F22b246e2d380f5F5786dE28847BE17ACaAA2B8) | | HopImplL1V2 AUTO | 0xbf18ad2a761206641b19905bf15d33752a2e0142
[see in explorer](https://etherscan.io/address/0xbf18ad2a761206641b19905bf15d33752a2e0142) | | HyphenImpl | 0x6e520F25E66450397d02ece0166edaF46c9BF28b
[see in explorer](https://etherscan.io/address/0x6e520F25E66450397d02ece0166edaF46c9BF28b) | | KyberSwapImpl | 0x4682e8315B80cF757e2077280E0471729c992Ed3
[see in explorer](https://etherscan.io/address/0x4682e8315B80cF757e2077280E0471729c992Ed3) | | MagpieSwapImpl | 0x831e9cDe2Ee7070203559CDd6Ec60745b9565B95
[see in explorer](https://etherscan.io/address/0x831e9cDe2Ee7070203559CDd6Ec60745b9565B95) | | MayanBridgeImpl | 0x93E063d78856096Dd4C33e77461457251817E22e
[see in explorer](https://etherscan.io/address/0x93E063d78856096Dd4C33e77461457251817E22e) | | MayanBridgeImplV2 | 0x51fDcA877B3E1a73C6C730F9665372549bfc0E67
[see in explorer](https://etherscan.io/address/0x51fDcA877B3E1a73C6C730F9665372549bfc0E67) | | NativeArbitrumImpl AUTO | 0x6b60E2a49b13B851e986f38f0Da2815FDa0427B5
[see in explorer](https://etherscan.io/address/0x6b60E2a49b13B851e986f38f0Da2815FDa0427B5) | | NativeOptimismImpl AUTO | 0xB24e2B830f4c78a1993F9b046089321764B28902
[see in explorer](https://etherscan.io/address/0xB24e2B830f4c78a1993F9b046089321764B28902) | | NativeOptimismStack AUTO | 0xBD0914E7A20FAd3e2BB7040B8c5B38A657acB8f6
[see in explorer](https://etherscan.io/address/0xBD0914E7A20FAd3e2BB7040B8c5B38A657acB8f6) | | NativeOptimismStackBase AUTO | 0x7069954C57c1cF5f20F4163d298C4bF0D9c39D3B
[see in explorer](https://etherscan.io/address/0x7069954C57c1cF5f20F4163d298C4bF0D9c39D3B) | | NativeOptimismStackMode AUTO | 0x4B394B54AbF128c99D4d8D9ad483343d12dE2fCB
[see in explorer](https://etherscan.io/address/0x4B394B54AbF128c99D4d8D9ad483343d12dE2fCB) | | NativeOptimismStackWithPortalInkNative AUTO | 0x289a72bA71Dfca228Fe280fF61f49329e2E92563
[see in explorer](https://etherscan.io/address/0x289a72bA71Dfca228Fe280fF61f49329e2E92563) | | NativePolygonImpl AUTO | 0x653a03b511E6FE9e80eeCb2bBbD36DCaf93cF147
[see in explorer](https://etherscan.io/address/0x653a03b511E6FE9e80eeCb2bBbD36DCaf93cF147) | | OneInchImpl | 0x47b7cBcCf4149Fe371a605dC64F14695c3F5Ccd3
[see in explorer](https://etherscan.io/address/0x47b7cBcCf4149Fe371a605dC64F14695c3F5Ccd3) | | OpenOceanSwapImpl AUTO | 0xbb03B17C3D63e9707Cff789beD922Bf0Ab98d0c2
[see in explorer](https://etherscan.io/address/0xbb03B17C3D63e9707Cff789beD922Bf0Ab98d0c2) | | RainbowSwapImpl | 0x1a9ec5Ed7363905C0A096DEe577c8fBb400c99D0
[see in explorer](https://etherscan.io/address/0x1a9ec5Ed7363905C0A096DEe577c8fBb400c99D0) | | RefuelBridgeImpl | 0x838286885360aaFF02AA42C95bde31f6055C919F
[see in explorer](https://etherscan.io/address/0x838286885360aaFF02AA42C95bde31f6055C919F) | | RefuelSwapAndBridgeController | 0x5Cb5A509beD96B2d168DC8aD85736B0b90da8473
[see in explorer](https://etherscan.io/address/0x5Cb5A509beD96B2d168DC8aD85736B0b90da8473) | | RFQRouterSingleOutput AUTO | 0xc4088d6e5a2027e784efc0491c322a3e2621bd9e
[see in explorer](https://etherscan.io/address/0xc4088d6e5a2027e784efc0491c322a3e2621bd9e) | | ScrollImpl AUTO | 0xf56ef339103A0b19B91Ec9b66EE6456F9BeF1499
[see in explorer](https://etherscan.io/address/0xf56ef339103A0b19B91Ec9b66EE6456F9BeF1499) | | SingleOutputRequestImpl AUTO | 0x407BE335f94C30Ee2876c4cF86ce08A46f518cF3
[see in explorer](https://etherscan.io/address/0x407BE335f94C30Ee2876c4cF86ce08A46f518cF3) | | SocketDeployFactory | 0x71630095e3F08A86aFC73f7b07342192adf39C55
[see in explorer](https://etherscan.io/address/0x71630095e3F08A86aFC73f7b07342192adf39C55) | | SocketGateway | 0x3a23F943181408EAC424116Af7b7790c94Cb97a5
[see in explorer](https://etherscan.io/address/0x3a23F943181408EAC424116Af7b7790c94Cb97a5) | | Solver AUTO | 0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042
[see in explorer](https://etherscan.io/address/0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042) | | StakedRouterExecutor AUTO | 0x12efda5e4d410c5da723ceb7e43942779e3fe49b
[see in explorer](https://etherscan.io/address/0x12efda5e4d410c5da723ceb7e43942779e3fe49b) | | StakedRouterReceiver AUTO | 0x5d84f33b7c9214df23fd86a0861ac923af99954d
[see in explorer](https://etherscan.io/address/0x5d84f33b7c9214df23fd86a0861ac923af99954d) | | StakedRouterSingleOutput AUTO | 0x167d49f106bbea59587ef3c63b33e6a421af1b8d
[see in explorer](https://etherscan.io/address/0x167d49f106bbea59587ef3c63b33e6a421af1b8d) | | StargateImplL2 | 0x3Dd7419889FF387A58D3Dad1F8B49ea1064290fB
[see in explorer](https://etherscan.io/address/0x3Dd7419889FF387A58D3Dad1F8B49ea1064290fB) | | StargateImplL2V2 | 0xE485d8c074E02Ae762D849D261BBF4D692AF66a6
[see in explorer](https://etherscan.io/address/0xE485d8c074E02Ae762D849D261BBF4D692AF66a6) | | StargateImplV2 | 0x05b108fD88d042eF0145DCcd564DCd6471852FC2
[see in explorer](https://etherscan.io/address/0x05b108fD88d042eF0145DCcd564DCd6471852FC2) | | SwapExecutor AUTO | 0x11918f1cb6db5e008A692F47c5320216fba6054B
[see in explorer](https://etherscan.io/address/0x11918f1cb6db5e008A692F47c5320216fba6054B) | | SwapRequestCallback AUTO | 0xEFB37Bd3a9ed2f768bf6f79d0379fe7f9BE50F49
[see in explorer](https://etherscan.io/address/0xEFB37Bd3a9ed2f768bf6f79d0379fe7f9BE50F49) | | SwapRequestImpl AUTO | 0x6379442Fb03F78060e8746AeA425eF6420e19F41
[see in explorer](https://etherscan.io/address/0x6379442Fb03F78060e8746AeA425eF6420e19F41) | | SwitchboardPlug AUTO | 0x9ED094fDe2a31BEd0278a4cfdb5528473baFe5a8
[see in explorer](https://etherscan.io/address/0x9ED094fDe2a31BEd0278a4cfdb5528473baFe5a8) | | SwitchboardRouter AUTO | 0x6026369CcA399352ba68AEDdb89aC65442D1907b
[see in explorer](https://etherscan.io/address/0x6026369CcA399352ba68AEDdb89aC65442D1907b) | | SymbiosisBridgeImpl | 0xc5621f8f25CB3Fb30211b1f49556443a8e59b558
[see in explorer](https://etherscan.io/address/0xc5621f8f25CB3Fb30211b1f49556443a8e59b558) | | SynapseBridgeImpl | 0x399ee2C4748f0e9c2985F51BeF45f0532FdaD66D
[see in explorer](https://etherscan.io/address/0x399ee2C4748f0e9c2985F51BeF45f0532FdaD66D) | | UnwrapAndForward AUTO | 0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad
[see in explorer](https://etherscan.io/address/0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad) | | WrappedTokenSwapperImpl | 0xCC5fDA5e3cA925bd0bb428C8b2669496eE43067e
[see in explorer](https://etherscan.io/address/0xCC5fDA5e3cA925bd0bb428C8b2669496eE43067e) | | ZeroXSwapImpl | 0x84502e430b8Fc064756d3034ad303d1456D23bfe
[see in explorer](https://etherscan.io/address/0x84502e430b8Fc064756d3034ad303d1456D23bfe) | | ZeroxV2SwapImpl | 0xCFee2171DC6c670eF1E0Df832df0cF37C31705E9
[see in explorer](https://etherscan.io/address/0xCFee2171DC6c670eF1E0Df832df0cF37C31705E9) | | ZeroxV2Wrapper AUTO | 0x614595189d16995Fe22a5c267B220C803e50966F
[see in explorer](https://etherscan.io/address/0x614595189d16995Fe22a5c267B220C803e50966F) | | ZkSyncBridgeImpl AUTO | 0x2FA9fd7259A1634666916f5a597DFE99029dFC67
[see in explorer](https://etherscan.io/address/0x2FA9fd7259A1634666916f5a597DFE99029dFC67) |
| name | address | | ------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | | AnyswapL2Impl | 0xb9B74bdaDeC1aF7FA2B69a47C645c724e8AA3b91
[see in explorer](https://explorer.fantom.network/address/0xb9B74bdaDeC1aF7FA2B69a47C645c724e8AA3b91) | | AnyswapV6L2Impl | 0x838286885360aaFF02AA42C95bde31f6055C919F
[see in explorer](https://explorer.fantom.network/address/0x838286885360aaFF02AA42C95bde31f6055C919F) | | CelerImpl | 0xde69D9107cF771141896499F8112Ff878D4F31E6
[see in explorer](https://explorer.fantom.network/address/0xde69D9107cF771141896499F8112Ff878D4F31E6) | | CelerStorageWrapper | 0x5CddbecAF8603E5e0bC771A46D48e148593351eA
[see in explorer](https://explorer.fantom.network/address/0x5CddbecAF8603E5e0bC771A46D48e148593351eA) | | CelerV2Impl | 0xe6900C7F50BFF51d406A7584Bd9e9C8403627737
[see in explorer](https://explorer.fantom.network/address/0xe6900C7F50BFF51d406A7584Bd9e9C8403627737) | | DisabledSocketRoute | 0x0f34A522FF82151c90679b73211955068FD854F1
[see in explorer](https://explorer.fantom.network/address/0x0f34A522FF82151c90679b73211955068FD854F1) | | FeesTakerController | 0x222722AC709D9E056a9709b50B9Fd886618d3E81
[see in explorer](https://explorer.fantom.network/address/0x222722AC709D9E056a9709b50B9Fd886618d3E81) | | HyphenImpl | 0x8F22b246e2d380f5F5786dE28847BE17ACaAA2B8
[see in explorer](https://explorer.fantom.network/address/0x8F22b246e2d380f5F5786dE28847BE17ACaAA2B8) | | OneInchImpl | 0x470eFE17455335EeAdD376768C9e5d799B3ffE5b
[see in explorer](https://explorer.fantom.network/address/0x470eFE17455335EeAdD376768C9e5d799B3ffE5b) | | OpenOceanSwapImpl AUTO | 0xCFee2171DC6c670eF1E0Df832df0cF37C31705E9
[see in explorer](https://explorer.fantom.network/address/0xCFee2171DC6c670eF1E0Df832df0cF37C31705E9) | | RefuelBridgeImpl | 0xA898821781ba5dd78a485Bcb610b8a60bbC5357E
[see in explorer](https://explorer.fantom.network/address/0xA898821781ba5dd78a485Bcb610b8a60bbC5357E) | | RefuelSwapAndBridgeController | 0x09BBE4DacBf631994F2f1b70c1B18d62c19466E6
[see in explorer](https://explorer.fantom.network/address/0x09BBE4DacBf631994F2f1b70c1B18d62c19466E6) | | SocketDeployFactory | 0x71630095e3F08A86aFC73f7b07342192adf39C55
[see in explorer](https://explorer.fantom.network/address/0x71630095e3F08A86aFC73f7b07342192adf39C55) | | SocketGateway | 0x3a23F943181408EAC424116Af7b7790c94Cb97a5
[see in explorer](https://explorer.fantom.network/address/0x3a23F943181408EAC424116Af7b7790c94Cb97a5) | | StargateImplL2 | 0xe0134Ca3d7AD384070580542Baee00511105BEfA
[see in explorer](https://explorer.fantom.network/address/0xe0134Ca3d7AD384070580542Baee00511105BEfA) | | StargateImplL2V2 | 0xD79c6bAc601ca92cb9F8Db61976CCdbb0588C5F6
[see in explorer](https://explorer.fantom.network/address/0xD79c6bAc601ca92cb9F8Db61976CCdbb0588C5F6) | | SynapseBridgeImpl | 0x1A8f60f05239EEAd23A27f32416B160D6a14277e
[see in explorer](https://explorer.fantom.network/address/0x1A8f60f05239EEAd23A27f32416B160D6a14277e) | | ZeroXSwapImpl | 0xa28f5a1575bbc9758EAc182CE3E66A2734621F4F
[see in explorer](https://explorer.fantom.network/address/0xa28f5a1575bbc9758EAc182CE3E66A2734621F4F) |
| name | address | | -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | | BungeeGateway AUTO | 0x5e01dbBBe59F8987673FAdD1469DdD2Be71e00af
[see in explorer](https://gnosisscan.io/address/0x5e01dbBBe59F8987673FAdD1469DdD2Be71e00af) | | BungeeInbox AUTO | 0x5e0f8e7337c8955d2124b8e85ca74af884b3e124
[see in explorer](https://gnosisscan.io/address/0x5e0f8e7337c8955d2124b8e85ca74af884b3e124) | | BungeeInboxOld AUTO | 0x4278d3E47774dBf2ed529B0286A6008088104D34
[see in explorer](https://gnosisscan.io/address/0x4278d3E47774dBf2ed529B0286A6008088104D34) | | CalldataExecutor AUTO | 0xa873aab6a98cb764ad6d52820d129d0e3667d9f9
[see in explorer](https://gnosisscan.io/address/0xa873aab6a98cb764ad6d52820d129d0e3667d9f9) | | CCTPRouterSingleOutput AUTO | 0x0000000000000000000000000000000000000000
[see in explorer](https://gnosisscan.io/address/0x0000000000000000000000000000000000000000) | | CCTPV2RouterSingleOutput AUTO | 0x0000000000000000000000000000000000000000
[see in explorer](https://gnosisscan.io/address/0x0000000000000000000000000000000000000000) | | ConnextImpl | 0x45362caA305D15A12D2AC781049069d87Dc6372c
[see in explorer](https://gnosisscan.io/address/0x45362caA305D15A12D2AC781049069d87Dc6372c) | | DisabledSocketRoute | 0x0f34A522FF82151c90679b73211955068FD854F1
[see in explorer](https://gnosisscan.io/address/0x0f34A522FF82151c90679b73211955068FD854F1) | | Entrypoint AUTO | 0x425A1E1f4106fB662e1Faa4320EF1CF00E76f9E8
[see in explorer](https://gnosisscan.io/address/0x425A1E1f4106fB662e1Faa4320EF1CF00E76f9E8) | | FeeCollector AUTO | 0xDC547D58dBCE66BFd7c35ef7d3394f05C2ec866D
[see in explorer](https://gnosisscan.io/address/0xDC547D58dBCE66BFd7c35ef7d3394f05C2ec866D) | | FeesTakerController | 0xF1b6f0c071cE884f53B789720e3d8B523EC895bb
[see in explorer](https://gnosisscan.io/address/0xF1b6f0c071cE884f53B789720e3d8B523EC895bb) | | GenericStakedRoute AUTO | 0x5013c0b3defd8f832d1b6dec750382946de5c13b
[see in explorer](https://gnosisscan.io/address/0x5013c0b3defd8f832d1b6dec750382946de5c13b) | | HopImplL2 | 0x2d0EeB574cC98f6d57c72FFe730D5C8a8f2eac37
[see in explorer](https://gnosisscan.io/address/0x2d0EeB574cC98f6d57c72FFe730D5C8a8f2eac37) | | HopImplL2V2 | 0x44532990D085C099e22F480ca15D8F0AC49CfE5D
[see in explorer](https://gnosisscan.io/address/0x44532990D085C099e22F480ca15D8F0AC49CfE5D) | | OneInchImpl | 0x478A943861430c6fAc82170A3dA899b0f04b839b
[see in explorer](https://gnosisscan.io/address/0x478A943861430c6fAc82170A3dA899b0f04b839b) | | OpenOceanSwapImpl AUTO | 0xCFee2171DC6c670eF1E0Df832df0cF37C31705E9
[see in explorer](https://gnosisscan.io/address/0xCFee2171DC6c670eF1E0Df832df0cF37C31705E9) | | RefuelBridgeImpl | 0xA898821781ba5dd78a485Bcb610b8a60bbC5357E
[see in explorer](https://gnosisscan.io/address/0xA898821781ba5dd78a485Bcb610b8a60bbC5357E) | | RefuelSwapAndBridgeController | 0x6e520F25E66450397d02ece0166edaF46c9BF28b
[see in explorer](https://gnosisscan.io/address/0x6e520F25E66450397d02ece0166edaF46c9BF28b) | | RFQRouterSingleOutput AUTO | 0xc4088d6e5a2027e784efc0491c322a3e2621bd9e
[see in explorer](https://gnosisscan.io/address/0xc4088d6e5a2027e784efc0491c322a3e2621bd9e) | | SingleOutputRequestImpl AUTO | 0x4743a14Dd1B32Bf7c89dBB905A83fC513455d2C7
[see in explorer](https://gnosisscan.io/address/0x4743a14Dd1B32Bf7c89dBB905A83fC513455d2C7) | | SocketDeployFactory | 0x71630095e3F08A86aFC73f7b07342192adf39C55
[see in explorer](https://gnosisscan.io/address/0x71630095e3F08A86aFC73f7b07342192adf39C55) | | SocketGateway | 0x3a23F943181408EAC424116Af7b7790c94Cb97a5
[see in explorer](https://gnosisscan.io/address/0x3a23F943181408EAC424116Af7b7790c94Cb97a5) | | Solver AUTO | 0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042
[see in explorer](https://gnosisscan.io/address/0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042) | | StakedRouterExecutor AUTO | 0x12efda5e4d410c5da723ceb7e43942779e3fe49b
[see in explorer](https://gnosisscan.io/address/0x12efda5e4d410c5da723ceb7e43942779e3fe49b) | | StakedRouterReceiver AUTO | 0x5d84f33b7c9214df23fd86a0861ac923af99954d
[see in explorer](https://gnosisscan.io/address/0x5d84f33b7c9214df23fd86a0861ac923af99954d) | | StakedRouterSingleOutput AUTO | 0x167d49f106bbea59587ef3c63b33e6a421af1b8d
[see in explorer](https://gnosisscan.io/address/0x167d49f106bbea59587ef3c63b33e6a421af1b8d) | | StargateImplV2 | 0x4682e8315B80cF757e2077280E0471729c992Ed3
[see in explorer](https://gnosisscan.io/address/0x4682e8315B80cF757e2077280E0471729c992Ed3) | | SwapExecutor AUTO | 0x76C3B1b35dfa2b165d41c44Ca3268B3AA97845A6
[see in explorer](https://gnosisscan.io/address/0x76C3B1b35dfa2b165d41c44Ca3268B3AA97845A6) | | SwapRequestCallback AUTO | 0xEFB37Bd3a9ed2f768bf6f79d0379fe7f9BE50F49
[see in explorer](https://gnosisscan.io/address/0xEFB37Bd3a9ed2f768bf6f79d0379fe7f9BE50F49) | | SwapRequestImpl AUTO | 0x6d4b85854dC621EF9D64368aEbd98dC27577e642
[see in explorer](https://gnosisscan.io/address/0x6d4b85854dC621EF9D64368aEbd98dC27577e642) | | SwitchboardPlug AUTO | 0x6b1a31Af8A9DC9E8e489035859ca98D6335a0bcB
[see in explorer](https://gnosisscan.io/address/0x6b1a31Af8A9DC9E8e489035859ca98D6335a0bcB) | | SwitchboardRouter AUTO | 0x69f9d5a9E04b9cED4dff07Cd47c393856FA3D6Be
[see in explorer](https://gnosisscan.io/address/0x69f9d5a9E04b9cED4dff07Cd47c393856FA3D6Be) | | SymbiosisBridgeImpl | 0x2603ccb5Abc82aD3359D947DfA8cEec738d05725
[see in explorer](https://gnosisscan.io/address/0x2603ccb5Abc82aD3359D947DfA8cEec738d05725) | | UnwrapAndForward AUTO | 0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad
[see in explorer](https://gnosisscan.io/address/0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad) | | ZeroxV2Wrapper AUTO | 0x614595189d16995Fe22a5c267B220C803e50966F
[see in explorer](https://gnosisscan.io/address/0x614595189d16995Fe22a5c267B220C803e50966F) |
| name | address | | -------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | | AcrossStakedRoute AUTO | 0x125ac5a530ece0a06dd3cd3da711c054eadb57b9
[see in explorer](https://purrsec.com/address/0x125ac5a530ece0a06dd3cd3da711c054eadb57b9) | | BungeeDepository AUTO | 0xa6cd293ba20873b3cbbbf78f156a1d56d8ab9347
[see in explorer](https://purrsec.com/address/0xa6cd293ba20873b3cbbbf78f156a1d56d8ab9347) | | BungeeGateway AUTO | 0x8f503B6d9fFdae8d375d1E226b71B4B3144D3849
[see in explorer](https://purrsec.com/address/0x8f503B6d9fFdae8d375d1E226b71B4B3144D3849) | | BungeeInbox AUTO | 0x5e0f8e7337c8955d2124b8e85ca74af884b3e124
[see in explorer](https://purrsec.com/address/0x5e0f8e7337c8955d2124b8e85ca74af884b3e124) | | BungeeInboxOld AUTO | 0x7ad979C6b0C9924F79ea571280071595ba13D002
[see in explorer](https://purrsec.com/address/0x7ad979C6b0C9924F79ea571280071595ba13D002) | | CalldataExecutor AUTO | 0xa873aab6a98cb764ad6d52820d129d0e3667d9f9
[see in explorer](https://purrsec.com/address/0xa873aab6a98cb764ad6d52820d129d0e3667d9f9) | | CCTPV2RouterSingleOutput AUTO | 0x6faec2944071b2a5ebfd1b08f43f29597aad8ca1
[see in explorer](https://purrsec.com/address/0x6faec2944071b2a5ebfd1b08f43f29597aad8ca1) | | Entrypoint AUTO | 0xc8807bD5b5c87Fe7Fc73D644Cb7800d1A4e4F09D
[see in explorer](https://purrsec.com/address/0xc8807bD5b5c87Fe7Fc73D644Cb7800d1A4e4F09D) | | FeeCollector AUTO | 0xE12D0CE29B916fbc067f49a8ebC203ffB66E8ded
[see in explorer](https://purrsec.com/address/0xE12D0CE29B916fbc067f49a8ebC203ffB66E8ded) | | GenericStakedRoute AUTO | 0x5013c0b3defd8f832d1b6dec750382946de5c13b
[see in explorer](https://purrsec.com/address/0x5013c0b3defd8f832d1b6dec750382946de5c13b) | | HypercoreDepositBungeeExecutor AUTO | 0x6b1a31Af8A9DC9E8e489035859ca98D6335a0bcB
[see in explorer](https://purrsec.com/address/0x6b1a31Af8A9DC9E8e489035859ca98D6335a0bcB) | | RFQRouterSingleOutput AUTO | 0xc4088d6e5a2027e784efc0491c322a3e2621bd9e
[see in explorer](https://purrsec.com/address/0xc4088d6e5a2027e784efc0491c322a3e2621bd9e) | | SingleOutputRequestImpl AUTO | 0xcC42AE193E97a228BbC1e747Ea4af3aa170acCA2
[see in explorer](https://purrsec.com/address/0xcC42AE193E97a228BbC1e747Ea4af3aa170acCA2) | | Solver AUTO | 0xae68b7117be0026cbd4366303f74eecbb19e4042
[see in explorer](https://purrsec.com/address/0xae68b7117be0026cbd4366303f74eecbb19e4042) | | StakedRouterExecutor AUTO | 0x12efda5e4d410c5da723ceb7e43942779e3fe49b
[see in explorer](https://purrsec.com/address/0x12efda5e4d410c5da723ceb7e43942779e3fe49b) | | StakedRouterReceiver AUTO | 0x5d84f33b7c9214df23fd86a0861ac923af99954d
[see in explorer](https://purrsec.com/address/0x5d84f33b7c9214df23fd86a0861ac923af99954d) | | StakedRouterSingleOutput AUTO | 0x167d49f106bbea59587ef3c63b33e6a421af1b8d
[see in explorer](https://purrsec.com/address/0x167d49f106bbea59587ef3c63b33e6a421af1b8d) | | SwapExecutor AUTO | 0x6e8338B0c56f598809e72D6a31456f9D5452de72
[see in explorer](https://purrsec.com/address/0x6e8338B0c56f598809e72D6a31456f9D5452de72) | | SwapRequestCallback AUTO | 0x84Fd802Dd211D483Eb115Ee8a80d0029784c7637
[see in explorer](https://purrsec.com/address/0x84Fd802Dd211D483Eb115Ee8a80d0029784c7637) | | SwapRequestImpl AUTO | 0x79b5380FF38462b72e14667742f634c6610158B8
[see in explorer](https://purrsec.com/address/0x79b5380FF38462b72e14667742f634c6610158B8) | | SwitchboardPlug AUTO | 0xc5C38A15A9D3D9dC5Fc7dE4426779B695677e45D
[see in explorer](https://purrsec.com/address/0xc5C38A15A9D3D9dC5Fc7dE4426779B695677e45D) | | SwitchboardRouter AUTO | 0x3416daBEAf259FBE5ba455E361f23e58BAB91E3E
[see in explorer](https://purrsec.com/address/0x3416daBEAf259FBE5ba455E361f23e58BAB91E3E) | | UnwrapAndForward AUTO | 0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad
[see in explorer](https://purrsec.com/address/0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad) |
| name | address | | -------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | | AcrossImplV3 | 0x740EA79e2FccDDB4eE8bB8Fc8ccAC5eb6dFa0b40
[see in explorer](https://explorer.inkonchain.com/address/0x740EA79e2FccDDB4eE8bB8Fc8ccAC5eb6dFa0b40) | | AcrossStakedRoute AUTO | 0x125ac5a530ece0a06dd3cd3da711c054eadb57b9
[see in explorer](https://explorer.inkonchain.com/address/0x125ac5a530ece0a06dd3cd3da711c054eadb57b9) | | AcrossV3WethUnwrapper | 0x36f0B62E4eE3d30939cBccABA9D983579799D931
[see in explorer](https://explorer.inkonchain.com/address/0x36f0B62E4eE3d30939cBccABA9D983579799D931) | | BungeeGateway AUTO | 0x6379442Fb03F78060e8746AeA425eF6420e19F41
[see in explorer](https://explorer.inkonchain.com/address/0x6379442Fb03F78060e8746AeA425eF6420e19F41) | | BungeeInbox AUTO | 0x5e0f8e7337c8955d2124b8e85ca74af884b3e124
[see in explorer](https://explorer.inkonchain.com/address/0x5e0f8e7337c8955d2124b8e85ca74af884b3e124) | | BungeeInboxOld AUTO | 0xE18DFEFCe7A5d18d39ce6fc925f102286fa96Fdc
[see in explorer](https://explorer.inkonchain.com/address/0xE18DFEFCe7A5d18d39ce6fc925f102286fa96Fdc) | | CalldataExecutor AUTO | 0xa873aab6a98cb764ad6d52820d129d0e3667d9f9
[see in explorer](https://explorer.inkonchain.com/address/0xa873aab6a98cb764ad6d52820d129d0e3667d9f9) | | CCTPRouterSingleOutput AUTO | 0x0000000000000000000000000000000000000000
[see in explorer](https://explorer.inkonchain.com/address/0x0000000000000000000000000000000000000000) | | CCTPV2RouterSingleOutput AUTO | 0x6faec2944071b2a5ebfd1b08f43f29597aad8ca1
[see in explorer](https://explorer.inkonchain.com/address/0x6faec2944071b2a5ebfd1b08f43f29597aad8ca1) | | DisabledSocketRoute | 0x0f34A522FF82151c90679b73211955068FD854F1
[see in explorer](https://explorer.inkonchain.com/address/0x0f34A522FF82151c90679b73211955068FD854F1) | | Entrypoint AUTO | 0x850B1EC3dD5E94866559B11DC632701a9911A081
[see in explorer](https://explorer.inkonchain.com/address/0x850B1EC3dD5E94866559B11DC632701a9911A081) | | FeeCollector AUTO | 0x4Dc0edb185a4d32B462977da58bb5B619E88F205
[see in explorer](https://explorer.inkonchain.com/address/0x4Dc0edb185a4d32B462977da58bb5B619E88F205) | | GenericStakedRoute AUTO | 0x5013c0b3defd8f832d1b6dec750382946de5c13b
[see in explorer](https://explorer.inkonchain.com/address/0x5013c0b3defd8f832d1b6dec750382946de5c13b) | | MagpieSwapImpl | 0x29473712478AB409F50256A252Af31D6b47b33c4
[see in explorer](https://explorer.inkonchain.com/address/0x29473712478AB409F50256A252Af31D6b47b33c4) | | RFQRouterSingleOutput AUTO | 0xc4088d6e5a2027e784efc0491c322a3e2621bd9e
[see in explorer](https://explorer.inkonchain.com/address/0xc4088d6e5a2027e784efc0491c322a3e2621bd9e) | | SingleOutputRequestImpl AUTO | 0x82e7D3872c43a9c4D67450a417a738257795ec62
[see in explorer](https://explorer.inkonchain.com/address/0x82e7D3872c43a9c4D67450a417a738257795ec62) | | SocketDeployFactory | 0x71630095e3F08A86aFC73f7b07342192adf39C55
[see in explorer](https://explorer.inkonchain.com/address/0x71630095e3F08A86aFC73f7b07342192adf39C55) | | SocketGateway | 0x3a23F943181408EAC424116Af7b7790c94Cb97a5
[see in explorer](https://explorer.inkonchain.com/address/0x3a23F943181408EAC424116Af7b7790c94Cb97a5) | | Solver AUTO | 0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042
[see in explorer](https://explorer.inkonchain.com/address/0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042) | | StakedRouterExecutor AUTO | 0x12efda5e4d410c5da723ceb7e43942779e3fe49b
[see in explorer](https://explorer.inkonchain.com/address/0x12efda5e4d410c5da723ceb7e43942779e3fe49b) | | StakedRouterReceiver AUTO | 0x5d84f33b7c9214df23fd86a0861ac923af99954d
[see in explorer](https://explorer.inkonchain.com/address/0x5d84f33b7c9214df23fd86a0861ac923af99954d) | | StakedRouterSingleOutput AUTO | 0x167d49f106bbea59587ef3c63b33e6a421af1b8d
[see in explorer](https://explorer.inkonchain.com/address/0x167d49f106bbea59587ef3c63b33e6a421af1b8d) | | StargateImplV2 | 0x614595189d16995Fe22a5c267B220C803e50966F
[see in explorer](https://explorer.inkonchain.com/address/0x614595189d16995Fe22a5c267B220C803e50966F) | | SwapExecutor AUTO | 0x8A228540a81344cD06bAB50dB3F938962aaF21D5
[see in explorer](https://explorer.inkonchain.com/address/0x8A228540a81344cD06bAB50dB3F938962aaF21D5) | | SwapRequestCallback AUTO | 0xEFB37Bd3a9ed2f768bf6f79d0379fe7f9BE50F49
[see in explorer](https://explorer.inkonchain.com/address/0xEFB37Bd3a9ed2f768bf6f79d0379fe7f9BE50F49) | | SwapRequestImpl AUTO | 0x407BE335f94C30Ee2876c4cF86ce08A46f518cF3
[see in explorer](https://explorer.inkonchain.com/address/0x407BE335f94C30Ee2876c4cF86ce08A46f518cF3) | | SwitchboardPlug AUTO | 0x6026369CcA399352ba68AEDdb89aC65442D1907b
[see in explorer](https://explorer.inkonchain.com/address/0x6026369CcA399352ba68AEDdb89aC65442D1907b) | | SwitchboardRouter AUTO | 0x11918f1cb6db5e008A692F47c5320216fba6054B
[see in explorer](https://explorer.inkonchain.com/address/0x11918f1cb6db5e008A692F47c5320216fba6054B) | | UnwrapAndForward AUTO | 0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad
[see in explorer](https://explorer.inkonchain.com/address/0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad) | | ZeroxV2Wrapper AUTO | 0x0000000000000000000000000000000000000000
[see in explorer](https://explorer.inkonchain.com/address/0x0000000000000000000000000000000000000000) |
| name | address | | -------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | | BungeeGateway AUTO | 0x8f503B6d9fFdae8d375d1E226b71B4B3144D3849
[see in explorer](https://katanascan.com/address/0x8f503B6d9fFdae8d375d1E226b71B4B3144D3849) | | BungeeInbox AUTO | 0x5e0f8e7337c8955d2124b8e85ca74af884b3e124
[see in explorer](https://katanascan.com/address/0x5e0f8e7337c8955d2124b8e85ca74af884b3e124) | | BungeeInboxOld AUTO | 0x7ad979C6b0C9924F79ea571280071595ba13D002
[see in explorer](https://katanascan.com/address/0x7ad979C6b0C9924F79ea571280071595ba13D002) | | CalldataExecutor AUTO | 0xa873aab6a98cb764ad6d52820d129d0e3667d9f9
[see in explorer](https://katanascan.com/address/0xa873aab6a98cb764ad6d52820d129d0e3667d9f9) | | CCTPV2RouterSingleOutput AUTO | 0x0000000000000000000000000000000000000000
[see in explorer](https://katanascan.com/address/0x0000000000000000000000000000000000000000) | | Entrypoint AUTO | 0xc8807bD5b5c87Fe7Fc73D644Cb7800d1A4e4F09D
[see in explorer](https://katanascan.com/address/0xc8807bD5b5c87Fe7Fc73D644Cb7800d1A4e4F09D) | | FeeCollector AUTO | 0xE12D0CE29B916fbc067f49a8ebC203ffB66E8ded
[see in explorer](https://katanascan.com/address/0xE12D0CE29B916fbc067f49a8ebC203ffB66E8ded) | | GenericStakedRoute AUTO | 0x5013c0b3defd8f832d1b6dec750382946de5c13b
[see in explorer](https://katanascan.com/address/0x5013c0b3defd8f832d1b6dec750382946de5c13b) | | RFQRouterSingleOutput AUTO | 0xc4088d6e5a2027e784efc0491c322a3e2621bd9e
[see in explorer](https://katanascan.com/address/0xc4088d6e5a2027e784efc0491c322a3e2621bd9e) | | SingleOutputRequestImpl AUTO | 0xcC42AE193E97a228BbC1e747Ea4af3aa170acCA2
[see in explorer](https://katanascan.com/address/0xcC42AE193E97a228BbC1e747Ea4af3aa170acCA2) | | Solver AUTO | 0xae68b7117be0026cbd4366303f74eecbb19e4042
[see in explorer](https://katanascan.com/address/0xae68b7117be0026cbd4366303f74eecbb19e4042) | | StakedRouterExecutor AUTO | 0x12efda5e4d410c5da723ceb7e43942779e3fe49b
[see in explorer](https://katanascan.com/address/0x12efda5e4d410c5da723ceb7e43942779e3fe49b) | | StakedRouterReceiver AUTO | 0x5d84f33b7c9214df23fd86a0861ac923af99954d
[see in explorer](https://katanascan.com/address/0x5d84f33b7c9214df23fd86a0861ac923af99954d) | | StakedRouterSingleOutput AUTO | 0x167d49f106bbea59587ef3c63b33e6a421af1b8d
[see in explorer](https://katanascan.com/address/0x167d49f106bbea59587ef3c63b33e6a421af1b8d) | | SwapExecutor AUTO | 0x6e8338B0c56f598809e72D6a31456f9D5452de72
[see in explorer](https://katanascan.com/address/0x6e8338B0c56f598809e72D6a31456f9D5452de72) | | SwapRequestCallback AUTO | 0x84Fd802Dd211D483Eb115Ee8a80d0029784c7637
[see in explorer](https://katanascan.com/address/0x84Fd802Dd211D483Eb115Ee8a80d0029784c7637) | | SwapRequestImpl AUTO | 0x79b5380FF38462b72e14667742f634c6610158B8
[see in explorer](https://katanascan.com/address/0x79b5380FF38462b72e14667742f634c6610158B8) | | SwitchboardPlug AUTO | 0xc5C38A15A9D3D9dC5Fc7dE4426779B695677e45D
[see in explorer](https://katanascan.com/address/0xc5C38A15A9D3D9dC5Fc7dE4426779B695677e45D) | | SwitchboardRouter AUTO | 0x3416daBEAf259FBE5ba455E361f23e58BAB91E3E
[see in explorer](https://katanascan.com/address/0x3416daBEAf259FBE5ba455E361f23e58BAB91E3E) | | UnwrapAndForward AUTO | 0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad
[see in explorer](https://katanascan.com/address/0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad) |
| name | address | | -------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | | AcrossImpl | 0x0Cd570303Dc16d2624fa74d4bf7c7fE38d7aBF25
[see in explorer](https://lineascan.build/address/0x0Cd570303Dc16d2624fa74d4bf7c7fE38d7aBF25) | | AcrossImplV3 | 0x740EA79e2FccDDB4eE8bB8Fc8ccAC5eb6dFa0b40
[see in explorer](https://lineascan.build/address/0x740EA79e2FccDDB4eE8bB8Fc8ccAC5eb6dFa0b40) | | AcrossStakedRoute AUTO | 0x125ac5a530ece0a06dd3cd3da711c054eadb57b9
[see in explorer](https://lineascan.build/address/0x125ac5a530ece0a06dd3cd3da711c054eadb57b9) | | AcrossV3WethUnwrapper | 0x36f0B62E4eE3d30939cBccABA9D983579799D931
[see in explorer](https://lineascan.build/address/0x36f0B62E4eE3d30939cBccABA9D983579799D931) | | BungeeDepository AUTO | 0xa6cd293ba20873b3cbbbf78f156a1d56d8ab9347
[see in explorer](https://lineascan.build/address/0xa6cd293ba20873b3cbbbf78f156a1d56d8ab9347) | | BungeeGateway AUTO | 0x6b1a31Af8A9DC9E8e489035859ca98D6335a0bcB
[see in explorer](https://lineascan.build/address/0x6b1a31Af8A9DC9E8e489035859ca98D6335a0bcB) | | BungeeInbox AUTO | 0x5e0f8e7337c8955d2124b8e85ca74af884b3e124
[see in explorer](https://lineascan.build/address/0x5e0f8e7337c8955d2124b8e85ca74af884b3e124) | | BungeeInboxOld AUTO | 0xBbe2c47dD59Ebc27204eB3437605b8c86F054a69
[see in explorer](https://lineascan.build/address/0xBbe2c47dD59Ebc27204eB3437605b8c86F054a69) | | CalldataExecutor AUTO | 0xa873aab6a98cb764ad6d52820d129d0e3667d9f9
[see in explorer](https://lineascan.build/address/0xa873aab6a98cb764ad6d52820d129d0e3667d9f9) | | CCTPRouterSingleOutput AUTO | 0x0000000000000000000000000000000000000000
[see in explorer](https://lineascan.build/address/0x0000000000000000000000000000000000000000) | | CctpV2Impl | 0xd5835Ae4D051D23EF0eEfe03e6D7e8D14b0668AD
[see in explorer](https://lineascan.build/address/0xd5835Ae4D051D23EF0eEfe03e6D7e8D14b0668AD) | | CCTPV2RouterSingleOutput AUTO | 0x6faec2944071b2a5ebfd1b08f43f29597aad8ca1
[see in explorer](https://lineascan.build/address/0x6faec2944071b2a5ebfd1b08f43f29597aad8ca1) | | CelerStakedRoute AUTO | 0xf1c07b6dddc480602d0304c31e6b13ff711b5828
[see in explorer](https://lineascan.build/address/0xf1c07b6dddc480602d0304c31e6b13ff711b5828) | | DisabledSocketRoute | 0x0f34A522FF82151c90679b73211955068FD854F1
[see in explorer](https://lineascan.build/address/0x0f34A522FF82151c90679b73211955068FD854F1) | | Entrypoint AUTO | 0x5e01dbBBe59F8987673FAdD1469DdD2Be71e00af
[see in explorer](https://lineascan.build/address/0x5e01dbBBe59F8987673FAdD1469DdD2Be71e00af) | | FeeCollector AUTO | 0xdcf83CC9CCDfa57aE757021f9457567F67BABeA9
[see in explorer](https://lineascan.build/address/0xdcf83CC9CCDfa57aE757021f9457567F67BABeA9) | | FeesTakerController | 0xa28f5a1575bbc9758EAc182CE3E66A2734621F4F
[see in explorer](https://lineascan.build/address/0xa28f5a1575bbc9758EAc182CE3E66A2734621F4F) | | GenericStakedRoute AUTO | 0x5013c0b3defd8f832d1b6dec750382946de5c13b
[see in explorer](https://lineascan.build/address/0x5013c0b3defd8f832d1b6dec750382946de5c13b) | | HopImplL2V2 | 0xc5131C8cf3E825D16aFf3196f3FE629FBE86D0bb
[see in explorer](https://lineascan.build/address/0xc5131C8cf3E825D16aFf3196f3FE629FBE86D0bb) | | KyberSwapImpl | 0x70ce162b46C172d20df5573fF86055a12A658873
[see in explorer](https://lineascan.build/address/0x70ce162b46C172d20df5573fF86055a12A658873) | | MagpieSwapImpl | 0xECe278805B61b2579dC21DA66681b359be85f546
[see in explorer](https://lineascan.build/address/0xECe278805B61b2579dC21DA66681b359be85f546) | | MayanBridgeImplV2 | 0x20574694cfD2145eD61BA4af37400303843AEF52
[see in explorer](https://lineascan.build/address/0x20574694cfD2145eD61BA4af37400303843AEF52) | | OpenOceanSwapImpl AUTO | 0xbb03B17C3D63e9707Cff789beD922Bf0Ab98d0c2
[see in explorer](https://lineascan.build/address/0xbb03B17C3D63e9707Cff789beD922Bf0Ab98d0c2) | | RefuelBridgeImpl | 0xB28777547bfe45503E669Ee256D97bBC79783bfD
[see in explorer](https://lineascan.build/address/0xB28777547bfe45503E669Ee256D97bBC79783bfD) | | RefuelSwapAndBridgeController | 0xD79c6bAc601ca92cb9F8Db61976CCdbb0588C5F6
[see in explorer](https://lineascan.build/address/0xD79c6bAc601ca92cb9F8Db61976CCdbb0588C5F6) | | RFQRouterSingleOutput AUTO | 0xc4088d6e5a2027e784efc0491c322a3e2621bd9e
[see in explorer](https://lineascan.build/address/0xc4088d6e5a2027e784efc0491c322a3e2621bd9e) | | SingleOutputRequestImpl AUTO | 0x76C3B1b35dfa2b165d41c44Ca3268B3AA97845A6
[see in explorer](https://lineascan.build/address/0x76C3B1b35dfa2b165d41c44Ca3268B3AA97845A6) | | SocketDeployFactory | 0x71630095e3F08A86aFC73f7b07342192adf39C55
[see in explorer](https://lineascan.build/address/0x71630095e3F08A86aFC73f7b07342192adf39C55) | | SocketGateway | 0x3a23F943181408EAC424116Af7b7790c94Cb97a5
[see in explorer](https://lineascan.build/address/0x3a23F943181408EAC424116Af7b7790c94Cb97a5) | | Solver AUTO | 0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042
[see in explorer](https://lineascan.build/address/0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042) | | StakedRouterExecutor AUTO | 0x12efda5e4d410c5da723ceb7e43942779e3fe49b
[see in explorer](https://lineascan.build/address/0x12efda5e4d410c5da723ceb7e43942779e3fe49b) | | StakedRouterReceiver AUTO | 0x5d84f33b7c9214df23fd86a0861ac923af99954d
[see in explorer](https://lineascan.build/address/0x5d84f33b7c9214df23fd86a0861ac923af99954d) | | StakedRouterSingleOutput AUTO | 0x167d49f106bbea59587ef3c63b33e6a421af1b8d
[see in explorer](https://lineascan.build/address/0x167d49f106bbea59587ef3c63b33e6a421af1b8d) | | StargateImplV2 | 0x4682e8315B80cF757e2077280E0471729c992Ed3
[see in explorer](https://lineascan.build/address/0x4682e8315B80cF757e2077280E0471729c992Ed3) | | SwapExecutor AUTO | 0x2261Fe33C0858a4Bb5178e429bF90C3652da961E
[see in explorer](https://lineascan.build/address/0x2261Fe33C0858a4Bb5178e429bF90C3652da961E) | | SwapRequestCallback AUTO | 0xEFB37Bd3a9ed2f768bf6f79d0379fe7f9BE50F49
[see in explorer](https://lineascan.build/address/0xEFB37Bd3a9ed2f768bf6f79d0379fe7f9BE50F49) | | SwapRequestImpl AUTO | 0x69f9d5a9E04b9cED4dff07Cd47c393856FA3D6Be
[see in explorer](https://lineascan.build/address/0x69f9d5a9E04b9cED4dff07Cd47c393856FA3D6Be) | | SwitchboardPlug AUTO | 0xeaCb816dF64027f3CA536735efA6835cda70D785
[see in explorer](https://lineascan.build/address/0xeaCb816dF64027f3CA536735efA6835cda70D785) | | SwitchboardRouter AUTO | 0xcE4B9942153b53aE4807dCFE703814C74e02aF62
[see in explorer](https://lineascan.build/address/0xcE4B9942153b53aE4807dCFE703814C74e02aF62) | | SymbiosisBridgeImpl | 0xf166678776d22016DdC7415003acFEcEFe8b07dd
[see in explorer](https://lineascan.build/address/0xf166678776d22016DdC7415003acFEcEFe8b07dd) | | UnwrapAndForward AUTO | 0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad
[see in explorer](https://lineascan.build/address/0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad) | | ZeroxV2SwapImpl | 0x413d1edcF7C0837F09e0DB6375DdE6D5F066ABaC
[see in explorer](https://lineascan.build/address/0x413d1edcF7C0837F09e0DB6375DdE6D5F066ABaC) | | ZeroxV2Wrapper AUTO | 0x614595189d16995Fe22a5c267B220C803e50966F
[see in explorer](https://lineascan.build/address/0x614595189d16995Fe22a5c267B220C803e50966F) |
| name | address | | -------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | | BungeeGateway AUTO | 0x69f9d5a9E04b9cED4dff07Cd47c393856FA3D6Be
[see in explorer](https://mantlescan.xyz/address/0x69f9d5a9E04b9cED4dff07Cd47c393856FA3D6Be) | | BungeeInbox AUTO | 0x5e0f8e7337c8955d2124b8e85ca74af884b3e124
[see in explorer](https://mantlescan.xyz/address/0x5e0f8e7337c8955d2124b8e85ca74af884b3e124) | | BungeeInboxOld AUTO | 0x9330914D5Ad261fE360fDe447455B60A9029C246
[see in explorer](https://mantlescan.xyz/address/0x9330914D5Ad261fE360fDe447455B60A9029C246) | | CalldataExecutor AUTO | 0xa873aab6a98cb764ad6d52820d129d0e3667d9f9
[see in explorer](https://mantlescan.xyz/address/0xa873aab6a98cb764ad6d52820d129d0e3667d9f9) | | CCTPRouterSingleOutput AUTO | 0x0000000000000000000000000000000000000000
[see in explorer](https://mantlescan.xyz/address/0x0000000000000000000000000000000000000000) | | CCTPV2RouterSingleOutput AUTO | 0x0000000000000000000000000000000000000000
[see in explorer](https://mantlescan.xyz/address/0x0000000000000000000000000000000000000000) | | DisabledSocketRoute | 0x0f34A522FF82151c90679b73211955068FD854F1
[see in explorer](https://mantlescan.xyz/address/0x0f34A522FF82151c90679b73211955068FD854F1) | | Entrypoint AUTO | 0x6d4b85854dC621EF9D64368aEbd98dC27577e642
[see in explorer](https://mantlescan.xyz/address/0x6d4b85854dC621EF9D64368aEbd98dC27577e642) | | FeeCollector AUTO | 0xdcf83CC9CCDfa57aE757021f9457567F67BABeA9
[see in explorer](https://mantlescan.xyz/address/0xdcf83CC9CCDfa57aE757021f9457567F67BABeA9) | | GenericStakedRoute AUTO | 0x5013c0b3defd8f832d1b6dec750382946de5c13b
[see in explorer](https://mantlescan.xyz/address/0x5013c0b3defd8f832d1b6dec750382946de5c13b) | | KyberSwapImpl | 0x70ce162b46C172d20df5573fF86055a12A658873
[see in explorer](https://mantlescan.xyz/address/0x70ce162b46C172d20df5573fF86055a12A658873) | | OpenOceanSwapImpl AUTO | 0x413d1edcF7C0837F09e0DB6375DdE6D5F066ABaC
[see in explorer](https://mantlescan.xyz/address/0x413d1edcF7C0837F09e0DB6375DdE6D5F066ABaC) | | RefuelBridgeImpl | 0x36A4f914fc2839aA60EF3a79395aB8D6239f6772
[see in explorer](https://mantlescan.xyz/address/0x36A4f914fc2839aA60EF3a79395aB8D6239f6772) | | RFQRouterSingleOutput AUTO | 0xc4088d6e5a2027e784efc0491c322a3e2621bd9e
[see in explorer](https://mantlescan.xyz/address/0xc4088d6e5a2027e784efc0491c322a3e2621bd9e) | | SingleOutputRequestImpl AUTO | 0xDF7184D8E57E94EF96C4D3A41985109839E49878
[see in explorer](https://mantlescan.xyz/address/0xDF7184D8E57E94EF96C4D3A41985109839E49878) | | SocketDeployFactory | 0x71630095e3F08A86aFC73f7b07342192adf39C55
[see in explorer](https://mantlescan.xyz/address/0x71630095e3F08A86aFC73f7b07342192adf39C55) | | SocketGateway | 0x3a23F943181408EAC424116Af7b7790c94Cb97a5
[see in explorer](https://mantlescan.xyz/address/0x3a23F943181408EAC424116Af7b7790c94Cb97a5) | | Solver AUTO | 0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042
[see in explorer](https://mantlescan.xyz/address/0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042) | | StakedRouterExecutor AUTO | 0x12efda5e4d410c5da723ceb7e43942779e3fe49b
[see in explorer](https://mantlescan.xyz/address/0x12efda5e4d410c5da723ceb7e43942779e3fe49b) | | StakedRouterReceiver AUTO | 0x5d84f33b7c9214df23fd86a0861ac923af99954d
[see in explorer](https://mantlescan.xyz/address/0x5d84f33b7c9214df23fd86a0861ac923af99954d) | | StakedRouterSingleOutput AUTO | 0x167d49f106bbea59587ef3c63b33e6a421af1b8d
[see in explorer](https://mantlescan.xyz/address/0x167d49f106bbea59587ef3c63b33e6a421af1b8d) | | StargateImplV2 | 0x4682e8315B80cF757e2077280E0471729c992Ed3
[see in explorer](https://mantlescan.xyz/address/0x4682e8315B80cF757e2077280E0471729c992Ed3) | | SwapExecutor AUTO | 0xb32caFa603E405Ee0121237582913a8299C636C3
[see in explorer](https://mantlescan.xyz/address/0xb32caFa603E405Ee0121237582913a8299C636C3) | | SwapRequestCallback AUTO | 0xEFB37Bd3a9ed2f768bf6f79d0379fe7f9BE50F49
[see in explorer](https://mantlescan.xyz/address/0xEFB37Bd3a9ed2f768bf6f79d0379fe7f9BE50F49) | | SwapRequestImpl AUTO | 0x76C3B1b35dfa2b165d41c44Ca3268B3AA97845A6
[see in explorer](https://mantlescan.xyz/address/0x76C3B1b35dfa2b165d41c44Ca3268B3AA97845A6) | | SwitchboardPlug AUTO | 0xcE4B9942153b53aE4807dCFE703814C74e02aF62
[see in explorer](https://mantlescan.xyz/address/0xcE4B9942153b53aE4807dCFE703814C74e02aF62) | | SwitchboardRouter AUTO | 0xF7448Ea886217f851594c63B19423854E9e56a41
[see in explorer](https://mantlescan.xyz/address/0xF7448Ea886217f851594c63B19423854E9e56a41) | | SymbiosisBridgeImpl | 0x45362caA305D15A12D2AC781049069d87Dc6372c
[see in explorer](https://mantlescan.xyz/address/0x45362caA305D15A12D2AC781049069d87Dc6372c) | | UnwrapAndForward AUTO | 0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad
[see in explorer](https://mantlescan.xyz/address/0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad) | | ZeroxV2SwapImpl | 0xCFee2171DC6c670eF1E0Df832df0cF37C31705E9
[see in explorer](https://mantlescan.xyz/address/0xCFee2171DC6c670eF1E0Df832df0cF37C31705E9) | | ZeroxV2Wrapper AUTO | 0x614595189d16995Fe22a5c267B220C803e50966F
[see in explorer](https://mantlescan.xyz/address/0x614595189d16995Fe22a5c267B220C803e50966F) |
| name | address | | -------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | | AcrossStakedRoute AUTO | 0x125ac5a530ece0a06dd3cd3da711c054eadb57b9
[see in explorer](https://mega.etherscan.io/address/0x125ac5a530ece0a06dd3cd3da711c054eadb57b9) | | BungeeGateway AUTO | 0x8f503B6d9fFdae8d375d1E226b71B4B3144D3849
[see in explorer](https://mega.etherscan.io/address/0x8f503B6d9fFdae8d375d1E226b71B4B3144D3849) | | BungeeInbox AUTO | 0x5e0f8e7337c8955d2124b8e85ca74af884b3e124
[see in explorer](https://mega.etherscan.io/address/0x5e0f8e7337c8955d2124b8e85ca74af884b3e124) | | CalldataExecutor AUTO | 0xa873aab6a98cb764ad6d52820d129d0e3667d9f9
[see in explorer](https://mega.etherscan.io/address/0xa873aab6a98cb764ad6d52820d129d0e3667d9f9) | | Entrypoint AUTO | 0xc8807bD5b5c87Fe7Fc73D644Cb7800d1A4e4F09D
[see in explorer](https://mega.etherscan.io/address/0xc8807bD5b5c87Fe7Fc73D644Cb7800d1A4e4F09D) | | FeeCollector AUTO | 0xE12D0CE29B916fbc067f49a8ebC203ffB66E8ded
[see in explorer](https://mega.etherscan.io/address/0xE12D0CE29B916fbc067f49a8ebC203ffB66E8ded) | | GenericStakedRoute AUTO | 0x5013c0b3defd8f832d1b6dec750382946de5c13b
[see in explorer](https://mega.etherscan.io/address/0x5013c0b3defd8f832d1b6dec750382946de5c13b) | | RFQRouterSingleOutput AUTO | 0xc4088d6e5a2027e784efc0491c322a3e2621bd9e
[see in explorer](https://mega.etherscan.io/address/0xc4088d6e5a2027e784efc0491c322a3e2621bd9e) | | SingleOutputRequestImpl AUTO | 0xcC42AE193E97a228BbC1e747Ea4af3aa170acCA2
[see in explorer](https://mega.etherscan.io/address/0xcC42AE193E97a228BbC1e747Ea4af3aa170acCA2) | | Solver AUTO | 0xae68b7117be0026cbd4366303f74eecbb19e4042
[see in explorer](https://mega.etherscan.io/address/0xae68b7117be0026cbd4366303f74eecbb19e4042) | | StakedRouterExecutor AUTO | 0x12efda5e4d410c5da723ceb7e43942779e3fe49b
[see in explorer](https://mega.etherscan.io/address/0x12efda5e4d410c5da723ceb7e43942779e3fe49b) | | StakedRouterReceiver AUTO | 0x5d84f33b7c9214df23fd86a0861ac923af99954d
[see in explorer](https://mega.etherscan.io/address/0x5d84f33b7c9214df23fd86a0861ac923af99954d) | | StakedRouterSingleOutput AUTO | 0x167d49f106bbea59587ef3c63b33e6a421af1b8d
[see in explorer](https://mega.etherscan.io/address/0x167d49f106bbea59587ef3c63b33e6a421af1b8d) | | SwapExecutor AUTO | 0x6e8338B0c56f598809e72D6a31456f9D5452de72
[see in explorer](https://mega.etherscan.io/address/0x6e8338B0c56f598809e72D6a31456f9D5452de72) | | SwapRequestCallback AUTO | 0x20FE2F4E88144be7323fed36aA15402088c4c5aB
[see in explorer](https://mega.etherscan.io/address/0x20FE2F4E88144be7323fed36aA15402088c4c5aB) | | SwapRequestImpl AUTO | 0x79b5380FF38462b72e14667742f634c6610158B8
[see in explorer](https://mega.etherscan.io/address/0x79b5380FF38462b72e14667742f634c6610158B8) | | SwitchboardPlug AUTO | 0xc5C38A15A9D3D9dC5Fc7dE4426779B695677e45D
[see in explorer](https://mega.etherscan.io/address/0xc5C38A15A9D3D9dC5Fc7dE4426779B695677e45D) | | SwitchboardRouter AUTO | 0x3416daBEAf259FBE5ba455E361f23e58BAB91E3E
[see in explorer](https://mega.etherscan.io/address/0x3416daBEAf259FBE5ba455E361f23e58BAB91E3E) | | UnwrapAndForward AUTO | 0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad
[see in explorer](https://mega.etherscan.io/address/0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad) |
| name | address | | -------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | | AcrossImpl | 0xa28f5a1575bbc9758EAc182CE3E66A2734621F4F
[see in explorer](https://explorer.mode.network/address/0xa28f5a1575bbc9758EAc182CE3E66A2734621F4F) | | AcrossImplV3 | 0x740EA79e2FccDDB4eE8bB8Fc8ccAC5eb6dFa0b40
[see in explorer](https://explorer.mode.network/address/0x740EA79e2FccDDB4eE8bB8Fc8ccAC5eb6dFa0b40) | | AcrossStakedRoute AUTO | 0x125ac5a530ece0a06dd3cd3da711c054eadb57b9
[see in explorer](https://explorer.mode.network/address/0x125ac5a530ece0a06dd3cd3da711c054eadb57b9) | | AcrossV3WethUnwrapper | 0x36f0B62E4eE3d30939cBccABA9D983579799D931
[see in explorer](https://explorer.mode.network/address/0x36f0B62E4eE3d30939cBccABA9D983579799D931) | | BungeeGateway AUTO | 0x8f503B6d9fFdae8d375d1E226b71B4B3144D3849
[see in explorer](https://explorer.mode.network/address/0x8f503B6d9fFdae8d375d1E226b71B4B3144D3849) | | BungeeInbox AUTO | 0x5e0f8e7337c8955d2124b8e85ca74af884b3e124
[see in explorer](https://explorer.mode.network/address/0x5e0f8e7337c8955d2124b8e85ca74af884b3e124) | | BungeeInboxOld AUTO | 0xa7ecA4EE5288190a2Be7dFF89b8972a7b32c114d
[see in explorer](https://explorer.mode.network/address/0xa7ecA4EE5288190a2Be7dFF89b8972a7b32c114d) | | CalldataExecutor AUTO | 0xa873aab6a98cb764ad6d52820d129d0e3667d9f9
[see in explorer](https://explorer.mode.network/address/0xa873aab6a98cb764ad6d52820d129d0e3667d9f9) | | CCTPRouterSingleOutput AUTO | 0x0000000000000000000000000000000000000000
[see in explorer](https://explorer.mode.network/address/0x0000000000000000000000000000000000000000) | | CCTPV2RouterSingleOutput AUTO | 0x0000000000000000000000000000000000000000
[see in explorer](https://explorer.mode.network/address/0x0000000000000000000000000000000000000000) | | Entrypoint AUTO | 0xc8807bD5b5c87Fe7Fc73D644Cb7800d1A4e4F09D
[see in explorer](https://explorer.mode.network/address/0xc8807bD5b5c87Fe7Fc73D644Cb7800d1A4e4F09D) | | FeeCollector AUTO | 0xE12D0CE29B916fbc067f49a8ebC203ffB66E8ded
[see in explorer](https://explorer.mode.network/address/0xE12D0CE29B916fbc067f49a8ebC203ffB66E8ded) | | FeesTakerController | 0x6163484b8d0Db43238C1875bcD7dA987e1824273
[see in explorer](https://explorer.mode.network/address/0x6163484b8d0Db43238C1875bcD7dA987e1824273) | | GenericStakedRoute AUTO | 0x5013c0b3defd8f832d1b6dec750382946de5c13b
[see in explorer](https://explorer.mode.network/address/0x5013c0b3defd8f832d1b6dec750382946de5c13b) | | RefuelSwapAndBridgeController | 0x45362caA305D15A12D2AC781049069d87Dc6372c
[see in explorer](https://explorer.mode.network/address/0x45362caA305D15A12D2AC781049069d87Dc6372c) | | RFQRouterSingleOutput AUTO | 0xc4088d6e5a2027e784efc0491c322a3e2621bd9e
[see in explorer](https://explorer.mode.network/address/0xc4088d6e5a2027e784efc0491c322a3e2621bd9e) | | SingleOutputRequestImpl AUTO | 0xcC42AE193E97a228BbC1e747Ea4af3aa170acCA2
[see in explorer](https://explorer.mode.network/address/0xcC42AE193E97a228BbC1e747Ea4af3aa170acCA2) | | SocketDeployFactory | 0x71630095e3F08A86aFC73f7b07342192adf39C55
[see in explorer](https://explorer.mode.network/address/0x71630095e3F08A86aFC73f7b07342192adf39C55) | | SocketGateway | 0x3a23F943181408EAC424116Af7b7790c94Cb97a5
[see in explorer](https://explorer.mode.network/address/0x3a23F943181408EAC424116Af7b7790c94Cb97a5) | | Solver AUTO | 0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042
[see in explorer](https://explorer.mode.network/address/0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042) | | StakedRouterExecutor AUTO | 0x12efda5e4d410c5da723ceb7e43942779e3fe49b
[see in explorer](https://explorer.mode.network/address/0x12efda5e4d410c5da723ceb7e43942779e3fe49b) | | StakedRouterReceiver AUTO | 0x5d84f33b7c9214df23fd86a0861ac923af99954d
[see in explorer](https://explorer.mode.network/address/0x5d84f33b7c9214df23fd86a0861ac923af99954d) | | StakedRouterSingleOutput AUTO | 0x167d49f106bbea59587ef3c63b33e6a421af1b8d
[see in explorer](https://explorer.mode.network/address/0x167d49f106bbea59587ef3c63b33e6a421af1b8d) | | StargateImplV2 | 0x4682e8315B80cF757e2077280E0471729c992Ed3
[see in explorer](https://explorer.mode.network/address/0x4682e8315B80cF757e2077280E0471729c992Ed3) | | SwapExecutor AUTO | 0x6e8338B0c56f598809e72D6a31456f9D5452de72
[see in explorer](https://explorer.mode.network/address/0x6e8338B0c56f598809e72D6a31456f9D5452de72) | | SwapRequestCallback AUTO | 0xEFB37Bd3a9ed2f768bf6f79d0379fe7f9BE50F49
[see in explorer](https://explorer.mode.network/address/0xEFB37Bd3a9ed2f768bf6f79d0379fe7f9BE50F49) | | SwapRequestImpl AUTO | 0x79b5380FF38462b72e14667742f634c6610158B8
[see in explorer](https://explorer.mode.network/address/0x79b5380FF38462b72e14667742f634c6610158B8) | | SwitchboardPlug AUTO | 0xc5C38A15A9D3D9dC5Fc7dE4426779B695677e45D
[see in explorer](https://explorer.mode.network/address/0xc5C38A15A9D3D9dC5Fc7dE4426779B695677e45D) | | SwitchboardRouter AUTO | 0x3416daBEAf259FBE5ba455E361f23e58BAB91E3E
[see in explorer](https://explorer.mode.network/address/0x3416daBEAf259FBE5ba455E361f23e58BAB91E3E) | | SymbiosisBridgeImpl | 0xb47Fa80C9548cE9D5a5557f78d99B6a78f62C46F
[see in explorer](https://explorer.mode.network/address/0xb47Fa80C9548cE9D5a5557f78d99B6a78f62C46F) | | UnwrapAndForward AUTO | 0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad
[see in explorer](https://explorer.mode.network/address/0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad) | | ZeroxV2Wrapper AUTO | 0x614595189d16995Fe22a5c267B220C803e50966F
[see in explorer](https://explorer.mode.network/address/0x614595189d16995Fe22a5c267B220C803e50966F) |
| name | address | | -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | | AcrossStakedRoute AUTO | 0x125ac5a530ece0a06dd3cd3da711c054eadb57b9
[see in explorer](https://monadscan.com/address/0x125ac5a530ece0a06dd3cd3da711c054eadb57b9) | | BungeeGateway AUTO | 0x1A2F1085A94De6fBcc334AAE1DDf527C567b75E7
[see in explorer](https://monadscan.com/address/0x1A2F1085A94De6fBcc334AAE1DDf527C567b75E7) | | BungeeInbox AUTO | 0x5e0f8e7337c8955d2124b8e85ca74af884b3e124
[see in explorer](https://monadscan.com/address/0x5e0f8e7337c8955d2124b8e85ca74af884b3e124) | | BungeeInboxOld AUTO | 0xaB568b1B49f8bE7488Ca1c0D5DdA6fF94691e4c8
[see in explorer](https://monadscan.com/address/0xaB568b1B49f8bE7488Ca1c0D5DdA6fF94691e4c8) | | CalldataExecutor AUTO | 0xa873aab6a98cb764ad6d52820d129d0e3667d9f9
[see in explorer](https://monadscan.com/address/0xa873aab6a98cb764ad6d52820d129d0e3667d9f9) | | CCTPV2RouterSingleOutput AUTO | 0x6faec2944071b2a5ebfd1b08f43f29597aad8ca1
[see in explorer](https://monadscan.com/address/0x6faec2944071b2a5ebfd1b08f43f29597aad8ca1) | | Entrypoint AUTO | 0x3bb92b8452bDE5Ac20C18E10e606fdc9AC19b414
[see in explorer](https://monadscan.com/address/0x3bb92b8452bDE5Ac20C18E10e606fdc9AC19b414) | | FeeCollector AUTO | 0x82260Eac86558C0835D08eeFF360014aEa7454b6
[see in explorer](https://monadscan.com/address/0x82260Eac86558C0835D08eeFF360014aEa7454b6) | | GenericStakedRoute AUTO | 0x5013c0b3defd8f832d1b6dec750382946de5c13b
[see in explorer](https://monadscan.com/address/0x5013c0b3defd8f832d1b6dec750382946de5c13b) | | RFQRouterSingleOutput AUTO | 0xc4088d6e5a2027e784efc0491c322a3e2621bd9e
[see in explorer](https://monadscan.com/address/0xc4088d6e5a2027e784efc0491c322a3e2621bd9e) | | SingleOutputRequestImpl AUTO | 0x27D966329a325f214b4854a4F0E62550BFebdca3
[see in explorer](https://monadscan.com/address/0x27D966329a325f214b4854a4F0E62550BFebdca3) | | Solver AUTO | 0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042
[see in explorer](https://monadscan.com/address/0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042) | | StakedRouterExecutor AUTO | 0x12efda5e4d410c5da723ceb7e43942779e3fe49b
[see in explorer](https://monadscan.com/address/0x12efda5e4d410c5da723ceb7e43942779e3fe49b) | | StakedRouterReceiver AUTO | 0x5d84f33b7c9214df23fd86a0861ac923af99954d
[see in explorer](https://monadscan.com/address/0x5d84f33b7c9214df23fd86a0861ac923af99954d) | | StakedRouterSingleOutput AUTO | 0x167d49f106bbea59587ef3c63b33e6a421af1b8d
[see in explorer](https://monadscan.com/address/0x167d49f106bbea59587ef3c63b33e6a421af1b8d) | | SwapExecutor AUTO | 0xd0389e84178f809903cbFE7D1EfAE3EFa9c1769c
[see in explorer](https://monadscan.com/address/0xd0389e84178f809903cbFE7D1EfAE3EFa9c1769c) | | SwapRequestCallback AUTO | 0x88a8596e2B51512aab3867Cc895d7047E1D9ef7B
[see in explorer](https://monadscan.com/address/0x88a8596e2B51512aab3867Cc895d7047E1D9ef7B) | | SwapRequestImpl AUTO | 0x01D8a85aDb82408E14bC242ed43fBaD0Ca2F94CB
[see in explorer](https://monadscan.com/address/0x01D8a85aDb82408E14bC242ed43fBaD0Ca2F94CB) | | SwitchboardPlug AUTO | 0xF20B3CB7508c519296556C1Caa9dB6F210e0232a
[see in explorer](https://monadscan.com/address/0xF20B3CB7508c519296556C1Caa9dB6F210e0232a) | | SwitchboardRouter AUTO | 0x3859AD748D03C358aAbB66d084bC5849B624E611
[see in explorer](https://monadscan.com/address/0x3859AD748D03C358aAbB66d084bC5849B624E611) | | UnwrapAndForward AUTO | 0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad
[see in explorer](https://monadscan.com/address/0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad) |
| name | address | | -------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | | AcrossImpl | 0x4dDaEAeb61c3686d01BC4B730c1a55D1C1C1dC0a
[see in explorer](https://optimistic.etherscan.io/address/0x4dDaEAeb61c3686d01BC4B730c1a55D1C1C1dC0a) | | AcrossImplV3 | 0x740EA79e2FccDDB4eE8bB8Fc8ccAC5eb6dFa0b40
[see in explorer](https://optimistic.etherscan.io/address/0x740EA79e2FccDDB4eE8bB8Fc8ccAC5eb6dFa0b40) | | AcrossStakedRoute AUTO | 0x125ac5a530ece0a06dd3cd3da711c054eadb57b9
[see in explorer](https://optimistic.etherscan.io/address/0x125ac5a530ece0a06dd3cd3da711c054eadb57b9) | | AcrossV3WethUnwrapper | 0x36f0B62E4eE3d30939cBccABA9D983579799D931
[see in explorer](https://optimistic.etherscan.io/address/0x36f0B62E4eE3d30939cBccABA9D983579799D931) | | AnyswapV6L2Impl | 0x4D46d8c1Ac1c80538AF5002BC64B6412e4Ac1023
[see in explorer](https://optimistic.etherscan.io/address/0x4D46d8c1Ac1c80538AF5002BC64B6412e4Ac1023) | | BungeeDepository AUTO | 0xa6cd293ba20873b3cbbbf78f156a1d56d8ab9347
[see in explorer](https://optimistic.etherscan.io/address/0xa6cd293ba20873b3cbbbf78f156a1d56d8ab9347) | | BungeeGateway AUTO | 0x09DAbdD517Ff1e155DeDEF64EC629Ca0285a31af
[see in explorer](https://optimistic.etherscan.io/address/0x09DAbdD517Ff1e155DeDEF64EC629Ca0285a31af) | | BungeeInbox AUTO | 0x5e0f8e7337c8955d2124b8e85ca74af884b3e124
[see in explorer](https://optimistic.etherscan.io/address/0x5e0f8e7337c8955d2124b8e85ca74af884b3e124) | | BungeeInboxOld AUTO | 0x78255f1DeE074fb7084Ee124058A058dE0B1C251
[see in explorer](https://optimistic.etherscan.io/address/0x78255f1DeE074fb7084Ee124058A058dE0B1C251) | | CalldataExecutor AUTO | 0xa873aab6a98cb764ad6d52820d129d0e3667d9f9
[see in explorer](https://optimistic.etherscan.io/address/0xa873aab6a98cb764ad6d52820d129d0e3667d9f9) | | CctpImpl | 0x2438DB4D24256371CC29405b12D646D370988D75
[see in explorer](https://optimistic.etherscan.io/address/0x2438DB4D24256371CC29405b12D646D370988D75) | | CCTPRouterSingleOutput AUTO | 0x3b4817827d06600f92296c5d1491818d69fc955f
[see in explorer](https://optimistic.etherscan.io/address/0x3b4817827d06600f92296c5d1491818d69fc955f) | | CCTPV2RouterSingleOutput AUTO | 0x6faec2944071b2a5ebfd1b08f43f29597aad8ca1
[see in explorer](https://optimistic.etherscan.io/address/0x6faec2944071b2a5ebfd1b08f43f29597aad8ca1) | | CelerImpl | 0xAe9482Ce7f2a472800D5e7f7F45eD12F17c90A8E
[see in explorer](https://optimistic.etherscan.io/address/0xAe9482Ce7f2a472800D5e7f7F45eD12F17c90A8E) | | CelerStakedRoute AUTO | 0xf1c07b6dddc480602d0304c31e6b13ff711b5828
[see in explorer](https://optimistic.etherscan.io/address/0xf1c07b6dddc480602d0304c31e6b13ff711b5828) | | CelerStorageWrapper | 0x7c6C373190421988fA31E64f369C45205676C1f0
[see in explorer](https://optimistic.etherscan.io/address/0x7c6C373190421988fA31E64f369C45205676C1f0) | | CelerV2Impl | 0x44532990D085C099e22F480ca15D8F0AC49CfE5D
[see in explorer](https://optimistic.etherscan.io/address/0x44532990D085C099e22F480ca15D8F0AC49CfE5D) | | ConnextImpl | 0x097A3DA20D7A9444a14361BC43481a9b303b573F
[see in explorer](https://optimistic.etherscan.io/address/0x097A3DA20D7A9444a14361BC43481a9b303b573F) | | DisabledSocketRoute | 0x0f34A522FF82151c90679b73211955068FD854F1
[see in explorer](https://optimistic.etherscan.io/address/0x0f34A522FF82151c90679b73211955068FD854F1) | | Entrypoint AUTO | 0x73096A2cD977941d0D423fA08F8C14DC5100DCef
[see in explorer](https://optimistic.etherscan.io/address/0x73096A2cD977941d0D423fA08F8C14DC5100DCef) | | FeeCollector AUTO | 0xdb629B83681Db277273808A15be68688CE75a94A
[see in explorer](https://optimistic.etherscan.io/address/0xdb629B83681Db277273808A15be68688CE75a94A) | | FeesTakerController | 0x4E7f21d92b70fCBBcB6AFCb8Bf59420622c158B3
[see in explorer](https://optimistic.etherscan.io/address/0x4E7f21d92b70fCBBcB6AFCb8Bf59420622c158B3) | | GenericStakedRoute AUTO | 0x5013c0b3defd8f832d1b6dec750382946de5c13b
[see in explorer](https://optimistic.etherscan.io/address/0x5013c0b3defd8f832d1b6dec750382946de5c13b) | | HopCctpImpl | 0xA9b0eEaC593378ce40360368b42c28c218F4b6f9
[see in explorer](https://optimistic.etherscan.io/address/0xA9b0eEaC593378ce40360368b42c28c218F4b6f9) | | HopImplL2 | 0x2d0EeB574cC98f6d57c72FFe730D5C8a8f2eac37
[see in explorer](https://optimistic.etherscan.io/address/0x2d0EeB574cC98f6d57c72FFe730D5C8a8f2eac37) | | HopImplL2V2 | 0xF1b6f0c071cE884f53B789720e3d8B523EC895bb
[see in explorer](https://optimistic.etherscan.io/address/0xF1b6f0c071cE884f53B789720e3d8B523EC895bb) | | HyphenImpl | 0x653a03b511E6FE9e80eeCb2bBbD36DCaf93cF147
[see in explorer](https://optimistic.etherscan.io/address/0x653a03b511E6FE9e80eeCb2bBbD36DCaf93cF147) | | KyberSwapImpl | 0x07f743edaEc2d8B15b682cBE0b12646433FC03A7
[see in explorer](https://optimistic.etherscan.io/address/0x07f743edaEc2d8B15b682cBE0b12646433FC03A7) | | MagpieSwapImpl | 0x29bd93433302B160dC0262ba26aC0cF854661679
[see in explorer](https://optimistic.etherscan.io/address/0x29bd93433302B160dC0262ba26aC0cF854661679) | | MayanBridgeImpl | 0x7e1ED5E1b6FC312694B4ABB3Afd27B627441B3Ef
[see in explorer](https://optimistic.etherscan.io/address/0x7e1ED5E1b6FC312694B4ABB3Afd27B627441B3Ef) | | MayanBridgeImplV2 | 0xf4f62E1D36B0Be2a701EDaa25967b6204C6b5aBE
[see in explorer](https://optimistic.etherscan.io/address/0xf4f62E1D36B0Be2a701EDaa25967b6204C6b5aBE) | | OneInchImpl | 0x33Ac3447b7707A31888d5f003234CCaBb54339e5
[see in explorer](https://optimistic.etherscan.io/address/0x33Ac3447b7707A31888d5f003234CCaBb54339e5) | | OpenOceanSwapImpl AUTO | 0x4F5Ab12A90fC5467d6cd43888E4Ef877ec304954
[see in explorer](https://optimistic.etherscan.io/address/0x4F5Ab12A90fC5467d6cd43888E4Ef877ec304954) | | RainbowSwapImpl | 0x3E76e8674FFFD1e6495Ec719B82a86cb6a31EFf7
[see in explorer](https://optimistic.etherscan.io/address/0x3E76e8674FFFD1e6495Ec719B82a86cb6a31EFf7) | | RefuelBridgeImpl | 0xE186a05FB020324a7cA61d80138BB1EA66DDDbDF
[see in explorer](https://optimistic.etherscan.io/address/0xE186a05FB020324a7cA61d80138BB1EA66DDDbDF) | | RefuelSwapAndBridgeController | 0x3Dd7419889FF387A58D3Dad1F8B49ea1064290fB
[see in explorer](https://optimistic.etherscan.io/address/0x3Dd7419889FF387A58D3Dad1F8B49ea1064290fB) | | RFQRouterSingleOutput AUTO | 0xc4088d6e5a2027e784efc0491c322a3e2621bd9e
[see in explorer](https://optimistic.etherscan.io/address/0xc4088d6e5a2027e784efc0491c322a3e2621bd9e) | | SingleOutputRequestImpl AUTO | 0x9c5fbD790A4D7921DBc66b09830F2D485a21f307
[see in explorer](https://optimistic.etherscan.io/address/0x9c5fbD790A4D7921DBc66b09830F2D485a21f307) | | SocketDeployFactory | 0x71630095e3F08A86aFC73f7b07342192adf39C55
[see in explorer](https://optimistic.etherscan.io/address/0x71630095e3F08A86aFC73f7b07342192adf39C55) | | SocketGateway | 0x3a23F943181408EAC424116Af7b7790c94Cb97a5
[see in explorer](https://optimistic.etherscan.io/address/0x3a23F943181408EAC424116Af7b7790c94Cb97a5) | | Solver AUTO | 0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042
[see in explorer](https://optimistic.etherscan.io/address/0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042) | | StakedRouterExecutor AUTO | 0x12efda5e4d410c5da723ceb7e43942779e3fe49b
[see in explorer](https://optimistic.etherscan.io/address/0x12efda5e4d410c5da723ceb7e43942779e3fe49b) | | StakedRouterReceiver AUTO | 0x5d84f33b7c9214df23fd86a0861ac923af99954d
[see in explorer](https://optimistic.etherscan.io/address/0x5d84f33b7c9214df23fd86a0861ac923af99954d) | | StakedRouterSingleOutput AUTO | 0x167d49f106bbea59587ef3c63b33e6a421af1b8d
[see in explorer](https://optimistic.etherscan.io/address/0x167d49f106bbea59587ef3c63b33e6a421af1b8d) | | StargateImplL2 | 0xFAAFb26C06a45962E97452E5d4310df2586623A2
[see in explorer](https://optimistic.etherscan.io/address/0xFAAFb26C06a45962E97452E5d4310df2586623A2) | | StargateImplL2V2 | 0x983dD91dD53F1171E846d585B4f2c7c84F14E78f
[see in explorer](https://optimistic.etherscan.io/address/0x983dD91dD53F1171E846d585B4f2c7c84F14E78f) | | StargateImplV2 | 0xF20B3CB7508c519296556C1Caa9dB6F210e0232a
[see in explorer](https://optimistic.etherscan.io/address/0xF20B3CB7508c519296556C1Caa9dB6F210e0232a) | | SwapExecutor AUTO | 0x84F06fBaCc4b64CA2f72a4B26191DAD97f2b52BA
[see in explorer](https://optimistic.etherscan.io/address/0x84F06fBaCc4b64CA2f72a4B26191DAD97f2b52BA) | | SwapRequestCallback AUTO | 0xC8E67b4D14A84D3408932a7ED01789d20864B624
[see in explorer](https://optimistic.etherscan.io/address/0xC8E67b4D14A84D3408932a7ED01789d20864B624) | | SwapRequestImpl AUTO | 0x3c819aAEeD5063F4A613032386Be29035E2F043d
[see in explorer](https://optimistic.etherscan.io/address/0x3c819aAEeD5063F4A613032386Be29035E2F043d) | | SwitchboardPlug AUTO | 0x0D1A6Fef68F81A407f4d66a7e0229eC198107ECa
[see in explorer](https://optimistic.etherscan.io/address/0x0D1A6Fef68F81A407f4d66a7e0229eC198107ECa) | | SwitchboardRouter AUTO | 0xBd5a1D22e83c53Bdd403bb50D5465472D8F05FAD
[see in explorer](https://optimistic.etherscan.io/address/0xBd5a1D22e83c53Bdd403bb50D5465472D8F05FAD) | | SymbiosisBridgeImpl | 0xFd010e8C1005FB5f0b9Bce7c86fA78734A4F6575
[see in explorer](https://optimistic.etherscan.io/address/0xFd010e8C1005FB5f0b9Bce7c86fA78734A4F6575) | | SynapseBridgeImpl | 0xfDbA28D084E157938CFca7e7091C17bc4D6CD2f0
[see in explorer](https://optimistic.etherscan.io/address/0xfDbA28D084E157938CFca7e7091C17bc4D6CD2f0) | | UniswapV3Impl | 0xB4a00066A4B3C438e31B5c9B8188B93141291976
[see in explorer](https://optimistic.etherscan.io/address/0xB4a00066A4B3C438e31B5c9B8188B93141291976) | | UnwrapAndForward AUTO | 0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad
[see in explorer](https://optimistic.etherscan.io/address/0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad) | | WrappedTokenSwapperImpl | 0x7016876b99131C7DF9D56201e410846b62B7dca3
[see in explorer](https://optimistic.etherscan.io/address/0x7016876b99131C7DF9D56201e410846b62B7dca3) | | ZeroXSwapImpl | 0xc5621f8f25CB3Fb30211b1f49556443a8e59b558
[see in explorer](https://optimistic.etherscan.io/address/0xc5621f8f25CB3Fb30211b1f49556443a8e59b558) | | ZeroxV2SwapImpl | 0xfb9fDe2b893C9438e3b0393D8f94000ea95f15E6
[see in explorer](https://optimistic.etherscan.io/address/0xfb9fDe2b893C9438e3b0393D8f94000ea95f15E6) | | ZeroxV2Wrapper AUTO | 0x0CB0552405846a4fcd83FBD791eF4a1F43ab3D94
[see in explorer](https://optimistic.etherscan.io/address/0x0CB0552405846a4fcd83FBD791eF4a1F43ab3D94) |
| name | address | | -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | | AcrossStakedRoute AUTO | 0x125ac5a530ece0a06dd3cd3da711c054eadb57b9
[see in explorer](https://plasmascan.to/address/0x125ac5a530ece0a06dd3cd3da711c054eadb57b9) | | BungeeDepository AUTO | 0xa6cd293ba20873b3cbbbf78f156a1d56d8ab9347
[see in explorer](https://plasmascan.to/address/0xa6cd293ba20873b3cbbbf78f156a1d56d8ab9347) | | BungeeGateway AUTO | 0x8f503B6d9fFdae8d375d1E226b71B4B3144D3849
[see in explorer](https://plasmascan.to/address/0x8f503B6d9fFdae8d375d1E226b71B4B3144D3849) | | BungeeInbox AUTO | 0x5e0f8e7337c8955d2124b8e85ca74af884b3e124
[see in explorer](https://plasmascan.to/address/0x5e0f8e7337c8955d2124b8e85ca74af884b3e124) | | BungeeInboxOld AUTO | 0x52b64acc8b46349Be18a0490b20d2a3F2D7Ed2Af
[see in explorer](https://plasmascan.to/address/0x52b64acc8b46349Be18a0490b20d2a3F2D7Ed2Af) | | CalldataExecutor AUTO | 0xa873aab6a98cb764ad6d52820d129d0e3667d9f9
[see in explorer](https://plasmascan.to/address/0xa873aab6a98cb764ad6d52820d129d0e3667d9f9) | | CCTPV2RouterSingleOutput AUTO | 0x0000000000000000000000000000000000000000
[see in explorer](https://plasmascan.to/address/0x0000000000000000000000000000000000000000) | | Entrypoint AUTO | 0xc8807bD5b5c87Fe7Fc73D644Cb7800d1A4e4F09D
[see in explorer](https://plasmascan.to/address/0xc8807bD5b5c87Fe7Fc73D644Cb7800d1A4e4F09D) | | FeeCollector AUTO | 0xE12D0CE29B916fbc067f49a8ebC203ffB66E8ded
[see in explorer](https://plasmascan.to/address/0xE12D0CE29B916fbc067f49a8ebC203ffB66E8ded) | | GenericStakedRoute AUTO | 0x5013c0b3defd8f832d1b6dec750382946de5c13b
[see in explorer](https://plasmascan.to/address/0x5013c0b3defd8f832d1b6dec750382946de5c13b) | | RFQRouterSingleOutput AUTO | 0xc4088d6e5a2027e784efc0491c322a3e2621bd9e
[see in explorer](https://plasmascan.to/address/0xc4088d6e5a2027e784efc0491c322a3e2621bd9e) | | SingleOutputRequestImpl AUTO | 0xcC42AE193E97a228BbC1e747Ea4af3aa170acCA2
[see in explorer](https://plasmascan.to/address/0xcC42AE193E97a228BbC1e747Ea4af3aa170acCA2) | | Solver AUTO | 0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042
[see in explorer](https://plasmascan.to/address/0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042) | | StakedRouterExecutor AUTO | 0x12efda5e4d410c5da723ceb7e43942779e3fe49b
[see in explorer](https://plasmascan.to/address/0x12efda5e4d410c5da723ceb7e43942779e3fe49b) | | StakedRouterReceiver AUTO | 0x5d84f33b7c9214df23fd86a0861ac923af99954d
[see in explorer](https://plasmascan.to/address/0x5d84f33b7c9214df23fd86a0861ac923af99954d) | | StakedRouterSingleOutput AUTO | 0x167d49f106bbea59587ef3c63b33e6a421af1b8d
[see in explorer](https://plasmascan.to/address/0x167d49f106bbea59587ef3c63b33e6a421af1b8d) | | SwapExecutor AUTO | 0x6e8338B0c56f598809e72D6a31456f9D5452de72
[see in explorer](https://plasmascan.to/address/0x6e8338B0c56f598809e72D6a31456f9D5452de72) | | SwapRequestCallback AUTO | 0x32B57D94ddF656b1E1edc31250B8a386aD633a34
[see in explorer](https://plasmascan.to/address/0x32B57D94ddF656b1E1edc31250B8a386aD633a34) | | SwapRequestImpl AUTO | 0x79b5380FF38462b72e14667742f634c6610158B8
[see in explorer](https://plasmascan.to/address/0x79b5380FF38462b72e14667742f634c6610158B8) | | SwitchboardPlug AUTO | 0xc5C38A15A9D3D9dC5Fc7dE4426779B695677e45D
[see in explorer](https://plasmascan.to/address/0xc5C38A15A9D3D9dC5Fc7dE4426779B695677e45D) | | SwitchboardRouter AUTO | 0x3416daBEAf259FBE5ba455E361f23e58BAB91E3E
[see in explorer](https://plasmascan.to/address/0x3416daBEAf259FBE5ba455E361f23e58BAB91E3E) | | UnwrapAndForward AUTO | 0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad
[see in explorer](https://plasmascan.to/address/0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad) | | ZeroxV2Wrapper AUTO | 0xA3429b742B29BF07F0864a3aD9DB759592de96f1
[see in explorer](https://plasmascan.to/address/0xA3429b742B29BF07F0864a3aD9DB759592de96f1) |
| name | address | | -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | | BungeeGateway AUTO | 0x01710CDb7319292Ed50A3F92561A599F5C650e2c
[see in explorer](https://explorer.plume.org/address/0x01710CDb7319292Ed50A3F92561A599F5C650e2c) | | BungeeInbox AUTO | 0x5e0f8e7337c8955d2124b8e85ca74af884b3e124
[see in explorer](https://explorer.plume.org/address/0x5e0f8e7337c8955d2124b8e85ca74af884b3e124) | | BungeeInboxOld AUTO | 0x756DE45962325e8D16Be295b333880344928Ad6C
[see in explorer](https://explorer.plume.org/address/0x756DE45962325e8D16Be295b333880344928Ad6C) | | CalldataExecutor AUTO | 0xa873aab6a98cb764ad6d52820d129d0e3667d9f9
[see in explorer](https://explorer.plume.org/address/0xa873aab6a98cb764ad6d52820d129d0e3667d9f9) | | CCTPV2RouterSingleOutput AUTO | 0x6faec2944071b2a5ebfd1b08f43f29597aad8ca1
[see in explorer](https://explorer.plume.org/address/0x6faec2944071b2a5ebfd1b08f43f29597aad8ca1) | | Entrypoint AUTO | 0x264f55044465A3d8d574D87168F2c2344D1e8c8c
[see in explorer](https://explorer.plume.org/address/0x264f55044465A3d8d574D87168F2c2344D1e8c8c) | | FeeCollector AUTO | 0x3Cd13488380e6d1e73CE185919Ac14018A78B844
[see in explorer](https://explorer.plume.org/address/0x3Cd13488380e6d1e73CE185919Ac14018A78B844) | | GenericStakedRoute AUTO | 0x5013c0b3defd8f832d1b6dec750382946de5c13b
[see in explorer](https://explorer.plume.org/address/0x5013c0b3defd8f832d1b6dec750382946de5c13b) | | RFQRouterSingleOutput AUTO | 0xc4088d6e5a2027e784efc0491c322a3e2621bd9e
[see in explorer](https://explorer.plume.org/address/0xc4088d6e5a2027e784efc0491c322a3e2621bd9e) | | SingleOutputRequestImpl AUTO | 0x5525e0700390A12995aC181eFF656E4aC0246b29
[see in explorer](https://explorer.plume.org/address/0x5525e0700390A12995aC181eFF656E4aC0246b29) | | Solver AUTO | 0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042
[see in explorer](https://explorer.plume.org/address/0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042) | | StakedRouterExecutor AUTO | 0x12efda5e4d410c5da723ceb7e43942779e3fe49b
[see in explorer](https://explorer.plume.org/address/0x12efda5e4d410c5da723ceb7e43942779e3fe49b) | | StakedRouterReceiver AUTO | 0x5d84f33b7c9214df23fd86a0861ac923af99954d
[see in explorer](https://explorer.plume.org/address/0x5d84f33b7c9214df23fd86a0861ac923af99954d) | | StakedRouterSingleOutput AUTO | 0x167d49f106bbea59587ef3c63b33e6a421af1b8d
[see in explorer](https://explorer.plume.org/address/0x167d49f106bbea59587ef3c63b33e6a421af1b8d) | | SwapExecutor AUTO | 0xBB1F279f61a7faC35cF4DDED87986Ab927083efb
[see in explorer](https://explorer.plume.org/address/0xBB1F279f61a7faC35cF4DDED87986Ab927083efb) | | SwapRequestCallback AUTO | 0x62e27f18fa770D456af351A9570cF79Fc48D2446
[see in explorer](https://explorer.plume.org/address/0x62e27f18fa770D456af351A9570cF79Fc48D2446) | | SwapRequestImpl AUTO | 0xC288094154d753b31f3CE5cCc029Cda3d023C466
[see in explorer](https://explorer.plume.org/address/0xC288094154d753b31f3CE5cCc029Cda3d023C466) | | SwitchboardPlug AUTO | 0x79b5380FF38462b72e14667742f634c6610158B8
[see in explorer](https://explorer.plume.org/address/0x79b5380FF38462b72e14667742f634c6610158B8) | | SwitchboardRouter AUTO | 0xcC42AE193E97a228BbC1e747Ea4af3aa170acCA2
[see in explorer](https://explorer.plume.org/address/0xcC42AE193E97a228BbC1e747Ea4af3aa170acCA2) | | UnwrapAndForward AUTO | 0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad
[see in explorer](https://explorer.plume.org/address/0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad) | | ZeroxV2Wrapper AUTO | 0x0000000000000000000000000000000000000000
[see in explorer](https://explorer.plume.org/address/0x0000000000000000000000000000000000000000) |
| name | address | | -------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | | AcrossImpl | 0x55D0e444d4C8E4382f5CD0A0b341Da53e284b2cF
[see in explorer](https://polygonscan.com/address/0x55D0e444d4C8E4382f5CD0A0b341Da53e284b2cF) | | AcrossImplV3 | 0x740EA79e2FccDDB4eE8bB8Fc8ccAC5eb6dFa0b40
[see in explorer](https://polygonscan.com/address/0x740EA79e2FccDDB4eE8bB8Fc8ccAC5eb6dFa0b40) | | AcrossStakedRoute AUTO | 0x125ac5a530ece0a06dd3cd3da711c054eadb57b9
[see in explorer](https://polygonscan.com/address/0x125ac5a530ece0a06dd3cd3da711c054eadb57b9) | | AcrossV3WethUnwrapper | 0x36f0B62E4eE3d30939cBccABA9D983579799D931
[see in explorer](https://polygonscan.com/address/0x36f0B62E4eE3d30939cBccABA9D983579799D931) | | AnyswapL2Impl | 0x0553582d40D4fe5445e9272f3B59f6fF80129952
[see in explorer](https://polygonscan.com/address/0x0553582d40D4fe5445e9272f3B59f6fF80129952) | | AnyswapV6L2Impl | 0x2263B27350De52B62412aab3425c9A6ca0512765
[see in explorer](https://polygonscan.com/address/0x2263B27350De52B62412aab3425c9A6ca0512765) | | BungeeDepository AUTO | 0xa6cd293ba20873b3cbbbf78f156a1d56d8ab9347
[see in explorer](https://polygonscan.com/address/0xa6cd293ba20873b3cbbbf78f156a1d56d8ab9347) | | BungeeGateway AUTO | 0x6DDe7CF4e6A6f53F058Bf5d2B4a54aFBba11EE54
[see in explorer](https://polygonscan.com/address/0x6DDe7CF4e6A6f53F058Bf5d2B4a54aFBba11EE54) | | BungeeInbox AUTO | 0x5e0f8e7337c8955d2124b8e85ca74af884b3e124
[see in explorer](https://polygonscan.com/address/0x5e0f8e7337c8955d2124b8e85ca74af884b3e124) | | BungeeInboxOld AUTO | 0x8d2d9F75346DB3c3bF54CCEED25E3D63d1E963F5
[see in explorer](https://polygonscan.com/address/0x8d2d9F75346DB3c3bF54CCEED25E3D63d1E963F5) | | CalldataExecutor AUTO | 0xa873aab6a98cb764ad6d52820d129d0e3667d9f9
[see in explorer](https://polygonscan.com/address/0xa873aab6a98cb764ad6d52820d129d0e3667d9f9) | | CCTPRouterSingleOutput AUTO | 0x3b4817827d06600f92296c5d1491818d69fc955f
[see in explorer](https://polygonscan.com/address/0x3b4817827d06600f92296c5d1491818d69fc955f) | | CCTPV2RouterSingleOutput AUTO | 0x6faec2944071b2a5ebfd1b08f43f29597aad8ca1
[see in explorer](https://polygonscan.com/address/0x6faec2944071b2a5ebfd1b08f43f29597aad8ca1) | | CelerImpl | 0xFb462C056912FE727705fEFDf41f88004DA6a74B
[see in explorer](https://polygonscan.com/address/0xFb462C056912FE727705fEFDf41f88004DA6a74B) | | CelerStakedRoute AUTO | 0xf1c07b6dddc480602d0304c31e6b13ff711b5828
[see in explorer](https://polygonscan.com/address/0xf1c07b6dddc480602d0304c31e6b13ff711b5828) | | CelerStorageWrapper | 0x7c6C373190421988fA31E64f369C45205676C1f0
[see in explorer](https://polygonscan.com/address/0x7c6C373190421988fA31E64f369C45205676C1f0) | | CelerV2Impl | 0xC953a4d1e959D6C1f0718447008e02C477A9051F
[see in explorer](https://polygonscan.com/address/0xC953a4d1e959D6C1f0718447008e02C477A9051F) | | DisabledSocketRoute | 0x0f34A522FF82151c90679b73211955068FD854F1
[see in explorer](https://polygonscan.com/address/0x0f34A522FF82151c90679b73211955068FD854F1) | | Entrypoint AUTO | 0xF0FaB952E363eAa34edCA4d05e330B1dC475f010
[see in explorer](https://polygonscan.com/address/0xF0FaB952E363eAa34edCA4d05e330B1dC475f010) | | FeeCollector AUTO | 0xecD3D10919a77Ef3352A88816Aea379091a0084B
[see in explorer](https://polygonscan.com/address/0xecD3D10919a77Ef3352A88816Aea379091a0084B) | | FeesTakerController | 0x58B3353f1249cc65993D42E4eFc60F2a0CA1062f
[see in explorer](https://polygonscan.com/address/0x58B3353f1249cc65993D42E4eFc60F2a0CA1062f) | | GenericStakedRoute AUTO | 0x5013c0b3defd8f832d1b6dec750382946de5c13b
[see in explorer](https://polygonscan.com/address/0x5013c0b3defd8f832d1b6dec750382946de5c13b) | | HopCctpImpl | 0x0dBae96aC6cc1b7D1aE8a59B4eEd0826Cf6693FC
[see in explorer](https://polygonscan.com/address/0x0dBae96aC6cc1b7D1aE8a59B4eEd0826Cf6693FC) | | HopImplL2 | 0x5CddbecAF8603E5e0bC771A46D48e148593351eA
[see in explorer](https://polygonscan.com/address/0x5CddbecAF8603E5e0bC771A46D48e148593351eA) | | HopImplL2V2 | 0x7a7b244648FcEb5926D16c4234157F9508c45E5f
[see in explorer](https://polygonscan.com/address/0x7a7b244648FcEb5926D16c4234157F9508c45E5f) | | HyphenImpl | 0xBAde7653492f1a70c3725EdeB2D28F3C84369809
[see in explorer](https://polygonscan.com/address/0xBAde7653492f1a70c3725EdeB2D28F3C84369809) | | KyberSwapImpl | 0xEfc1ef8ab6C7FBBe2a74948E2397fAe5D685728d
[see in explorer](https://polygonscan.com/address/0xEfc1ef8ab6C7FBBe2a74948E2397fAe5D685728d) | | MagpieSwapImpl | 0x43BC03bed86642E79CB45525270D98E6623175E8
[see in explorer](https://polygonscan.com/address/0x43BC03bed86642E79CB45525270D98E6623175E8) | | MagpieSwapImplStaging AUTO | 0x68920c9D01624b5754eAa5ed7AB6E6E8732b10c7
[see in explorer](https://polygonscan.com/address/0x68920c9D01624b5754eAa5ed7AB6E6E8732b10c7) | | MayanBridgeImpl | 0xae46BBa06B397C95f42e31E391649801bC4e7989
[see in explorer](https://polygonscan.com/address/0xae46BBa06B397C95f42e31E391649801bC4e7989) | | MayanBridgeImplV2 | 0xB412f6F3d855a79EBe0AF5040cC25A7f9AB7645b
[see in explorer](https://polygonscan.com/address/0xB412f6F3d855a79EBe0AF5040cC25A7f9AB7645b) | | OneInchImpl | 0xb95625B293A2474AD55B546a0Ddd997c16bB8812
[see in explorer](https://polygonscan.com/address/0xb95625B293A2474AD55B546a0Ddd997c16bB8812) | | OneInchImpStaging AUTO | 0xF6C53B61440B2633fFA9FE3B1603C82C8AbFceA0
[see in explorer](https://polygonscan.com/address/0xF6C53B61440B2633fFA9FE3B1603C82C8AbFceA0) | | OpenOceanSwapImpl AUTO | 0x9B532719C3C4CCc767498Eb987ae1f840052ffFa
[see in explorer](https://polygonscan.com/address/0x9B532719C3C4CCc767498Eb987ae1f840052ffFa) | | OpenoceanSwapImplStaging AUTO | 0x829ED8391aFA5987991c6fd70c71938B87b7795C
[see in explorer](https://polygonscan.com/address/0x829ED8391aFA5987991c6fd70c71938B87b7795C) | | RainbowSwapImpl | 0x2d53A92f5F57b1Ae10881a3963F18AFB843De435
[see in explorer](https://polygonscan.com/address/0x2d53A92f5F57b1Ae10881a3963F18AFB843De435) | | RefuelBridgeImpl | 0xFC42BcAA16a54e7E48D0c39e4713dC5923BD551D
[see in explorer](https://polygonscan.com/address/0xFC42BcAA16a54e7E48D0c39e4713dC5923BD551D) | | RefuelBridgeImplStaging AUTO | 0xD1adeaE7db6C261141393945cC2229A355E9f199
[see in explorer](https://polygonscan.com/address/0xD1adeaE7db6C261141393945cC2229A355E9f199) | | RefuelSwapAndBridgeController | 0x1717004FA6668bAAD3a20258876A88dAd908cd21
[see in explorer](https://polygonscan.com/address/0x1717004FA6668bAAD3a20258876A88dAd908cd21) | | RefuelSwapAndBridgeControllerStaging AUTO | 0x3c3b02B5E87992e14e070957447bF646130e0e8e
[see in explorer](https://polygonscan.com/address/0x3c3b02B5E87992e14e070957447bF646130e0e8e) | | RFQRouterSingleOutput AUTO | 0xc4088d6e5a2027e784efc0491c322a3e2621bd9e
[see in explorer](https://polygonscan.com/address/0xc4088d6e5a2027e784efc0491c322a3e2621bd9e) | | SingleOutputRequestImpl AUTO | 0x4bA60a120b12d070c26393Db76779DeB323e5aA4
[see in explorer](https://polygonscan.com/address/0x4bA60a120b12d070c26393Db76779DeB323e5aA4) | | SocketDeployFactory | 0x71630095e3F08A86aFC73f7b07342192adf39C55
[see in explorer](https://polygonscan.com/address/0x71630095e3F08A86aFC73f7b07342192adf39C55) | | SocketGateway | 0x3a23F943181408EAC424116Af7b7790c94Cb97a5
[see in explorer](https://polygonscan.com/address/0x3a23F943181408EAC424116Af7b7790c94Cb97a5) | | SocketGatewayStaging AUTO | 0xBC13C22E754d47F8d78d21b432B66FE5b439D568
[see in explorer](https://polygonscan.com/address/0xBC13C22E754d47F8d78d21b432B66FE5b439D568) | | Solver AUTO | 0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042
[see in explorer](https://polygonscan.com/address/0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042) | | StakedRouterExecutor AUTO | 0x12efda5e4d410c5da723ceb7e43942779e3fe49b
[see in explorer](https://polygonscan.com/address/0x12efda5e4d410c5da723ceb7e43942779e3fe49b) | | StakedRouterReceiver AUTO | 0x5d84f33b7c9214df23fd86a0861ac923af99954d
[see in explorer](https://polygonscan.com/address/0x5d84f33b7c9214df23fd86a0861ac923af99954d) | | StakedRouterSingleOutput AUTO | 0x167d49f106bbea59587ef3c63b33e6a421af1b8d
[see in explorer](https://polygonscan.com/address/0x167d49f106bbea59587ef3c63b33e6a421af1b8d) | | StargateImplL2 | 0xB24e2B830f4c78a1993F9b046089321764B28902
[see in explorer](https://polygonscan.com/address/0xB24e2B830f4c78a1993F9b046089321764B28902) | | StargateImplL2V2 | 0xdC5E23287b4f0E8170f9F0FE17F139E65DC7eAE0
[see in explorer](https://polygonscan.com/address/0xdC5E23287b4f0E8170f9F0FE17F139E65DC7eAE0) | | StargateImplV2 | 0x0CB0552405846a4fcd83FBD791eF4a1F43ab3D94
[see in explorer](https://polygonscan.com/address/0x0CB0552405846a4fcd83FBD791eF4a1F43ab3D94) | | SwapExecutor AUTO | 0x31D27CeB1A388556F28AaF6BF7B45eFA437B35b8
[see in explorer](https://polygonscan.com/address/0x31D27CeB1A388556F28AaF6BF7B45eFA437B35b8) | | SwapRequestCallback AUTO | 0x4682e8315B80cF757e2077280E0471729c992Ed3
[see in explorer](https://polygonscan.com/address/0x4682e8315B80cF757e2077280E0471729c992Ed3) | | SwapRequestImpl AUTO | 0xd589562E76a826a01aCcd4Cb31928656c940b769
[see in explorer](https://polygonscan.com/address/0xd589562E76a826a01aCcd4Cb31928656c940b769) | | SwitchboardPlug AUTO | 0xFD4AdfA24c351C485D4b05f268c75216DBDCE088
[see in explorer](https://polygonscan.com/address/0xFD4AdfA24c351C485D4b05f268c75216DBDCE088) | | SwitchboardRouter AUTO | 0x69c6702EFC57f3Bb29E9896120246D91B33Bbc44
[see in explorer](https://polygonscan.com/address/0x69c6702EFC57f3Bb29E9896120246D91B33Bbc44) | | SymbiosisBridgeImpl | 0xAE1640392f8C82EcCbD07AE8Ec0Af3e0C0Ca9743
[see in explorer](https://polygonscan.com/address/0xAE1640392f8C82EcCbD07AE8Ec0Af3e0C0Ca9743) | | SynapseBridgeImpl | 0xbb5852E0ae9730D935dCE4eFD6A7Ce2b3c733946
[see in explorer](https://polygonscan.com/address/0xbb5852E0ae9730D935dCE4eFD6A7Ce2b3c733946) | | UnwrapAndForward AUTO | 0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad
[see in explorer](https://polygonscan.com/address/0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad) | | WrappedTokenSwapperImpl | 0xb2C03411Ce22149B3cC9A711b1a1a70953CD6c57
[see in explorer](https://polygonscan.com/address/0xb2C03411Ce22149B3cC9A711b1a1a70953CD6c57) | | ZeroXSwapImpl | 0x37477A76e5dc52bd25Cf6B0B38ee2b4bEC112428
[see in explorer](https://polygonscan.com/address/0x37477A76e5dc52bd25Cf6B0B38ee2b4bEC112428) | | ZeroXSwapImplStaging AUTO | 0x3fFCcb464592B8c0ecB55AcD3066947695Fe7a32
[see in explorer](https://polygonscan.com/address/0x3fFCcb464592B8c0ecB55AcD3066947695Fe7a32) | | ZeroxV2SwapImpl | 0x469185Aa4180Ef4E0E2a847c927b16357FBC3367
[see in explorer](https://polygonscan.com/address/0x469185Aa4180Ef4E0E2a847c927b16357FBC3367) | | ZeroxV2SwapImplStaging AUTO | 0xECe278805B61b2579dC21DA66681b359be85f546
[see in explorer](https://polygonscan.com/address/0xECe278805B61b2579dC21DA66681b359be85f546) | | ZeroxV2Wrapper AUTO | 0x05b108fD88d042eF0145DCcd564DCd6471852FC2
[see in explorer](https://polygonscan.com/address/0x05b108fD88d042eF0145DCcd564DCd6471852FC2) |
| name | address | | ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | | AnyswapV6L2Impl | 0x1768C1D2900f1408D44FbB1EdCc306F94aF852ae
[see in explorer](https://www.oklink.com/polygon-zkevm/address/0x1768C1D2900f1408D44FbB1EdCc306F94aF852ae) | | CelerImpl | 0xFAAFb26C06a45962E97452E5d4310df2586623A2
[see in explorer](https://www.oklink.com/polygon-zkevm/address/0xFAAFb26C06a45962E97452E5d4310df2586623A2) | | CelerStorageWrapper | 0xE186a05FB020324a7cA61d80138BB1EA66DDDbDF
[see in explorer](https://www.oklink.com/polygon-zkevm/address/0xE186a05FB020324a7cA61d80138BB1EA66DDDbDF) | | CelerV2Impl | 0x21A63b31c4029A9f5ac690De159d45aB2Ebf1378
[see in explorer](https://www.oklink.com/polygon-zkevm/address/0x21A63b31c4029A9f5ac690De159d45aB2Ebf1378) | | DisabledSocketRoute | 0x0f34A522FF82151c90679b73211955068FD854F1
[see in explorer](https://www.oklink.com/polygon-zkevm/address/0x0f34A522FF82151c90679b73211955068FD854F1) | | FeesTakerController | 0x5ce6d37c2fd66Fe1531F44C5141e815b7c9aC8a4
[see in explorer](https://www.oklink.com/polygon-zkevm/address/0x5ce6d37c2fd66Fe1531F44C5141e815b7c9aC8a4) | | RefuelBridgeImpl | 0x89800A17CEA97dB4A8F0705d7f8da770032397f5
[see in explorer](https://www.oklink.com/polygon-zkevm/address/0x89800A17CEA97dB4A8F0705d7f8da770032397f5) | | SocketDeployFactory | 0x71630095e3F08A86aFC73f7b07342192adf39C55
[see in explorer](https://www.oklink.com/polygon-zkevm/address/0x71630095e3F08A86aFC73f7b07342192adf39C55) | | SocketGateway | 0x3a23F943181408EAC424116Af7b7790c94Cb97a5
[see in explorer](https://www.oklink.com/polygon-zkevm/address/0x3a23F943181408EAC424116Af7b7790c94Cb97a5) | | SymbiosisBridgeImpl | 0x32c75ee3e08207ecc836048c1f7115048f076a1e
[see in explorer](https://www.oklink.com/polygon-zkevm/address/0x32c75ee3e08207ecc836048c1f7115048f076a1e) |
| name | address | | -------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | | AcrossImplV3 | 0x740EA79e2FccDDB4eE8bB8Fc8ccAC5eb6dFa0b40
[see in explorer](https://scrollscan.com/address/0x740EA79e2FccDDB4eE8bB8Fc8ccAC5eb6dFa0b40) | | AcrossStakedRoute AUTO | 0x125ac5a530ece0a06dd3cd3da711c054eadb57b9
[see in explorer](https://scrollscan.com/address/0x125ac5a530ece0a06dd3cd3da711c054eadb57b9) | | AcrossV3WethUnwrapper | 0x36f0B62E4eE3d30939cBccABA9D983579799D931
[see in explorer](https://scrollscan.com/address/0x36f0B62E4eE3d30939cBccABA9D983579799D931) | | BungeeGateway AUTO | 0x8f503B6d9fFdae8d375d1E226b71B4B3144D3849
[see in explorer](https://scrollscan.com/address/0x8f503B6d9fFdae8d375d1E226b71B4B3144D3849) | | BungeeInbox AUTO | 0x5e0f8e7337c8955d2124b8e85ca74af884b3e124
[see in explorer](https://scrollscan.com/address/0x5e0f8e7337c8955d2124b8e85ca74af884b3e124) | | BungeeInboxOld AUTO | 0x7f0d90E4e81B77C6eEFF544c461b2f53BFA5A6aD
[see in explorer](https://scrollscan.com/address/0x7f0d90E4e81B77C6eEFF544c461b2f53BFA5A6aD) | | CalldataExecutor AUTO | 0xa873aab6a98cb764ad6d52820d129d0e3667d9f9
[see in explorer](https://scrollscan.com/address/0xa873aab6a98cb764ad6d52820d129d0e3667d9f9) | | CCTPRouterSingleOutput AUTO | 0x0000000000000000000000000000000000000000
[see in explorer](https://scrollscan.com/address/0x0000000000000000000000000000000000000000) | | CCTPV2RouterSingleOutput AUTO | 0x0000000000000000000000000000000000000000
[see in explorer](https://scrollscan.com/address/0x0000000000000000000000000000000000000000) | | CelerStorageWrapper | 0x6163484b8d0Db43238C1875bcD7dA987e1824273
[see in explorer](https://scrollscan.com/address/0x6163484b8d0Db43238C1875bcD7dA987e1824273) | | CelerV2Impl | 0xa28f5a1575bbc9758EAc182CE3E66A2734621F4F
[see in explorer](https://scrollscan.com/address/0xa28f5a1575bbc9758EAc182CE3E66A2734621F4F) | | DisabledSocketRoute | 0x0f34A522FF82151c90679b73211955068FD854F1
[see in explorer](https://scrollscan.com/address/0x0f34A522FF82151c90679b73211955068FD854F1) | | Entrypoint AUTO | 0xc8807bD5b5c87Fe7Fc73D644Cb7800d1A4e4F09D
[see in explorer](https://scrollscan.com/address/0xc8807bD5b5c87Fe7Fc73D644Cb7800d1A4e4F09D) | | FeeCollector AUTO | 0xE12D0CE29B916fbc067f49a8ebC203ffB66E8ded
[see in explorer](https://scrollscan.com/address/0xE12D0CE29B916fbc067f49a8ebC203ffB66E8ded) | | GenericStakedRoute AUTO | 0x5013c0b3defd8f832d1b6dec750382946de5c13b
[see in explorer](https://scrollscan.com/address/0x5013c0b3defd8f832d1b6dec750382946de5c13b) | | KyberSwapImpl | 0x70ce162b46C172d20df5573fF86055a12A658873
[see in explorer](https://scrollscan.com/address/0x70ce162b46C172d20df5573fF86055a12A658873) | | MagpieSwapImpl | 0xfb9fDe2b893C9438e3b0393D8f94000ea95f15E6
[see in explorer](https://scrollscan.com/address/0xfb9fDe2b893C9438e3b0393D8f94000ea95f15E6) | | OpenOceanSwapImpl AUTO | 0x413d1edcF7C0837F09e0DB6375DdE6D5F066ABaC
[see in explorer](https://scrollscan.com/address/0x413d1edcF7C0837F09e0DB6375DdE6D5F066ABaC) | | RFQRouterSingleOutput AUTO | 0xc4088d6e5a2027e784efc0491c322a3e2621bd9e
[see in explorer](https://scrollscan.com/address/0xc4088d6e5a2027e784efc0491c322a3e2621bd9e) | | SingleOutputRequestImpl AUTO | 0xcC42AE193E97a228BbC1e747Ea4af3aa170acCA2
[see in explorer](https://scrollscan.com/address/0xcC42AE193E97a228BbC1e747Ea4af3aa170acCA2) | | SocketDeployFactory | 0x71630095e3F08A86aFC73f7b07342192adf39C55
[see in explorer](https://scrollscan.com/address/0x71630095e3F08A86aFC73f7b07342192adf39C55) | | SocketGateway | 0x3a23F943181408EAC424116Af7b7790c94Cb97a5
[see in explorer](https://scrollscan.com/address/0x3a23F943181408EAC424116Af7b7790c94Cb97a5) | | Solver AUTO | 0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042
[see in explorer](https://scrollscan.com/address/0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042) | | StakedRouterExecutor AUTO | 0x12efda5e4d410c5da723ceb7e43942779e3fe49b
[see in explorer](https://scrollscan.com/address/0x12efda5e4d410c5da723ceb7e43942779e3fe49b) | | StakedRouterReceiver AUTO | 0x5d84f33b7c9214df23fd86a0861ac923af99954d
[see in explorer](https://scrollscan.com/address/0x5d84f33b7c9214df23fd86a0861ac923af99954d) | | StakedRouterSingleOutput AUTO | 0x167d49f106bbea59587ef3c63b33e6a421af1b8d
[see in explorer](https://scrollscan.com/address/0x167d49f106bbea59587ef3c63b33e6a421af1b8d) | | StargateImplV2 | 0x4682e8315B80cF757e2077280E0471729c992Ed3
[see in explorer](https://scrollscan.com/address/0x4682e8315B80cF757e2077280E0471729c992Ed3) | | SwapExecutor AUTO | 0x6e8338B0c56f598809e72D6a31456f9D5452de72
[see in explorer](https://scrollscan.com/address/0x6e8338B0c56f598809e72D6a31456f9D5452de72) | | SwapRequestCallback AUTO | 0xEFB37Bd3a9ed2f768bf6f79d0379fe7f9BE50F49
[see in explorer](https://scrollscan.com/address/0xEFB37Bd3a9ed2f768bf6f79d0379fe7f9BE50F49) | | SwapRequestImpl AUTO | 0x79b5380FF38462b72e14667742f634c6610158B8
[see in explorer](https://scrollscan.com/address/0x79b5380FF38462b72e14667742f634c6610158B8) | | SwitchboardPlug AUTO | 0xc5C38A15A9D3D9dC5Fc7dE4426779B695677e45D
[see in explorer](https://scrollscan.com/address/0xc5C38A15A9D3D9dC5Fc7dE4426779B695677e45D) | | SwitchboardRouter AUTO | 0x3416daBEAf259FBE5ba455E361f23e58BAB91E3E
[see in explorer](https://scrollscan.com/address/0x3416daBEAf259FBE5ba455E361f23e58BAB91E3E) | | UnwrapAndForward AUTO | 0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad
[see in explorer](https://scrollscan.com/address/0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad) | | ZeroxV2SwapImpl | 0xCFee2171DC6c670eF1E0Df832df0cF37C31705E9
[see in explorer](https://scrollscan.com/address/0xCFee2171DC6c670eF1E0Df832df0cF37C31705E9) | | ZeroxV2Wrapper AUTO | 0x614595189d16995Fe22a5c267B220C803e50966F
[see in explorer](https://scrollscan.com/address/0x614595189d16995Fe22a5c267B220C803e50966F) |
| name | address | | -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | | BungeeGateway AUTO | 0x8f503B6d9fFdae8d375d1E226b71B4B3144D3849
[see in explorer](https://seistream.app/address/0x8f503B6d9fFdae8d375d1E226b71B4B3144D3849) | | BungeeInbox AUTO | 0x5e0f8e7337c8955d2124b8e85ca74af884b3e124
[see in explorer](https://seistream.app/address/0x5e0f8e7337c8955d2124b8e85ca74af884b3e124) | | BungeeInboxOld AUTO | 0x7ad979C6b0C9924F79ea571280071595ba13D002
[see in explorer](https://seistream.app/address/0x7ad979C6b0C9924F79ea571280071595ba13D002) | | CalldataExecutor AUTO | 0xa873aab6a98cb764ad6d52820d129d0e3667d9f9
[see in explorer](https://seistream.app/address/0xa873aab6a98cb764ad6d52820d129d0e3667d9f9) | | CCTPV2RouterSingleOutput AUTO | 0x6faec2944071b2a5ebfd1b08f43f29597aad8ca1
[see in explorer](https://seistream.app/address/0x6faec2944071b2a5ebfd1b08f43f29597aad8ca1) | | Entrypoint AUTO | 0xc8807bD5b5c87Fe7Fc73D644Cb7800d1A4e4F09D
[see in explorer](https://seistream.app/address/0xc8807bD5b5c87Fe7Fc73D644Cb7800d1A4e4F09D) | | FeeCollector AUTO | 0xE12D0CE29B916fbc067f49a8ebC203ffB66E8ded
[see in explorer](https://seistream.app/address/0xE12D0CE29B916fbc067f49a8ebC203ffB66E8ded) | | GenericStakedRoute AUTO | 0x5013c0b3defd8f832d1b6dec750382946de5c13b
[see in explorer](https://seistream.app/address/0x5013c0b3defd8f832d1b6dec750382946de5c13b) | | RFQRouterSingleOutput AUTO | 0xc4088d6e5a2027e784efc0491c322a3e2621bd9e
[see in explorer](https://seistream.app/address/0xc4088d6e5a2027e784efc0491c322a3e2621bd9e) | | SingleOutputRequestImpl AUTO | 0xcC42AE193E97a228BbC1e747Ea4af3aa170acCA2
[see in explorer](https://seistream.app/address/0xcC42AE193E97a228BbC1e747Ea4af3aa170acCA2) | | Solver AUTO | 0xae68b7117be0026cbd4366303f74eecbb19e4042
[see in explorer](https://seistream.app/address/0xae68b7117be0026cbd4366303f74eecbb19e4042) | | StakedRouterExecutor AUTO | 0x12efda5e4d410c5da723ceb7e43942779e3fe49b
[see in explorer](https://seistream.app/address/0x12efda5e4d410c5da723ceb7e43942779e3fe49b) | | StakedRouterReceiver AUTO | 0x5d84f33b7c9214df23fd86a0861ac923af99954d
[see in explorer](https://seistream.app/address/0x5d84f33b7c9214df23fd86a0861ac923af99954d) | | StakedRouterSingleOutput AUTO | 0x167d49f106bbea59587ef3c63b33e6a421af1b8d
[see in explorer](https://seistream.app/address/0x167d49f106bbea59587ef3c63b33e6a421af1b8d) | | SwapExecutor AUTO | 0x6e8338B0c56f598809e72D6a31456f9D5452de72
[see in explorer](https://seistream.app/address/0x6e8338B0c56f598809e72D6a31456f9D5452de72) | | SwapRequestCallback AUTO | 0x84Fd802Dd211D483Eb115Ee8a80d0029784c7637
[see in explorer](https://seistream.app/address/0x84Fd802Dd211D483Eb115Ee8a80d0029784c7637) | | SwapRequestImpl AUTO | 0x79b5380FF38462b72e14667742f634c6610158B8
[see in explorer](https://seistream.app/address/0x79b5380FF38462b72e14667742f634c6610158B8) | | SwitchboardPlug AUTO | 0xc5C38A15A9D3D9dC5Fc7dE4426779B695677e45D
[see in explorer](https://seistream.app/address/0xc5C38A15A9D3D9dC5Fc7dE4426779B695677e45D) | | SwitchboardRouter AUTO | 0x3416daBEAf259FBE5ba455E361f23e58BAB91E3E
[see in explorer](https://seistream.app/address/0x3416daBEAf259FBE5ba455E361f23e58BAB91E3E) | | UnwrapAndForward AUTO | 0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad
[see in explorer](https://seistream.app/address/0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad) |
| name | address | | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | | BungeeGateway AUTO | bung5E8oYryGA7d2ivgoe1spoZRS88cvcwoK23TtExg
[see in explorer](https://solscan.io/address/bung5E8oYryGA7d2ivgoe1spoZRS88cvcwoK23TtExg) |
| name | address | | -------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | | AcrossStakedRoute AUTO | 0x125ac5a530ece0a06dd3cd3da711c054eadb57b9
[see in explorer](https://soneium.blockscout.com/address/0x125ac5a530ece0a06dd3cd3da711c054eadb57b9) | | BungeeGateway AUTO | 0x8f503B6d9fFdae8d375d1E226b71B4B3144D3849
[see in explorer](https://soneium.blockscout.com/address/0x8f503B6d9fFdae8d375d1E226b71B4B3144D3849) | | BungeeInbox AUTO | 0x5e0f8e7337c8955d2124b8e85ca74af884b3e124
[see in explorer](https://soneium.blockscout.com/address/0x5e0f8e7337c8955d2124b8e85ca74af884b3e124) | | BungeeInboxOld AUTO | 0xF22bb9358a72591B652cfd6861C532BC90fF5b86
[see in explorer](https://soneium.blockscout.com/address/0xF22bb9358a72591B652cfd6861C532BC90fF5b86) | | CalldataExecutor AUTO | 0xa873aab6a98cb764ad6d52820d129d0e3667d9f9
[see in explorer](https://soneium.blockscout.com/address/0xa873aab6a98cb764ad6d52820d129d0e3667d9f9) | | CCTPRouterSingleOutput AUTO | 0x0000000000000000000000000000000000000000
[see in explorer](https://soneium.blockscout.com/address/0x0000000000000000000000000000000000000000) | | CCTPV2RouterSingleOutput AUTO | 0x0000000000000000000000000000000000000000
[see in explorer](https://soneium.blockscout.com/address/0x0000000000000000000000000000000000000000) | | Entrypoint AUTO | 0xc8807bD5b5c87Fe7Fc73D644Cb7800d1A4e4F09D
[see in explorer](https://soneium.blockscout.com/address/0xc8807bD5b5c87Fe7Fc73D644Cb7800d1A4e4F09D) | | FeeCollector AUTO | 0xE12D0CE29B916fbc067f49a8ebC203ffB66E8ded
[see in explorer](https://soneium.blockscout.com/address/0xE12D0CE29B916fbc067f49a8ebC203ffB66E8ded) | | GenericStakedRoute AUTO | 0x5013c0b3defd8f832d1b6dec750382946de5c13b
[see in explorer](https://soneium.blockscout.com/address/0x5013c0b3defd8f832d1b6dec750382946de5c13b) | | RFQRouterSingleOutput AUTO | 0xc4088d6e5a2027e784efc0491c322a3e2621bd9e
[see in explorer](https://soneium.blockscout.com/address/0xc4088d6e5a2027e784efc0491c322a3e2621bd9e) | | SingleOutputRequestImpl AUTO | 0xcC42AE193E97a228BbC1e747Ea4af3aa170acCA2
[see in explorer](https://soneium.blockscout.com/address/0xcC42AE193E97a228BbC1e747Ea4af3aa170acCA2) | | Solver AUTO | 0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042
[see in explorer](https://soneium.blockscout.com/address/0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042) | | StakedRouterExecutor AUTO | 0x12efda5e4d410c5da723ceb7e43942779e3fe49b
[see in explorer](https://soneium.blockscout.com/address/0x12efda5e4d410c5da723ceb7e43942779e3fe49b) | | StakedRouterReceiver AUTO | 0x5d84f33b7c9214df23fd86a0861ac923af99954d
[see in explorer](https://soneium.blockscout.com/address/0x5d84f33b7c9214df23fd86a0861ac923af99954d) | | StakedRouterSingleOutput AUTO | 0x167d49f106bbea59587ef3c63b33e6a421af1b8d
[see in explorer](https://soneium.blockscout.com/address/0x167d49f106bbea59587ef3c63b33e6a421af1b8d) | | SwapExecutor AUTO | 0x6e8338B0c56f598809e72D6a31456f9D5452de72
[see in explorer](https://soneium.blockscout.com/address/0x6e8338B0c56f598809e72D6a31456f9D5452de72) | | SwapRequestCallback AUTO | 0xEFB37Bd3a9ed2f768bf6f79d0379fe7f9BE50F49
[see in explorer](https://soneium.blockscout.com/address/0xEFB37Bd3a9ed2f768bf6f79d0379fe7f9BE50F49) | | SwapRequestImpl AUTO | 0x79b5380FF38462b72e14667742f634c6610158B8
[see in explorer](https://soneium.blockscout.com/address/0x79b5380FF38462b72e14667742f634c6610158B8) | | SwitchboardPlug AUTO | 0xc5C38A15A9D3D9dC5Fc7dE4426779B695677e45D
[see in explorer](https://soneium.blockscout.com/address/0xc5C38A15A9D3D9dC5Fc7dE4426779B695677e45D) | | SwitchboardRouter AUTO | 0x3416daBEAf259FBE5ba455E361f23e58BAB91E3E
[see in explorer](https://soneium.blockscout.com/address/0x3416daBEAf259FBE5ba455E361f23e58BAB91E3E) | | UnwrapAndForward AUTO | 0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad
[see in explorer](https://soneium.blockscout.com/address/0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad) | | ZeroxV2Wrapper AUTO | 0x0000000000000000000000000000000000000000
[see in explorer](https://soneium.blockscout.com/address/0x0000000000000000000000000000000000000000) |
| name | address | | -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | | BungeeGateway AUTO | 0x11918f1cb6db5e008A692F47c5320216fba6054B
[see in explorer](https://sonicscan.org/address/0x11918f1cb6db5e008A692F47c5320216fba6054B) | | BungeeInbox AUTO | 0x5e0f8e7337c8955d2124b8e85ca74af884b3e124
[see in explorer](https://sonicscan.org/address/0x5e0f8e7337c8955d2124b8e85ca74af884b3e124) | | BungeeInboxOld AUTO | 0x9D05eD9C0258ce034c6788944841Fe5825eDa0c4
[see in explorer](https://sonicscan.org/address/0x9D05eD9C0258ce034c6788944841Fe5825eDa0c4) | | CalldataExecutor AUTO | 0xa873aab6a98cb764ad6d52820d129d0e3667d9f9
[see in explorer](https://sonicscan.org/address/0xa873aab6a98cb764ad6d52820d129d0e3667d9f9) | | CCTPRouterSingleOutput AUTO | 0x0000000000000000000000000000000000000000
[see in explorer](https://sonicscan.org/address/0x0000000000000000000000000000000000000000) | | CctpV2Impl | 0x7db3a26e620f501CBbe3F6D98E7B9BF7bE63Ea5f
[see in explorer](https://sonicscan.org/address/0x7db3a26e620f501CBbe3F6D98E7B9BF7bE63Ea5f) | | CCTPV2RouterSingleOutput AUTO | 0x6faec2944071b2a5ebfd1b08f43f29597aad8ca1
[see in explorer](https://sonicscan.org/address/0x6faec2944071b2a5ebfd1b08f43f29597aad8ca1) | | DisabledSocketRoute | 0x0f34A522FF82151c90679b73211955068FD854F1
[see in explorer](https://sonicscan.org/address/0x0f34A522FF82151c90679b73211955068FD854F1) | | Entrypoint AUTO | 0x407BE335f94C30Ee2876c4cF86ce08A46f518cF3
[see in explorer](https://sonicscan.org/address/0x407BE335f94C30Ee2876c4cF86ce08A46f518cF3) | | FeeCollector AUTO | 0xe772551F88E2c14aEcC880dF6b7CBd574561bf82
[see in explorer](https://sonicscan.org/address/0xe772551F88E2c14aEcC880dF6b7CBd574561bf82) | | FeesTakerController | 0x48E15f841D0Dd0C6e1B93432374EEDB47E9eBbeB
[see in explorer](https://sonicscan.org/address/0x48E15f841D0Dd0C6e1B93432374EEDB47E9eBbeB) | | GenericStakedRoute AUTO | 0x5013c0b3defd8f832d1b6dec750382946de5c13b
[see in explorer](https://sonicscan.org/address/0x5013c0b3defd8f832d1b6dec750382946de5c13b) | | MagpieSwapImpl | 0xFBd820d7C4aFB954532107b8DD37D0515C90eBb0
[see in explorer](https://sonicscan.org/address/0xFBd820d7C4aFB954532107b8DD37D0515C90eBb0) | | OpenOceanSwapImpl AUTO | 0x831e9cDe2Ee7070203559CDd6Ec60745b9565B95
[see in explorer](https://sonicscan.org/address/0x831e9cDe2Ee7070203559CDd6Ec60745b9565B95) | | RefuelSwapAndBridgeController | 0x7Dab58E25c235fdeA1D3ffC401a94D9afFAff598
[see in explorer](https://sonicscan.org/address/0x7Dab58E25c235fdeA1D3ffC401a94D9afFAff598) | | RFQRouterSingleOutput AUTO | 0xc4088d6e5a2027e784efc0491c322a3e2621bd9e
[see in explorer](https://sonicscan.org/address/0xc4088d6e5a2027e784efc0491c322a3e2621bd9e) | | SingleOutputRequestImpl AUTO | 0x26Be0Eb9Ad8877e77da075dEc15b683D9EfD56aD
[see in explorer](https://sonicscan.org/address/0x26Be0Eb9Ad8877e77da075dEc15b683D9EfD56aD) | | SocketDeployFactory | 0x71630095e3F08A86aFC73f7b07342192adf39C55
[see in explorer](https://sonicscan.org/address/0x71630095e3F08A86aFC73f7b07342192adf39C55) | | SocketGateway | 0x3a23F943181408EAC424116Af7b7790c94Cb97a5
[see in explorer](https://sonicscan.org/address/0x3a23F943181408EAC424116Af7b7790c94Cb97a5) | | Solver AUTO | 0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042
[see in explorer](https://sonicscan.org/address/0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042) | | StakedRouterExecutor AUTO | 0x12efda5e4d410c5da723ceb7e43942779e3fe49b
[see in explorer](https://sonicscan.org/address/0x12efda5e4d410c5da723ceb7e43942779e3fe49b) | | StakedRouterReceiver AUTO | 0x5d84f33b7c9214df23fd86a0861ac923af99954d
[see in explorer](https://sonicscan.org/address/0x5d84f33b7c9214df23fd86a0861ac923af99954d) | | StakedRouterSingleOutput AUTO | 0x167d49f106bbea59587ef3c63b33e6a421af1b8d
[see in explorer](https://sonicscan.org/address/0x167d49f106bbea59587ef3c63b33e6a421af1b8d) | | StargateImplV2 | 0x4682e8315B80cF757e2077280E0471729c992Ed3
[see in explorer](https://sonicscan.org/address/0x4682e8315B80cF757e2077280E0471729c992Ed3) | | SwapExecutor AUTO | 0x6BFE1830046D92877Bb11229ceDe23e8590dc2c4
[see in explorer](https://sonicscan.org/address/0x6BFE1830046D92877Bb11229ceDe23e8590dc2c4) | | SwapRequestCallback AUTO | 0xEFB37Bd3a9ed2f768bf6f79d0379fe7f9BE50F49
[see in explorer](https://sonicscan.org/address/0xEFB37Bd3a9ed2f768bf6f79d0379fe7f9BE50F49) | | SwapRequestImpl AUTO | 0x8A228540a81344cD06bAB50dB3F938962aaF21D5
[see in explorer](https://sonicscan.org/address/0x8A228540a81344cD06bAB50dB3F938962aaF21D5) | | SwitchboardPlug AUTO | 0xAaA647EE552b24D4E28Ab1B4e5223af9729035da
[see in explorer](https://sonicscan.org/address/0xAaA647EE552b24D4E28Ab1B4e5223af9729035da) | | SwitchboardRouter AUTO | 0x001aeD6a2F42b0CebCbCD9308c303ff2189eDC9c
[see in explorer](https://sonicscan.org/address/0x001aeD6a2F42b0CebCbCD9308c303ff2189eDC9c) | | UnwrapAndForward AUTO | 0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad
[see in explorer](https://sonicscan.org/address/0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad) | | ZeroxV2Wrapper AUTO | 0x614595189d16995Fe22a5c267B220C803e50966F
[see in explorer](https://sonicscan.org/address/0x614595189d16995Fe22a5c267B220C803e50966F) |
| name | address | | ---------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- | | BungeeDepository AUTO | TVLrWiPWF6xRanrMfET5xsQibDm2eSbFiP
[see in explorer](https://tronscan.org/#/contract/TVLrWiPWF6xRanrMfET5xsQibDm2eSbFiP) | | BungeeDepositoryTron AUTO | TWMsLzKo9sCzQP4Sh4cbgZpCZnXCTyeiHn
[see in explorer](https://tronscan.org/#/contract/TWMsLzKo9sCzQP4Sh4cbgZpCZnXCTyeiHn) | | Simple AUTO | TVm2o3iaUAQ6JC5Rp1uzGqF91nn4Mvh2HW
[see in explorer](https://tronscan.org/#/contract/TVm2o3iaUAQ6JC5Rp1uzGqF91nn4Mvh2HW) |
| name | address | | -------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | | AcrossImplV3 | 0x740EA79e2FccDDB4eE8bB8Fc8ccAC5eb6dFa0b40
[see in explorer](https://unichain.blockscout.com/address/0x740EA79e2FccDDB4eE8bB8Fc8ccAC5eb6dFa0b40) | | AcrossStakedRoute AUTO | 0x125ac5a530ece0a06dd3cd3da711c054eadb57b9
[see in explorer](https://unichain.blockscout.com/address/0x125ac5a530ece0a06dd3cd3da711c054eadb57b9) | | AcrossV3WethUnwrapper | 0x36f0B62E4eE3d30939cBccABA9D983579799D931
[see in explorer](https://unichain.blockscout.com/address/0x36f0B62E4eE3d30939cBccABA9D983579799D931) | | BungeeGateway AUTO | 0x79b5380FF38462b72e14667742f634c6610158B8
[see in explorer](https://unichain.blockscout.com/address/0x79b5380FF38462b72e14667742f634c6610158B8) | | BungeeInbox AUTO | 0x5e0f8e7337c8955d2124b8e85ca74af884b3e124
[see in explorer](https://unichain.blockscout.com/address/0x5e0f8e7337c8955d2124b8e85ca74af884b3e124) | | BungeeInboxOld AUTO | 0x198d69c8d8422D182EbbFEC9C35A31E003BcaD9a
[see in explorer](https://unichain.blockscout.com/address/0x198d69c8d8422D182EbbFEC9C35A31E003BcaD9a) | | CalldataExecutor AUTO | 0xa873aab6a98cb764ad6d52820d129d0e3667d9f9
[see in explorer](https://unichain.blockscout.com/address/0xa873aab6a98cb764ad6d52820d129d0e3667d9f9) | | CctpImpl | 0xbD99719C412f0cF440439f328B93622DeBB601b2
[see in explorer](https://unichain.blockscout.com/address/0xbD99719C412f0cF440439f328B93622DeBB601b2) | | CCTPRouterSingleOutput AUTO | 0x3b4817827d06600f92296c5d1491818d69fc955f
[see in explorer](https://unichain.blockscout.com/address/0x3b4817827d06600f92296c5d1491818d69fc955f) | | CCTPV2RouterSingleOutput AUTO | 0x6faec2944071b2a5ebfd1b08f43f29597aad8ca1
[see in explorer](https://unichain.blockscout.com/address/0x6faec2944071b2a5ebfd1b08f43f29597aad8ca1) | | Entrypoint AUTO | 0x01710CDb7319292Ed50A3F92561A599F5C650e2c
[see in explorer](https://unichain.blockscout.com/address/0x01710CDb7319292Ed50A3F92561A599F5C650e2c) | | FeeCollector AUTO | 0x79C7a69499Cf1866734E8D3154200a05aE41c865
[see in explorer](https://unichain.blockscout.com/address/0x79C7a69499Cf1866734E8D3154200a05aE41c865) | | FeesTakerController | 0xD0403D1994652f8476ACB8cf5c44aE41C44450f3
[see in explorer](https://unichain.blockscout.com/address/0xD0403D1994652f8476ACB8cf5c44aE41C44450f3) | | GenericStakedRoute AUTO | 0x5013c0b3defd8f832d1b6dec750382946de5c13b
[see in explorer](https://unichain.blockscout.com/address/0x5013c0b3defd8f832d1b6dec750382946de5c13b) | | MayanBridgeImplV2 | 0xCFee2171DC6c670eF1E0Df832df0cF37C31705E9
[see in explorer](https://unichain.blockscout.com/address/0xCFee2171DC6c670eF1E0Df832df0cF37C31705E9) | | RefuelSwapAndBridgeController | 0xD306B32f05c26a32d5Fd0Fdaf34F05FCA5BBd667
[see in explorer](https://unichain.blockscout.com/address/0xD306B32f05c26a32d5Fd0Fdaf34F05FCA5BBd667) | | RFQRouterSingleOutput AUTO | 0xc4088d6e5a2027e784efc0491c322a3e2621bd9e
[see in explorer](https://unichain.blockscout.com/address/0xc4088d6e5a2027e784efc0491c322a3e2621bd9e) | | SingleOutputRequestImpl AUTO | 0xBB1F279f61a7faC35cF4DDED87986Ab927083efb
[see in explorer](https://unichain.blockscout.com/address/0xBB1F279f61a7faC35cF4DDED87986Ab927083efb) | | SocketDeployFactory | 0x71630095e3F08A86aFC73f7b07342192adf39C55
[see in explorer](https://unichain.blockscout.com/address/0x71630095e3F08A86aFC73f7b07342192adf39C55) | | SocketGateway | 0x3a23F943181408EAC424116Af7b7790c94Cb97a5
[see in explorer](https://unichain.blockscout.com/address/0x3a23F943181408EAC424116Af7b7790c94Cb97a5) | | Solver AUTO | 0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042
[see in explorer](https://unichain.blockscout.com/address/0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042) | | StakedRouterExecutor AUTO | 0x12efda5e4d410c5da723ceb7e43942779e3fe49b
[see in explorer](https://unichain.blockscout.com/address/0x12efda5e4d410c5da723ceb7e43942779e3fe49b) | | StakedRouterReceiver AUTO | 0x5d84f33b7c9214df23fd86a0861ac923af99954d
[see in explorer](https://unichain.blockscout.com/address/0x5d84f33b7c9214df23fd86a0861ac923af99954d) | | StakedRouterSingleOutput AUTO | 0x167d49f106bbea59587ef3c63b33e6a421af1b8d
[see in explorer](https://unichain.blockscout.com/address/0x167d49f106bbea59587ef3c63b33e6a421af1b8d) | | StargateImplV2 | 0x4682e8315B80cF757e2077280E0471729c992Ed3
[see in explorer](https://unichain.blockscout.com/address/0x4682e8315B80cF757e2077280E0471729c992Ed3) | | SwapExecutor AUTO | 0x6e8338B0c56f598809e72D6a31456f9D5452de72
[see in explorer](https://unichain.blockscout.com/address/0x6e8338B0c56f598809e72D6a31456f9D5452de72) | | SwapRequestCallback AUTO | 0xEFB37Bd3a9ed2f768bf6f79d0379fe7f9BE50F49
[see in explorer](https://unichain.blockscout.com/address/0xEFB37Bd3a9ed2f768bf6f79d0379fe7f9BE50F49) | | SwapRequestImpl AUTO | 0xcC42AE193E97a228BbC1e747Ea4af3aa170acCA2
[see in explorer](https://unichain.blockscout.com/address/0xcC42AE193E97a228BbC1e747Ea4af3aa170acCA2) | | SwitchboardPlug AUTO | 0xc5C38A15A9D3D9dC5Fc7dE4426779B695677e45D
[see in explorer](https://unichain.blockscout.com/address/0xc5C38A15A9D3D9dC5Fc7dE4426779B695677e45D) | | SwitchboardRouter AUTO | 0x3416daBEAf259FBE5ba455E361f23e58BAB91E3E
[see in explorer](https://unichain.blockscout.com/address/0x3416daBEAf259FBE5ba455E361f23e58BAB91E3E) | | UnwrapAndForward AUTO | 0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad
[see in explorer](https://unichain.blockscout.com/address/0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad) | | ZeroxV2SwapImpl | 0x13C605F77Cd8A77977Cf0fa41a371204FaecCC03
[see in explorer](https://unichain.blockscout.com/address/0x13C605F77Cd8A77977Cf0fa41a371204FaecCC03) | | ZeroxV2Wrapper AUTO | 0x614595189d16995Fe22a5c267B220C803e50966F
[see in explorer](https://unichain.blockscout.com/address/0x614595189d16995Fe22a5c267B220C803e50966F) |
| name | address | | -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | | AcrossImplV3 | 0x740EA79e2FccDDB4eE8bB8Fc8ccAC5eb6dFa0b40
[see in explorer](https://worldscan.org/address/0x740EA79e2FccDDB4eE8bB8Fc8ccAC5eb6dFa0b40) | | AcrossStakedRoute AUTO | 0x125ac5a530ece0a06dd3cd3da711c054eadb57b9
[see in explorer](https://worldscan.org/address/0x125ac5a530ece0a06dd3cd3da711c054eadb57b9) | | AcrossV3WethUnwrapper | 0x36f0B62E4eE3d30939cBccABA9D983579799D931
[see in explorer](https://worldscan.org/address/0x36f0B62E4eE3d30939cBccABA9D983579799D931) | | BungeeGateway AUTO | 0x8f503B6d9fFdae8d375d1E226b71B4B3144D3849
[see in explorer](https://worldscan.org/address/0x8f503B6d9fFdae8d375d1E226b71B4B3144D3849) | | BungeeInbox AUTO | 0x5e0f8e7337c8955d2124b8e85ca74af884b3e124
[see in explorer](https://worldscan.org/address/0x5e0f8e7337c8955d2124b8e85ca74af884b3e124) | | BungeeInboxOld AUTO | 0x3B2Dbb1636F384F05002686fB816D60CD5c4EAAb
[see in explorer](https://worldscan.org/address/0x3B2Dbb1636F384F05002686fB816D60CD5c4EAAb) | | CalldataExecutor AUTO | 0xa873aab6a98cb764ad6d52820d129d0e3667d9f9
[see in explorer](https://worldscan.org/address/0xa873aab6a98cb764ad6d52820d129d0e3667d9f9) | | CctpV2Impl | 0x1768C1D2900f1408D44FbB1EdCc306F94aF852ae
[see in explorer](https://worldscan.org/address/0x1768C1D2900f1408D44FbB1EdCc306F94aF852ae) | | CCTPV2RouterSingleOutput AUTO | 0x6faec2944071b2a5ebfd1b08f43f29597aad8ca1
[see in explorer](https://worldscan.org/address/0x6faec2944071b2a5ebfd1b08f43f29597aad8ca1) | | DisabledSocketRoute | 0x0f34A522FF82151c90679b73211955068FD854F1
[see in explorer](https://worldscan.org/address/0x0f34A522FF82151c90679b73211955068FD854F1) | | Entrypoint AUTO | 0xc8807bD5b5c87Fe7Fc73D644Cb7800d1A4e4F09D
[see in explorer](https://worldscan.org/address/0xc8807bD5b5c87Fe7Fc73D644Cb7800d1A4e4F09D) | | FeeCollector AUTO | 0xE12D0CE29B916fbc067f49a8ebC203ffB66E8ded
[see in explorer](https://worldscan.org/address/0xE12D0CE29B916fbc067f49a8ebC203ffB66E8ded) | | FeesTakerController | 0xe0134Ca3d7AD384070580542Baee00511105BEfA
[see in explorer](https://worldscan.org/address/0xe0134Ca3d7AD384070580542Baee00511105BEfA) | | GenericStakedRoute AUTO | 0x5013c0b3defd8f832d1b6dec750382946de5c13b
[see in explorer](https://worldscan.org/address/0x5013c0b3defd8f832d1b6dec750382946de5c13b) | | RefuelSwapAndBridgeController | 0xA898821781ba5dd78a485Bcb610b8a60bbC5357E
[see in explorer](https://worldscan.org/address/0xA898821781ba5dd78a485Bcb610b8a60bbC5357E) | | RFQRouterSingleOutput AUTO | 0xc4088d6e5a2027e784efc0491c322a3e2621bd9e
[see in explorer](https://worldscan.org/address/0xc4088d6e5a2027e784efc0491c322a3e2621bd9e) | | SingleOutputRequestImpl AUTO | 0xcC42AE193E97a228BbC1e747Ea4af3aa170acCA2
[see in explorer](https://worldscan.org/address/0xcC42AE193E97a228BbC1e747Ea4af3aa170acCA2) | | SocketDeployFactory | 0x71630095e3F08A86aFC73f7b07342192adf39C55
[see in explorer](https://worldscan.org/address/0x71630095e3F08A86aFC73f7b07342192adf39C55) | | SocketGateway | 0x3a23F943181408EAC424116Af7b7790c94Cb97a5
[see in explorer](https://worldscan.org/address/0x3a23F943181408EAC424116Af7b7790c94Cb97a5) | | Solver AUTO | 0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042
[see in explorer](https://worldscan.org/address/0xAe68b7117BE0026Cbd4366303f74EEcbB19e4042) | | StakedRouterExecutor AUTO | 0x12efda5e4d410c5da723ceb7e43942779e3fe49b
[see in explorer](https://worldscan.org/address/0x12efda5e4d410c5da723ceb7e43942779e3fe49b) | | StakedRouterReceiver AUTO | 0x5d84f33b7c9214df23fd86a0861ac923af99954d
[see in explorer](https://worldscan.org/address/0x5d84f33b7c9214df23fd86a0861ac923af99954d) | | StakedRouterSingleOutput AUTO | 0x167d49f106bbea59587ef3c63b33e6a421af1b8d
[see in explorer](https://worldscan.org/address/0x167d49f106bbea59587ef3c63b33e6a421af1b8d) | | StargateImplV2 | 0xEFB37Bd3a9ed2f768bf6f79d0379fe7f9BE50F49
[see in explorer](https://worldscan.org/address/0xEFB37Bd3a9ed2f768bf6f79d0379fe7f9BE50F49) | | SwapExecutor AUTO | 0x6e8338B0c56f598809e72D6a31456f9D5452de72
[see in explorer](https://worldscan.org/address/0x6e8338B0c56f598809e72D6a31456f9D5452de72) | | SwapRequestCallback AUTO | 0x62e27f18fa770D456af351A9570cF79Fc48D2446
[see in explorer](https://worldscan.org/address/0x62e27f18fa770D456af351A9570cF79Fc48D2446) | | SwapRequestImpl AUTO | 0x79b5380FF38462b72e14667742f634c6610158B8
[see in explorer](https://worldscan.org/address/0x79b5380FF38462b72e14667742f634c6610158B8) | | SwitchboardPlug AUTO | 0xc5C38A15A9D3D9dC5Fc7dE4426779B695677e45D
[see in explorer](https://worldscan.org/address/0xc5C38A15A9D3D9dC5Fc7dE4426779B695677e45D) | | SwitchboardRouter AUTO | 0x3416daBEAf259FBE5ba455E361f23e58BAB91E3E
[see in explorer](https://worldscan.org/address/0x3416daBEAf259FBE5ba455E361f23e58BAB91E3E) | | UnwrapAndForward AUTO | 0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad
[see in explorer](https://worldscan.org/address/0xd31367da48d3f9d6dd0d59de4aa1ef6023a88fad) | | ZeroxV2SwapImpl | 0x5CddbecAF8603E5e0bC771A46D48e148593351eA
[see in explorer](https://worldscan.org/address/0x5CddbecAF8603E5e0bC771A46D48e148593351eA) | | ZeroxV2Wrapper AUTO | 0x7ad979C6b0C9924F79ea571280071595ba13D002
[see in explorer](https://worldscan.org/address/0x7ad979C6b0C9924F79ea571280071595ba13D002) |
| name | address | | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | | AcrossImpl | 0x8517D2B4A9df18034dd00CCB5940fA4dCfaD7219
[see in explorer](https://explorer.zksync.io/address/0x8517D2B4A9df18034dd00CCB5940fA4dCfaD7219) | | AnyswapV6L2Impl | 0x0c8F5C755233401257b3Fda01816eC17Ae54642d
[see in explorer](https://explorer.zksync.io/address/0x0c8F5C755233401257b3Fda01816eC17Ae54642d) | | CelerImpl | 0x3adaF849af32b298d8f34f7eD783dA8d3781aF29
[see in explorer](https://explorer.zksync.io/address/0x3adaF849af32b298d8f34f7eD783dA8d3781aF29) | | CelerStorageWrapper | 0xbC5ebCA678A2C2333a99F4ec79b1D09518bFD52e
[see in explorer](https://explorer.zksync.io/address/0xbC5ebCA678A2C2333a99F4ec79b1D09518bFD52e) | | DisabledSocketRoute | 0xcB7Bf8C0dAf13f61A275D1E0D0D6d42bAF1a5231
[see in explorer](https://explorer.zksync.io/address/0xcB7Bf8C0dAf13f61A275D1E0D0D6d42bAF1a5231) | | FeesTakerController | 0x2D1bf3A12A020DAdb1D07Fc85ffA0f3eBC82F4F2
[see in explorer](https://explorer.zksync.io/address/0x2D1bf3A12A020DAdb1D07Fc85ffA0f3eBC82F4F2) | | OneInchImpl | 0xfAAA5398Ec7F335F71C102c7e8bc9Ef8d5763b77
[see in explorer](https://explorer.zksync.io/address/0xfAAA5398Ec7F335F71C102c7e8bc9Ef8d5763b77) | | RefuelBridgeImpl | 0xE3597Ec143dA4dB5053e2A51Cbf0a04B52b9b59C
[see in explorer](https://explorer.zksync.io/address/0xE3597Ec143dA4dB5053e2A51Cbf0a04B52b9b59C) | | SocketDeployFactory | 0xd95B102370Dffbb65fe8adf4157DEa22b563F4E1
[see in explorer](https://explorer.zksync.io/address/0xd95B102370Dffbb65fe8adf4157DEa22b563F4E1) | | SocketGateway | 0xaDdE7028e7ec226777e5dea5D53F6457C21ec7D6
[see in explorer](https://explorer.zksync.io/address/0xaDdE7028e7ec226777e5dea5D53F6457C21ec7D6) |
# Get API Access Source: https://docs.bungee.exchange/integrate/get-api-access Get API access to the Bungee API. We support three types of API integrations, each with different endpoints, authentication methods, and rate limits: 1. **Public Sandbox** — For quick testing and development (no authentication required) 2. **Dedicated Backend** — For server-to-server integrations (API key authentication) 3. **Frontend / Direct** — For frontend, dApp, or mobile integrations (domain/IP whitelist) For production use, [request API access here](https://forms.gle/z3q5RdXjouuXR85k9). Once you receive your API key, include it as `x-api-key` in the request header when making calls to the dedicated backend endpoint. You will also receive an affiliate ID for tracking purposes—include it as `affiliate` in the request header. Each integration type uses a different base URL. See the details below and the comparison table for specific endpoints, authentication requirements, and rate limits. ### Public Sandbox — For Testing Only[​](#public-sandbox--for-testing-only "Direct link to Public Sandbox — For Testing Only") * Endpoint: `https://public-backend.bungee.exchange/` * Who this is for: Developers or teams who want to quickly try out APIs without setup. * Key facts: * No authentication or whitelisting * Very limited RPS (shared/public) * Not suitable for production ### Dedicated Backend Integrators[​](#dedicated-backend-integrators "Direct link to Dedicated Backend Integrators") * Endpoint: `https://dedicated-backend.bungee.exchange/` * Who this is for: Projects that run their own backend servers and call our APIs server-to-server (typically a single IP or small range). * Key facts: * Auth: API key via `x-api-key` * Default 20 RPS (extendable) * Limits enforced at the API key level #### Example request[​](#example-request "Direct link to Example request") ```bash theme={null} curl --location 'https://dedicated-backend.bungee.exchange/api/v1/supported-chains' \ --header 'x-api-key: [YOUR-API-KEY]' \ --header 'affiliate: [YOUR-AFFILIATE-ID]' ``` **Native Tokens**: For native assets (e.g., ETH, POL), use `0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee` as the token address. **Token Decimals**: Always fetch token decimals via `/api/v1/tokens/list` to ensure accuracy when calculating `inputAmount` in wei. This API key provides you with a higher rate limit of 20 requests per second. You can find detailed documentation on all available endpoints on the [API Reference](/api-reference). #### Security Recommendation[​](#security-recommendation "Direct link to Security Recommendation") For production use, we strongly recommend routing API calls through your backend to keep your API key secure. Exposing the key in frontend code allows anyone to extract it, which can lead to exhausted rate limits or unexpected costs. If your frontend must call the API directly, please contact us to enable your allowed origin(s). ### Frontend / Direct Integrators[​](#frontend--direct-integrators "Direct link to Frontend / Direct Integrators") * Endpoint: `https://backend.bungee.exchange/` * Who this is for: Projects that call Bungee APIs directly from their frontend, apps, or mobile clients. * Key facts: * Auth: Domain/IP whitelist (no API key) * Default 100 RPM per IP * Limits enforced at the IP level ## Comparison Table[​](#comparison-table "Direct link to Comparison Table") | Integrator Type | Endpoint | Authentication | Rate Limit | Enforcement Method | Use Case | | ----------------- | -------------------------------------------- | ------------------- | ------------------- | ------------------ | ------------------------- | | Sandbox (Public) | `https://public-backend.bungee.exchange/` | None | Very Limited | Shared/Public | Testing only | | Dedicated Backend | `https://dedicated-backend.bungee.exchange/` | API Key | 20 RPS (extendable) | API key–based | Production backends | | Frontend / Direct | `https://backend.bungee.exchange/` | Whitelisted Domains | 100 RPM | IP–based | Frontends, dApps, wallets | ## Server Request ID[​](#server-request-id "Direct link to Server Request ID") All responses include a `server-req-id` header that can be used for debugging purposes when contacting support. When encountering any errors or unexpected behavior: 1. Always capture and log this ID along with the error details 2. Include this ID when reporting issues to the Bungee team 3. Add the ID to any error messages shown to users to facilitate troubleshooting Example of capturing the `server-req-id` in error handling: ```javascript theme={null} async function getQuote(params) { const url = `${BUNGEE_API_BASE_URL}/api/v1/bungee/quote`; const queryParams = new URLSearchParams(params); const queryUrl = `${url}?${queryParams}`; const response = await fetch(queryUrl); const data = await response.json(); const serverReqId = response.headers.get("server-req-id"); if (!data.success) { throw new Error( `Quote error: ${data.statusCode}: ${data.message}. server-req-id: ${serverReqId}` ); } return data.result; } ``` The `server-req-id` provides the Bungee team with crucial information to trace the exact request through their systems, significantly improving debugging efficiency and resolution time. # Overview Source: https://docs.bungee.exchange/integrate/integration-guides This guide provides a step-by-step overview of integrating Bungee Auto into your application. ## Integration Flow[​](#integration-flow "Direct link to Integration Flow") All Bungee integrations follow the four key steps below. For detailed API specifications, see the [API Reference](/api-reference). ### 1. Get a quote[​](#1-get-a-quote "Direct link to 1. Get a quote") Request a quote from the `/bungee/quote` endpoint to receive available routes, fee estimates, and transaction data for your token swap. ### 2. Handle token approvals[​](#2-handle-token-approvals "Direct link to 2. Handle token approvals") For ERC20 tokens only: * **Auto Mode**: Uses Permit2 for gasless approvals (Permit2 tx data is provided in the quote response) * **Manual Mode**: Requires standard ERC20 approval transaction (approval transaction data is provided in the quote response and execution data in the build-tx response) ### 3. Submit the transaction (onchain or gasless)[​](#3-submit-the-transaction-onchain-or-gasless "Direct link to 3. Submit the transaction (onchain or gasless)") **Auto ERC20** Sign the Permit2 typed data and submit it offchain via `/bungee/submit` endpoint See [submit onchain requests](/integrate/integration-guides/auto-onchain-requests) to get the transaction data in the quote response and submit ERC20 requests onchain **Auto Native Token** * Transaction data is provided in the quote response * Submit the request onchain to the Inbox Contract **Manual Routes** Build transaction data via `/bungee/build-tx` endpoint and submit onchain ### 4. Monitor the transaction status[​](#4-monitor-the-transaction-status "Direct link to 4. Monitor the transaction status") Use the `/bungee/status` API endpoint to track the status of your transaction until completion. Integrate Bungee with Permit2 for ERC20 tokens Integrate Bungee with the Inbox Contract ## Submission Methods[​](#submission-methods "Direct link to Submission Methods") Bungee Auto requests can be submitted in two ways. Use this table to decide which one fits your needs: | Requirement | Recommended Flow | Why? | | :------------------------- | :--------------------------- | :------------------------------------------------------------------------ | | **ERC20 Tokens** | **Permit2 (Gasless)** | Better UX, no gas for approvals, one-time signature. | | **Native Tokens** | **Inbox Contract (Onchain)** | Native tokens (ETH, POL) cannot be approved, must be sent onchain. | | **Smart Contract Wallets** | **Inbox Contract (Onchain)** | Unless the wallet supports EIP-1271 signatures, use the onchain fallback. | ### Gasless request with Permit2[​](#gasless-request-with-permit2 "Direct link to Gasless request with Permit2") This method uses the Bungee Auto API with Permit2 for gasless approvals: 1. Get a quote from the Bungee API 2. Create a request via the API 3. Approve Permit2 contract if needed 4. Sign a Permit2 message 5. Submit the request with the signature 6. Monitor the status via the API This is the recommended approach for ERC20 tokens as it provides a better user experience by eliminating the need for separate approval transactions. Additionally, it allows for gasless approvals, saving users gas fees and tokens are only transferred if the auction is completed and a transmitter has picked up the request. For a complete implementation guide, see [Permit2 Integration (ERC20)](/integrate/integration-guides/auto-permit2-gasless-requests). ### Inbox Contract[​](#inbox-contract "Direct link to Inbox Contract") This method uses the Bungee Auto inbox contract to directly submit the request onchain: 1. Get a quote from the Bungee API 2. Create and submit a request onchain via Inbox contract 3. Monitor the status via the API This method is required for native tokens (ETH, POL, etc.) and can also be used for ERC20 tokens if Permit2 is not an option or if the integration is directly onchain. For a complete implementation guide, see [onchain request submission via Inbox Contract](/integrate/integration-guides/auto-onchain-requests). # Build requests onchain Source: https://docs.bungee.exchange/integrate/integration-guides/additional-guides/build-requests-onchain Create and submit crosschain requests directly through smart contracts Building requests onchain involves creating a `IBungeeInbox.Request` with all required parameters, including deadline, nonce, and token specifications. The request is then submitted through the `createRequest` function. ## Creating a Request ### Step 1: Generate Request Parameters Establish the timing and uniqueness parameters for your request: ```solidity theme={null} uint256 currentTimestamp = block.timestamp; uint256 deadline = currentTimestamp + 600; // 10 minutes deadline uint256 nonce = uint256( uint32( bytes4( keccak256( abi.encodePacked( currentTimestamp, block.number, block.prevrandao, msg.sender, inputAmount, chainSlug_, gasleft() ) ) ) ) ); ``` The nonce generation combines multiple blockchain parameters to ensure uniqueness and prevent repeated numbers. ### Step 2: Build the Basic Request Create the basic request structure with chain identifiers, token details, and execution parameters: ```solidity theme={null} IBungeeInbox.BasicRequest memory basicReq = IBungeeInbox.BasicRequest({ originChainId: request[user].inputChainSlug, destinationChainId: request[user].outputChainSlug, deadline: deadline, nonce: nonce, sender: sourceBungeeInboxAddress, receiver: request[user].monitorAddress, delegate: request[user].monitorAddress, bungeeGateway: sourceBungeeGatewayAddress, switchboardId: 1, // Fixed value for standard operations inputToken: request[user].inputTokenAddress, inputAmount: request[user].inputAmount, outputToken: request[user].outputTokenAddress, minOutputAmount: request[user].minSwapOutput, refuelAmount: 0 // Add refuel amount if native token transfer needed }); ``` ### Step 3: Complete the Request Structure Build the full request with additional parameters for swap execution and metadata: ```solidity theme={null} IBungeeInbox.Request memory bungeeRequest = IBungeeInbox.Request({ basicReq: basicReq, swapOutputToken: request[user].outputTokenAddress, minSwapOutput: request[user].minSwapOutput, metadata: bytes32(0), // Metadata: first 16 bytes = quoteId. Last 16 bytes = integrator id affiliateFees: "", // Add affiliate fee structure if needed minDestGas: 0, destinationPayload: "", // Add destination payload encoding if needed exclusiveTransmitter: address(0) // Add specific transmitter if needed }); ``` Detailed explanation of all parameters of both structures may be seen in the IBungeeInbox structure definition. Also, validate all inputs before creating requests to prevent invalid submissions. ## Submitting the Request Once your request structure is complete, submit it through the BungeeInbox contract on the source chain: ```solidity theme={null} IBungeeInbox(bungeeInboxAddress).createRequest(bungeeRequest); ``` ## Helper Libraries The utility libraries below are for request handling and validation. These libraries include EIP-712 compliant hashing functions and request verification tools that ensure proper request formatting and security. ```solidity theme={null} // SPDX-License-Identifier: MIT pragma solidity ^0.8.22; import {IBungeeInbox} from "./IBungeeInbox.sol"; /// @title Basic Request Library /// @notice Provides helpers for handling and hashing BasicRequest structs /// @dev Contains EIP-712 type hash and origin hash logic for BasicRequest library BasicRequestLib { /// @dev EIP-712 type definition for BasicRequest struct bytes internal constant BASIC_REQUEST_TYPE = abi.encodePacked( "BasicRequest(", "uint256 originChainId,", "uint256 destinationChainId,", "uint256 deadline,", "uint256 nonce,", "address sender,", "address receiver,", "address delegate,", "address bungeeGateway,", "uint32 switchboardId,", "address inputToken,", "uint256 inputAmount,", "address outputToken,", "uint256 minOutputAmount,", "uint256 refuelAmount)" ); /// @dev Keccak256 hash of the BASIC_REQUEST_TYPE bytes32 internal constant BASIC_REQUEST_TYPE_HASH = keccak256(BASIC_REQUEST_TYPE); /// @notice Computes the EIP-712 hash of a BasicRequest struct for the origin chain /// @dev Enforces originChainId to be the current chainId. Resulting hash is the same on all chains. /// Helps avoid extra checking of chainId in the contract. /// @param basicReq BasicRequest object to be hashed /// @return bytes32 The EIP-712 hash of the BasicRequest struct function originHash(IBungeeInbox.BasicRequest memory basicReq) internal view returns (bytes32) { return keccak256( abi.encodePacked( BASIC_REQUEST_TYPE_HASH, abi.encode( block.chainid, basicReq.destinationChainId, basicReq.deadline, basicReq.nonce, basicReq.sender, basicReq.receiver, basicReq.delegate, basicReq.bungeeGateway, basicReq.switchboardId, basicReq.inputToken, basicReq.inputAmount, basicReq.outputToken, basicReq.minOutputAmount, basicReq.refuelAmount ) ) ); } } /// @title Bungee Request Library. /// @author bungee protocol /// @notice This library is responsible for all the hashing related to Request object. library BungeeInboxRequest { using BasicRequestLib for IBungeeInbox.BasicRequest; /// @dev EIP-712 type definition for Request struct bytes internal constant REQUEST_TYPE = abi.encodePacked( "Request(", "BasicRequest basicReq,", "address swapOutputToken,", "uint256 minSwapOutput,", "bytes32 metadata,", "bytes affiliateFees,", "uint256 minDestGas,", "bytes destinationPayload,", "address exclusiveTransmitter)" ); /// @dev EIP-712 type definition for Bungee Request, including BasicRequest bytes internal constant BUNGEE_REQUEST_TYPE = abi.encodePacked(REQUEST_TYPE, BasicRequestLib.BASIC_REQUEST_TYPE); /// @dev Keccak256 hash of the BUNGEE_REQUEST_TYPE bytes32 internal constant BUNGEE_REQUEST_TYPE_HASH = keccak256(BUNGEE_REQUEST_TYPE); /** * @notice Creates a deterministic hash for a complete swap request * @dev Generates an EIP-712 compliant hash that uniquely identifies a swap request * This hash is used for request tracking, validation, and preventing replay attacks * @param request The complete swap request structure containing all swap parameters * @return bytes32 The deterministic hash of the swap request */ function createSORHash(IBungeeInbox.Request memory request) internal view returns (bytes32) { return keccak256( abi.encode( BUNGEE_REQUEST_TYPE_HASH, request.basicReq.originHash(), request.swapOutputToken, request.minSwapOutput, request.metadata, keccak256(request.affiliateFees), request.minDestGas, keccak256(request.destinationPayload), request.exclusiveTransmitter ) ); } } ``` ```solidity theme={null} // SPDX-License-Identifier: MIT pragma solidity ^0.8.22; /// @title Bungee Inbox Interface /// @notice Interface for submitting and handling Bungee crosschain requests /// @dev Defines the structure and function for Bungee Inbox requests interface IBungeeInbox { /// @notice Basic details in the request /// @dev Contains all the fundamental parameters required for a Bungee request struct BasicRequest { /// @notice Source chain ID uint256 originChainId; /// @notice Destination chain ID uint256 destinationChainId; /// @notice Deadline of the request uint256 deadline; /// @notice Nonce used for uniqueness in signature uint256 nonce; /// @notice Address of the user placing the request address sender; /// @notice Address of the receiver on destination chain address receiver; /// @notice Delegate address that has some rights over the request signed (e.g., cancellation) address delegate; /// @notice Address of bungee gateway, this address will have access to pull funds from the sender address bungeeGateway; /// @notice ID of the switchboard for settlement uint32 switchboardId; /// @notice Address of the input token address inputToken; /// @notice Amount of the input token uint256 inputAmount; /// @notice Output token to be received on the destination address outputToken; /// @notice Minimum amount of output token to be received on the destination uint256 minOutputAmount; /// @notice Native token refuel amount on the destination chain uint256 refuelAmount; } /// @notice The Request which user signs /// @dev Contains all parameters for a complete Bungee request, including swap and execution details struct Request { /// @notice Basic details in the request BasicRequest basicReq; /// @notice Swap output token that the user is permitting to swap input token to address swapOutputToken; /// @notice Minimum swap output the user is okay with swapping the input token to /// @dev Transmitter can choose or not choose to swap tokens uint256 minSwapOutput; /// @notice Any sort of metadata to be passed with the request bytes32 metadata; /// @notice Fees of the affiliate if any bytes affiliateFees; /// @notice Minimum destination gas limit to execute calldata on destination /// @dev Only to be used when execution is required on destination uint256 minDestGas; /// @notice Calldata to be executed on the destination /// @dev Calldata can only be executed on the receiver in the request bytes destinationPayload; /// @notice Address of the only transmitter that is permitted to execute the request /// @dev If the transmitter is not set, anyone can execute the request. This validation would be done off-chain by the auction house address exclusiveTransmitter; } /// @notice Creates a new Bungee request /// @dev Accepts a complete Request struct and processes it. May require a payment depending on the request. /// @param singleOutputRequest The complete request structure containing all parameters function createRequest(Request calldata singleOutputRequest) external payable; } ``` # Charging fees Source: https://docs.bungee.exchange/integrate/integration-guides/additional-guides/charging-fees How to implement fee charging in Bungee integrations # Charging Fees with Bungee Bungee allows integrators to charge fees on swaps and transfers, providing a revenue stream for your application. This guide explains how to implement fee charging in both Bungee Auto and Bungee Manual integrations. If you plan to implement fee charging, please request a dedicated API key first. ## Fee Mechanics When integrating Bungee, you can specify two key parameters to collect fees: * **`feeTakerAddress`**: The address that will receive the collected fees * **`feeBps`**: The percentage of the transfer amount to charge as a fee (in basis points - 1 basis point = 0.01%) These parameters ensure that a portion of each swap is directed to your specified feeTaker address. The input token amount will be reduced by the fee amount before the swap is executed. ## Implementation You can add fee parameters to both Bungee Auto and Manual integrations when requesting a quote: ```javascript theme={null} const BUNGEE_API_BASE_URL = "https://public-backend.bungee.exchange"; async function getQuoteWithFees() { const quoteParams = { userAddress: "0xYourUsersAddress", originChainId: "1", // Ethereum destinationChainId: "10", // Optimism inputToken: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", // USDC on Ethereum outputToken: "0x7F5c764cBc14f9669B88837ca1490cCa17c31607", // USDC on Optimism inputAmount: "1000000", // 1 USDC (6 decimals) receiverAddress: "0xYourUsersAddress", feeTakerAddress: "0xYourFeeCollectionAddress", // Address to receive fees feeBps: "50", // 0.5% fee (50 basis points) }; // For Manual mode, add this parameter // quoteParams.enableManual = "true"; const url = `${BUNGEE_API_BASE_URL}/api/v1/bungee/quote`; const queryParams = new URLSearchParams(quoteParams); const fullUrl = `${url}?${queryParams}`; const response = await fetch(fullUrl, { method: "GET" }); const data = await response.json(); const serverReqId = response.headers.get("server-req-id"); if (!data.success) { throw new Error( `Quote error: ${data.statusCode}: ${data.message}. server-req-id: ${serverReqId}` ); } return data.result; } ``` ## Where to Claim Fees For Bungee Manual, no need to claim as fees are delivered directly to the `feeTakerAddress` provided. For Bungee Auto, fees are sent to the `FeeCollector` contract where anyone can trigger the claim fees for a specified token address and `feeTakerAddress` pair. For per-chain `FeeCollector` addresses, see the [Contract Addresses](/integrate/contract-addresses) page. The `FeeCollector` exposes a `claim(address token, address feeTaker)` method to withdraw accrued fees. ## Next Steps Integrate Bungee Auto with fee charging Integrate Bungee Manual with fee charging Details on the Quote API parameters Learn more about fee charging and monetization # Destination payload execution Source: https://docs.bungee.exchange/integrate/integration-guides/additional-guides/destination-payload Execute arbitrary contract calls on the destination chain after transfers Destination payload lets you execute arbitrary contract calls on the destination chain after a crosschain transfer completes. This is useful for flows such as depositing to a vault, repaying a loan, or interacting with a protocol immediately after bridging/swapping. ## How it works When building a Bungee request, you can provide calldata that will be executed on the destination chain. It works for both same chain swaps as well as cross chain swaps. If the below parameters are provided, Bungee will deliver assets on destination and then invoke the receiver contract with your `destinationPayload` under the specified gas limit. * `destinationPayload`: ABI-encoded calldata for the target contract on the destination chain * `receiverAddress`: The execution target that will receive the calldata and perform the call * `destinationGasLimit`: Gas budget on destination to execute the payload ```solidity theme={null} interface IBungeeExecutor { function executeData( bytes32 requestHash, uint256[] calldata amounts, address[] calldata tokens, bytes memory callData ) external payable; } ``` ## Implementation example ```typescript theme={null} const BUNGEE_API_BASE_URL = "https://public-backend.bungee.exchange"; async function getQuoteWithDestinationPayload() { const quoteParams = { userAddress: "0xYourUsersAddress", originChainId: "8453", // Base destinationChainId: "8453", // Base inputToken: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", // USDC on Base outputToken: "0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2", // USDT on Base inputAmount: "10000000", // 10 USDC (6 decimals) receiverAddress: contractAddress, // contract address that implements executeData destinationPayload: "0x1234acbd", // calldata for the contract set on receiverAddress destinationGasLimit: "100000", // gas ceiling for destination execution }; const url = `${BUNGEE_API_BASE_URL}/api/v1/bungee/quote`; const queryParams = new URLSearchParams(quoteParams); const fullUrl = `${url}?${queryParams}`; const response = await fetch(fullUrl, { method: "GET", headers: { "Content-Type": "application/json", }, }); const data = await response.json(); const serverReqId = response.headers.get("server-req-id"); if (!data.success) { throw new Error( `Quote error: ${data.statusCode}: ${data.message}. server-req-id: ${serverReqId}` ); } } ``` ## Important Notes * The `destinationPayload` is the `callData` parameter that will be passed to the `executeData` function * Execution may fail due to invalid encoding: re-check `encodeAbiParameters` types match the receiver decode * The `receiverAddress` needs to be a contract that implements `IBungeeExecutor` contract's interface for the `executeData` function * Ensure the receiver contract trusts/can handle calls from the Bungee executor * Complex receivers or multi-token logic require higher gas limits * Execution may fail due to out of gas on destination: increase `destinationGasLimit` ## Complete Examples Complete script example showing how to execute a custom payload on the destination chain: ```javascript theme={null} import { createWalletClient, createPublicClient, http, encodeAbiParameters, } from 'viem'; import { privateKeyToAccount } from 'viem/accounts'; import { base, optimism } from 'viem/chains'; // Configuration - Update these values const PRIVATE_KEY = process.env.PRIVATE_KEY; // Example receiver contract on Base that implements executeData(...) // and sends funds back to the userAddress // The example receiver decodes only an `address` and transfers the first `(token, amount)` pair // https://basescan.org/address/0xC0b43F2B38CA47CC9e1b9697296716ebCF3D8177#code const CONTRACT_ADDRESS = '0xC0b43F2B38CA47CC9e1b9697296716ebCF3D8177'; // ExecuteDestinationPayload // Create account from private key const account = privateKeyToAccount(PRIVATE_KEY); // Create OP clients const publicClient = createPublicClient({ chain: base, transport: http(), }); const walletpublicClient = createWalletClient({ account, chain: base, transport: http(), }); const BUNGEE_API_BASE_URL = "https://public-backend.bungee.exchange"; const quoteParamsERC20 = { userAddress: account.address, originChainId: 8453, // Base inputToken: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", // USDC on Base //originChainId: 10, // OP //inputToken: "0x0b2c639c533813f4aa9d7837caf62653d097ff85", // USDC on OP destinationChainId: 8453, // Base //outputToken: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", // USDC on Base outputToken: "0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2", // USDT on Base inputAmount: "3000000", // 3 USDC (6 decimals) }; async function getQuote(params) { const url = `${BUNGEE_API_BASE_URL}/api/v1/bungee/quote`; const queryParams = new URLSearchParams(params); const queryUrl = `${url}?${queryParams}`; console.log(queryUrl); const response = await fetch(queryUrl); const data = await response.json(); const serverReqId = response.headers.get("server-req-id"); if (!data.success) { throw new Error( `Quote error: ${data.statusCode}: ${data.message}. server-req-id: ${serverReqId}` ); } if (!data.result.autoRoute) { throw new Error(`No autoRoute available. server-req-id: ${serverReqId}`); } console.log(`server-req-id: ${serverReqId}`); const quoteId = data.result.autoRoute.quoteId; const requestType = data.result.autoRoute.requestType; let witness = null; let signTypedData = null; if (data.result.autoRoute.signTypedData) { signTypedData = data.result.autoRoute.signTypedData; if (signTypedData.values && signTypedData.values.witness) { witness = signTypedData.values.witness; } } const approvalData = data.result.autoRoute.approvalData; return { quoteId, requestType, witness, signTypedData, approvalData, fullResponse: data, }; } // Function to check and handle token approvals async function checkAndApproveToken(approvalData) { if (!approvalData || !approvalData.tokenAddress) { console.log("No approval data found or required"); return; } console.log("\nChecking token approval..."); // ERC20 ABI for allowance and approve functions const erc20Abi = [ { inputs: [ { name: "owner", type: "address" }, { name: "spender", type: "address" }, ], name: "allowance", outputs: [{ name: "", type: "uint256" }], stateMutability: "view", type: "function", }, { inputs: [ { name: "spender", type: "address" }, { name: "amount", type: "uint256" }, ], name: "approve", outputs: [{ name: "", type: "bool" }], stateMutability: "nonpayable", type: "function", }, ]; try { const currentAllowance = await publicClient.readContract({ address: approvalData.tokenAddress, abi: erc20Abi, functionName: "allowance", args: [ approvalData.userAddress, approvalData.spenderAddress, ], }); console.log(`Current allowance: ${currentAllowance}`); console.log(`Required approval: ${approvalData.amount}`); // Check if approval is needed if (BigInt(currentAllowance) >= BigInt(approvalData.amount)) { console.log("Sufficient allowance already exists."); return; } console.log("Insufficient allowance. Approving tokens..."); // Send approval transaction const hash = await walletpublicClient.writeContract({ address: approvalData.tokenAddress, abi: erc20Abi, functionName: "approve", args: [approvalData.spenderAddress, approvalData.amount], }); console.log(`Approval transaction sent: ${hash}`); // Wait for transaction to be mined const receipt = await publicClient.waitForTransactionReceipt({ hash }); console.log(`Approval confirmed in block ${receipt.blockNumber}`); return receipt; } catch (error) { console.error("Error in approval process:", error); throw error; } } async function viemSignTypedData(signTypedData) { const signature = await account.signTypedData({ types: signTypedData.types, primaryType: "PermitWitnessTransferFrom", message: signTypedData.values, domain: signTypedData.domain, }); return signature; } async function submitSignedRequest( requestType, request, userSignature, quoteId ) { const requestBody = { requestType, request, userSignature, quoteId, }; const response = await fetch(`${BUNGEE_API_BASE_URL}/api/v1/bungee/submit`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(requestBody), }); const data = await response.json(); if (!data.success) { throw new Error(`Submit error: ${data.error?.message || "Unknown error"}`); } const serverReqId = response.headers.get("server-req-id"); console.log(`server-req-id: ${serverReqId}`); return data.result; } async function checkStatus(requestHash) { const response = await fetch( `${BUNGEE_API_BASE_URL}/api/v1/bungee/status?requestHash=${requestHash}` ); const data = await response.json(); if (!data.success) { throw new Error(`Status error: ${data.error?.message || "Unknown error"}`); } return data.result[0]; } async function main() { try { quoteParamsERC20.destinationPayload = encodeAbiParameters( [{ type: 'address' }], [account.address] // In this usecase the Payload is just the address to forward the funds to ); quoteParamsERC20.destinationGasLimit = "100000"; // Max gas value taken from the forge test --gas-report was 62471 quoteParamsERC20.receiverAddress = CONTRACT_ADDRESS; // Receiver Address is the contract that will receive the payload const quote = await getQuote(quoteParamsERC20); console.log(`Got quote ${quote.quoteId}`); const { quoteId, requestType, witness, signTypedData } = quote; console.log(JSON.stringify(quote.fullResponse, null, 2)); if (quote.approvalData) { await checkAndApproveToken(quote.approvalData); } if (signTypedData && witness) { // Sign the typed data console.log("\n2. Signing typed data..."); const signature = await viemSignTypedData(signTypedData); // Submit the signed request console.log("\n3. Submitting signed request..."); const submitResult = await submitSignedRequest( requestType, witness, signature, quoteId ); console.log( "\n4. Submission complete:", "\n- Hash:", submitResult.requestHash, "\n- Type:", submitResult.requestType ); // Check the status // Wait for 5 seconds console.log("\n4. Waiting for 5 seconds..."); let status; do { await new Promise((resolve) => setTimeout(resolve, 5000)); console.log("\n5. Checking status..."); try { status = await checkStatus(submitResult.requestHash); console.log("- Status details:", status.bungeeStatusCode); } catch (error) { console.error( "Failed to check status:", error?.message || "Unknown error" ); } } while (status?.bungeeStatusCode !== 3); console.log( "\n6. Transaction complete:", "\n- Hash:", status.destinationData?.txHash || "Transaction hash not available" ); } else { console.log("No signature data available in the quote response"); } } catch (error) { console.error('Main execution error:', error); } } // Run the script if (import.meta.url === `file://${process.argv[1]}`) { main(); } ``` **For Example Purposes Only** The smart contract below is for example purposes only. Please ensure you audit your contracts for production usage. Example smart contract that implements the `IBungeeExecutor` interface: ```solidity theme={null} // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.28; import {Ownable} from "solady/auth/Ownable.sol"; import {SafeTransferLib} from "solady/utils/SafeTransferLib.sol"; /** * @title IBungeeExecutor * @dev Interface for executing cross-chain data payloads */ interface IBungeeExecutor { /** * @notice Executes data payload with token transfers * @param requestHash Unique identifier for the cross-chain request * @param amounts Array of token amounts to process * @param tokens Array of token addresses to process * @param callData Encoded data containing execution parameters */ function executeData( bytes32 requestHash, uint256[] calldata amounts, address[] calldata tokens, bytes memory callData ) external payable; } /** * @title ExecuteDestinationPayload * @dev Contract for executing destination payloads in cross-chain transfers * @notice This contract handles the final step of cross-chain transfers by sending tokens to recipients */ contract ExecuteDestinationPayload is IBungeeExecutor, Ownable { address public constant NATIVE_TOKEN = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; /** * @notice Emitted when a destination payload is successfully executed * @param requestHash Unique identifier for the cross-chain request * @param amount Amount of tokens transferred to recipient * @param token Address of the token transferred * @param recipient Address that received the tokens */ event DestinationPayload( bytes32 indexed requestHash, uint256 amount, address indexed token, address indexed recipient ); /** * @notice Thrown when input arrays have invalid lengths * @dev Both amounts and tokens arrays must have length is 1 */ error InvalidArrayLength(); /** * @notice Thrown when trying to rescue zero amount */ error ZeroAmount(); /** * @notice Thrown when trying to rescue to zero address */ error ZeroAddress(); /** * @notice Constructor sets the initial owner */ constructor() { _initializeOwner(msg.sender); } /** * @notice Executes the destination payload by transferring tokens to the recipient * @dev Transfers the first token/amount pair to the decoded recipient address * @param requestHash Unique identifier for the cross-chain request * @param amounts Array of token amounts (must have length = 1, only first element used) * @param tokens Array of token addresses (must have length = 1, only first element used) * @param callData ABI-encoded recipient address * @custom:security Only the first elements of amounts and tokens arrays are used * @custom:security For ETH transfers, uses safeTransferETH * @custom:security For ERC20 transfers, uses safeTransfer from msg.sender */ function executeData( bytes32 requestHash, uint256[] calldata amounts, address[] calldata tokens, bytes memory callData ) external payable override { // Check if array length is 1 if (amounts.length != 1 || tokens.length != 1) { revert InvalidArrayLength(); } // Decode recipient address from callData address recipient = abi.decode(callData, (address)); // Transfer funds to user using first array elements address token = tokens[0]; uint256 amount = amounts[0]; if (token == NATIVE_TOKEN) { // Transfer ETH to recipient SafeTransferLib.safeTransferETH(recipient, amount); } else { // Transfer ERC20 token from msg.sender to recipient SafeTransferLib.safeTransfer(token, recipient, amount); } emit DestinationPayload(requestHash, amount, token, recipient); } /** * @notice Rescues all ETH from the contract * @dev Only callable by the owner */ function rescueAllETH() external onlyOwner { uint256 balance = address(this).balance; if (balance == 0) revert ZeroAmount(); SafeTransferLib.safeTransferETH(msg.sender, balance); } /** * @notice Rescues all ERC20 tokens from the contract * @dev Only callable by the owner * @param token Address of the ERC20 token to rescue */ function rescueAllERC20(address token) external onlyOwner { if (token == address(0)) revert ZeroAddress(); uint256 balance = SafeTransferLib.balanceOf(token, address(this)); if (balance == 0) revert ZeroAmount(); SafeTransferLib.safeTransfer(token, msg.sender, balance); } /** * @notice Allows the contract to receive ETH */ receive() external payable {} } ``` # Swap across EVM & HyperCore Source: https://docs.bungee.exchange/integrate/integration-guides/additional-guides/hypercore-on-bungee Bridge and swap assets between EVM chains and HyperCore using Bungee Bungee also supports swapping assets from any EVM chain to HyperCore and from HyperCore to any EVM chain. This guide walks you through swapping assets between EVM chains and HyperCore using Bungee. It covers transaction options, and current limitations. ## Quick Start ### Key differences Follow the "Auto routing" guides when going from any EVM to HyperCore. The main difference when integrating HyperCore Bungee API compared to standard EVM chains: **Transaction Flow from HyperCore to EVM** * User sends funds to a Deposit contract with the quote ID * Bungee indexes the transaction and delivers the funds on the destination chain **API Behavior** * Both `userAddress` and `receiverAddress` required for quotes * The only assets supported from/to HyperCore are [USDC (Spot)](https://hyperevmscan.io/address/0x2000000000000000000000000000000000000000) and USDC (Perps). * There is no Fee collection currently from HyperCore to EVM * The quote responses already take into account that HyperCore charges a 1 USDC activation fee for new account activation and withdrawals * Only USDC (Perps) is supported when bridging out of Hypercore ## Integration Steps ### HyperCore to EVM The ["Auto routing" guide from Bungee Docs](/integrate/integration-guides/auto-permit2-gasless-requests) outlines how to integrate the deposit flow as it is a quite similar process. 1. **Select Chains:** Users choose the source and destination chains, which determine the tokens available for bridging. 2. **Fetch Routes:** After selecting the tokens, retrieve the deposit route if available using the `/quote` endpoint. The response will contain `depositRoute.signTypedData` and `depositRoute.quoteId`. 3. **Sign and Submit:** Sign the `signTypedData` from the quote response using `primaryType: "HyperCoreTransaction:SendAsset"`, then submit the signed data to HyperLiquid's API endpoint (`https://api.hyperliquid.xyz/exchange`). 4. **Track Transaction Status:** Monitor the transaction's progress by polling the `/status` endpoint using the `quoteId` from the quote response until the bridging process is complete. For HyperCore quotes, please ensure both `userAddress` and `receiverAddress` are defined. **`inputAmount` Format for HyperCore:** The `inputAmount` parameter must be provided as an **integer string in 6-decimal base units (micro-units)**. This is the same format used for USDC on most EVM chains. | Human-readable | `inputAmount` value | | -------------- | ------------------- | | 9.99 USDC | `"9990000"` | | 2.00 USDC | `"2000000"` | | 10.23 USDC | `"10230000"` | **Conversion formula:** `inputAmount = humanAmount × 10^6` (rounded to integer) For example, to send 9.99 USDC, use `inputAmount: "9990000"` (9.99 × 1,000,000 = 9,990,000). The HyperCore signature generation uses this micro-unit value directly. Do not pass decimal strings like `"9.99"`. Also, note that from HyperCore to EVM is a separate route from `autoRoute` since it is under `depositRoute`. ## Examples ### Queries ``` https://public-backend.bungee.exchange/api/v1/bungee/quote?userAddress=0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045&receiverAddress=0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045&originChainId=10&destinationChainId=1337&inputToken=0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85&outputToken=0x2000000000000000000000000000000000000000&inputAmount=2000000 ``` ``` https://public-backend.bungee.exchange/api/v1/bungee/quote?userAddress=0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045&receiverAddress=0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045&originChainId=1337&destinationChainId=10&inputToken=0x6d1e7cde53ba9467b783cb7c530ce054&outputToken=0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85&inputAmount=10230000 ``` For HyperCore quotes, `inputAmount` must be provided as an integer string in 6-decimal base units (micro-units). For example, to send 10.23 USDC, use `inputAmount: "10230000"` (10.23 × 10^6). ### Scripts ```tsx theme={null} import { privateKeyToAccount } from "viem/accounts"; import { createPublicClient, http, createWalletClient } from "viem"; import { optimism } from "viem/chains"; // Check if PRIVATE_KEY is set, set in console, i.e.: export PRIVATE_KEY= if (!process.env.PRIVATE_KEY) { console.error("Error: PRIVATE_KEY environment variable is not set"); console.error( "Example: export PRIVATE_KEY=" ); process.exit(1); } // Create account from private key const account = privateKeyToAccount( process.env.PRIVATE_KEY.startsWith('0x') ? process.env.PRIVATE_KEY : `0x${process.env.PRIVATE_KEY}` ); // Create Viem clients const publicClient = createPublicClient({ chain: optimism, transport: http(), }); const walletClient = createWalletClient({ account, chain: optimism, transport: http(), }); // API and token parameters const BUNGEE_API_BASE_URL = "https://public-backend.bungee.exchange"; // Quote parameters const quoteParamsERC20 = { userAddress: account.address, receiverAddress: account.address, originChainId: 10, // Optimism destinationChainId: 1337, // HyperCore inputToken: "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85", // USDC on Optimism outputToken: "0x2000000000000000000000000000000000000000", // USDC (SPOT) on HyperCore //outputToken: "0x6d1e7cde53ba9467b783cb7c530ce054", // USDC (Perps) on HyperCore inputAmount: "2000000", // 2 USDC (6 decimals) }; // Function to get a quote async function getQuote(params) { try { const url = `${BUNGEE_API_BASE_URL}/api/v1/bungee/quote`; const queryParams = new URLSearchParams(params); const fullUrl = `${url}?${queryParams}`; const response = await fetch(fullUrl); console.log(fullUrl); const data = await response.json(); const serverReqId = response.headers.get("server-req-id"); // Check for errors if (!data.success) { throw new Error( `Quote error: ${data.statusCode}: ${data.message}. server-req-id: ${serverReqId}` ); } // Check if autoRoute exists if (!data.result.autoRoute) { throw new Error(`No autoRoute available. server-req-id: ${serverReqId}`); } const quoteId = data.result.autoRoute.quoteId; const requestType = data.result.autoRoute.requestType; console.log("- Quote ID:", quoteId); console.log("- Request Type:", requestType); // Extract data based on the response structure let witness = null; let signTypedData = null; if (data.result.autoRoute.signTypedData) { signTypedData = data.result.autoRoute.signTypedData; // The witness is located in signTypedData.values.witness if (signTypedData?.values?.witness) { witness = signTypedData.values.witness; } } // Extract approval data if present const approvalData = data.result.autoRoute.approvalData; // Log request hash if (data.result.autoRoute.requestHash) { console.log("- Request Hash:", data.result.autoRoute.requestHash); } return { quoteId, requestType, witness, signTypedData, approvalData, fullResponse: data, }; } catch (error) { console.error("Failed to get quote:", error); throw error; } } // Function to sign typed data using viem async function viemSignTypedData(signTypedData) { try { const signature = await account.signTypedData({ types: signTypedData.types, primaryType: "PermitWitnessTransferFrom", message: signTypedData.values, domain: signTypedData.domain, }); console.log("- Signature:", signature); return signature; } catch (error) { console.error("Failed to sign typed data:", error); throw error; } } // Function to submit the signed request async function submitSignedRequest( requestType, request, userSignature, quoteId ) { try { // Prepare request body const requestBody = { requestType, request, userSignature, quoteId, }; const response = await fetch( `${BUNGEE_API_BASE_URL}/api/v1/bungee/submit`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(requestBody), } ); const data = await response.json(); const serverReqId = response.headers.get("server-req-id"); console.log("Server request id", serverReqId); // Response data is saved to file but not logged to keep output clean if (!data.success) { throw new Error( `Submit error: ${data.error?.message || "Unknown error"}` ); } console.log("- Request Hash:", data.result.requestHash); return data.result; } catch (error) { console.error("Failed to submit signed request:", error); throw error; } } // Function to check the status of a request async function checkStatus(requestHash) { try { const response = await fetch( `${BUNGEE_API_BASE_URL}/api/v1/bungee/status?requestHash=${requestHash}` ); const data = await response.json(); if (!data.success) { throw new Error( `Status error: ${data.error?.message || "Unknown error"}` ); } return data.result[0]; } catch (error) { console.error("Failed to check status:", error); throw error; } } // Function to check and handle token approvals async function checkAndApproveToken(approvalData) { if (!approvalData || !approvalData.tokenAddress) { console.log("No approval data found or required"); return; } console.log("\nChecking token approval..."); // ERC20 ABI for allowance and approve functions const erc20Abi = [ { inputs: [ { name: "owner", type: "address" }, { name: "spender", type: "address" }, ], name: "allowance", outputs: [{ name: "", type: "uint256" }], stateMutability: "view", type: "function", }, { inputs: [ { name: "spender", type: "address" }, { name: "amount", type: "uint256" }, ], name: "approve", outputs: [{ name: "", type: "bool" }], stateMutability: "nonpayable", type: "function", }, ]; try { const currentAllowance = await publicClient.readContract({ address: approvalData.tokenAddress, abi: erc20Abi, functionName: "allowance", args: [ approvalData.userAddress, approvalData.spenderAddress, ], }); console.log(`Current allowance: ${currentAllowance}`); console.log(`Required approval: ${approvalData.amount}`); // Check if approval is needed if (BigInt(currentAllowance) >= BigInt(approvalData.amount)) { console.log("Sufficient allowance already exists."); return; } console.log("Insufficient allowance. Approving tokens..."); // Send approval transaction const hash = await walletClient.writeContract({ address: approvalData.tokenAddress, abi: erc20Abi, functionName: "approve", args: [ approvalData.spenderAddress, approvalData.amount, ], }); console.log(`Approval transaction sent: ${hash}`); // Wait for transaction to be mined const receipt = await publicClient.waitForTransactionReceipt({ hash }); console.log(`Approval confirmed in block ${receipt.blockNumber}`); return receipt; } catch (error) { console.error("Error in approval process:", error); throw error; } } // Main function to handle the flow async function main() { try { console.log("Starting Bungee ERC20 Token Test (Auto Route)..."); // Get the quote and extract data console.log("\n1. Getting quote..."); const quoteResponse = await getQuote(quoteParamsERC20); const { quoteId, requestType, witness, signTypedData } = quoteResponse; console.log(JSON.stringify(quoteResponse.fullResponse, null, 2)); // Check if approval is needed and handle it //if (quoteResponse.approvalData) { // await checkAndApproveToken(quoteResponse.approvalData); //} if (signTypedData && witness) { // Sign the typed data console.log("\n2. Signing typed data..."); const signature = await viemSignTypedData(signTypedData); // Submit the signed request console.log("\n3. Submitting signed request..."); const submitResult = await submitSignedRequest( requestType, witness, signature, quoteId ); console.log( "\n4. Submission complete:", "\n- Hash:", submitResult.requestHash, "\n- Type:", submitResult.requestType ); // Check the status // Wait for 5 seconds console.log("\n5. Waiting for 5 seconds..."); let status; do { await new Promise((resolve) => setTimeout(resolve, 5000)); console.log("\n6. Checking status..."); try { status = await checkStatus(submitResult.requestHash); console.log("- Status details:", status.bungeeStatusCode); } catch (error) { console.error( "Failed to check status:", error?.message || "Unknown error" ); } } while (status?.bungeeStatusCode !== 3 && status?.bungeeStatusCode !== 4); console.log( "\n7. Transaction complete:", "\n- Hash:", status.destinationData?.txHash || "Transaction hash not available" ); } else { console.log("No signature data available in the quote response"); } } catch (error) { console.error("Error in processing:", error?.shortMessage || error.message); throw error; } } // Execute the main function main(); ``` ```tsx theme={null} import { privateKeyToAccount } from "viem/accounts"; import { http, createWalletClient, parseSignature } from "viem"; import { arbitrum } from "viem/chains"; // Check if PRIVATE_KEY is set, set in console, i.e.: export PRIVATE_KEY= if (!process.env.PRIVATE_KEY) { console.error("Error: PRIVATE_KEY environment variable is not set"); console.error( "Example: export PRIVATE_KEY=" ); process.exit(1); } // Create account from private key const normalizedPrivateKey = process.env.PRIVATE_KEY.trim().startsWith('0x') ? process.env.PRIVATE_KEY.trim() : `0x${process.env.PRIVATE_KEY.trim()}`; const account = privateKeyToAccount(normalizedPrivateKey); // Create Viem clients const walletClient = createWalletClient({ account, chain: arbitrum, transport: http(), }); // API and token parameters const BUNGEE_API_BASE_URL = "https://public-backend.bungee.exchange"; const HYPERLIQUID_API_URL = "https://api.hyperliquid.xyz/exchange"; // Quote parameters const quoteParamsERC20 = { userAddress: account.address, receiverAddress: account.address, originChainId: 1337, // HyperCore destinationChainId: 10, // Optimism inputToken: "0x6d1e7cde53ba9467b783cb7c530ce054", // USDC (Perps) on HyperCore outputToken: "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85", // USDC on Optimism inputAmount: "10230000", // USDC (Perps) }; // Function to get a quote async function getQuote(params) { try { const url = `${BUNGEE_API_BASE_URL}/api/v1/bungee/quote`; const queryParams = new URLSearchParams(params); const fullUrl = `${url}?${queryParams}`; const response = await fetch(fullUrl); console.log(fullUrl); const data = await response.json(); const serverReqId = response.headers.get("server-req-id"); // Check for errors if (!data.success) { throw new Error( `Quote error: ${data.statusCode}: ${data.message}. server-req-id: ${serverReqId}` ); } // Check if autoRoute exists if (!data.result.depositRoute) { throw new Error(`No depositRoute available. server-req-id: ${serverReqId}`); } const quoteId = data.result.depositRoute.quoteId; console.log("- Quote ID:", quoteId); // Extract data based on the response structure const signTypedData = data.result.depositRoute.signTypedData; return { quoteId, signTypedData, fullResponse: data, }; } catch (error) { console.error("Failed to get quote:", error); throw error; } } // Function to sign typed data using viem async function viemSignTypedData(signTypedData) { try { const signature = await walletClient.signTypedData({ types: signTypedData.types, primaryType: "HyperCoreTransaction:SendAsset", message: signTypedData.values, domain: signTypedData.domain, }); const signatureParsed = parseSignature(signature); const signatureObject = { r: signatureParsed.r, s: signatureParsed.s, v: Number(signatureParsed.v), }; return signatureObject; } catch (error) { console.error("Failed to sign typed data:", error); throw error; } } // Function to submit the signed request async function submitSignedRequest( signTypedData, signature, ) { try { // Prepare request body const requestBody = { action: signTypedData.values, nonce: signTypedData.values.nonce, signature: signature, }; console.log("- HyperCore Submit Request:", JSON.stringify(requestBody, null, 2)); const response = await fetch( HYPERLIQUID_API_URL, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(requestBody), } ); const data = await response.json(); if (data.status === 'err') { console.error("- HyperCore API Error Response:", data); throw new Error( `HyperCore API error: ${data.response || data.message || 'Unknown error'}` ); } return data; } catch (error) { console.error("Failed to submit signed request:", error); throw error; } } // Function to check the status of a request async function checkStatus(quoteId) { try { const response = await fetch( `${BUNGEE_API_BASE_URL}/api/v1/bungee/status?requestHash=${quoteId}` ); const data = await response.json(); if (!data.success) { throw new Error( `Status error: ${data.error?.message || "Unknown error"}` ); } return data.result[0]; } catch (error) { console.error("Failed to check status:", error); throw error; } } // Main function to handle the flow async function main() { try { console.log("Starting Bungee ERC20 Token Test (Auto Route)..."); // Get the quote and extract data console.log("\n1. Getting quote..."); const quoteResponse = await getQuote(quoteParamsERC20); const { quoteId, signTypedData } = quoteResponse; console.log(JSON.stringify(quoteResponse.fullResponse, null, 2)); if (signTypedData) { // Sign the typed data console.log("\n2. Signing typed data..."); const signature = await viemSignTypedData(signTypedData); // Submit the signed request console.log("\n3. Submitting signed request..."); const submitResult = await submitSignedRequest( signTypedData, signature, ); console.log( "\n4. Submission complete:", "\n- Response:", submitResult, ); // Check the status // Wait for 5 seconds console.log("\n5. Waiting for 5 seconds..."); let status; do { await new Promise((resolve) => setTimeout(resolve, 5000)); console.log("\n6. Checking status..."); try { status = await checkStatus(quoteId); console.log("- Status details:", status.bungeeStatusCode); } catch (error) { console.error( "Failed to check status:", error?.message || "Unknown error" ); } } while (status?.bungeeStatusCode !== 3 && status?.bungeeStatusCode !== 4); console.log( "\n7. Transaction complete:", "\n- Hash:", status.destinationData?.txHash || "Transaction hash not available" ); } else { console.log("No signature data available in the quote response"); } } catch (error) { console.error("Error in processing:", error?.shortMessage || error.message); throw error; } } // Execute the main function main(); ``` # Swap across EVM & Solana Source: https://docs.bungee.exchange/integrate/integration-guides/additional-guides/solana-on-bungee Bridge and swap assets between EVM chains and Solana using Bungee Bungee also supports swap assets from any EVM chain to Solana and from Solana to any EVM chain. This guide walks you through swapping assets between EVM chains and Solana using Bungee. It covers supported chains, transaction options, and current limitations. ## Quick Start ### Solana Chain ID on Bungee API The **chain ID** for Solana queries is `89999`. ### Key differences Here's what's different when integrating Solana Bungee API compared to standard EVM chains: **Transaction Flow** * No token approvals are needed on Solana **API Behavior** * Both `userAddress` and `receiverAddress` required for quotes * Fee collection only works from EVM to Solana - **Native Tokens across all Chains (`0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee`):** Use this address to represent native tokens on any chain (ETH, SOL, etc.) - **Wrapped SOL (wSOL) (`So11111111111111111111111111111111111111112`):** The SPL token address for wrapped SOL on Solana ### Supported chains Most major EVM chains on Bungee are supported to bridge to Solana. ## Integration Steps The ["Bungee Auto" guide from Bungee Docs](/integrate/integration-guides/auto-onchain-requests) outlines how to integrate a bridging process that allows users to swap and bridge tokens across chains in a single transaction on the source chain, eliminating the need for any transactions on the destination chain. This same process should be implemented when bridging to Solana. 1. **Select Chains:** Users choose the source and destination chains, which determine the tokens available for bridging. 2. **Fetch Quote:** Call the `/quote` endpoint which returns an `autoRoute` object containing `txData`, `requestHash`, and optionally `approvalData`. The transaction data is ready to use directly from the quote response. 3. **Handle Token Approval (EVM only):** For EVM transactions, check if `approvalData` exists in the quote response. If present, handle token approvals before submitting the transaction. Solana transactions do not require approvals. 4. **Submit Transaction:** Execute the transaction using `txData` from the quote response. The transaction type (`evm` or `solana`) determines the submission method and required parameters. 5. **Track Transaction Status:** Monitor the transaction's progress by polling the `/status` endpoint using the source `txHash` until the bridging process is complete. For Solana quotes, please ensure both `userAddress` and `receiverAddress` are defined. Also, remember Solana does not require token approvals. ## Examples ### Queries ``` https://public-backend.bungee.exchange/api/v1/bungee/quote?userAddress=0x3e8cB4bd04d81498aB4b94a392c334F5328b237b&originChainId=8453&destinationChainId=89999&inputAmount=100000000&inputToken=0x833589fcd6edb6e08f4c7c32d4f71b54bda02913&enableManual=true&receiverAddress=7BchahMyqpBZYmQS3QnbY3kRweDLgPCRpWdo1rxWmJ3g&refuel=false&outputToken=6p6xgHyF7AeE6TZkSmFsko444wqoP15icUSqi2jfGiPN ``` Querying the Solana RPC directly is recommended, nonetheless the current API supports: ``` https://public-backend.bungee.exchange/api/v1/tokens/search?q=FUAfBo2jgks6gB4Z4LfZkqSZgzNucisEHqnNebaRxM1P&userAddress=7BchahMyqpBZYmQS3QnbY3kRweDLgPCRpWdo1rxWmJ3g ``` ``` https://public-backend.bungee.exchange/api/v1/tokens/list?chainIds=89999&list=trending ``` ### Scripts ```tsx theme={null} import dotenv from "dotenv"; dotenv.config(); import { privateKeyToAccount } from "viem/accounts"; import { createPublicClient, http, createWalletClient } from "viem"; import { base } from "viem/chains"; import { Keypair, Connection, PublicKey, TransactionInstruction, TransactionMessage, VersionedTransaction } from "@solana/web3.js"; import bs58 from "bs58"; // Helper function to fetch address lookup table accounts for Solana transactions async function getAddressLookupTableAccounts(lookupTableAddresses, connection) { const lookupTables = await Promise.all( lookupTableAddresses.map(async (address) => { const result = await connection.getAddressLookupTable(new PublicKey(address)); return result.value; }) ); return lookupTables.filter((table) => table !== null); } // Check if PRIVATE_KEY is set if (!process.env.PRIVATE_KEY) { console.error("Error: PRIVATE_KEY environment variable is not set"); console.error( "Example: PRIVATE_KEY=" ); process.exit(1); } // Check if SOLANA_PRIVATE_KEY is set if (!process.env.SOLANA_PRIVATE_KEY) { console.error("Error: SOLANA_PRIVATE_KEY environment variable is not set"); console.error( "Example: SOLANA_PRIVATE_KEY=your_base58_private_key_or_array" ); process.exit(1); } // Create EVM account from private key // Trim whitespace and ensure proper format const evmPrivateKey = process.env.PRIVATE_KEY.trim(); const account = privateKeyToAccount(evmPrivateKey); // Create Viem clients const publicClient = createPublicClient({ chain: base, transport: http(), }); const walletClient = createWalletClient({ account, chain: base, transport: http(), }); // Parse Solana private key and create keypair let solanaKeypair; try { const solanaPrivateKey = process.env.SOLANA_PRIVATE_KEY; // Try parsing as base58 string first let privateKeyBytes; try { privateKeyBytes = bs58.decode(solanaPrivateKey); } catch { // If not base58, try parsing as JSON array try { privateKeyBytes = Uint8Array.from(JSON.parse(solanaPrivateKey)); } catch { // If that fails, try as comma-separated string privateKeyBytes = Uint8Array.from(solanaPrivateKey.split(",").map(Number)); } } solanaKeypair = Keypair.fromSecretKey(privateKeyBytes); console.log("Solana address:", solanaKeypair.publicKey.toBase58()); } catch (error) { console.error("Error parsing Solana private key:", error); console.error("Please provide a valid base58 string or array format"); process.exit(1); } const solanaAddress = solanaKeypair.publicKey.toBase58(); // API and token parameters const BUNGEE_API_BASE_URL = "https://public-backend.bungee.exchange"; const SOLANA_RPC_URL = "https://api.mainnet-beta.solana.com"; // EVM to Solana // const originChainId = 8453; // const destinationChainId = 89999; // const inputToken = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"; // USDC on Base // const outputToken = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"; // const inputAmount = "5000000"; // 5 USDC (6 decimals) // Solana to EVM const originChainId = 89999; const destinationChainId = 8453; const inputToken = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"; // Native SOL const outputToken = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"; // USDC on Base const inputAmount = "170000000"; // ~$15 of SOL (9 decimals) // Conditionally set addresses based on origin chain const quoteParams = { userAddress: originChainId === 89999 ? solanaAddress : account.address, receiverAddress: destinationChainId === 89999 ? solanaAddress : account.address, originChainId, destinationChainId, inputToken, outputToken, inputAmount, }; // Function to get a quote async function getQuote(params) { try { const url = `${BUNGEE_API_BASE_URL}/api/v1/bungee/quote`; const queryParams = new URLSearchParams(params); const fullUrl = `${url}?${queryParams}`; const response = await fetch(fullUrl); console.log(fullUrl); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const data = await response.json(); const serverReqId = response.headers.get("server-req-id"); // Check for errors if (!data.success) { throw new Error( `Quote error: ${data.statusCode}: ${data.message || data.error?.message || "Unknown error"}. server-req-id: ${serverReqId}` ); } // Check if autoRoute exists if (!data.result || !data.result.autoRoute) { throw new Error(`No autoRoute available. server-req-id: ${serverReqId}`); } const quoteId = data.result.autoRoute.quoteId; const requestHash = data.result.autoRoute.requestHash; const txData = data.result.autoRoute.txData; if (!quoteId) { throw new Error("Quote ID not found in response"); } if (!requestHash) { throw new Error("Request hash not found in response"); } if (!txData) { throw new Error("Transaction data not found in response"); } const approvalData = data.result.autoRoute.approvalData; console.log("- Quote ID:", quoteId); console.log("- Request Hash:", requestHash); console.log("- Transaction Type:", txData.type); if (approvalData) { console.log("- Approval Required: Yes"); } return { quoteId, requestHash, txData, approvalData, fullResponse: data, }; } catch (error) { console.error("Failed to get quote:", error.message || error); throw error; } } // Function to submit EVM transaction async function submitEVMTransaction(txData) { try { if (!txData || txData.type !== "evm") { throw new Error("Invalid EVM transaction data"); } if (!txData.to) { throw new Error("Transaction 'to' address is required"); } if (!txData.data) { throw new Error("Transaction data is required"); } console.log(" To:", txData.to); console.log(" Value:", txData.value || "0"); console.log(" Data:", txData.data.substring(0, 66) + "..."); // Send the transaction const hash = await walletClient.sendTransaction({ to: txData.to, value: BigInt(txData.value || "0"), data: txData.data, }); console.log("- Transaction sent:", hash); // Wait for transaction to be mined const receipt = await publicClient.waitForTransactionReceipt({ hash }); if (receipt.status === "reverted") { throw new Error(`Transaction reverted in block ${receipt.blockNumber}`); } console.log("- Transaction mined in block:", receipt.blockNumber); return { hash, receipt, }; } catch (error) { console.error("Failed to submit EVM transaction:", error.message || error); throw error; } } // Function to check and handle token approvals async function checkAndApproveToken(approvalData) { if (!approvalData || !approvalData.tokenAddress) { console.log("No approval data found or required"); return; } // ERC20 ABI for allowance and approve functions const erc20Abi = [ { inputs: [ { name: "owner", type: "address" }, { name: "spender", type: "address" }, ], name: "allowance", outputs: [{ name: "", type: "uint256" }], stateMutability: "view", type: "function", }, { inputs: [ { name: "spender", type: "address" }, { name: "amount", type: "uint256" }, ], name: "approve", outputs: [{ name: "", type: "bool" }], stateMutability: "nonpayable", type: "function", }, ]; try { // Validate required fields if (!approvalData.userAddress) { throw new Error("userAddress is required in approvalData"); } if (!approvalData.spenderAddress) { throw new Error("spenderAddress is required in approvalData"); } if (!approvalData.amount) { throw new Error("amount is required in approvalData"); } // Check current allowance const currentAllowance = await publicClient.readContract({ address: approvalData.tokenAddress, abi: erc20Abi, functionName: "allowance", args: [ approvalData.userAddress, approvalData.spenderAddress, ], }); // Check if approval is needed if (BigInt(currentAllowance) >= BigInt(approvalData.amount)) { return; } console.log("Insufficient allowance. Approving tokens..."); const hash = await walletClient.writeContract({ address: approvalData.tokenAddress, abi: erc20Abi, functionName: "approve", args: [ approvalData.spenderAddress, approvalData.amount, ], }); console.log(`Approval transaction sent: ${hash}`); const receipt = await publicClient.waitForTransactionReceipt({ hash }); if (receipt.status === "reverted") { throw new Error(`Approval transaction reverted in block ${receipt.blockNumber}`); } console.log(`Approval confirmed in block ${receipt.blockNumber}`); // Wait 1 block after approval before proceeding as submission sometimes is too fast const approvalBlock = receipt.blockNumber; while (true) { const currentBlock = await publicClient.getBlockNumber(); if (currentBlock > approvalBlock) { break; } await new Promise((resolve) => setTimeout(resolve, 2000)); } return receipt; } catch (error) { console.error("Error in approval process:", error.message || error); throw error; } } // Function to submit Solana transaction async function submitSolanaTransaction(txData) { try { if (!txData || txData.type !== "solana") { throw new Error("Invalid Solana transaction data"); } if (!txData.data || !txData.data.instructions) { throw new Error("Transaction instructions are required"); } if (!txData.data.lookupTables) { throw new Error("Lookup tables are required"); } // Convert instructions to TransactionInstruction[] const connection = new Connection(SOLANA_RPC_URL); const clientInstructions = txData.data.instructions.map( (instruction, index) => { try { return new TransactionInstruction({ programId: new PublicKey(instruction.programId), keys: instruction.keys.map((key) => ({ pubkey: new PublicKey(key.pubkey), isSigner: key.isSigner, isWritable: key.isWritable, })), data: Buffer.from(instruction.data, "base64"), }); } catch (error) { throw new Error(`Failed to parse instruction ${index}: ${error.message}`); } } ); // Get lookup tables using Solana Connection API let clientLookupTables; try { clientLookupTables = await getAddressLookupTableAccounts( txData.data.lookupTables, connection ); } catch (error) { throw new Error(`Failed to fetch lookup tables: ${error.message}`); } // Get latest blockhash let blockhash, lastValidBlockHeight; try { const blockhashResult = await connection.getLatestBlockhash("finalized"); blockhash = blockhashResult.blockhash; lastValidBlockHeight = blockhashResult.lastValidBlockHeight; } catch (error) { throw new Error(`Failed to get latest blockhash: ${error.message}`); } // Create MessageV0 with lookup tables let messageV0; try { messageV0 = new TransactionMessage({ payerKey: solanaKeypair.publicKey, recentBlockhash: blockhash, instructions: clientInstructions, }).compileToV0Message(clientLookupTables); } catch (error) { throw new Error(`Failed to compile transaction message: ${error.message}`); } // Create versioned transaction const transaction = new VersionedTransaction(messageV0); // Handle signers if present const signers = [solanaKeypair]; if (txData.data.signers && txData.data.signers.length > 0) { try { const additionalSigners = txData.data.signers.map((signer) => Keypair.fromSecretKey(Uint8Array.from(signer)) ); signers.push(...additionalSigners); } catch (error) { throw new Error(`Failed to parse signers: ${error.message}`); } } transaction.sign(signers); // Send transaction let signature; try { signature = await connection.sendRawTransaction( transaction.serialize(), { skipPreflight: false, preflightCommitment: "confirmed", } ); } catch (error) { throw new Error(`Failed to send transaction: ${error.message}`); } console.log("- Transaction sent:", signature); // Wait for confirmation let confirmation; try { confirmation = await connection.confirmTransaction({ signature, blockhash, lastValidBlockHeight, }); } catch (error) { throw new Error(`Failed to confirm transaction: ${error.message}`); } if (confirmation.value.err) { throw new Error(`Transaction failed: ${JSON.stringify(confirmation.value.err)}`); } console.log("- Transaction confirmed"); return { hash: signature, receipt: confirmation, }; } catch (error) { console.error("Failed to submit Solana transaction:", error.message || error); throw error; } } // Function to check the status of a request (uses submission transaction hash) async function checkStatus(submissionTxHash) { try { if (!submissionTxHash) { throw new Error("Submission transaction hash is required"); } const response = await fetch( `${BUNGEE_API_BASE_URL}/api/v1/bungee/status?requestHash=${submissionTxHash}` ); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const data = await response.json(); if (!data.success) { throw new Error( `Status error: ${data.error?.message || data.message || "Unknown error"}` ); } if (!data.result || !Array.isArray(data.result) || data.result.length === 0) { throw new Error("No status result found"); } return data.result[0]; } catch (error) { console.error("Failed to check status:", error.message || error); throw error; } } // Main function to handle the flow async function main() { try { console.log("Starting Bungee Solana Auto Swap..."); let direction; if (originChainId === 89999 && destinationChainId === 89999) { direction = "Solana → Solana"; } else if (originChainId === 89999) { direction = "Solana → EVM"; } else if (destinationChainId === 89999) { direction = "EVM → Solana"; } else { direction = "Unknown"; } console.log(`Direction: ${direction}`); console.log(`EVM Address: ${account.address}`); console.log(`Solana Address: ${solanaAddress}`); const SOLANA_CHAIN_ID = 89999; const isSameChainSwap = originChainId === destinationChainId; if (originChainId !== SOLANA_CHAIN_ID && destinationChainId !== SOLANA_CHAIN_ID) { throw new Error("One of originChainId or destinationChainId must be 89999 (Solana)"); } console.log("\n1. Getting quote..."); const quoteResponse = await getQuote(quoteParams); if (!quoteResponse.txData) { throw new Error("No transaction data available in the quote response"); } const txData = quoteResponse.txData; const isSolanaTx = txData.type === "solana"; let submissionTxHash; let submissionReceipt; if (isSolanaTx) { // Solana → EVM (no approvals needed) console.log("\n2. Submitting Solana transaction..."); const { hash, receipt } = await submitSolanaTransaction(txData); submissionTxHash = hash; submissionReceipt = receipt; console.log( "\n3. Transaction submitted:", "\n- Hash:", hash ); } else if (txData.type === "evm") { // EVM → Solana // Check and handle approvals first if (quoteResponse.approvalData) { console.log("\n2. Checking token approval..."); await checkAndApproveToken(quoteResponse.approvalData); } console.log("\n3. Submitting EVM transaction..."); const { hash, receipt } = await submitEVMTransaction(txData); submissionTxHash = hash; submissionReceipt = receipt; console.log( "\n4. Transaction submitted:", "\n- Hash:", hash, "\n- Status:", receipt.status ); } else { throw new Error(`Unknown transaction type: ${txData.type}`); } if (isSameChainSwap) { const completeStepNumber = isSolanaTx ? "4" : "5"; console.log( `\n${completeStepNumber}. Transaction complete (confirmed on-chain):`, "\n- Hash:", submissionTxHash, "\n- Receipt Status:", isSolanaTx ? "confirmed" : submissionReceipt?.status || "unknown" ); return; } // Poll status until complete (using submission transaction hash) const statusStepNumber = isSolanaTx ? "4" : "5"; console.log(`\n${statusStepNumber}. Waiting before checking status...`); await new Promise((resolve) => setTimeout(resolve, 5000)); let status; let attempts = 0; const maxAttempts = 60; // Maximum 10 minutes (60 * 10 seconds) do { attempts++; if (attempts > maxAttempts) { throw new Error(`Status check timeout after ${maxAttempts} attempts`); } await new Promise((resolve) => setTimeout(resolve, 10000)); const checkStepNumber = isSolanaTx ? "5" : "6"; console.log(`\n${checkStepNumber}. Checking status (attempt ${attempts})...`); try { status = await checkStatus(submissionTxHash); console.log("- Status code:", status.bungeeStatusCode); if (status.bungeeStatusCode === 3) { break; } } catch (error) { console.error( "Failed to check status:", error?.message || "Unknown error" ); // Continue polling even if one check fails } } while (!status || status.bungeeStatusCode !== 3); if (!status) { throw new Error("Failed to get final status"); } const completeStepNumber = isSolanaTx ? "6" : "7"; console.log( `\n${completeStepNumber}. Transaction complete:`, "\n- Status Code:", status.bungeeStatusCode, "\n- Destination Hash:", status.destinationData?.txHash || "Transaction hash not available" ); } catch (error) { console.error("\n❌ Error in processing:", error?.shortMessage || error?.message || error); process.exit(1); } } main(); ``` # Token list and search Source: https://docs.bungee.exchange/integrate/integration-guides/additional-guides/token-endpoints How to use Bungee token list and search endpoints Bungee Auto supports trading any token with sufficient liquidity, regardless of whether it appears in the token list responses. ## Token Sources and Verification Bungee maintains a primary data source for token information and categorizes tokens in two ways: * **Verified Tokens:** These are recognized by Bungee and are considered verified. * **Unverified Tokens:** These are tokens added to our own database that may not be widely listed yet. When these are displayed, we recommend showing a warning to users to exercise caution. ### How the Endpoints and Parameters Work * **`/tokens/list` (Default):** * Returns a curated list of trending tokens, all of which are "verified" (recognized by Bungee). * "Trending" is currently determined by trading volume, showing the tokens with the highest volume on each supported network. * This list is dynamic, and the trending algorithm may evolve to include other factors for relevance. * **`/tokens/list` (with `list=full` parameter):** * Returns the full, unabridged list of all tokens known to Bungee (including both verified and unverified tokens). * **Warning:** This is a very heavy and slow API call. We strongly recommend *not* using it in a production frontend application. * **`/tokens/search`:** * Designed to find a specific token by its name, symbol, or address (e.g., "USDC"). * Searches across the entire dataset, including both verified and unverified tokens. #### Best Practices * For the best user experience, we recommend: * Using the default `/tokens/list` to display a relevant, curated list of trending tokens. * Maintaining your own list of tokens that are most relevant to your users. * Most tokens with sufficient liquidity should return a valid route through Bungee, regardless of which list they appear on. ## Token list endpoint example usage The `/tokens/list` endpoint retrieves a list of available tokens, with optional parameters to customize the response. ```javascript theme={null} const BUNGEE_API_BASE_URL = "https://public-backend.bungee.exchange"; async function getTokenList(userAddress, chainIds = [1], isTrending = true) { const url = `${BUNGEE_API_BASE_URL}/api/v1/tokens/list`; const params = { userAddress, chainIds: chainIds.join(","), list: isTrending ? "trending" : "full", }; const queryParams = new URLSearchParams(params); const response = await fetch(`${url}?${queryParams}`); const data = await response.json(); return data; } ``` ## Token search endpoint example usage The `/tokens/search` endpoint allows you to search for tokens by address, name, or symbol. Use this endpoint to verify if a specific token can be traded, even if it doesn't appear in the token list. ```javascript theme={null} async function searchToken(query, userAddress) { const url = `${BUNGEE_API_BASE_URL}/api/v1/tokens/search`; const params = { q: query, userAddress, }; const queryParams = new URLSearchParams(params); const response = await fetch(`${url}?${queryParams}`); const data = await response.json(); return data; } ``` # Swap across EVM & Tron Source: https://docs.bungee.exchange/integrate/integration-guides/additional-guides/tron-on-bungee Bridge and swap assets between EVM chains and Tron using Bungee Bungee also supports swap assets from any EVM chain to Tron and from Tron to any EVM chain. This guide walks you through swapping assets between EVM chains and Tron using Bungee. It covers transaction options, and current limitations. ## Quick Start ### Key differences Here's what's different when integrating Tron Bungee API compared to standard EVM chains: **Transaction Flow** * User sends funds to a Deposit contract with the quote ID * Bungee indexes the transaction and delivers the funds on the destination chain **API Behavior** * Both `userAddress` and `receiverAddress` required for quotes * The only asset supported from/to Tron is [Tron USDT](https://tronscan.io/#/token20/TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t) * There is no Fee collection at the moment ## Integration Steps The ["Auto routing onchain" guide from Bungee Docs](/integrate/integration-guides/auto-onchain-requests) outlines how to integrate the deposit flow as it is a quite similar process. 1. **Select Chains:** Users choose the source and destination chains, which determine the tokens available for bridging. 2. **Fetch Routes:** After selecting the tokens, retrieve the deposit route if available using the `/quote` endpoint. 3. **Submitting a deposit via the Deposit contract:** Obtain the transaction data from the `/quote` endpoint. Use this data to execute the deposit transaction on the source chain. 4. **Track Transaction Status:** Monitor the transaction's progress by polling the `/status` endpoint until the bridging process is complete. For Tron quotes, please ensure both `userAddress` and `receiverAddress` are defined. Also, note that this is a separate route from `autoRoute` since it is under `depositRoute`. ## Examples ### Queries ``` https://public-backend.bungee.exchange/api/v1/bungee/quote?userAddress=0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045&receiverAddress=TMe1CS54poswoTTrPAtqsKhry4RM7nvSF4&originChainId=137&destinationChainId=728126428&inputToken=0x3c499c542cef5e3811e1192ce70d8cc03d5c3359&outputToken=TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t&inputAmount=5000000 ``` ``` https://public-backend.bungee.exchange/api/v1/bungee/quote?userAddress=TMe1CS54poswoTTrPAtqsKhry4RM7nvSF4&receiverAddress=0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045&originChainId=728126428&destinationChainId=8453&inputToken=TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t&outputToken=0x833589fcd6edb6e08f4c7c32d4f71b54bda02913&inputAmount=9681288 ``` ### Scripts ```tsx theme={null} import { privateKeyToAccount } from "viem/accounts"; import { TronWeb } from "tronweb"; // Check if PRIVATE_KEY is set, set in console, i.e.: export PRIVATE_KEY= if (!process.env.PRIVATE_KEY) { console.error("Error: PRIVATE_KEY environment variable is not set"); console.error( "Example: PRIVATE_KEY=" ); process.exit(1); } // Check if TRON_PRIVATE_KEY is set if (!process.env.TRON_PRIVATE_KEY) { console.error("Error: TRON_PRIVATE_KEY environment variable is not set"); console.error( "Example: TRON_PRIVATE_KEY=" ); process.exit(1); } // Create account from private key const account = privateKeyToAccount(`${process.env.PRIVATE_KEY}`); // Derive TRON address from TRON private key const tronPrivateKey = process.env.TRON_PRIVATE_KEY.replace(/^0x/, ""); const tronWeb = new TronWeb({ fullHost: "https://api.trongrid.io", privateKey: tronPrivateKey, }); const tronAddress = tronWeb.address.fromPrivateKey(tronPrivateKey); // API and token parameters const BUNGEE_API_BASE_URL = "https://public-backend.bungee.exchange"; // USDT contract address on Tron const USDT_CONTRACT = "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t"; // Function to get USDT balance async function getUSDTBalance() { try { const contract = await tronWeb.contract().at(USDT_CONTRACT); const balance = await contract.balanceOf(tronAddress).call(); return balance.toString(); } catch (error) { console.error("Failed to get USDT balance:", error); throw error; } } // Function to get a quote async function getQuote(params) { try { const url = `${BUNGEE_API_BASE_URL}/api/v1/bungee/quote`; const queryParams = new URLSearchParams(params); const fullUrl = `${url}?${queryParams}`; const response = await fetch(fullUrl); console.log(fullUrl); const data = await response.json(); const serverReqId = response.headers.get("server-req-id"); // Check for errors if (!data.success) { throw new Error( `Quote error: ${data.statusCode}: ${data.message}. server-req-id: ${serverReqId}` ); } // Check if autoRoute exists if (!data.result.depositRoute) { throw new Error(`No depositRoute available. server-req-id: ${serverReqId}`); } const quoteId = data.result.depositRoute.quoteId; console.log("- Quote ID:", quoteId); // Extract data based on the response structure const txData = data.result.depositRoute.txData; return { quoteId, txData, fullResponse: data, }; } catch (error) { console.error("Failed to get quote:", error); throw error; } } // Function to submit the transaction to the Deposit contract async function submitNativeTransaction(txData) { try { console.log("- Submitting transaction to Deposit contract..."); console.log(" To:", txData.to); console.log(" Value:", txData.value); console.log(" Data:", txData.data); const transaction = await tronWeb.transactionBuilder.triggerSmartContract( tronWeb.address.fromHex(txData.to), "", // Empty functionSelector when using 'input' { input: txData.data.replace(/^0x/, ""), // Full data including function selector + params + quoteId callValue: parseInt(txData.value) || 0, feeLimit: 100000000, }, [], // Empty parameters since we're using 'input' tronAddress ); // Sign and send const signed = await tronWeb.trx.sign(transaction.transaction); const result = await tronWeb.trx.sendRawTransaction(signed); if (!result.result) { throw new Error(`Transaction failed: ${JSON.stringify(result)}`); } const hash = result.txid; console.log("- Transaction sent:", hash); // Wait for confirmation let receipt; while (!receipt) { await new Promise((resolve) => setTimeout(resolve, 3000)); try { const txInfo = await tronWeb.trx.getTransactionInfo(hash); if (txInfo?.blockNumber) { receipt = { blockNumber: txInfo.blockNumber, status: txInfo.receipt ? "success" : "failed", transactionHash: hash }; } } catch { } } console.log("- Transaction confirmed in block:", receipt.blockNumber); return { hash, receipt }; } catch (error) { console.error("Failed to submit transaction:", error); throw error; } } // Function to check the status of a request async function checkStatus(requestHash) { try { const response = await fetch( `${BUNGEE_API_BASE_URL}/api/v1/bungee/status?requestHash=${requestHash}` ); const data = await response.json(); if (!data.success) { throw new Error( `Status error: ${data.error?.message || "Unknown error"}` ); } return data.result[0]; } catch (error) { console.error("Failed to check status:", error); throw error; } } // Main function to handle the flow async function main() { try { console.log("Starting Bungee Tron to EVM Token Test (Deposit Route)..."); // Get USDT balance console.log("\n1. Getting USDT balance..."); const usdtBalance = await getUSDTBalance(); console.log("- USDT Balance:", usdtBalance); // Quote parameters for ERC20 token test const quoteParamsERC20 = { userAddress: tronAddress, receiverAddress: account.address, originChainId: 728126428, // Tron destinationChainId: 137, // Polygon inputToken: USDT_CONTRACT, // USDT on Tron outputToken: "0x3c499c542cef5e3811e1192ce70d8cc03d5c3359", // USDC on Polygon inputAmount: usdtBalance, // Use actual USDT balance }; // Get the quote and extract data console.log("\n2. Getting quote..."); const quoteResponse = await getQuote(quoteParamsERC20); //console.log(JSON.stringify(quoteResponse.fullResponse, null, 2)); if (quoteResponse.txData) { // Submit the transaction console.log("\n3. Submitting transaction..."); const { hash, receipt } = await submitNativeTransaction(quoteResponse.txData); console.log( "\n4. Transaction submitted:", "\n- Hash:", hash, "\n- Status:", receipt.status ); // Wait for 5 seconds before checking status console.log("\n5. Waiting for 5 seconds..."); let status; do { await new Promise((resolve) => setTimeout(resolve, 5000)); console.log("\n6. Checking status..."); try { status = await checkStatus(quoteResponse.quoteId); console.log("- Status details:", status.bungeeStatusCode); } catch (error) { console.error( "Failed to check status:", error?.message || "Unknown error" ); } } while (status?.bungeeStatusCode !== 3 && status?.bungeeStatusCode !== 4); console.log( "\n7. Transaction complete:", "\n- Hash:", status.destinationData?.txHash || "Transaction hash not available" ); } else { console.log("No transaction data available in the quote response"); } } catch (error) { console.error("Error in processing:", error?.shortMessage || error.message); throw error; } } // Execute the main function main(); ``` ```tsx theme={null} import { privateKeyToAccount } from "viem/accounts"; import { createPublicClient, http, createWalletClient } from "viem"; import { polygon } from "viem/chains"; import { TronWeb } from "tronweb"; // Check if PRIVATE_KEY is set, set in console, i.e.: export PRIVATE_KEY= if (!process.env.PRIVATE_KEY) { console.error("Error: PRIVATE_KEY environment variable is not set"); console.error( "Example: PRIVATE_KEY=" ); process.exit(1); } // Create account from private key // Normalize private key to ensure it has 0x prefix (required by viem) const rawPrivateKey = process.env.PRIVATE_KEY; const normalizedPrivateKey = rawPrivateKey.startsWith('0x') ? rawPrivateKey : `0x${rawPrivateKey}`; const account = privateKeyToAccount(normalizedPrivateKey); // Create Viem clients const publicClient = createPublicClient({ chain: polygon, transport: http(), }); const walletClient = createWalletClient({ account, chain: polygon, transport: http(), }); // Check if TRON_PRIVATE_KEY is set if (!process.env.TRON_PRIVATE_KEY) { console.error("Error: TRON_PRIVATE_KEY environment variable is not set"); console.error( "Example: TRON_PRIVATE_KEY=" ); process.exit(1); } // Derive TRON address from TRON private key const tronPrivateKey = process.env.TRON_PRIVATE_KEY.replace(/^0x/, ""); const tronWeb = new TronWeb({ fullHost: "https://api.trongrid.io", privateKey: tronPrivateKey, }); const tronAddress = tronWeb.address.fromPrivateKey(tronPrivateKey); // API and token parameters const BUNGEE_API_BASE_URL = "https://public-backend.bungee.exchange"; // Quote parameters for ERC20 token test (USDC from Optimism to Arbitrum) const quoteParamsERC20 = { userAddress: account.address, receiverAddress: tronAddress, originChainId: 137, // Polygon destinationChainId: 728126428, // Tron inputToken: "0x3c499c542cef5e3811e1192ce70d8cc03d5c3359", // USDC on Polygon outputToken: "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t", // USDT inputAmount: "10000000", // 10 USDC (6 decimals) }; // Function to get a quote async function getQuote(params) { try { const url = `${BUNGEE_API_BASE_URL}/api/v1/bungee/quote`; const queryParams = new URLSearchParams(params); const fullUrl = `${url}?${queryParams}`; const response = await fetch(fullUrl); console.log(fullUrl); const data = await response.json(); const serverReqId = response.headers.get("server-req-id"); // Check for errors if (!data.success) { throw new Error( `Quote error: ${data.statusCode}: ${data.message}. server-req-id: ${serverReqId}` ); } // Check if autoRoute exists if (!data.result.depositRoute) { throw new Error(`No depositRoute available. server-req-id: ${serverReqId}`); } const quoteId = data.result.depositRoute.quoteId; console.log("- Quote ID:", quoteId); // Extract data based on the response structure const txData = data.result.depositRoute.txData; return { quoteId, txData, fullResponse: data, }; } catch (error) { console.error("Failed to get quote:", error); throw error; } } // Function to submit the transaction to the inbox contract async function submitNativeTransaction(txData) { try { console.log("- Submitting transaction to inbox contract..."); console.log(" To:", txData.to); console.log(" Value:", txData.value); console.log(" Data:", txData.data); // Send the transaction const hash = await walletClient.sendTransaction({ to: txData.to, value: BigInt(txData.value), data: txData.data, }); console.log("- Transaction sent:", hash); // Wait for transaction to be mined const receipt = await publicClient.waitForTransactionReceipt({ hash }); console.log("- Transaction confirmed in block:", receipt.blockNumber); return { hash, receipt, }; } catch (error) { console.error("Failed to submit transaction:", error); throw error; } } // Function to check the status of a request async function checkStatus(requestHash) { try { const response = await fetch( `${BUNGEE_API_BASE_URL}/api/v1/bungee/status?requestHash=${requestHash}` ); const data = await response.json(); if (!data.success) { throw new Error( `Status error: ${data.error?.message || "Unknown error"}` ); } return data.result[0]; } catch (error) { console.error("Failed to check status:", error); throw error; } } // Main function to handle the flow async function main() { try { console.log("Starting Bungee EVM to Tron Test (Deposit Route)..."); // Get the quote and extract data console.log("\n1. Getting quote..."); const quoteResponse = await getQuote(quoteParamsERC20); //console.log(JSON.stringify(quoteResponse.fullResponse, null, 2)); if (quoteResponse.txData) { // Submit the transaction console.log("\n2. Submitting transaction..."); const { hash, receipt } = await submitNativeTransaction(quoteResponse.txData); console.log( "\n3. Transaction submitted:", "\n- Hash:", hash, "\n- Status:", receipt.status ); // Wait for 5 seconds before checking status console.log("\n4. Waiting for 5 seconds..."); let status; do { await new Promise((resolve) => setTimeout(resolve, 5000)); console.log("\n5. Checking status..."); try { status = await checkStatus(quoteResponse.quoteId); console.log("- Status details:", status.bungeeStatusCode); } catch (error) { console.error( "Failed to check status:", error?.message || "Unknown error" ); } } while (status?.bungeeStatusCode !== 3 && status?.bungeeStatusCode !== 4); console.log( "\n6. Transaction complete:", "\n- Hash:", status.destinationData?.txHash || "Transaction hash not available" ); } else { console.log("No transaction data available in the quote response"); } } catch (error) { console.error("Error in processing:", error?.shortMessage || error.message); throw error; } } // Execute the main function main(); ``` # Auto routing with Permit2 Source: https://docs.bungee.exchange/integrate/integration-guides/auto-erc20-permit2 Integrate Bungee Auto for ERC20 tokens with gasless approvals This guide covers how to integrate Bungee Auto for samechain and crosschain swaps using **ERC20 tokens** as input tokens with Permit2 for gasless approvals. ## Overview The Permit2 integration flow allows users to swap ERC20 tokens across chains without requiring separate approval transactions. This provides a better user experience by: 1. Eliminating the need for separate approval transactions 2. Enabling gasless approvals, saving users gas fees 3. Only transferring tokens if the auction is completed and a transmitter has picked up the request **Smart Contract Wallets** If the wallet supports EIP-1271, you can use the Permit2 signature flow for approvals. Otherwise, use the fallback mechanism by sending the request via the [BungeeInbox contract](/integrate/integration-guides/auto-onchain-requests). ## Integration Steps ### Step 1: Get a Quote Request a quote for your ERC20 transfer using the actual parameters from the script. This ensures you have all the required data for the next steps. ```javascript theme={null} const BUNGEE_API_BASE_URL = "https://public-backend.bungee.exchange"; const quoteParamsERC20 = { userAddress: account.address, receiverAddress: account.address, originChainId: 10, // Optimism destinationChainId: 42161, // Arbitrum inputToken: "0x0b2c639c533813f4aa9d7837caf62653d097ff85", // USDC on Optimism outputToken: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", // USDC on Arbitrum inputAmount: "1000000", // 1 USDC (6 decimals) }; async function getQuote(params) { const url = `${BUNGEE_API_BASE_URL}/api/v1/bungee/quote`; const queryParams = new URLSearchParams(params); const fullUrl = `${url}?${queryParams}`; const response = await fetch(fullUrl); const data = await response.json(); const serverReqId = response.headers.get("server-req-id"); if (!data.success) { throw new Error( `Quote error: ${data.statusCode}: ${data.message}. server-req-id: ${serverReqId}` ); } if (!data.result.autoRoute) { throw new Error(`No autoRoute available. server-req-id: ${serverReqId}`); } const quoteId = data.result.autoRoute.quoteId; const requestType = data.result.autoRoute.requestType; let witness = null; let signTypedData = null; if (data.result.autoRoute.signTypedData) { signTypedData = data.result.autoRoute.signTypedData; if (signTypedData.values && signTypedData.values.witness) { witness = signTypedData.values.witness; } } const approvalData = data.result.autoRoute.approvalData; return { quoteId, requestType, witness, signTypedData, approvalData, fullResponse: data, }; } ``` **Quote Expiry Handling** Bungee quotes are typically valid for **60 seconds**. If the user's token approval transaction takes significant time to confirm, the `quoteId` may expire. For the best user experience, consider **refreshing the quote** after the approval confirmation and before requesting the Permit2 signature. ### Step 2: Check and Approve Token (ERC20 Approval Step) Before signing and submitting the request, you must ensure the permit2 contract has sufficient allowance to spend your tokens. The script checks for allowance and sends an approval transaction if needed. Read more about permit2 [here](/overview/routing-methods/permit2). ```javascript theme={null} async function checkAndApproveToken(approvalData) { if (!approvalData || !approvalData.tokenAddress) { console.log("No approval data found or required"); return; } // ERC20 ABI for allowance and approve functions const erc20Abi = [ { inputs: [ { name: "owner", type: "address" }, { name: "spender", type: "address" }, ], name: "allowance", outputs: [{ name: "", type: "uint256" }], stateMutability: "view", type: "function", }, { inputs: [ { name: "spender", type: "address" }, { name: "amount", type: "uint256" }, ], name: "approve", outputs: [{ name: "", type: "bool" }], stateMutability: "nonpayable", type: "function", }, ]; const currentAllowance = await publicClient.readContract({ address: approvalData.tokenAddress, abi: erc20Abi, functionName: "allowance", args: [ approvalData.userAddress, approvalData.spenderAddress === "0" ? "0x000000000022D473030F116dDEE9F6B43aC78BA3" // Permit2 default : approvalData.spenderAddress, ], }); if (BigInt(currentAllowance) >= BigInt(approvalData.amount)) { console.log("Sufficient allowance already exists."); return; } // Send approval transaction const hash = await walletClient.writeContract({ address: approvalData.tokenAddress, abi: erc20Abi, functionName: "approve", args: [ approvalData.spenderAddress === "0" ? "0x000000000022D473030F116dDEE9F6B43aC78BA3" : approvalData.spenderAddress, approvalData.amount, ], }); console.log(`Approval transaction sent: ${hash}`); await publicClient.waitForTransactionReceipt({ hash }); console.log("Approval confirmed."); } ``` **Important: `approvalData` is NOT a Transaction Object** The `approvalData` returned by the API contains raw parameters (`tokenAddress`, `spenderAddress`, `amount`, `userAddress`). It is **not** a pre-built transaction object that you can blindly send to a wallet. You must use these parameters to construct an `approve()` transaction yourself, as shown in the example below. Additionally, the API may return `approvalData` even if the user already has sufficient allowance. **Always check the onchain allowance** before prompting the user to approve. **Optimization Tip**: When approving for **Permit2**, we recommend approving the maximum amount (`MaxUint256`). This allows the user to perform gasless signatures for all future swaps without needing another onchain transaction. For other flows (e.g. Manual), use the exact amount specified in `approvalData`. ### Step 3: Sign and Submit the Request After ensuring approval, sign the typed data and submit the request. Extract the `witness` object from the quote response at `result.autoRoute.signTypedData.values.witness` and pass it as the `request` parameter when submitting the signed request. ```javascript theme={null} async function viemSignTypedData(signTypedData) { const signature = await account.signTypedData({ types: signTypedData.types, primaryType: "PermitWitnessTransferFrom", message: signTypedData.values, domain: signTypedData.domain, }); return signature; } async function submitSignedRequest( requestType, request, userSignature, quoteId ) { const requestBody = { requestType, request, userSignature, quoteId, }; const response = await fetch(`${BUNGEE_API_BASE_URL}/api/v1/bungee/submit`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(requestBody), }); const data = await response.json(); if (!data.success) { throw new Error(`Submit error: ${data.error?.message || "Unknown error"}`); } return data.result; } ``` ### Step 4: Check Request Status After submitting the request, check its status to track progress. You can implement a polling mechanism to continuously check until completion: ```javascript theme={null} async function checkStatus(requestHash) { const response = await fetch( `${BUNGEE_API_BASE_URL}/api/v1/bungee/status?requestHash=${requestHash}` ); const data = await response.json(); if (!data.success) { throw new Error(`Status error: ${data.error?.message || "Unknown error"}`); } return data.result[0]; } async function pollForCompletion( requestHash, interval = 5000, maxAttempts = 60 ) { let attempts = 0; while (attempts < maxAttempts) { const status = await checkStatus(requestHash); const code = status?.bungeeStatusCode; if (code === 3 || code === 4) { // FULFILLED or SETTLED console.log("Transaction complete:", status.destinationData?.txHash); return status; } if (code === 5) { throw new Error(`Request expired. Status: ${JSON.stringify(status)}`); } if (code === 6) { throw new Error(`Request cancelled. Status: ${JSON.stringify(status)}`); } if (code === 7) { throw new Error(`Request refunded. Status: ${JSON.stringify(status)}`); } attempts++; await new Promise((resolve) => setTimeout(resolve, interval)); } throw new Error("Polling timed out. Transaction may not have completed."); } ``` *** ## Complete Integration Example ```javascript theme={null} import { privateKeyToAccount } from "viem/accounts"; import { createPublicClient, http, createWalletClient } from "viem"; import { optimism } from "viem/chains"; // Check if PRIVATE_KEY is set if (!process.env.PRIVATE_KEY) { console.error("Error: PRIVATE_KEY environment variable is not set"); process.exit(1); } // Create account from private key const normalizedPrivateKey = process.env.PRIVATE_KEY.startsWith('0x') ? process.env.PRIVATE_KEY : `0x${process.env.PRIVATE_KEY}`; const account = privateKeyToAccount(normalizedPrivateKey); // Create Viem clients const publicClient = createPublicClient({ chain: optimism, transport: http(), }); const walletClient = createWalletClient({ account, chain: optimism, transport: http(), }); // API and token parameters const BUNGEE_API_BASE_URL = "https://public-backend.bungee.exchange"; // Quote parameters for ERC20 token test (USDC from Optimism to Arbitrum) const quoteParamsERC20 = { userAddress: account.address, receiverAddress: account.address, originChainId: 10, // Optimism destinationChainId: 42161, // Arbitrum inputToken: "0x0b2c639c533813f4aa9d7837caf62653d097ff85", // USDC on Optimism outputToken: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", // USDC on Arbitrum inputAmount: "1000000", // 1 USDC (6 decimals) }; async function getQuote(params) { const url = `${BUNGEE_API_BASE_URL}/api/v1/bungee/quote`; const queryParams = new URLSearchParams(params); const fullUrl = `${url}?${queryParams}`; const response = await fetch(fullUrl); const data = await response.json(); const serverReqId = response.headers.get("server-req-id"); if (!data.success) { throw new Error( `Quote error: ${data.statusCode}: ${data.message}. server-req-id: ${serverReqId}` ); } if (!data.result.autoRoute) { throw new Error(`No autoRoute available. server-req-id: ${serverReqId}`); } const quoteId = data.result.autoRoute.quoteId; const requestType = data.result.autoRoute.requestType; let witness = null; let signTypedData = null; if (data.result.autoRoute.signTypedData) { signTypedData = data.result.autoRoute.signTypedData; if (signTypedData?.values?.witness) { witness = signTypedData.values.witness; } } return { quoteId, requestType, witness, signTypedData, approvalData: data.result.autoRoute.approvalData, fullResponse: data, }; } async function checkAndApproveToken(approvalData) { if (!approvalData || !approvalData.tokenAddress) { console.log("No approval data found or required"); return; } // ERC20 ABI for allowance and approve functions const erc20Abi = [ { inputs: [ { name: "owner", type: "address" }, { name: "spender", type: "address" }, ], name: "allowance", outputs: [{ name: "", type: "uint256" }], stateMutability: "view", type: "function", }, { inputs: [ { name: "spender", type: "address" }, { name: "amount", type: "uint256" }, ], name: "approve", outputs: [{ name: "", type: "bool" }], stateMutability: "nonpayable", type: "function", }, ]; const currentAllowance = await publicClient.readContract({ address: approvalData.tokenAddress, abi: erc20Abi, functionName: "allowance", args: [ approvalData.userAddress, approvalData.spenderAddress === "0" ? "0x000000000022D473030F116dDEE9F6B43aC78BA3" // Permit2 default : approvalData.spenderAddress, ], }); if (BigInt(currentAllowance) >= BigInt(approvalData.amount)) { console.log("Sufficient allowance already exists."); return; } // Send approval transaction const hash = await walletClient.writeContract({ address: approvalData.tokenAddress, abi: erc20Abi, functionName: "approve", args: [ approvalData.spenderAddress === "0" ? "0x000000000022D473030F116dDEE9F6B43aC78BA3" : approvalData.spenderAddress, approvalData.amount, ], }); console.log(`Approval transaction sent: ${hash}`); await publicClient.waitForTransactionReceipt({ hash }); console.log("Approval confirmed."); } async function viemSignTypedData(signTypedData) { const signature = await account.signTypedData({ types: signTypedData.types, primaryType: "PermitWitnessTransferFrom", message: signTypedData.values, domain: signTypedData.domain, }); return signature; } async function submitSignedRequest(requestType, request, userSignature, quoteId) { const requestBody = { requestType, request, userSignature, quoteId }; const response = await fetch(`${BUNGEE_API_BASE_URL}/api/v1/bungee/submit`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(requestBody), }); const data = await response.json(); if (!data.success) { throw new Error(`Submit error: ${data.error?.message || "Unknown error"}`); } return data.result; } async function checkStatus(requestHash) { const response = await fetch( `${BUNGEE_API_BASE_URL}/api/v1/bungee/status?requestHash=${requestHash}` ); const data = await response.json(); if (!data.success) { throw new Error(`Status error: ${data.error?.message || "Unknown error"}`); } return data.result[0]; } async function pollForCompletion( requestHash, interval = 5000, maxAttempts = 60 ) { let attempts = 0; while (attempts < maxAttempts) { const status = await checkStatus(requestHash); const code = status?.bungeeStatusCode; if (code === 3 || code === 4) { // FULFILLED or SETTLED console.log("Transaction complete:", status.destinationData?.txHash); return status; } if (code === 5) { throw new Error(`Request expired. Status: ${JSON.stringify(status)}`); } if (code === 6) { throw new Error(`Request cancelled. Status: ${JSON.stringify(status)}`); } if (code === 7) { throw new Error(`Request refunded. Status: ${JSON.stringify(status)}`); } console.log("Status:", code); attempts++; await new Promise((resolve) => setTimeout(resolve, interval)); } throw new Error("Polling timed out. Transaction may not have completed."); } async function main() { console.log("Starting Bungee ERC20 Token Test (Auto Route)..."); // Get the quote console.log("\n1. Getting quote..."); const { quoteId, requestType, witness, signTypedData, approvalData } = await getQuote(quoteParamsERC20); // Handle approval if needed if (approvalData) { await checkAndApproveToken(approvalData); } if (signTypedData && witness) { // Sign the typed data console.log("\n2. Signing typed data..."); const signature = await viemSignTypedData(signTypedData); // Submit the signed request console.log("\n3. Submitting signed request..."); const submitResult = await submitSignedRequest( requestType, witness, signature, quoteId ); console.log("Request Hash:", submitResult.requestHash); // Poll for completion console.log("\n4. Checking status..."); const status = await pollForCompletion(submitResult.requestHash); } else { console.error("Missing required data for signing and submission:"); console.error("- signTypedData:", signTypedData ? "present" : "missing"); console.error("- witness:", witness ? "present" : "missing"); console.error("- quoteId:", quoteId); throw new Error("Cannot proceed: signTypedData and witness are required for submitting signed requests. Check your quote response."); } } main(); ``` # Auto routing onchain Source: https://docs.bungee.exchange/integrate/integration-guides/auto-onchain-requests Integrate Bungee Auto for native tokens using the Inbox Contract This page covers how to integrate Bungee Auto for samechain and crosschain swaps using **Native tokens** (ETH, POL, etc.) as input tokens by directly interacting with the Bungee Inbox contract. ## Overview The Inbox Contract integration is required for native tokens and can also be used for ERC20 tokens when: * Permit2 is not an option * The integration is directly onchain * You prefer a fully onchain approach This method involves: 1. Getting a quote from the Bungee API 2. Creating and submitting a request via the inbox contract 3. Monitoring the status via the API ## Integration Steps ### Step 1: Get a Quote For native tokens, request a quote using the address `0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE`. ```javascript theme={null} const BUNGEE_API_BASE_URL = "https://public-backend.bungee.exchange"; const quoteParamsNative = { userAddress: "0x...", originChainId: 10, // Optimism destinationChainId: 42161, // Arbitrum inputToken: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", // ETH on Optimism inputAmount: "100000000000000", // 0.0001 ETH in wei receiverAddress: "0x...", outputToken: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", // ETH on Arbitrum }; ``` When integrating Bungee Auto, you can specify the `useInbox` parameter to directly create a request onchain and bypass permit2 gasless signatures: * **`useInbox`**: Enables `autoRoute.txData` for ERC20 tokens and disables `autoRoute.signTypedData` #### Example ```javascript theme={null} /** * Get a quote with ERC20 onchain request information */ async function getQuoteWithUseInbox() { // Set up the parameters for the quote request const quoteParams = { userAddress: "0xYourUsersAddress", originChainId: "1", // Ethereum destinationChainId: "10", // Optimism inputToken: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", // USDC on Ethereum outputToken: "0x7F5c764cBc14f9669B88837ca1490cCa17c31607", // USDC on Optimism inputAmount: "1000000", // 1 USDC (6 decimals) receiverAddress: "0xYourUsersAddress", useInbox: true, // Enables autoRoute.txData for ERC20 tokens and disables autoRoute.signTypedData }; // Build the URL with query parameters const url = `${BUNGEE_API_BASE_URL}/api/v1/bungee/quote`; const queryParams = new URLSearchParams(quoteParams); const fullUrl = `${url}?${queryParams}`; // Make the request const response = await fetch(fullUrl, { method: "GET", headers: { "Content-Type": "application/json", }, }); const data = await response.json(); const serverReqId = response.headers.get("server-req-id"); if (!data.success) { throw new Error( `Quote error: ${data.statusCode}: ${data.message}. server-req-id: ${serverReqId}` ); } return data.result; } ``` Before submitting a user request to BungeeInbox, check if the request needs approval. You can verify this by checking if the field `autoRoute.approvalData` contains any data. * If `approvalData` is present and populated, it means approval is required. * If `approvalData` is empty, no approval is needed, and you can submit the request directly. ```javascript theme={null} async function getQuote(params) { try { const url = `${BUNGEE_API_BASE_URL}/api/v1/bungee/quote`; const queryParams = new URLSearchParams(params); const fullUrl = `${url}?${queryParams}`; const response = await fetch(fullUrl); const data = await response.json(); const serverReqId = response.headers.get("server-req-id"); if (!data.success) { throw new Error( `Quote error: ${data.statusCode}: ${data.message}. server-req-id: ${serverReqId}` ); } if (!data.result.autoRoute) { throw new Error(`No autoRoute available. server-req-id: ${serverReqId}`); } // Extract transaction data for native token const txData = data.result.autoRoute.txData; const requestHash = data.result.autoRoute.requestHash; const quoteId = data.result.autoRoute.quoteId; const requestType = data.result.autoRoute.requestType; console.log("- Quote ID:", quoteId); console.log("- Request Type:", requestType); // Log request hash if (data.result.autoRoute.requestHash) { console.log("- Request Hash:", data.result.autoRoute.requestHash); } return { quoteId, requestType, txData, requestHash, fullResponse: data, }; } catch (error) { console.error("Failed to get quote:", error); throw error; } } ``` ### Step 2: Submit the Transaction to the Inbox Contract For native tokens, submit the transaction directly to the inbox contract using the transaction data from the quote. ```javascript theme={null} async function submitNativeTransaction(txData) { const hash = await walletClient.sendTransaction({ to: txData.to, value: BigInt(txData.value), data: txData.data, }); const receipt = await publicClient.waitForTransactionReceipt({ hash }); return { hash, receipt }; } ``` ### Step 3: Check Request Status After submitting the request, check its status to track progress. You can implement a polling mechanism to continuously check until completion: ```javascript theme={null} async function checkStatus(requestHash) { const response = await fetch( `${BUNGEE_API_BASE_URL}/api/v1/bungee/status?requestHash=${requestHash}` ); const data = await response.json(); if (!data.success) { throw new Error(`Status error: ${data.error?.message || "Unknown error"}`); } return data.result[0]; } async function pollForCompletion( requestHash, interval = 5000, maxAttempts = 60 ) { let attempts = 0; while (attempts < maxAttempts) { const status = await checkStatus(requestHash); const code = status?.bungeeStatusCode; if (code === 3 || code === 4) { console.log("Transaction complete:", status.destinationData?.txHash); return status; } if (code === 5) { throw new Error(`Request expired. Status: ${JSON.stringify(status)}`); } if (code === 6) { throw new Error(`Request cancelled. Status: ${JSON.stringify(status)}`); } if (code === 7) { throw new Error(`Request refunded. Status: ${JSON.stringify(status)}`); } attempts++; await new Promise((resolve) => setTimeout(resolve, interval)); } throw new Error("Polling timed out. Transaction may not have completed."); } ``` ## Complete Integration Example ```javascript theme={null} import { createPublicClient, createWalletClient, http } from "viem"; import { privateKeyToAccount } from "viem/accounts"; import { optimism } from "viem/chains"; // Check if PRIVATE_KEY is set if (!process.env.PRIVATE_KEY) { console.error("Error: PRIVATE_KEY environment variable is not set"); process.exit(1); } // Create account from private key // Normalize private key to ensure it has exactly one "0x" prefix (required by viem) const normalizedPrivateKey = `0x${process.env.PRIVATE_KEY.replace(/^0x/i, '')}`; const account = privateKeyToAccount(normalizedPrivateKey); const publicClient = createPublicClient({ chain: optimism, transport: http(), }); const walletClient = createWalletClient({ account, chain: optimism, transport: http(), }); // API and token parameters const BUNGEE_API_BASE_URL = "https://public-backend.bungee.exchange"; // Quote parameters for native token test (ETH from Optimism to Arbitrum) const quoteParamsNative = { userAddress: account.address, receiverAddress: account.address, originChainId: 10, // Optimism destinationChainId: 42161, // Arbitrum inputToken: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", // ETH on Optimism outputToken: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", // ETH on Arbitrum inputAmount: "100000000000000", // 0.0001 ETH in wei }; async function getQuote(params) { const url = `${BUNGEE_API_BASE_URL}/api/v1/bungee/quote`; const queryParams = new URLSearchParams(params); const fullUrl = `${url}?${queryParams}`; const response = await fetch(fullUrl); const data = await response.json(); if (!data.success) { throw new Error(`Quote error: ${data.error?.message || "Unknown error"}`); } if (!data.result.autoRoute) { throw new Error("No autoRoute available for native token transfer"); } return { txData: data.result.autoRoute.txData, requestHash: data.result.autoRoute.requestHash, }; } async function submitNativeTransaction(txData) { const hash = await walletClient.sendTransaction({ to: txData.to, value: BigInt(txData.value), data: txData.data, }); const receipt = await publicClient.waitForTransactionReceipt({ hash }); return { hash, receipt }; } async function checkStatus(requestHash) { const response = await fetch( `${BUNGEE_API_BASE_URL}/api/v1/bungee/status?requestHash=${requestHash}` ); const data = await response.json(); if (!data.success) { throw new Error(`Status error: ${data.error?.message || "Unknown error"}`); } return data.result[0]; } async function main() { console.log("Starting Bungee Native Token Test (Auto Route)..."); // Get the quote console.log("\n1. Getting quote..."); const { txData, requestHash } = await getQuote(quoteParamsNative); if (txData) { // Submit the transaction console.log("\n2. Submitting transaction..."); const { hash, receipt } = await submitNativeTransaction(txData); console.log("Transaction sent:", hash); // Poll for completion console.log("\n3. Checking status..."); let status; let attempts = 0; const maxAttempts = 60; const interval = 5000; while (attempts < maxAttempts) { await new Promise((resolve) => setTimeout(resolve, interval)); status = await checkStatus(requestHash); const code = status?.bungeeStatusCode; console.log("Status:", code); if (code === 3 || code === 4) { console.log("Transaction complete:", status.destinationData?.txHash); break; } if (code === 5) { throw new Error(`Request expired. Status: ${JSON.stringify(status)}`); } if (code === 6) { throw new Error(`Request cancelled. Status: ${JSON.stringify(status)}`); } if (code === 7) { throw new Error(`Request refunded. Status: ${JSON.stringify(status)}`); } attempts++; } if (attempts >= maxAttempts) { throw new Error(`Polling timed out after ${maxAttempts} attempts. Last status: ${JSON.stringify(status)}`); } } } main(); ``` # Auto routing onchain Source: https://docs.bungee.exchange/integrate/integration-guides/auto-onchain-requests-via-inbox-contract This page covers how to integrate Bungee Auto for same-chain and cross-chain swaps using native tokens (ETH, POL, etc.) as input tokens by directly interacting with the Bungee Inbox contract. ## Overview[​](#overview "Direct link to Overview") The Inbox Contract integration is required for native tokens and can also be used for ERC20 tokens when: * Permit2 is not an option * The integration is directly onchain * You prefer a fully onchain approach This method involves: 1. Getting a quote from the Bungee API 2. Creating and submitting a request via the inbox contract 3. Monitoring the status via the API ## Integration Steps[​](#integration-steps "Direct link to Integration Steps") ### Step 1: Get a Quote[​](#step-1-get-a-quote "Direct link to Step 1: Get a Quote") For native tokens, request a quote using the address `0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE`. > **API Reference**: Quote Endpoint ```javascript theme={null} const BUNGEE_API_BASE_URL = "https://public-backend.bungee.exchange"; const quoteParamsNative = { userAddress: "0x...", originChainId: 10, // Optimism destinationChainId: 42161, // Arbitrum inputToken: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", // ETH on Optimism inputAmount: "100000000000000", // 0.0001 ETH in wei receiverAddress: "0x...", outputToken: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", // ETH on Arbitrum }; ``` When integrating Bungee Auto, you can specify the `useInbox` parameter to directly create a request onchain and bypass permit2 gasless signatures: * **`useInbox`**: Enables `autoRoute.txData` for ERC20 tokens and disables `autoRoute.signTypedData` #### Example[​](#example "Direct link to Example") ```js theme={null} /** * Get a quote with ERC20 onchain request information */ async function getQuoteWithUseInbox() { // Set up the parameters for the quote request const quoteParams = { userAddress: "0xYourUsersAddress", originChainId: "1", // Ethereum destinationChainId: "10", // Optimism inputToken: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", // USDC on Ethereum outputToken: "0x7F5c764cBc14f9669B88837ca1490cCa17c31607", // USDC on Optimism inputAmount: "1000000", // 1 USDC (6 decimals) receiverAddress: "0xYourUsersAddress", useInbox: true, // Enables autoRoute.txData for ERC20 tokens and disables autoRoute.signTypedData }; // Build the URL with query parameters const url = `${BUNGEE_API_BASE_URL}/api/v1/bungee/quote`; const queryParams = new URLSearchParams(quoteParams); const fullUrl = `${url}?${queryParams}`; // Make the request const response = await fetch(fullUrl, { method: "GET", headers: { "Content-Type": "application/json", }, }); const data = await response.json(); const serverReqId = response.headers.get("server-req-id"); if (!data.success) { throw new Error( `Quote error: ${data.statusCode}: ${data.message}. server-req-id: ${serverReqId}` ); } return data.result; } ``` Before submitting a user request to BungeeInbox, check if the request needs approval. You can verify this by checking if the field `autoRoute.approvalData` contains any data. * If `approvalData` is present and populated, it means approval is required. * If `approvalData` is empty, no approval is needed, and you can submit the request directly. ``` async function getQuote(params) { try { const url = `${BUNGEE_API_BASE_URL}/api/v1/bungee/quote`; const queryParams = new URLSearchParams(params); const fullUrl = `${url}?${queryParams}`; const response = await fetch(fullUrl); const data = await response.json(); const serverReqId = response.headers.get("server-req-id"); if (!data.success) { throw new Error( `Quote error: ${data.statusCode}: ${data.message}. server-req-id: ${serverReqId}` ); } if (!data.result.autoRoute) { throw new Error(`No autoRoute available. server-req-id: ${serverReqId}`); } // Extract transaction data for native token const txData = data.result.autoRoute.txData; const requestHash = data.result.autoRoute.requestHash; const quoteId = data.result.autoRoute.quoteId; const requestType = data.result.autoRoute.requestType; console.log("- Quote ID:", quoteId); console.log("- Request Type:", requestType); // Log request hash if (data.result.autoRoute.requestHash) { console.log("- Request Hash:", data.result.autoRoute.requestHash); } return { quoteId, requestType, txData, requestHash, fullResponse: data, }; } catch (error) { console.error("Failed to get quote:", error); throw error; } } ``` ### Step 2: Submit the Transaction to the Inbox Contract[​](#step-2-submit-the-transaction-to-the-inbox-contract "Direct link to Step 2: Submit the Transaction to the Inbox Contract") For native tokens, submit the transaction directly to the inbox contract using the transaction data from the quote. ```js theme={null} async function submitNativeTransaction(txData) { const hash = await walletClient.sendTransaction({ to: txData.to, value: BigInt(txData.value), data: txData.data, }); const receipt = await publicClient.waitForTransactionReceipt({ hash }); return { hash, receipt }; } ``` ### Step 3: Check Request Status[​](#step-3-check-request-status "Direct link to Step 3: Check Request Status") After submitting the request, check its status to track progress. You can implement a polling mechanism to continuously check until completion: > **API Reference**: Status Endpoint ```js theme={null} async function checkStatus(requestHash) { const response = await fetch( `${BUNGEE_API_BASE_URL}/api/v1/bungee/status?requestHash=${requestHash}` ); const data = await response.json(); if (!data.success) { throw new Error(`Status error: ${data.error?.message || "Unknown error"}`); } return data.result[0]; } async function pollForCompletion( requestHash, interval = 5000, maxAttempts = 60 ) { let attempts = 0; while (attempts < maxAttempts) { const status = await checkStatus(requestHash); const code = status?.bungeeStatusCode; if (code === 3 || code === 4) { // FULFILLED or SETTLED console.log("Transaction complete:", status.destinationData?.txHash); return status; } if (code === 5) { throw new Error(`Request expired. Status: ${JSON.stringify(status)}`); } if (code === 6) { throw new Error(`Request cancelled. Status: ${JSON.stringify(status)}`); } if (code === 7) { throw new Error(`Request refunded. Status: ${JSON.stringify(status)}`); } attempts++; await new Promise((resolve) => setTimeout(resolve, interval)); } throw new Error("Polling timed out. Transaction may not have completed."); } ``` ## Complete Integration Example[​](#complete-integration-example "Direct link to Complete Integration Example") ```javascript theme={null} import { createPublicClient, createWalletClient, http } from "viem"; import { privateKeyToAccount } from "viem/accounts"; import { optimism } from "viem/chains"; // Check if PRIVATE_KEY is set, set in console, i.e.: export PRIVATE_KEY= if (!process.env.PRIVATE_KEY) { console.error("Error: PRIVATE_KEY environment variable is not set"); console.error("Example: export PRIVATE_KEY="); process.exit(1); } // Create account from private key // Normalize private key to ensure it has exactly one "0x" prefix (required by viem) const normalizedPrivateKey = `0x${process.env.PRIVATE_KEY.replace(/^0x/i, '')}`; const account = privateKeyToAccount(normalizedPrivateKey); const publicClient = createPublicClient({ chain: optimism, transport: http(), }); const walletClient = createWalletClient({ account, chain: optimism, transport: http(), }); // API and token parameters const BUNGEE_API_BASE_URL = "https://public-backend.bungee.exchange"; // Quote parameters for native token test (ETH from Optimism to Arbitrum) const quoteParamsNative = { userAddress: account.address, receiverAddress: account.address, originChainId: 10, // Optimism destinationChainId: 42161, // Arbitrum inputToken: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", // ETH on Optimism outputToken: "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE", // ETH on Arbitrum inputAmount: "100000000000000", // 0.0001 ETH in wei }; async function getQuote(params) { const url = `${BUNGEE_API_BASE_URL}/api/v1/bungee/quote`; const queryParams = new URLSearchParams(params); const fullUrl = `${url}?${queryParams}`; const response = await fetch(fullUrl); const data = await response.json(); if (!data.success) { throw new Error(`Quote error: ${data.error?.message || "Unknown error"}`); } if (!data.result.autoRoute) { throw new Error("No autoRoute available for native token transfer"); } return { txData: data.result.autoRoute.txData, requestHash: data.result.autoRoute.requestHash, }; } async function submitNativeTransaction(txData) { const hash = await walletClient.sendTransaction({ to: txData.to, value: BigInt(txData.value), data: txData.data, }); const receipt = await publicClient.waitForTransactionReceipt({ hash }); return { hash, receipt }; } async function checkStatus(requestHash) { const response = await fetch( `${BUNGEE_API_BASE_URL}/api/v1/bungee/status?requestHash=${requestHash}` ); const data = await response.json(); if (!data.success) { throw new Error(`Status error: ${data.error?.message || "Unknown error"}`); } return data.result[0]; } async function main() { console.log("Starting Bungee Native Token Test (Auto Route)..."); // Get the quote console.log("\n1. Getting quote..."); const { txData, requestHash } = await getQuote(quoteParamsNative); if (txData) { // Submit the transaction console.log("\n2. Submitting transaction..."); const { hash, receipt } = await submitNativeTransaction(txData); console.log("Transaction sent:", hash); // Poll for completion console.log("\n3. Checking status..."); let status; let attempts = 0; const maxAttempts = 60; const interval = 5000; while (attempts < maxAttempts) { await new Promise((resolve) => setTimeout(resolve, interval)); status = await checkStatus(requestHash); const code = status?.bungeeStatusCode; console.log("Status:", code); if (code === 3 || code === 4) { // FULFILLED or SETTLED console.log("Transaction complete:", status.destinationData?.txHash); break; } if (code === 5) { throw new Error(`Request expired. Status: ${JSON.stringify(status)}`); } if (code === 6) { throw new Error(`Request cancelled. Status: ${JSON.stringify(status)}`); } if (code === 7) { throw new Error(`Request refunded. Status: ${JSON.stringify(status)}`); } attempts++; } if (attempts >= maxAttempts) { throw new Error( `Polling timed out after ${maxAttempts} attempts. Last status: ${JSON.stringify(status)}` ); } } } main(); ``` # Auto routing with Permit2 Source: https://docs.bungee.exchange/integrate/integration-guides/auto-permit2-gasless-requests This guide covers how to integrate Bungee Auto for samechain and crosschain swaps using ERC20 tokens as input tokens with Permit2 for gasless approvals. ## Overview[​](#overview "Direct link to Overview") The Permit2 integration flow allows users to swap ERC20 tokens across chains without requiring separate approval transactions. This provides a better user experience by: 1. Eliminating the need for separate approval transactions 2. Enabling gasless approvals, saving users gas fees 3. Only transferring tokens if the auction is completed and a transmitter has picked up the request If the wallet supports EIP-1271, you can use the Permit2 signature flow for approvals. Otherwise, use the fallback mechanism by sending the request via the [`BungeeInbox` contract](/integrate/integration-guides/auto-onchain-requests). ## Integration Steps[​](#integration-steps "Direct link to Integration Steps") ### Step 1: Get a Quote[​](#step-1-get-a-quote "Direct link to Step 1: Get a Quote") Request a quote for your ERC20 transfer using the actual parameters from the script. This ensures you have all the required data for the next steps. > **API Reference**: Quote Endpoint ```javascript theme={null} const BUNGEE_API_BASE_URL = "https://public-backend.bungee.exchange"; const quoteParamsERC20 = { userAddress: account.address, receiverAddress: account.address, originChainId: 10, // Optimism destinationChainId: 42161, // Arbitrum inputToken: "0x0b2c639c533813f4aa9d7837caf62653d097ff85", // USDC on Optimism outputToken: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", // USDC on Arbitrum inputAmount: "1000000", // 1 USDC (6 decimals) }; async function getQuote(params) { const url = `${BUNGEE_API_BASE_URL}/api/v1/bungee/quote`; const queryParams = new URLSearchParams(params); const fullUrl = `${url}?${queryParams}`; const response = await fetch(fullUrl); const data = await response.json(); const serverReqId = response.headers.get("server-req-id"); if (!data.success) { throw new Error( `Quote error: ${data.statusCode}: ${data.message}. server-req-id: ${serverReqId}` ); } if (!data.result.autoRoute) { throw new Error(`No autoRoute available. server-req-id: ${serverReqId}`); } const quoteId = data.result.autoRoute.quoteId; const requestType = data.result.autoRoute.requestType; let witness = null; let signTypedData = null; if (data.result.autoRoute.signTypedData) { signTypedData = data.result.autoRoute.signTypedData; if (signTypedData.values && signTypedData.values.witness) { witness = signTypedData.values.witness; } } const approvalData = data.result.autoRoute.approvalData; return { quoteId, requestType, witness, signTypedData, approvalData, fullResponse: data, }; } ``` ### Step 2: Check and Approve Token (ERC20 Approval Step)[​](#step-2-check-and-approve-token-erc20-approval-step "Direct link to Step 2: Check and Approve Token (ERC20 Approval Step)") Before signing and submitting the request, you must ensure the permit2 contract has sufficient allowance to spend your tokens. The script checks for allowance and sends an approval transaction if needed. > Read more about permit2 [here](/overview/routing-methods/permit2). ```javascript theme={null} async function checkAndApproveToken(approvalData) { if (!approvalData || !approvalData.tokenAddress) { console.log("No approval data found or required"); return; } // ERC20 ABI for allowance and approve functions const erc20Abi = [ { inputs: [ { name: "owner", type: "address" }, { name: "spender", type: "address" }, ], name: "allowance", outputs: [{ name: "", type: "uint256" }], stateMutability: "view", type: "function", }, { inputs: [ { name: "spender", type: "address" }, { name: "amount", type: "uint256" }, ], name: "approve", outputs: [{ name: "", type: "bool" }], stateMutability: "nonpayable", type: "function", }, ]; const currentAllowance = await publicClient.readContract({ address: approvalData.tokenAddress, abi: erc20Abi, functionName: "allowance", args: [ approvalData.userAddress, approvalData.spenderAddress === "0" ? "0x000000000022D473030F116dDEE9F6B43aC78BA3" // Permit2 default : approvalData.spenderAddress, ], }); if (BigInt(currentAllowance) >= BigInt(approvalData.amount)) { console.log("Sufficient allowance already exists."); return; } // Send approval transaction const hash = await walletClient.writeContract({ address: approvalData.tokenAddress, abi: erc20Abi, functionName: "approve", args: [ approvalData.spenderAddress === "0" ? "0x000000000022D473030F116dDEE9F6B43aC78BA3" : approvalData.spenderAddress, approvalData.amount, ], }); console.log(`Approval transaction sent: ${hash}`); await publicClient.waitForTransactionReceipt({ hash }); console.log("Approval confirmed."); } ``` ### Step 3: Sign and Submit the Request[​](#step-3-sign-and-submit-the-request "Direct link to Step 3: Sign and Submit the Request") After ensuring approval, sign the typed data and submit the request. Use the actual function and parameter names from the script. ```javascript theme={null} async function viemSignTypedData(signTypedData) { const signature = await account.signTypedData({ types: signTypedData.types, primaryType: "PermitWitnessTransferFrom", message: signTypedData.values, domain: signTypedData.domain, }); return signature; } async function submitSignedRequest( requestType, request, userSignature, quoteId ) { const requestBody = { requestType, request, userSignature, quoteId, }; const response = await fetch(`${BUNGEE_API_BASE_URL}/api/v1/bungee/submit`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(requestBody), }); const data = await response.json(); if (!data.success) { throw new Error(`Submit error: ${data.error?.message || "Unknown error"}`); } return data.result; } ``` ### Step 4: Check Request Status[​](#step-4-check-request-status "Direct link to Step 4: Check Request Status") After submitting the request, check its status to track progress. You can implement a polling mechanism to continuously check until completion: > **API Reference**: Status Endpoint ```javascript theme={null} async function checkStatus(requestHash) { const response = await fetch( `${BUNGEE_API_BASE_URL}/api/v1/bungee/status?requestHash=${requestHash}` ); const data = await response.json(); if (!data.success) { throw new Error(`Status error: ${data.error?.message || "Unknown error"}`); } return data.result[0]; } async function pollForCompletion( requestHash, interval = 5000, maxAttempts = 60 ) { let attempts = 0; const terminalStates = [3, 4, 5, 6, 7]; // FULFILLED, SETTLED, EXPIRED, CANCELLED, REFUNDED while (attempts < maxAttempts) { const status = await checkStatus(requestHash); const code = status?.bungeeStatusCode; if (terminalStates.includes(code)) { if (code === 3 || code === 4) { console.log("Transaction complete:", status.destinationData?.txHash); } else if (code === 5) { console.log("Request expired"); } else if (code === 6) { console.log("Request cancelled"); } else if (code === 7) { console.log("Request refunded:", status.refund?.txHash); } return status; } attempts++; await new Promise((resolve) => setTimeout(resolve, interval)); } throw new Error("Polling timed out. Transaction may not have completed."); } ``` *** ## Complete Integration Example[​](#complete-integration-example "Direct link to Complete Integration Example") ```javascript theme={null} import { privateKeyToAccount } from "viem/accounts"; import { createPublicClient, http, createWalletClient } from "viem"; import { optimism } from "viem/chains"; import { logToJson } from "../utils/logger.js"; import path from "node:path"; // Define script-specific output path const OUTPUT_DIR = path.resolve( process.cwd(), "scripts/examples/output/auto-erc20" ); // Check if PRIVATE_KEY is set, set in console, i.e.: export PRIVATE_KEY= if (!process.env.PRIVATE_KEY) { console.error("Error: PRIVATE_KEY environment variable is not set"); console.error( "Example: export PRIVATE_KEY=" ); process.exit(1); } // Create account from private key // Normalize private key to ensure it has exactly one "0x" prefix (required by viem) const normalizedPrivateKey = `0x${process.env.PRIVATE_KEY.replace(/^0x/i, '')}`; const account = privateKeyToAccount(normalizedPrivateKey); // Create Viem clients const publicClient = createPublicClient({ chain: optimism, transport: http(), }); const walletClient = createWalletClient({ account, chain: optimism, transport: http(), }); // API and token parameters const BUNGEE_API_BASE_URL = "https://public-backend.bungee.exchange"; // Quote parameters for ERC20 token test (USDC from Optimism to Arbitrum) const quoteParamsERC20 = { userAddress: account.address, receiverAddress: account.address, originChainId: 10, // Optimism destinationChainId: 42161, // Arbitrum inputToken: "0x0b2c639c533813f4aa9d7837caf62653d097ff85", // USDC on Optimism outputToken: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", // USDC on Arbitrum inputAmount: "1000000", // 1 USDC (6 decimals) }; // Function to get a quote async function getQuote(params) { try { const url = `${BUNGEE_API_BASE_URL}/api/v1/bungee/quote`; const queryParams = new URLSearchParams(params); const fullUrl = `${url}?${queryParams}`; // Log the request parameters logToJson(params, "quote_request_params", OUTPUT_DIR); const response = await fetch(fullUrl); const data = await response.json(); const serverReqId = response.headers.get("server-req-id"); // Log the response logToJson(data, "quote_response", OUTPUT_DIR); // Check for errors if (!data.success) { throw new Error( `Quote error: ${data.statusCode}: ${data.message}. server-req-id: ${serverReqId}` ); } // Check if autoRoute exists if (!data.result.autoRoute) { throw new Error(`No autoRoute available. server-req-id: ${serverReqId}`); } const quoteId = data.result.autoRoute.quoteId; const requestType = data.result.autoRoute.requestType; console.log("- Quote ID:", quoteId); console.log("- Request Type:", requestType); // Extract data based on the response structure let witness = null; let signTypedData = null; if (data.result.autoRoute.signTypedData) { signTypedData = data.result.autoRoute.signTypedData; // The witness is located in signTypedData.values.witness if (signTypedData?.values?.witness) { witness = signTypedData.values.witness; } } // Extract approval data if present const approvalData = data.result.autoRoute.approvalData; // Log request hash if (data.result.autoRoute.requestHash) { console.log("- Request Hash:", data.result.autoRoute.requestHash); } // Witness object is available but not logged to keep output clean // Log the typed data structure for debugging if (signTypedData) { logToJson(signTypedData, "typed_data_structure", OUTPUT_DIR); } return { quoteId, requestType, witness, signTypedData, approvalData, fullResponse: data, }; } catch (error) { console.error("Failed to get quote:", error); throw error; } } // Function to sign typed data using viem async function viemSignTypedData(signTypedData) { try { const signature = await account.signTypedData({ types: signTypedData.types, primaryType: "PermitWitnessTransferFrom", message: signTypedData.values, domain: signTypedData.domain, }); console.log("- Signature:", signature); return signature; } catch (error) { console.error("Failed to sign typed data:", error); throw error; } } // Function to submit the signed request async function submitSignedRequest( requestType, request, userSignature, quoteId ) { try { // Prepare request body const requestBody = { requestType, request, userSignature, quoteId, }; // Log the request body logToJson(requestBody, "submit_request", OUTPUT_DIR); const response = await fetch( `${BUNGEE_API_BASE_URL}/api/v1/bungee/submit`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(requestBody), } ); const data = await response.json(); // Log the response data logToJson(data, "submit_response", OUTPUT_DIR); // Response data is saved to file but not logged to keep output clean if (!data.success) { throw new Error( `Submit error: ${data.error?.message || "Unknown error"}` ); } console.log("- Request Hash:", data.result.requestHash); return data.result; } catch (error) { console.error("Failed to submit signed request:", error); throw error; } } // Function to check the status of a request async function checkStatus(requestHash) { try { // Log the request parameters logToJson({ requestHash }, "status_request_params", OUTPUT_DIR); const response = await fetch( `${BUNGEE_API_BASE_URL}/api/v1/bungee/status?requestHash=${requestHash}` ); const data = await response.json(); // Log the response data logToJson(data, "status_response", OUTPUT_DIR); if (!data.success) { throw new Error( `Status error: ${data.error?.message || "Unknown error"}` ); } return data.result[0]; } catch (error) { console.error("Failed to check status:", error); throw error; } } // Function to check and handle token approvals async function checkAndApproveToken(approvalData) { if (!approvalData || !approvalData.tokenAddress) { console.log("No approval data found or required"); return; } console.log("\nChecking token approval..."); // ERC20 ABI for allowance and approve functions const erc20Abi = [ { inputs: [ { name: "owner", type: "address" }, { name: "spender", type: "address" }, ], name: "allowance", outputs: [{ name: "", type: "uint256" }], stateMutability: "view", type: "function", }, { inputs: [ { name: "spender", type: "address" }, { name: "amount", type: "uint256" }, ], name: "approve", outputs: [{ name: "", type: "bool" }], stateMutability: "nonpayable", type: "function", }, ]; try { const currentAllowance = await publicClient.readContract({ address: approvalData.tokenAddress, abi: erc20Abi, functionName: "allowance", args: [ approvalData.userAddress, // TODO:Fall back to known Permit2 address if spenderAddress is "0" approvalData.spenderAddress === "0" ? "0x000000000022D473030F116dDEE9F6B43aC78BA3" : approvalData.spenderAddress, ], }); console.log(`Current allowance: ${currentAllowance}`); console.log(`Required approval: ${approvalData.amount}`); // Check if approval is needed if (BigInt(currentAllowance) >= BigInt(approvalData.amount)) { console.log("Sufficient allowance already exists."); return; } console.log("Insufficient allowance. Approving tokens..."); // Send approval transaction const hash = await walletClient.writeContract({ address: approvalData.tokenAddress, abi: erc20Abi, functionName: "approve", args: [ // Fall back to known Permit2 address if spenderAddress is "0" approvalData.spenderAddress === "0" ? "0x000000000022D473030F116dDEE9F6B43aC78BA3" : approvalData.spenderAddress, approvalData.amount, ], }); console.log(`Approval transaction sent: ${hash}`); // Wait for transaction to be mined const receipt = await publicClient.waitForTransactionReceipt({ hash }); console.log(`Approval confirmed in block ${receipt.blockNumber}`); return receipt; } catch (error) { console.error("Error in approval process:", error); throw error; } } // Main function to handle the flow async function main() { try { console.log("Starting Bungee ERC20 Token Test (Auto Route)..."); // Get the quote and extract data console.log("\n1. Getting quote..."); const quoteResponse = await getQuote(quoteParamsERC20); const { quoteId, requestType, witness, signTypedData } = quoteResponse; // Check if approval is needed and handle it if (quoteResponse.approvalData) { await checkAndApproveToken(quoteResponse.approvalData); } if (signTypedData && witness) { // Sign the typed data console.log("\n2. Signing typed data..."); const signature = await viemSignTypedData(signTypedData); // Submit the signed request console.log("\n3. Submitting signed request..."); const submitResult = await submitSignedRequest( requestType, witness, signature, quoteId ); console.log( "\n4. Submission complete:", "\n- Hash:", submitResult.requestHash, "\n- Type:", submitResult.requestType ); // Check the status // Wait for 5 seconds console.log("\n4. Waiting for 5 seconds..."); let status; const terminalStates = [3, 4, 5, 6, 7]; // FULFILLED, SETTLED, EXPIRED, CANCELLED, REFUNDED do { await new Promise((resolve) => setTimeout(resolve, 5000)); console.log("\n5. Checking status..."); try { status = await checkStatus(submitResult.requestHash); console.log("- Status details:", status.bungeeStatusCode); } catch (error) { console.error( "Failed to check status:", error?.message || "Unknown error" ); } } while (!status || !terminalStates.includes(status?.bungeeStatusCode)); // Handle terminal states if (status) { const code = status.bungeeStatusCode; if (code === 3 || code === 4) { console.log( "\n6. Transaction complete:", "\n- Hash:", status.destinationData?.txHash || "Transaction hash not available" ); } else if (code === 5) { console.error("\n6. Request expired"); throw new Error(`Request expired. Status: ${JSON.stringify(status)}`); } else if (code === 6) { console.error("\n6. Request cancelled"); throw new Error(`Request cancelled. Status: ${JSON.stringify(status)}`); } else if (code === 7) { console.error("\n6. Request refunded:", status.refund?.txHash || "Refund transaction hash not available"); throw new Error(`Request refunded. Status: ${JSON.stringify(status)}`); } } } else { console.log("No signature data available in the quote response"); } } catch (error) { console.error("Error in processing:", error?.shortMessage || error.message); throw error; } } // Execute the main function main(); ``` # Request status codes Source: https://docs.bungee.exchange/integrate/integration-guides/check-status Understanding Bungee API status codes and how to monitor requests When submitting requests with Bungee, monitoring the status of requests is essential. This is an explainer of the different status codes returned by the Bungee API and how to interpret them. ## Checking Request Status You can use the Bungee API endpoint to check the status of a request from Bungee Auto transactions and Bungee Manual crosschain swaps. The request hash can be either: * The `requestHash` returned from a submit request (for Auto routes) * The transaction hash (for Manual routes) ```javascript theme={null} const BUNGEE_API_BASE_URL = "https://public-backend.bungee.exchange"; async function checkStatus(requestHash) { try { const response = await fetch( `${BUNGEE_API_BASE_URL}/api/v1/bungee/status?requestHash=${requestHash}` ); const data = await response.json(); if (!data.success) { const serverReqId = response.headers.get("server-req-id"); throw new Error( `Status error: ${data.statusCode}: ${data.message}. server-req-id: ${serverReqId}` ); } // It returns an array since we can have multiple requests in one requestHash return data.result[0]; } catch (error) { console.error("Failed to check status:", error); throw error; } } ``` ### Manual samechain swaps For Bungee Manual samechain swaps, the swap is executed in the same onchain transaction you submit. Check the receipt status to determine success. ```javascript theme={null} // Example using viem import { createPublicClient, http } from "viem"; import { mainnet } from "viem/chains"; const client = createPublicClient({ chain: mainnet, transport: http() }); async function checkManualSameChainTx(hash) { const receipt = await client.waitForTransactionReceipt({ hash }); if (!receipt) { throw new Error("Transaction not found"); } if (receipt.status !== "success") { throw new Error("Transaction failed/reverted"); } return receipt; } ``` ## Status Code Enum Bungee uses the following enum to represent the status of a request. These status codes are returned in the `bungeeStatusCode` field of the status response: ```typescript theme={null} export enum RequestStatusEnum { PENDING = 0, ASSIGNED = 1, EXTRACTED = 2, FULFILLED = 3, SETTLED = 4, EXPIRED = 5, CANCELLED = 6, REFUNDED = 7, } ``` ## Status Code Descriptions ### PENDING (0) The request has been submitted to the Bungee Auto system but has not yet been picked up by a solver. This is the initial state of all requests. ### ASSIGNED (1) A solver has been assigned to the request and is working on it. The solver is preparing to execute the request. ### EXTRACTED (2) The solver has extracted the funds from the source chain and is in the process of executing the request. ### FULFILLED (3) The request has been successfully executed on the destination chain. The funds have been delivered to the recipient address. ### SETTLED (4) The request has been fully settled, meaning all operations have been completed and confirmed on both chains. ### EXPIRED (5) The request has expired because it was not processed within the specified time limit. This could happen if no solver was available or if there were network issues. ### CANCELLED (6) The request was cancelled, either by the user or by the system. ### REFUNDED (7) The refund has been processed and the funds have been sent to the user's address. The `refund` object contains details about the transaction hash and chain ID. **Refund recipient:** * If refunded on the source chain: * Onchain: Funds are sent to the `msg.sender` of the `createRequest` transaction * API: Funds are sent to the user address if submitted via `submit` endpoint * If refunded on the destination chain: Funds are sent to the `receiver` address ## Example Implementation with Polling Here's an example of how to poll for status updates until a transaction is complete: ```javascript theme={null} // For Auto routes (using requestHash from submission) // Terminal states: 3 = FULFILLED, 4 = SETTLED (success), 5 = EXPIRED, 6 = CANCELLED, 7 = REFUNDED (failure) const TERMINAL_SUCCESS = [3, 4]; const TERMINAL_FAILURE = [5, 6, 7]; const TERMINAL_STATES = [...TERMINAL_SUCCESS, ...TERMINAL_FAILURE]; let status; do { await new Promise((resolve) => setTimeout(resolve, 5000)); // Wait 5 seconds between checks console.log("Checking status..."); try { status = await checkStatus(submitResult.requestHash); console.log("Status details:", status.bungeeStatusCode); } catch (error) { console.error("Failed to check status:", error?.message || "Unknown error"); } } while (!TERMINAL_STATES.includes(status?.bungeeStatusCode)); // Handle terminal states if (TERMINAL_SUCCESS.includes(status?.bungeeStatusCode)) { console.log( "Transaction complete:", "\n- Hash:", status.destinationData?.txHash || "Transaction hash not available" ); } else { const statusNames = { 5: "EXPIRED", 6: "CANCELLED", 7: "REFUNDED" }; console.error( "Transaction failed:", `\n- Status: ${statusNames[status?.bungeeStatusCode]} (${status?.bungeeStatusCode})`, "\n- Details:", JSON.stringify(status, null, 2) ); throw new Error(`Request ${statusNames[status?.bungeeStatusCode]}`); } ``` ```javascript theme={null} // For Manual routes (using transaction hash) // Terminal states: 3 = FULFILLED, 4 = SETTLED (success), 5 = EXPIRED, 6 = CANCELLED, 7 = REFUNDED (failure) const TERMINAL_SUCCESS = [3, 4]; const TERMINAL_FAILURE = [5, 6, 7]; const TERMINAL_STATES = [...TERMINAL_SUCCESS, ...TERMINAL_FAILURE]; let status; do { await new Promise((resolve) => setTimeout(resolve, 5000)); // Wait 5 seconds between checks console.log("Checking status..."); try { status = await checkStatus(transactionHash); console.log("Status details:", status?.bungeeStatusCode || "Pending"); } catch (error) { console.error("Failed to check status:", error?.message || "Unknown error"); } } while (!status || !TERMINAL_STATES.includes(status?.bungeeStatusCode)); // Handle terminal states if (TERMINAL_SUCCESS.includes(status?.bungeeStatusCode)) { console.log( "Transaction complete:", "\n- Hash:", status.destinationData?.txHash || "Transaction hash not available" ); } else { const statusNames = { 5: "EXPIRED", 6: "CANCELLED", 7: "REFUNDED" }; console.error( "Transaction failed:", `\n- Status: ${statusNames[status?.bungeeStatusCode]} (${status?.bungeeStatusCode})`, "\n- Transaction Hash:", transactionHash, "\n- Details:", JSON.stringify(status, null, 2) ); throw new Error(`Request ${statusNames[status?.bungeeStatusCode]}`); } ``` # Deposit addresses Source: https://docs.bungee.exchange/integrate/integration-guides/deposit Integrate Bungee Deposit by fetching deposit quote data, submitting txData, and polling request status This page covers how to integrate the Bungee Deposit flow using the `quote` and `status` endpoints. The flow is: 1. Fetch a quote with deposit mode enabled (`enableDepositAddress=true`). 2. Read `result.deposit` from the quote response. 3. Use either: * `deposit.txData` for direct programmatic execution, or * `deposit.depositData` to display transfer details for user-driven submission. 4. Poll `/status` using `deposit.requestHash` until terminal status. Currently, the deposit flow is supported on **all EVM** chains, **Tempo**, **Solana**, **Tron** and **Stellar**. * **Tron** supports direct deposits from USDT0 OFT chains to USDT on Tron. No other tokens or cross-chain swaps are supported at this time. * **Stellar** supports Base USDC deposits to and from USDC on Stellar. No other tokens or cross-chain swaps are supported at this time. * **Tempo** [does not use a native gas token](https://docs.tempo.xyz/protocol/fees). The gas token is determined by the account’s [fee token preferences](https://docs.tempo.xyz/protocol/fees/spec-fee#fee-token-preferences), and [Viem has helper functions](https://viem.sh/tempo/actions/fee.getUserToken) to resolve it. If the swap input token is also selected as the fee token, the swap amount must leave enough balance to cover gas. ## Integration Steps ### Step 1: Get a Quote in Deposit Mode Use the quote endpoint with `enableDepositAddress=true` and `refundAddress=USER_ADDRESS`. The `userAddress` is optional for the deposit flow. The `depositDestinationMemo` may be applicable for Stellar transactions. ```javascript theme={null} const BUNGEE_API_BASE_URL = "https://public-backend.bungee.exchange"; const quoteParams = { originChainId: "8453", destinationChainId: "42161", inputAmount: "2000000", inputToken: "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913", outputToken: "0xaf88d065e77c8cc2239327c5edb3a432268e5831", userAddress: USER_ADDRESS, // Optional for the deposit flow receiverAddress: RECEIVER_ADDRESS, refundAddress: USER_ADDRESS, // Required when `enableDepositAddress` is `true` enableDepositAddress: "true", disableAuto: "true", }; async function getDepositQuote(params) { const url = `${BUNGEE_API_BASE_URL}/api/v1/bungee/quote?${new URLSearchParams(params)}`; const response = await fetch(url); if (!response.ok) { throw new Error(`Quote HTTP error: ${response.status}`); } const data = await response.json(); const serverReqId = response.headers.get("server-req-id"); if (!data.success) { throw new Error( `Quote error: ${data.statusCode}: ${data.message || "Unknown error"}. server-req-id: ${serverReqId}` ); } const deposit = data?.result?.deposit; if (!deposit?.txData || !deposit?.requestHash) { throw new Error(`Missing deposit txData/requestHash. server-req-id: ${serverReqId}`); } return { requestHash: deposit.requestHash, txData: deposit.txData, userOp: deposit.userOp, }; } ``` `result.deposit.requestHash` is the identifier you should use with the status endpoint. ### Step 2: Submit `deposit.txData` Use `deposit.txData.type` to select the transaction submission method for the origin chain. Example below shows EVM submission with `viem`. In addition to executing with `deposit.txData`, you can also use `deposit.depositData` from the quote response to display the direct transfer details (recipient address, token, amount, chainId, memo if present) so users can submit the transfer manually via a QR code UI. For Stellar deposits, when transferring USDC for the first time from a wallet, ensure the wallet has a USDC trustline before submitting the transaction. ```javascript theme={null} async function submitEvmTransaction(txData, originChainId, privateKey) { if (!txData?.to) { throw new Error("Transaction 'to' is required"); } const account = privateKeyToAccount(privateKey.startsWith("0x") ? privateKey : `0x${privateKey}`); const walletClient = createWalletClient({ chain, account, transport: http(), }); const publicClient = createPublicClient({ chain, transport: http(), }); const hash = await walletClient.sendTransaction({ to: txData.to, data: txData.data, value: BigInt(txData.value ?? "0"), }); const receipt = await publicClient.waitForTransactionReceipt({ hash }); if (!receipt || receipt.status !== "success") { throw new Error(`Transaction failed: ${hash}`); } return { hash, receipt }; } ``` ### Step 3: Poll Status with `requestHash` After transaction submission, poll the status endpoint using the request hash returned in step 1. ```javascript theme={null} async function checkStatus(requestHash) { const response = await fetch( `${BUNGEE_API_BASE_URL}/api/v1/bungee/status?requestHash=${requestHash}` ); if (!response.ok) { throw new Error(`Status HTTP error: ${response.status}`); } const data = await response.json(); if (!data.success) { throw new Error( `Status error: ${data.error?.message || data.message || "Unknown error"}` ); } if (!Array.isArray(data.result) || data.result.length === 0) { throw new Error("No status result found"); } return data.result[0]; } async function pollDepositStatus(requestHash, intervalMs = 10000, maxAttempts = 60) { let attempts = 0; while (attempts < maxAttempts) { attempts += 1; await new Promise((resolve) => setTimeout(resolve, intervalMs)); const status = await checkStatus(requestHash); const code = status?.bungeeStatusCode; if (code === 3 || code === 4) return status; if (code === 5 || code === 6 || code === 7) { throw new Error(`Request failed with status code ${code}`); } } throw new Error("Status polling timed out"); } ``` For status code details, see [Request status codes](/integrate/integration-guides/check-status). ## Examples ### Queries ```text theme={null} https://public-backend.bungee.exchange/api/v1/bungee/quote?originChainId=8453&destinationChainId=1110002&inputAmount=20000000&inputToken=0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913&outputToken=USDC-GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN&refundAddress=0x664b591aB924C6bb2CacA533ed702386934A11d6&receiverAddress=GAEQYFK3GOLJO7OR24DMBEAGVQ7TRPQXXMSRGLI4BQVZNH6SJT7PTBRC&enableDepositAddress=true&depositDestinationMemo=3063557953 ``` ```text theme={null} https://public-backend.bungee.exchange/api/v1/bungee/quote?originChainId=1110002&destinationChainId=8453&inputAmount=20000000&inputToken=USDC-GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN&receiverAddress=0x7B346f63e6F8f663CBEC6d526bA762B42A1Fdd7A&outputToken=0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913&enableDepositAddress=true&refundAddress=0x7B346f63e6F8f663CBEC6d526bA762B42A1Fdd7A&depositDestinationMemo=3063557953&disableAuto=true ``` ### Scripts ```javascript theme={null} import dotenv from "dotenv"; import { TronWeb } from "tronweb"; import { createPublicClient, createWalletClient, http } from "viem"; import { privateKeyToAccount } from "viem/accounts"; import { base, arbitrum, optimism, tempo } from "viem/chains"; import * as StellarSdk from "@stellar/stellar-sdk"; import StellarHDWallet from "stellar-hd-wallet"; import { Keypair, Connection, Transaction as SolanaTransaction, VersionedTransaction, } from "@solana/web3.js"; import bs58 from "bs58"; dotenv.config(); const BUNGEE_API_BASE_URL = "https://public-backend.bungee.exchange"; const TRON_FULL_HOST = "https://api.trongrid.io"; const SOLANA_RPC_URL = "https://api.mainnet-beta.solana.com"; const STELLAR_HORIZON_URL = "https://horizon.stellar.org"; const SOLANA_CHAIN_ID = 89999; // Tron only accepts direct deposit from USDT0 OFT chains to USDT on Tron // No other tokens or source chain swaps are supported at the moment const TRON_CHAIN_ID = 728126428; const TRON_USDT_CONTRACT = "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t"; // Stellar only supports Base USDC from/to USDC on Stellar at the moment // No other tokens or source chain swaps are supported at the moment const STELLAR_CHAIN_ID = 1110002; const STELLAR_USDC_ISSUER = "GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN"; const STELLAR_USDC_ASSET = `USDC-${STELLAR_USDC_ISSUER}`; // Tempo tokens const TEMPO_PATH_USD = '0x20c0000000000000000000000000000000000000'; const TEMPO_USDCe = '0x20c000000000000000000000b9537d11c60e8b50'; let cachedEvmAccount = undefined; let cachedTronContext = undefined; let cachedSolanaContext = undefined; let cachedStellarContextPromise = null; // Parameters to edit for each deposit const originChainId = SOLANA_CHAIN_ID; const destinationChainId = 8453; const inputAmount = "80000000"; const inputToken = "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"; const outputToken = "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913"; if (!process.env.BUNGEE_API_KEY) { console.error("Error: BUNGEE_API_KEY environment variable is not set"); process.exit(1); } if (!process.env.BUNGEE_AFFILIATE_ID) { console.error("Error: BUNGEE_AFFILIATE_ID environment variable is not set"); process.exit(1); } function getApiHeaders() { return { "x-api-key": process.env.BUNGEE_API_KEY, affiliate: process.env.BUNGEE_AFFILIATE_ID, }; } function sanitizePrivateKey(value) { if (!value) return null; return value.startsWith("0x") ? value : `0x${value}`; } function parseSolanaKeypair(value) { if (!value) return null; let privateKeyBytes; try { privateKeyBytes = bs58.decode(value); } catch { try { privateKeyBytes = Uint8Array.from(JSON.parse(value)); } catch { privateKeyBytes = Uint8Array.from(value.split(",").map(Number)); } } return Keypair.fromSecretKey(privateKeyBytes); } function getEvmAccount() { if (cachedEvmAccount !== undefined) { return cachedEvmAccount; } const evmPrivateKey = sanitizePrivateKey(process.env.PRIVATE_KEY?.trim()); cachedEvmAccount = evmPrivateKey ? privateKeyToAccount(evmPrivateKey) : null; return cachedEvmAccount; } function getTronContext() { if (cachedTronContext !== undefined) { return cachedTronContext; } const tronPrivateKey = process.env.TRON_PRIVATE_KEY?.replace(/^0x/, ""); if (!tronPrivateKey) { cachedTronContext = null; return cachedTronContext; } const tronWeb = new TronWeb({ fullHost: TRON_FULL_HOST, privateKey: tronPrivateKey, }); const tronAddress = tronWeb.address.fromPrivateKey(tronPrivateKey); cachedTronContext = { tronWeb, tronAddress, }; return cachedTronContext; } function getSolanaContext() { if (cachedSolanaContext !== undefined) { return cachedSolanaContext; } const solanaPrivateKey = process.env.SOLANA_PRIVATE_KEY; if (!solanaPrivateKey) { cachedSolanaContext = null; return cachedSolanaContext; } try { const solanaKeypair = parseSolanaKeypair(solanaPrivateKey); cachedSolanaContext = { solanaKeypair, solanaAddress: solanaKeypair.publicKey.toBase58(), }; } catch (error) { throw new Error( `Failed to parse SOLANA_PRIVATE_KEY. Use base58 or array/comma format. ${error.message}` ); } return cachedSolanaContext; } async function addStellarUsdcTrustline(account, signer, server, networkPassphrase) { console.log("\nNo USDC trustline found, adding trustline..."); const transaction = new StellarSdk.TransactionBuilder(account, { fee: StellarSdk.BASE_FEE, networkPassphrase, }) .addOperation( StellarSdk.Operation.changeTrust({ asset: new StellarSdk.Asset("USDC", STELLAR_USDC_ISSUER), }) ) .setTimeout(30) .build(); transaction.sign(signer); const result = await server.submitTransaction(transaction); console.log("Trustline added! Hash:", result.hash); } async function loadStellarWalletContext() { if (!process.env.STELLAR_SEED_PHRASE) { throw new Error( "STELLAR_SEED_PHRASE is required when Stellar chain is used" ); } let wallet; try { wallet = StellarHDWallet.fromMnemonic(process.env.STELLAR_SEED_PHRASE); } catch (error) { throw new Error(`Failed to parse STELLAR_SEED_PHRASE: ${error.message}`); } const secretKey = wallet.getSecret(0); const walletAddress = wallet.getPublicKey(0); const signer = StellarSdk.Keypair.fromSecret(secretKey); const server = new StellarSdk.Horizon.Server(STELLAR_HORIZON_URL); const networkPassphrase = StellarSdk.Networks.PUBLIC; let account; try { account = await server.loadAccount(walletAddress); } catch (error) { throw new Error(`Failed to load Stellar account ${walletAddress}: ${error.message}`); } const xlm = account.balances.find((b) => b.asset_type === "native"); const xlmBalance = Number(xlm?.balance ?? "0"); console.log("Stellar Address: ", walletAddress); console.log("Stellar XLM Balance:", xlm ? xlm.balance : "0"); if (!Number.isFinite(xlmBalance) || xlmBalance <= 0) { throw new Error("No XLM balance in Stellar wallet"); } let hasUsdcTrustline = account.balances.find( (b) => b.asset_code === "USDC" && b.asset_issuer === STELLAR_USDC_ISSUER ); console.log("Stellar USDC Trustline:", hasUsdcTrustline ? "YES" : "NO"); if (!hasUsdcTrustline) { await addStellarUsdcTrustline(account, signer, server, networkPassphrase); const updatedAccount = await server.loadAccount(walletAddress); hasUsdcTrustline = updatedAccount.balances.find( (b) => b.asset_code === "USDC" && b.asset_issuer === STELLAR_USDC_ISSUER ); if (!hasUsdcTrustline) { throw new Error("Failed to create USDC trustline on Stellar wallet"); } } return { walletAddress, signer, server, networkPassphrase, }; } async function getStellarWalletContext() { if (!cachedStellarContextPromise) { cachedStellarContextPromise = loadStellarWalletContext(); } return cachedStellarContextPromise; } // REMOVE THIS OR EXPAND IF YOU ADD MORE CHAIN SUPPORT // MERELY SETTING THIS FOR EXAMPLE PURPOSES function getEvmChain(chainId) { const numericChainId = Number(chainId); if (numericChainId === base.id) return base; if (numericChainId === arbitrum.id) return arbitrum; if (numericChainId === optimism.id) return optimism; if (numericChainId === tempo.id) return tempo; throw new Error( `Unsupported EVM chain ${numericChainId}. Add it to getEvmChain before submitting EVM txs.` ); } function applyStellarAssetConstraint({ originChainId, destinationChainId, inputToken, outputToken, }) { let resolvedInputToken = inputToken; let resolvedOutputToken = outputToken; if (Number(originChainId) === STELLAR_CHAIN_ID && inputToken !== STELLAR_USDC_ASSET) { console.log( `Overriding inputToken to ${STELLAR_USDC_ASSET} because originChainId is ${STELLAR_CHAIN_ID}` ); resolvedInputToken = STELLAR_USDC_ASSET; } if ( Number(destinationChainId) === STELLAR_CHAIN_ID && outputToken !== STELLAR_USDC_ASSET ) { console.log( `Overriding outputToken to ${STELLAR_USDC_ASSET} because destinationChainId is ${STELLAR_CHAIN_ID}` ); resolvedOutputToken = STELLAR_USDC_ASSET; } return { inputToken: resolvedInputToken, outputToken: resolvedOutputToken, }; } async function getWalletAddressForChain(chainId) { if (Number(chainId) === SOLANA_CHAIN_ID) { const solanaContext = getSolanaContext(); if (!solanaContext?.solanaAddress) { throw new Error("SOLANA_PRIVATE_KEY is required when Solana chain is used"); } return solanaContext.solanaAddress; } if (Number(chainId) === TRON_CHAIN_ID) { const tronContext = getTronContext(); if (!tronContext?.tronAddress) { throw new Error("TRON_PRIVATE_KEY is required when Tron chain is used"); } return tronContext.tronAddress; } if (Number(chainId) === STELLAR_CHAIN_ID) { const stellarContext = await getStellarWalletContext(); return stellarContext.walletAddress; } const evmAccount = getEvmAccount(); if (!evmAccount) { throw new Error("PRIVATE_KEY is required when an EVM chain is used"); } return evmAccount.address; } async function getQuote(params) { const url = `${BUNGEE_API_BASE_URL}/api/v1/bungee/quote`; const fullUrl = `${url}?${new URLSearchParams(params)}`; const response = await fetch(fullUrl, { headers: getApiHeaders(), }); console.log(fullUrl); if (!response.ok) { throw new Error(`Quote HTTP error: ${response.status}`); } const data = await response.json(); const serverReqId = response.headers.get("server-req-id"); if (!data.success) { throw new Error( `Quote error: ${data.statusCode}: ${data.message || "Unknown error"}. server-req-id: ${serverReqId}` ); } const deposit = data?.result?.deposit; if (!deposit) { throw new Error(`No deposit available in quote response. server-req-id: ${serverReqId}`); } if (!deposit.txData) { throw new Error(`deposit.txData is missing. server-req-id: ${serverReqId}`); } if (!deposit.requestHash) { throw new Error(`deposit.requestHash is missing. server-req-id: ${serverReqId}`); } console.log("- Request Hash:", deposit.requestHash); console.log("- User Op:", deposit.userOp || "N/A"); console.log("- Transaction Type:", deposit.txData.type || "unknown"); return { requestHash: deposit.requestHash, txData: deposit.txData, fullResponse: data, }; } async function submitEvmTransaction(txData) { const evmAccount = getEvmAccount(); if (!evmAccount) { throw new Error("PRIVATE_KEY is required for evm txData.type"); } if (!txData.to) { throw new Error("EVM transaction 'to' is required"); } const chain = getEvmChain(originChainId); const walletClient = createWalletClient({ chain, account: evmAccount, transport: http(), }); const publicClient = createPublicClient({ chain, transport: http(), }); console.log(" To:", txData.to); console.log(" Value:", txData.value); console.log(" Data:", txData.data?.slice(0, 66) ? `${txData.data.slice(0, 66)}...` : "N/A"); const hash = await walletClient.sendTransaction({ to: txData.to, data: txData.data, value: BigInt(txData.value), }); console.log("- Transaction sent:", hash); const receipt = await publicClient.waitForTransactionReceipt({ hash }); if (!receipt || receipt.status !== "success") { throw new Error(`EVM transaction failed: ${hash}`); } console.log("- Transaction mined in block:", receipt.blockNumber); return { hash, receipt }; } async function submitTronTransaction(txData) { const tronContext = getTronContext(); if (!tronContext?.tronWeb || !tronContext?.tronAddress) { throw new Error("TRON_PRIVATE_KEY is required for tron txData.type"); } const { tronWeb, tronAddress } = tronContext; if (!txData.to) { throw new Error("Tron transaction 'to' is required"); } if (!txData.data) { throw new Error("Tron transaction 'data' is required"); } console.log(" To:", txData.to); console.log(" Value:", txData.value); console.log(" Data:", txData.data); const tronTo = typeof txData.to === "string" && txData.to.startsWith("T") ? txData.to : tronWeb.address.fromHex(txData.to); const transaction = await tronWeb.transactionBuilder.triggerSmartContract( tronTo, "", { input: txData.data.replace(/^0x/, ""), callValue: Number(txData.value), feeLimit: Number(100000000), }, [], tronAddress ); const signed = await tronWeb.trx.sign(transaction.transaction); const result = await tronWeb.trx.sendRawTransaction(signed); if (!result.result) { throw new Error(`Tron transaction failed: ${JSON.stringify(result)}`); } const hash = result.txid; console.log("- Transaction sent:", hash); let receipt; while (!receipt) { await new Promise((resolve) => setTimeout(resolve, 3000)); try { const txInfo = await tronWeb.trx.getTransactionInfo(hash); if (txInfo?.blockNumber) { receipt = { blockNumber: txInfo.blockNumber, status: txInfo.receipt ? "success" : "failed", transactionHash: hash, }; } } catch { // Keep polling until the receipt is available. } } console.log("- Transaction mined in block:", receipt.blockNumber); return { hash, receipt }; } async function submitSolanaTransaction(txData) { const solanaContext = getSolanaContext(); const solanaKeypair = solanaContext?.solanaKeypair; if (!solanaKeypair) { throw new Error("SOLANA_PRIVATE_KEY is required for solana txData.type"); } const connection = new Connection(SOLANA_RPC_URL); const serializedPayload = typeof txData?.data === "string" ? txData.data : typeof txData?.data?.serializedTx === "string" ? txData.data.serializedTx : typeof txData?.data?.transaction === "string" ? txData.data.transaction : typeof txData?.data?.tx === "string" ? txData.data.tx : null; if (!serializedPayload) { throw new Error("Solana txData.data must be a serialized transaction payload"); } const normalizedPayload = serializedPayload .trim() .replace(/\s+/g, "") .replace(/-/g, "+") .replace(/_/g, "/"); const base64Padded = normalizedPayload + "=".repeat((4 - (normalizedPayload.length % 4 || 4)) % 4); const serializedTxBytes = Buffer.from(base64Padded, "base64"); if (!serializedTxBytes.length) { throw new Error("Failed to decode serialized Solana txData.data payload"); } console.log(" Serialized Solana payload detected"); console.log( " Data:", serializedPayload.length > 66 ? `${serializedPayload.slice(0, 66)}...` : serializedPayload ); let wireTxBuffer; try { const versionedTx = VersionedTransaction.deserialize(serializedTxBytes); versionedTx.sign([solanaKeypair]); wireTxBuffer = versionedTx.serialize(); } catch (versionedError) { try { const legacyTx = SolanaTransaction.from(serializedTxBytes); legacyTx.sign(solanaKeypair); wireTxBuffer = legacyTx.serialize(); } catch (legacyError) { throw new Error( `Failed to decode serialized Solana tx payload as versioned or legacy transaction. ` + `versionedError=${versionedError.message}; legacyError=${legacyError.message}` ); } } const signature = await connection.sendRawTransaction(wireTxBuffer, { skipPreflight: false, preflightCommitment: "confirmed", }); console.log("- Transaction sent:", signature); const confirmation = await connection.confirmTransaction(signature, "confirmed"); if (confirmation.value.err) { throw new Error(`Solana transaction failed: ${JSON.stringify(confirmation.value.err)}`); } console.log("- Transaction confirmed"); return { hash: signature, receipt: confirmation }; } function getStellarNetworkPassphrase(txData) { return ( txData?.networkPassphrase || txData?.data?.networkPassphrase || txData?.meta?.networkPassphrase || StellarSdk.Networks.PUBLIC ); } function parseStellarMemo(memoValue) { if (memoValue === undefined || memoValue === null || memoValue === "") { return null; } const memoString = String(memoValue).trim(); if (!memoString) { return null; } if (/^\d+$/.test(memoString)) { return StellarSdk.Memo.id(memoString); } return StellarSdk.Memo.text(memoString); } function parseStellarAsset(assetPayload) { if (!assetPayload) { throw new Error("Missing Stellar operation.asset payload"); } const assetCode = assetPayload.code || assetPayload.assetCode; const assetIssuer = assetPayload.issuer || assetPayload.assetIssuer; if (!assetCode) { throw new Error("Missing Stellar asset code"); } if (assetCode.toUpperCase() === "XLM") { return StellarSdk.Asset.native(); } if (!assetIssuer) { throw new Error(`Missing issuer for Stellar asset ${assetCode}`); } return new StellarSdk.Asset(assetCode, assetIssuer); } async function buildStellarTransactionFromOperation({ txData, signer, server, networkPassphrase, }) { const operation = txData?.operation; if (!operation) { throw new Error("Missing txData.operation for stellar transaction"); } if (!operation.destination) { throw new Error("Missing txData.operation.destination for stellar transaction"); } if (!operation.amount) { throw new Error("Missing txData.operation.amount for stellar transaction"); } const sourceAccount = await server.loadAccount(signer.publicKey()); const asset = parseStellarAsset(operation.asset); const memo = parseStellarMemo(txData?.memo); const builder = new StellarSdk.TransactionBuilder(sourceAccount, { fee: StellarSdk.BASE_FEE, networkPassphrase, }).addOperation( StellarSdk.Operation.payment({ destination: operation.destination, asset, amount: String(operation.amount), }) ); if (memo) { builder.addMemo(memo); } return builder.setTimeout(30).build(); } function extractStellarXdr(txData) { const candidates = [ txData?.xdr, txData?.transactionXdr, txData?.envelopeXdr, txData?.unsignedXdr, txData?.data, txData?.data?.xdr, txData?.data?.transactionXdr, txData?.data?.envelopeXdr, txData?.data?.unsignedXdr, txData?.data?.transaction?.xdr, txData?.rawTransaction, ]; for (const candidate of candidates) { if (typeof candidate === "string" && candidate.trim().length > 0) { return candidate.trim(); } } const queue = [txData]; while (queue.length > 0) { const current = queue.shift(); if (!current || typeof current !== "object") { continue; } for (const [key, value] of Object.entries(current)) { if ( typeof value === "string" && value.trim().length > 0 && /xdr|envelope/i.test(key) ) { return value.trim(); } if (value && typeof value === "object") { queue.push(value); } } } throw new Error( "No Stellar XDR found in txData. Expected xdr/transactionXdr/envelopeXdr field." ); } async function submitStellarTransaction(txData) { const { signer, server } = await getStellarWalletContext(); const networkPassphrase = getStellarNetworkPassphrase(txData); let transaction; try { const xdr = extractStellarXdr(txData); transaction = StellarSdk.TransactionBuilder.fromXDR(xdr, networkPassphrase); } catch { transaction = await buildStellarTransactionFromOperation({ txData, signer, server, networkPassphrase, }); } transaction.sign(signer); const result = await server.submitTransaction(transaction); console.log("- Transaction sent:", result.hash); return { hash: result.hash, receipt: result, }; } async function checkStatus(requestHash) { const response = await fetch( `${BUNGEE_API_BASE_URL}/api/v1/bungee/status?requestHash=${requestHash}`, { headers: getApiHeaders(), } ); if (!response.ok) { throw new Error(`Status HTTP error: ${response.status}`); } const data = await response.json(); if (!data.success) { throw new Error( `Status error: ${data.error?.message || data.message || "Unknown error"}` ); } if (!Array.isArray(data.result) || data.result.length === 0) { throw new Error("No status result found"); } return data.result[0]; } async function main() { try { const constrainedAssets = applyStellarAssetConstraint({ originChainId, destinationChainId, inputToken, outputToken, }); const originWalletAddress = await getWalletAddressForChain(originChainId); const destinationWalletAddress = await getWalletAddressForChain(destinationChainId); const quoteParams = { originChainId: String(originChainId), destinationChainId: String(destinationChainId), inputAmount, inputToken: constrainedAssets.inputToken, outputToken: constrainedAssets.outputToken, userAddress: originWalletAddress, receiverAddress: destinationWalletAddress, refundAddress: originWalletAddress, enableDepositAddress: "true", disableAuto: "true", }; console.log("Starting Bungee Deposit flow..."); console.log(`Origin Chain: ${originChainId}`); console.log(`Destination Chain: ${destinationChainId}`); console.log(`User Address: ${quoteParams.userAddress}`); console.log(`Receiver Address: ${quoteParams.receiverAddress}`); console.log("\n1. Getting quote..."); const quoteResponse = await getQuote(quoteParams); const txData = quoteResponse.txData; if (!txData || !txData.type) { throw new Error("No txData.type available in deposit response"); } let submission; if (txData.type === "evm") { console.log("\n2. Submitting EVM transaction..."); submission = await submitEvmTransaction(txData); } else if (txData.type === "tron") { console.log("\n2. Submitting Tron transaction..."); submission = await submitTronTransaction(txData); } else if (txData.type === "solana") { console.log("\n2. Submitting Solana transaction..."); submission = await submitSolanaTransaction(txData); } else if (txData.type === "stellar") { console.log("\n2. Submitting Stellar transaction..."); submission = await submitStellarTransaction(txData); } else { throw new Error(`Unknown transaction type: ${txData.type}`); } console.log("\n3. Transaction submitted:"); console.log("- Hash:", submission.hash); const statusRequestHash = quoteResponse.requestHash; const waitTime = 10000; // 10 seconds console.log(`\n4. Waiting ${waitTime / 2}ms before status polling...`); await new Promise((resolve) => setTimeout(resolve, waitTime / 2)); let status; let attempts = 0; const maxAttempts = 100; do { attempts += 1; if (attempts > maxAttempts) { throw new Error(`Status check timeout after ${maxAttempts} attempts`); } await new Promise((resolve) => setTimeout(resolve, waitTime)); console.log(`\n5. Checking status (attempt ${attempts})...`); try { status = await checkStatus(statusRequestHash); console.log("- Status code:", status.bungeeStatusCode); } catch (error) { console.error("- Status check failed:", error?.message || error); } } while (!status || status.bungeeStatusCode !== 3); console.log("\n6. Transaction complete:"); console.log("- Status Code:", status.bungeeStatusCode); console.log( "- Destination Hash:", status.destinationData?.txHash || "Transaction hash not available" ); } catch (error) { console.error("\nError in processing:", error?.shortMessage || error?.message || error); process.exit(1); } } main(); ``` ## Edge Cases and Best Practices * Always persist `requestHash` immediately after quote generation. * Provide `refundAddress` explicitly so refunds can be directed deterministically. * Validate chain, token, destination receiver, and memo before showing the deposit instructions. * Treat the source transfer tx hash and `requestHash` as separate objects; use `requestHash` for Bungee status checks. * For Stellar as destination, ensure the receiver wallet has a USDC trustline before first USDC transfer. * Surface terminal failure states in UX (`EXPIRED`, `CANCELLED`, `REFUNDED`) and show retry guidance. ## Debugging Checklist 1. Store `requestHash` and `server-req-id` from quote/status calls. 2. Confirm the submitted transfer matches `depositData` (address, token, amount, and memo if present). 3. Poll `/status` with `requestHash` until terminal state. 4. If unresolved, share `requestHash` and `server-req-id` with support. ## Failure Cases API Behavior Status codes: `5 = EXPIRED`, `6 = CANCELLED`, `7 = REFUNDED` | Failure Mode | Category | Bungee Status Code | API Behavior | | -------------------------------------- | ---------- | ------------------ | ------------------------------------------------------------- | | Wrong token deposited | User error | 5 (EXPIRED) | Quote expires, deposit not recognized | | Deposited on wrong chain | User error | 5 (EXPIRED) | Quote expires, funds on wrong chain are not detected | | Less amount deposited | User error | 5 (EXPIRED) | Deposit is detected, but no execution happens | | More amount deposited | User error | SUCCESS | Re-quote with actual amount and suggested slippage is applied | | Balance monitoring expired, no deposit | Timing | 5 (EXPIRED) | Address released | | Slippage exceeds tolerance | Market | STAYS PENDING | Refund is needed | # Manual routing Source: https://docs.bungee.exchange/integrate/integration-guides/manual Integrate Bungee Manual for crosschain swaps with granular control This page covers how to integrate Bungee Manual for crosschain swaps as it is useful when: * You need more control over the crosschain process * You want to compare multiple routes before executing This method involves: 1. Getting a quote from the Bungee API 2. Building the transaction from a selected route 3. Handling any required token approvals 4. Executing the crosschain transaction 5. Monitoring the status via the API **Slippage behavior (Manual vs Auto)** * In Bungee Manual, the `slippage` you provide applies only to the swap that may occur on the origin chain before bridging. If no origin swap is needed, the slippage setting does not apply. The bridge step itself does not use swap-style slippage because bridges have different mechanics. * In Bungee Auto, the `slippage` parameter is applied to the full end-to-end route (origin swap, bridge step, and any destination swap where applicable). ## Integration Steps ### Step 1: Get a Quote For ERC20 & Native tokens, request a quote with all required parameters, including the option to enable manual routes. The `enableManual: true` parameter is **required** to receive manual routes in the response. Without this parameter, only auto routes will be returned. ```javascript theme={null} const BUNGEE_API_BASE_URL = "https://public-backend.bungee.exchange"; const quoteParamsERC20 = { userAddress: USER_ADDRESS, originChainId: 10, // Optimism destinationChainId: 42161, // Arbitrum inputToken: "0x0b2c639c533813f4aa9d7837caf62653d097ff85", // USDC on Optimism inputAmount: "10000000", // 10 USDC (with decimals) receiverAddress: RECEIVER_ADDRESS, outputToken: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", // USDC on Arbitrum enableManual: true, // Important: enables manual routes }; async function getQuote(params) { const url = `${BUNGEE_API_BASE_URL}/api/v1/bungee/quote`; const queryParams = new URLSearchParams(params); const queryUrl = `${url}?${queryParams}`; const response = await fetch(queryUrl); const data = await response.json(); const serverReqId = response.headers.get("server-req-id"); if (!data.success) { throw new Error( `Quote error: ${data.statusCode}: ${data.message}. server-req-id: ${serverReqId}` ); } if (!data.result.manualRoutes || data.result.manualRoutes.length === 0) { throw new Error( `No manual routes available. server-req-id: ${serverReqId}` ); } return { manualRoutes: data.result.manualRoutes, completeResponse: data, serverReqId, }; } ``` ### Step 2: Build the Transaction from Selected Route The quote response contains multiple manual routes. Select one and build the transaction data by submitting the quote ID of the selected route. ```javascript theme={null} async function buildTransaction(quoteId) { const response = await fetch( `${BUNGEE_API_BASE_URL}/api/v1/bungee/build-tx?quoteId=${quoteId}` ); const data = await response.json(); const serverReqId = response.headers.get("server-req-id"); if (!data.success) { throw new Error( `Build TX error: ${data.statusCode}: ${data.message}. server-req-id: ${serverReqId}` ); } return data.result; } ``` ### Step 3: Handle Token Approvals (if needed) Check if the token needs to be approved for spending and create an approval transaction if required. Approval data is included in the build transaction response. ```javascript theme={null} const ERC20_ABI = parseAbi([ "function approve(address spender, uint256 amount) returns (bool)", "function allowance(address owner, address spender) view returns (uint256)", ]); async function buildApprovalTransaction(chainId, approvalData) { // Check current allowance const currentAllowance = await publicClient.readContract({ address: approvalData.tokenAddress, abi: ERC20_ABI, functionName: "allowance", args: [approvalData.userAddress, approvalData.spenderAddress], }); // If allowance is sufficient, no approval needed if (currentAllowance >= BigInt(approvalData.amount)) { return null; } // Create approval transaction data const data = encodeFunctionData({ abi: ERC20_ABI, functionName: "approve", args: [approvalData.spenderAddress, approvalData.amount], }); return { to: approvalData.tokenAddress, data, chainId: chainId, value: "0x00", }; } ``` ### Step 4: Execute the Transactions From the build transaction response, you can get the transaction data and send it to the blockchain. ```javascript theme={null} async function sendTransaction(txData) { const hash = await walletClient.sendTransaction({ to: txData.to, data: txData.data, value: txData.value ? BigInt(txData.value) : BigInt(0), }); const receipt = await publicClient.waitForTransactionReceipt({ hash }); return { hash, receipt }; } ``` If routing via Stargate, include a `msg.value` equal to the `protocolFees.amount` and ensure the address has enough native tokens to cover it. ### Step 5: Monitor the Transaction Status After submitting the request, check its status to track progress. ```javascript theme={null} async function checkStatus(txHash) { const response = await fetch( `${BUNGEE_API_BASE_URL}/api/v1/bungee/status?txHash=${txHash}` ); const data = await response.json(); const serverReqId = response.headers.get("server-req-id"); if (!data.success) { throw new Error( `Status error: ${data.statusCode}: ${data.message}. server-req-id: ${serverReqId}` ); } return data.result; } async function pollForCompletion( txHash, interval = 5000, maxAttempts = 60 ) { let attempts = 0; while (attempts < maxAttempts) { const status = await checkStatus(txHash); const code = status[0]?.bungeeStatusCode; // Success state if (code === 3) { return status; // Transaction complete } // Terminal failure states if (code === 5 || code === 6 || code === 7) { const statusMessage = status[0]?.message || "No additional message"; const statusNames = { 5: "EXPIRED", 6: "CANCELLED", 7: "REFUNDED" }; throw new Error( `Transaction terminated with status ${code} (${statusNames[code]}): ${statusMessage}` ); } attempts++; await new Promise((resolve) => setTimeout(resolve, interval)); } throw new Error("Polling timed out. Transaction may not have completed."); } ``` For a detailed explanation of all status codes, see the [Request Status Codes](/integrate/integration-guides/check-status) guide. ## Complete Integration Example (ERC20) ```javascript theme={null} import { createPublicClient, createWalletClient, http } from "viem"; import { privateKeyToAccount } from "viem/accounts"; import { optimism } from "viem/chains"; // Check if PRIVATE_KEY is set if (!process.env.PRIVATE_KEY) { console.error("Error: PRIVATE_KEY environment variable is not set"); process.exit(1); } // Create account from private key // Normalize private key to ensure it has exactly one "0x" prefix (required by viem) const normalizedPrivateKey = `0x${process.env.PRIVATE_KEY.replace(/^0x/i, '')}`; const account = privateKeyToAccount(normalizedPrivateKey); const publicClient = createPublicClient({ chain: optimism, transport: http(), }); const walletClient = createWalletClient({ account, chain: optimism, transport: http(), }); const BUNGEE_API_BASE_URL = "https://public-backend.bungee.exchange"; const quoteParams = { userAddress: account.address, receiverAddress: account.address, originChainId: 10, destinationChainId: 42161, inputToken: "0x0b2c639c533813f4aa9d7837caf62653d097ff85", outputToken: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", inputAmount: "10000000", enableManual: true, }; async function getQuote(params) { const url = `${BUNGEE_API_BASE_URL}/api/v1/bungee/quote`; const queryParams = new URLSearchParams(params); const response = await fetch(`${url}?${queryParams}`); const data = await response.json(); if (!data.success || !data.result.manualRoutes?.length) { throw new Error("No manual routes available"); } return data.result.manualRoutes; } async function buildTransaction(quoteId) { const response = await fetch( `${BUNGEE_API_BASE_URL}/api/v1/bungee/build-tx?quoteId=${quoteId}` ); const data = await response.json(); if (!data.success) { throw new Error("Failed to build transaction"); } return data.result; } async function checkStatus(txHash) { const response = await fetch( `${BUNGEE_API_BASE_URL}/api/v1/bungee/status?txHash=${txHash}` ); const data = await response.json(); return data.result[0]; } async function main() { console.log("Starting Bungee Manual Route Test..."); // Get routes const routes = await getQuote(quoteParams); console.log(`Found ${routes.length} routes`); // Select first route const selectedRoute = routes[0]; const quoteId = selectedRoute.quoteId; // Build transaction const txResult = await buildTransaction(quoteId); // Handle approval if needed if (txResult.approvalData) { // ... handle approval } // Send transaction const hash = await walletClient.sendTransaction({ to: txResult.txData.to, data: txResult.txData.data, value: txResult.txData.value ? BigInt(txResult.txData.value) : BigInt(0), }); console.log("Transaction sent:", hash); // Poll for completion // Terminal states: 3 = FULFILLED, 4 = SETTLED (success), 5 = EXPIRED, 6 = CANCELLED, 7 = REFUNDED (failure) const TERMINAL_SUCCESS = [3, 4]; const TERMINAL_FAILURE = [5, 6, 7]; const TERMINAL_STATES = [...TERMINAL_SUCCESS, ...TERMINAL_FAILURE]; let status; do { await new Promise((r) => setTimeout(r, 5000)); status = await checkStatus(hash); } while (!TERMINAL_STATES.includes(status?.bungeeStatusCode)); if (TERMINAL_SUCCESS.includes(status?.bungeeStatusCode)) { console.log("Complete:", status.destinationData?.txHash); } else { const statusNames = { 5: "EXPIRED", 6: "CANCELLED", 7: "REFUNDED" }; throw new Error(`Request ${statusNames[status?.bungeeStatusCode]}: ${JSON.stringify(status)}`); } } main(); ``` # Manual routing Source: https://docs.bungee.exchange/integrate/integration-guides/manual-route-selection This page covers how to integrate Bungee Manual for crosschain swaps as it is useful when: * You need more control over the crosschain process * You want to compare multiple routes before executing This method involves: 1. Getting a quote from the Bungee API 2. Building the transaction from a selected route 3. Handling any required token approvals 4. Executing the crosschain transaction 5. Monitoring the status via the API * In Bungee Manual, the `slippage` you provide applies only to the swap that may occur on the origin chain before bridging. If no origin swap is needed, the slippage setting does not apply. The bridge step itself does not use swap-style slippage because bridges have different mechanics. * In Bungee Auto, the `slippage` parameter is applied to the full end-to-end route (origin swap, bridge step, and any destination swap where applicable). ## Integration Steps[​](#integration-steps "Direct link to Integration Steps") ### Step 1: Get a Quote[​](#step-1-get-a-quote "Direct link to Step 1: Get a Quote") For ERC20 & Native tokens, request a quote with all required parameters, including the option to enable manual routes. > **API Reference**: Quote Endpoint The `enableManual: true` parameter is **required** to receive manual routes in the response. Without this parameter, only auto routes will be returned. ```javascript theme={null} const BUNGEE_API_BASE_URL = "https://public-backend.bungee.exchange"; const quoteParamsERC20 = { userAddress: USER_ADDRESS, originChainId: 10, // Optimism destinationChainId: 42161, // Arbitrum inputToken: "0x0b2c639c533813f4aa9d7837caf62653d097ff85", // USDC on Optimism inputAmount: "10000000", // 10 USDC (with decimals) receiverAddress: RECEIVER_ADDRESS, outputToken: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", // USDC on Arbitrum enableManual: true, // Important: enables manual routes }; async function getQuote(params) { const url = `${BUNGEE_API_BASE_URL}/api/v1/bungee/quote`; const queryParams = new URLSearchParams(params); const queryUrl = `${url}?${queryParams}`; const response = await fetch(queryUrl); const data = await response.json(); const serverReqId = response.headers.get("server-req-id"); if (!data.success) { throw new Error( `Quote error: ${data.statusCode}: ${data.message}. server-req-id: ${serverReqId}` ); } if (!data.result.manualRoutes || data.result.manualRoutes.length === 0) { throw new Error( `No manual routes available. server-req-id: ${serverReqId}` ); } return { manualRoutes: data.result.manualRoutes, completeResponse: data, serverReqId, }; } ``` ### Step 2: Build the Transaction from Selected Route[​](#step-2-build-the-transaction-from-selected-route "Direct link to Step 2: Build the Transaction from Selected Route") The quote response contains multiple manual routes. Select one and build the transaction data by submitting the quote ID of the selected route. > **API Reference**: Build Transaction Endpoint ```javascript theme={null} // After getting the quote response with manualRoutes const { manualRoutes } = await getQuote(quoteParamsERC20); // Inspect the manualRoutes array and let the user pick a route // For example, selecting the first route: const chosenManualRoute = manualRoutes[0]; // Extract the quoteId from the chosen manual route const quoteId = chosenManualRoute.quoteId; // Build the transaction using the quoteId async function buildTransaction(quoteId) { const response = await fetch( `${BUNGEE_API_BASE_URL}/api/v1/bungee/build-tx?quoteId=${quoteId}` ); const data = await response.json(); const serverReqId = response.headers.get("server-req-id"); if (!data.success) { throw new Error( `Build TX error: ${data.statusCode}: ${data.message}. server-req-id: ${serverReqId}` ); } // The build-tx response contains txData, approvalData, and requestHash return data.result; } // Call build-tx to get the transaction data const buildResult = await buildTransaction(quoteId); const txData = buildResult.txData; // Transaction data to execute const requestHash = buildResult.requestHash; // Use this for status checking ``` ### Step 3: Handle Token Approvals (if needed)[​](#step-3-handle-token-approvals-if-needed "Direct link to Step 3: Handle Token Approvals (if needed)") Check if the token needs to be approved for spending and create an approval transaction if required. Approval data is included in the build transaction response. ```js theme={null} const ERC20_ABI = parseAbi([ "function approve(address spender, uint256 amount) returns (bool)", "function allowance(address owner, address spender) view returns (uint256)", ]); async function buildApprovalTransaction(chainId, approvalData) { // Check current allowance const currentAllowance = await publicClient.readContract({ address: approvalData.tokenAddress, abi: ERC20_ABI, functionName: "allowance", args: [approvalData.userAddress, approvalData.spenderAddress], }); // If allowance is sufficient, no approval needed if (currentAllowance >= BigInt(approvalData.amount)) { return null; } // Create approval transaction data const data = encodeFunctionData({ abi: ERC20_ABI, functionName: "approve", args: [approvalData.spenderAddress, approvalData.amount], }); return { to: approvalData.tokenAddress, data, chainId: chainId, value: "0x00", }; } ``` ### Step 4: Execute the Transactions[​](#step-4-execute-the-transactions "Direct link to Step 4: Execute the Transactions") From the build transaction response, you can get the transaction data and send it to the blockchain. ```js theme={null} async function sendTransaction(txData) { const hash = await walletClient.sendTransaction({ to: txData.to, data: txData.data, value: txData.value ? BigInt(txData.value) : BigInt(0), }); const receipt = await publicClient.waitForTransactionReceipt({ hash }); return { hash, receipt }; } ``` If routing via Stargate, include a `msg.value` equal to the `protocolFees.amount` and ensure the address has enough native tokens to cover it. ### Step 5: Monitor the Transaction Status[​](#step-5-monitor-the-transaction-status "Direct link to Step 5: Monitor the Transaction Status") After submitting the request, check its status to track progress. > **API Reference**: Status Endpoint ```javascript theme={null} async function checkStatus(requestHash) { const response = await fetch( `${BUNGEE_API_BASE_URL}/api/v1/bungee/status?requestHash=${requestHash}` ); const data = await response.json(); const serverReqId = response.headers.get("server-req-id"); if (!data.success) { throw new Error( `Status error: ${data.statusCode}: ${data.message}. server-req-id: ${serverReqId}` ); } return data.result; } async function pollForCompletion( requestHash, interval = 5000, maxAttempts = 60 ) { let attempts = 0; while (attempts < maxAttempts) { const status = await checkStatus(requestHash); const code = status[0]?.bungeeStatusCode; // Terminal success states if (code === 3) { // FULFILLED return status; } if (code === 4) { // SETTLED return status; } // Terminal failure states if (code === 5) { // EXPIRED throw new Error(`Request expired. Status: ${JSON.stringify(status)}`); } if (code === 6) { // CANCELLED throw new Error(`Request cancelled. Status: ${JSON.stringify(status)}`); } if (code === 7) { // REFUNDED throw new Error(`Request refunded. Status: ${JSON.stringify(status)}`); } attempts++; await new Promise((resolve) => setTimeout(resolve, interval)); } throw new Error("Polling timed out. Transaction may not have completed."); } ``` For a detailed explanation of all status codes, see the [Request Status Codes](/integrate/integration-guides/status-codes) guide. ## Complete Integration Example (ERC20)[​](#complete-integration-example-erc20 "Direct link to Complete Integration Example (ERC20)") ```javascript theme={null} import { createPublicClient, createWalletClient, http } from "viem"; import { privateKeyToAccount } from "viem/accounts"; import { optimism } from "viem/chains"; // Check if PRIVATE_KEY is set, set in console, i.e.: export PRIVATE_KEY= if (!process.env.PRIVATE_KEY) { console.error("Error: PRIVATE_KEY environment variable is not set"); console.error( "Example: export PRIVATE_KEY=" ); process.exit(1); } // Create account from private key const normalizedPrivateKey = process.env.PRIVATE_KEY.startsWith("0x") ? process.env.PRIVATE_KEY : `0x${process.env.PRIVATE_KEY}`; const account = privateKeyToAccount(normalizedPrivateKey); const publicClient = createPublicClient({ chain: optimism, transport: http(), }); const walletClient = createWalletClient({ account, chain: optimism, transport: http(), }); // API and token parameters const BUNGEE_API_BASE_URL = "https://public-backend.bungee.exchange"; // Quote parameters for ERC20 token transfer (USDC from Optimism to Arbitrum) const quoteParamsERC20 = { userAddress: account.address, receiverAddress: account.address, originChainId: 10, // Optimism destinationChainId: 42161, // Arbitrum inputToken: "0x0b2c639c533813f4aa9d7837caf62653d097ff85", // USDC on Optimism outputToken: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", // USDC on Arbitrum inputAmount: "10000000", // 10 USDC (with decimals) enableManual: true, // Important: enables manual routes }; async function getQuote(params) { try { const url = `${BUNGEE_API_BASE_URL}/api/v1/bungee/quote`; const queryParams = new URLSearchParams(params); const fullUrl = `${url}?${queryParams}`; const response = await fetch(fullUrl); const data = await response.json(); if (!data.success) { throw new Error(`Quote error: ${data.error?.message || "Unknown error"}`); } if (!data.result.manualRoutes || data.result.manualRoutes.length === 0) { throw new Error("No manual routes available"); } return { manualRoutes: data.result.manualRoutes, fullResponse: data, }; } catch (error) { console.error("Failed to get quote:", error); throw error; } } // Function to build transaction from quote ID async function buildTransaction(quoteId) { try { const response = await fetch( `${BUNGEE_API_BASE_URL}/api/v1/bungee/build-tx?quoteId=${quoteId}` ); const data = await response.json(); if (!data.success) { throw new Error( `Build TX error: ${data.error?.message || "Unknown error"}` ); } return data.result; } catch (error) { console.error("Failed to build transaction:", error); throw error; } } // Function to submit the ERC20 transaction async function submitERC20Transaction(txData) { try { console.log("- Submitting transaction to inbox contract..."); console.log(" To:", txData.to); console.log(" Value:", txData.value); console.log(" Data:", txData.data); // Send the transaction const hash = await walletClient.sendTransaction({ to: txData.to, value: BigInt(txData.value), data: txData.data, }); console.log("- Transaction sent:", hash); // Wait for transaction to be mined const receipt = await publicClient.waitForTransactionReceipt({ hash }); console.log("- Transaction mined in block:", receipt.blockNumber); return { hash, receipt, }; } catch (error) { console.error("Failed to submit transaction:", error); throw error; } } // Function to check the status of a request async function checkStatus(requestHash) { try { const response = await fetch( `${BUNGEE_API_BASE_URL}/api/v1/bungee/status?requestHash=${requestHash}` ); const data = await response.json(); if (!data.success) { throw new Error( `Status error: ${data.error?.message || "Unknown error"}` ); } return data.result[0]; } catch (error) { console.error("Failed to check status:", error); throw error; } } async function main() { try { console.log("Starting Bungee ERC20 Token Test (Manual Route)..."); // Step 1: Get the quote with manual routes console.log("\n1. Getting quote with manual routes..."); const { manualRoutes } = await getQuote(quoteParamsERC20); if (!manualRoutes || manualRoutes.length === 0) { throw new Error("No manual routes available"); } // Step 2: Select a route (using the first route as an example) console.log("\n2. Selecting route..."); const selectedRoute = manualRoutes[0]; const quoteId = selectedRoute.quoteId; console.log("- Selected Quote ID:", quoteId); console.log("- Available routes:", manualRoutes.length); // Step 3: Build the transaction from the selected route console.log("\n3. Building transaction..."); const buildResult = await buildTransaction(quoteId); const txData = buildResult.txData; const approvalData = buildResult.approvalData; const requestHash = buildResult.requestHash; // Step 4: Handle token approvals if needed if (approvalData) { console.log("\n4. Handling token approvals..."); // For ERC20 tokens, approvals are required before transfer // Check current allowance and create approval transaction if needed console.log("- Approval required:", approvalData); // TODO: Implement approval transaction if needed } else { console.log("\n4. No approvals required"); } // Step 5: Submit the transaction console.log("\n5. Submitting transaction..."); const { hash, receipt } = await submitERC20Transaction(txData); console.log( "\n6. Transaction submitted:", "\n- Hash:", hash, "\n- Status:", receipt.status ); console.log("- Request Hash:", requestHash); // Step 6: Poll for completion // Terminal states: 3 = FULFILLED, 4 = SETTLED (success), 5 = EXPIRED, 6 = CANCELLED, 7 = REFUNDED (failure) console.log("\n7. Polling for completion..."); const TERMINAL_SUCCESS = [3, 4]; const TERMINAL_FAILURE = [5, 6, 7]; const TERMINAL_STATES = [...TERMINAL_SUCCESS, ...TERMINAL_FAILURE]; let status; do { await new Promise((resolve) => setTimeout(resolve, 5000)); console.log("Checking status..."); try { status = await checkStatus(requestHash); console.log("- Status code:", status.bungeeStatusCode); } catch (error) { console.error( "Failed to check status:", error?.message || "Unknown error" ); } } while (!TERMINAL_STATES.includes(status?.bungeeStatusCode)); // Handle terminal states if (TERMINAL_SUCCESS.includes(status?.bungeeStatusCode)) { console.log( "\n8. Transaction complete:", "\n- Hash:", status.destinationData?.txHash || "Transaction hash not available" ); } else { const statusNames = { 5: "EXPIRED", 6: "CANCELLED", 7: "REFUNDED" }; console.error( "\n8. Transaction failed:", `\n- Status: ${statusNames[status?.bungeeStatusCode]} (${status?.bungeeStatusCode})`, "\n- Details:", JSON.stringify(status, null, 2) ); throw new Error(`Request ${statusNames[status?.bungeeStatusCode]}`); } } catch (error) { console.error("Error in processing:", error?.shortMessage || error.message); throw error; } } // Execute the main function main(); ``` # Request status codes Source: https://docs.bungee.exchange/integrate/integration-guides/status-codes When submitting requests with Bungee, monitoring the status of requests is essential. This is an explainer of the different status codes returned by the Bungee API and how to interpret them. > **API Reference**: Status Endpoint ## Checking Request Status[​](#checking-request-status "Direct link to Checking Request Status") You can use the Bungee API endpoint to check the status of a request from Bungee Auto transactions and Bungee Manual crosschain swaps. The request hash can be either: * The `requestHash` returned from a submit request (for Auto routes) * The transaction hash (for Manual routes) ```javascript theme={null} const BUNGEE_API_BASE_URL = "https://public-backend.bungee.exchange"; async function checkStatus(requestHash) { try { const response = await fetch( `${BUNGEE_API_BASE_URL}/api/v1/bungee/status?requestHash=${requestHash}` ); const data = await response.json(); if (!data.success) { const serverReqId = response.headers.get("server-req-id"); throw new Error( `Status error: ${data.statusCode}: ${data.message}. server-req-id: ${serverReqId}` ); } // It returns an array since we can have multiple requests in one requestHash return data.result[0]; } catch (error) { console.error("Failed to check status:", error); throw error; } } ``` ### Manual samechain swaps[​](#manual-samechain-swaps "Direct link to Manual samechain swaps") For Bungee Manual samechain swaps, the swap is executed in the same onchain transaction you submit. Check the receipt status to determine success. ```javascript theme={null} // Example using viem import { createPublicClient, http } from "viem"; import { ethereum } from "viem/chains"; const client = createPublicClient({ chain: ethereum, transport: http() }); async function checkManualSameChainTx(hash) { const receipt = await client.waitForTransactionReceipt({ hash }); if (!receipt) { throw new Error("Transaction not found"); } if (receipt.status !== "success") { throw new Error("Transaction failed/reverted"); } return receipt; } ``` ## Status Code Enum[​](#status-code-enum "Direct link to Status Code Enum") Bungee uses the following enum to represent the status of a request. These status codes are returned in the `bungeeStatusCode` field of the status response: ```typescript theme={null} export enum RequestStatusEnum { PENDING = 0, ASSIGNED = 1, EXTRACTED = 2, FULFILLED = 3, SETTLED = 4, EXPIRED = 5, CANCELLED = 6, REFUNDED = 7, } ``` ## Status Code Descriptions[​](#status-code-descriptions "Direct link to Status Code Descriptions") ### PENDING (0)[​](#pending-0 "Direct link to PENDING (0)") The request has been submitted to the Bungee Auto system but has not yet been picked up by a solver. This is the initial state of all requests. ### ASSIGNED (1)[​](#assigned-1 "Direct link to ASSIGNED (1)") A solver has been assigned to the request and is working on it. The solver is preparing to execute the request. ### EXTRACTED (2)[​](#extracted-2 "Direct link to EXTRACTED (2)") The solver has extracted the funds from the source chain and is in the process of executing the request. ### FULFILLED (3)[​](#fulfilled-3 "Direct link to FULFILLED (3)") The request has been successfully executed on the destination chain. The funds have been delivered to the recipient address. ### SETTLED (4)[​](#settled-4 "Direct link to SETTLED (4)") The request has been fully settled, meaning all operations have been completed and confirmed on both chains. ### EXPIRED (5)[​](#expired-5 "Direct link to EXPIRED (5)") The request has expired because it was not processed within the specified time limit. This could happen if no solver was available or if there were network issues. ### CANCELLED (6)[​](#cancelled-6 "Direct link to CANCELLED (6)") The request was cancelled, either by the user or by the system. ### REFUNDED (7)[​](#refunded-7 "Direct link to REFUNDED (7)") The refund has been processed and the funds have been sent to the user's address. The `refund` object contains details about the transaction hash and chain ID. **Refund recipient:** * If refunded on the source chain: * Onchain: Funds are sent to the `msg.sender` of the `createRequest` transaction * API: Funds are sent to the user address if submitted via `submit` endpoint * If refunded on the destination chain: Funds are sent to the `receiver` address ## Example Implementation with Polling[​](#example-implementation-with-polling "Direct link to Example Implementation with Polling") Here's an example of how to poll for status updates until a transaction is complete: ```javascript theme={null} // For Auto routes (using requestHash from submission) let status; const terminalStates = [3, 4, 5, 6, 7]; // FULFILLED, SETTLED, EXPIRED, CANCELLED, REFUNDED do { await new Promise((resolve) => setTimeout(resolve, 5000)); // Wait 5 seconds between checks console.log("Checking status..."); try { status = await checkStatus(submitResult.requestHash); console.log("Status details:", status.bungeeStatusCode); } catch (error) { console.error("Failed to check status:", error?.message || "Unknown error"); } } while (!status || !terminalStates.includes(status.bungeeStatusCode)); // Handle terminal states if (status) { const code = status.bungeeStatusCode; if (code === 3) { // FULFILLED console.log( "Transaction complete:", "\n- Hash:", status.destinationData?.txHash || "Transaction hash not available" ); } else if (code === 4) { // SETTLED console.log("Transaction settled:", status.destinationData?.txHash || "Transaction hash not available"); } else if (code === 5) { // EXPIRED console.log("Request expired. The request was not processed within the time limit."); } else if (code === 6) { // CANCELLED console.log("Request cancelled."); } else if (code === 7) { // REFUNDED console.log("Request refunded:", status.refund?.txHash || "Refund transaction hash not available"); } } ``` ```javascript theme={null} // For Manual routes (using transaction hash) let status; const terminalStates = [3, 4, 5, 6, 7]; // FULFILLED, SETTLED, EXPIRED, CANCELLED, REFUNDED do { await new Promise((resolve) => setTimeout(resolve, 5000)); // Wait 5 seconds between checks console.log("Checking status..."); try { status = await checkStatus(transactionHash); console.log("Status details:", status?.bungeeStatusCode || "Pending"); } catch (error) { console.error("Failed to check status:", error?.message || "Unknown error"); } } while (!status || !terminalStates.includes(status.bungeeStatusCode)); // Handle terminal states if (status) { const code = status.bungeeStatusCode; if (code === 3) { // FULFILLED console.log( "Transaction complete:", "\n- Hash:", status.destinationData?.txHash || "Transaction hash not available" ); } else if (code === 4) { // SETTLED console.log("Transaction settled:", status.destinationData?.txHash || "Transaction hash not available"); } else if (code === 5) { // EXPIRED - terminal failure const errorMessage = `Request expired (status code: ${code}). The request was not processed within the time limit. Status details: ${JSON.stringify(status)}`; console.error(errorMessage); throw new Error(errorMessage); } else if (code === 6) { // CANCELLED - terminal failure const errorMessage = `Request cancelled (status code: ${code}). Status details: ${JSON.stringify(status)}`; console.error(errorMessage); throw new Error(errorMessage); } else if (code === 7) { // REFUNDED - terminal failure const errorMessage = `Request refunded (status code: ${code}). Refund transaction hash: ${status.refund?.txHash || "not available"}. Status details: ${JSON.stringify(status)}`; console.error(errorMessage); throw new Error(errorMessage); } } ``` # Introduction Source: https://docs.bungee.exchange/integrate/integration-introduction Getting started with Bungee API integration Bungee's unified API makes crosschain token swaps simple. This page walks you through the integration process and helps you choose the right approach for your app. ## Integration flow Integrating Bungee Auto involves 4 steps: 1. **Get a quote**: Fetch quote pricing information 2. **Create a Request**: Prepare the request 3. **Submit a Request**: Submit the request either via the `submit` endpoint or onchain via the Inbox Contract 4. **Monitor status**: Track the Request status And that's it! Bungee Auto will handle the rest. See our [integration guides](/integrate/integration-guides) for step-by-step instructions on how to integrate Bungee into your application. Integrate Bungee via Permit2 for ERC20s Integrate Bungee via the BungeeInbox contract Integrate Bungee Manual for granular control Swap across EVM & Solana ## Link to Bungee Redirect users to Bungee with chain/tokens for transfers pre-selected. Users can then simply choose a route and start transferring with just a few clicks. ``` https://bungee.exchange/?originChainId=1&inputToken=0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee&destinationChainId=10&outputToken=0x0b2c639c533813f4aa9d7837caf62653d097ff85 ``` See the [Bungee Link](/integrate/bungee-link) documentation for more details and parameters. # Audits Source: https://docs.bungee.exchange/overview/audits Review Bungee security audits and published audit reports. # Brand Kit Source: https://docs.bungee.exchange/overview/brand-kit Access Bungee brand assets and usage guidelines. # Chain Support Source: https://docs.bungee.exchange/overview/chain-support Check which networks support Bungee Auto and Bungee Manual. This file has been auto-generated on 2026-04-10 This table shows which chains support Bungee Auto and Bungee Manual. | Chain | Bungee Auto | Bungee Manual | | ----------------------------------------------------- | ----------- | ------------- | | [Arbitrum](https://arbiscan.io) | ✅ | ✅ | | [Aurora](https://aurorascan.dev) | ❌ | ✅\* | | [Avalanche](https://snowtrace.io) | ✅ | ✅ | | [B3](https://explorer.b3.fun) | ❌ | ✅ | | [Base](https://basescan.org) | ✅ | ✅ | | [Berachain](https://berascan.com) | ✅ | ✅ | | [Binance Smart Chain](https://bscscan.com) | ✅ | ✅ | | [Blast](https://blastscan.io) | ✅ | ✅ | | [Ethereum](https://etherscan.io) | ✅ | ✅ | | [Fantom](https://explorer.fantom.network) | ✅ | ✅\* | | [Gnosis](https://gnosisscan.io) | ✅ | ✅ | | [Hyperevm](https://purrsec.com) | ✅ | ❌ | | [Ink](https://explorer.inkonchain.com) | ✅ | ✅ | | [Katana](https://katanascan.com) | ✅ | ❌ | | [Linea](https://lineascan.build) | ✅ | ✅ | | [Mantle](https://mantlescan.xyz) | ✅ | ✅ | | [Megaeth](https://mega.etherscan.io) | ✅ | ❌ | | [Mode](https://explorer.mode.network) | ✅ | ✅ | | [Monad](https://monadscan.com) | ✅ | ❌ | | [Optimism](https://optimistic.etherscan.io) | ✅ | ✅ | | [Plasma](https://plasmascan.to) | ✅ | ❌ | | [Plume](https://explorer.plume.org) | ✅ | ❌ | | [Polygon](https://polygonscan.com) | ✅ | ✅ | | [Polygon zkEVM](https://www.oklink.com/polygon-zkevm) | ❌ | ✅ | | [Scroll](https://scrollscan.com) | ✅ | ✅ | | [Sei](https://seistream.app) | ✅ | ❌ | | [Solana](https://solscan.io) | ✅ | ❌ | | [Soneium](https://soneium.blockscout.com) | ✅ | ❌ | | [Sonic](https://sonicscan.org) | ✅ | ✅ | | [Tron](https://tronscan.org) | ✅ | ❌ | | [Unichain](https://unichain.blockscout.com) | ✅ | ✅ | | [Worldchain](https://worldscan.org) | ✅ | ✅ | | [zkSync Era](https://explorer.zksync.io) | ❌ | ✅ | **Notice:** \*Aurora and Fantom have limited support and are being sunsetted. # Deposit Addresses Source: https://docs.bungee.exchange/overview/deposit-addresses Use Bungee deposit addresses to complete the origin transfer directly and route funds cross-chain. ## What Are Deposit Addresses? Deposit addresses let users bridge without connecting a wallet. Instead of initiating a bridge from a connected wallet, users send funds to a designated address provided by Bungee, and Bungee routes funds to the destination chain and delivers tokens to the user’s wallet after processing. This makes it easy to onboard users to a new chain or fund a destination wallet from sources like CEX withdrawals or fiat on-ramps. Once generated, a deposit address expires after 10 minutes and is valid for only a single deposit transaction. This flow is useful when you want: * A direct transfer flow from the source wallet * To support flows where wallet connection is unavailable or intentionally skipped * To onboard users onto a new chain with a single, simple “send to this address” step ## How It Works * **Depositing funds** The deposit transaction **requires no calldata**. You simply send the agreed amount to the deposit address returned by the API. As long as the amount covers the costs, it will be automatically bridged according to the route from the original quote. * **Gas and fee considerations** For **low-value transfers**, the gas costs overhead can be significant, so we generally do not recommend deposit addresses for low-value bridging. * **Post-deposit quote recalculation** After a deposit is detected, the quote is re-generated to account for gas price fluctuations and to recompute all fees. This means the final received amount may differ from the initial quote, but it will always respect the minimum amount specified. If the minimum amount cannot be achieved, the deposit amount is refunded on the origin chain. * **Refund behavior** Failures via deposit addresses are extremely rare, but still possible. By default, Bungee will automatically refund the funds on the origin chain to the `refundAddress` in your quote request. Any filling failure will then refund to this address. ## Common Use Cases * CEX withdrawals that should arrive on a different destination chain. * Fiat on-ramp to app onboarding where users should end up directly on the app’s preferred chain. * Embedded/headless flows where wallet connection is unavailable or intentionally skipped. ## Integration Guide For the full implementation details, including request/response formats and lifecycle handling, see the [Deposit route integration guide](/integrate/integration-guides/deposit). # Frequently Asked Questions Source: https://docs.bungee.exchange/overview/faq Find answers to common questions about Bungee, routing modes, and integrations. Bungee is a protocol that powers seamless swaps within and between blockchains. With over \$25B in volume processed and trusted by major wallets and dApps, Bungee provides efficient, secure, and accessible crosschain swaps through two routing modes: Auto and Manual. Bungee Manual Mode is integrated into major wallets and dApps, including: * [Coinbase Wallet](https://wallet.coinbase.com/) * [MetaMask](https://metamask.io/) * [Rabby](https://rabby.io/) * [Rainbow](https://rainbow.me/) Additionally, you can try out both routing modes at our official interface: * **Auto and Manual Modes**: [bungee.exchange](https://bungee.exchange) ## Routing Modes * **Auto Mode** automatically selects and executes the best route through a marketplace of competing offchain agents. Users just sign a message with their preferences. * **Manual Mode** provides multiple routes for users to choose from, giving control over route selection and execution. Read more about the modes in [Integration Guides](/integrate/integration-guides) Learn more about Auto Mode in our [Integration Guides](/integrate/integration-guides). See [Auto Mode Integration](/integrate/integration-guides/auto-permit2-gasless-requests) for detailed implementation steps. Additionally you can try out Auto Mode at [bungee.exchange](https://bungee.exchange). Learn more about Manual Mode in [Manual Mode Integration Guide](/integrate/integration-guides/manual) Additionally you can try out Manual Mode at [bungee.exchange](https://bungee.exchange). ## Integration Yes, Bungee Auto and Manual Mode are available for integration via APIs. See [Auto Mode Integration](/integrate/integration-guides/auto-permit2-gasless-requests) and [Manual Mode Integration](/integrate/integration-guides/manual-route-selection). The API Endpoints provide both Quotes for Bungee Auto and Routes for Bungee Manual. Bungee Auto is enabled by default while Bungee Manual can be enabled via parameter. Ready to integrate? Get started with Manual Mode [Integration Guide](/integrate/integration-guides/manual-route-selection) Yes, Bungee Auto is available for integration via APIs. See [Auto Mode Integration](/integrate/integration-guides). Yes, we are currently working on Bungee Widget, a component that allows you to use Auto Mode in your App. More information coming soon. ## Technical Questions Auto Mode uses a request-based execution system with off-chain signatures. For each swap, the following steps occur: 1. Get a quote for price estimation 2. Create and sign a request with your preferences 3. Off-chain agents compete to execute your request 4. The winning agent executes the swap 5. The transaction is settled and verified Learn more about Auto Mode integration in our [Integration Guides](/integrate/integration-guides). See [Auto Mode with Permit2](/integrate/integration-guides/auto-permit2-gasless-requests) or [Auto Mode Onchain](/integrate/integration-guides/auto-onchain-requests) for implementation details. Auto Mode has three types of agents: * **Fillers**: Have active capital across networks and fulfill requests * **Solvers**: Use passive staked capital to find and execute optimal routes * **Provers**: Whitelisted by BungeeDAO for secure native bridge integrations Both modes have protection mechanisms: * **Auto Mode**: Requests have timeouts and slippage protection. If execution fails, your funds remain safe in the source chain. * **Manual Mode**: Transactions are atomic, meaning they either complete successfully or revert entirely. ## Support * Discord Community: [Join our Discord](https://discord.com/invite/DrvfYq6fvc) * Twitter Updates: [@BungeeExchange](https://twitter.com/BungeeExchange) * Support: [Contact our support team directly via website](https://bungee.exchange) # Fees & Monetization Source: https://docs.bungee.exchange/overview/fees-monetization Bungee is free to use for third-party integrators and users alike. **For users,** Bungee does not charge any additional fees. For Bungee Auto, all onchain execution costs are covered within the quoted fees. When transactions are routed via other protocols, Bungee does not add any markup or hidden fees to the transaction. **For integrators,** Bungee does not charge a fee for using the API. However, integrations are free to implement fee charging for their own services. If you plan to implement fees, please request API access first. ## Implementing Fee Charging[​](#implementing-fee-charging "Direct link to Implementing Fee Charging") If you plan to implement fees in your integration, please follow these steps: 1. Request API access to ensure reliable service for your users 2. Review the [Charging Fees Guide](/integrate/integration-guides/additional-guides/charging-fees) for technical implementation details 3. Understand the fee parameters in the [Quote API Reference](/integrate/get-api-access) ## Next Steps[​](#next-steps "Direct link to Next Steps") Technical implementation of fees Request API access for production use Integrate Bungee Auto with fees Integrate Bungee Manual with fees # Incognito Mode Source: https://docs.bungee.exchange/overview/incognito Swap and bridge tokens without a direct on-chain link between your sending and receiving wallets. ## What is Incognito? Incognito brings practical privacy to Bungee. When enabled, your source and destination wallets are unlinked on-chain, so there's no direct on-chain link between them. Think of it like incognito mode in your browser: you just toggle it on and leave no traces. No special tokens to hold. No sign up. No workflow changes. Toggle it on and swap as usual. ## How It Works 1. **Toggle Incognito** on the Bungee app. 2. **Choose your route.** Select source and destination chains and tokens. You can pick the same token on the same chain (e.g. USDC on Arbitrum to USDC on Arbitrum) or bridge across chains, just like a regular swap. 3. **Enter a receiving address.** This is the key step. Use a different wallet from your sending address. The whole point of incognito is that there's no on-chain link between the two. 4. **Confirm the transaction.** Your funds are routed so the sending and receiving wallets are unlinked on-chain. Incognito is powered by [Houdini Swap](https://houdiniswap.com). Under the hood, transactions are routed through regulated centralized exchanges to break the on-chain link between wallets, subject to applicable compliance requirements. This isn't encryption, zero-knowledge proofs, or on-chain mixing. It's practical unlinking using the same infrastructure that already handles millions of transactions daily. Try out Incognito on the [Bungee app](https://bungee.exchange). ## Key Features * **One click.** No extra steps, no complicated setup. * **25+ chains & 100+ tokens.** Works across the networks and assets you already use. * **No KYC.** No identity verification required under normal circumstances. * **Compliant** — transactions are screened subject to applicable legal and compliance requirements and may trigger KYC or other checks depending on jurisdiction. ## Tracking Your Transaction After submitting an incognito swap, you'll receive an **Order ID**. Use this to track the status of your transaction. Since incognito routes break the on-chain link, standard block explorers won't show a direct connection between your wallets. The Order ID is your reference. Do not share it publicly. The Bungee App itself only stores that information locally on your browser. Please note that compliance requirements and KYC policies may vary by jurisdiction and are subject to change. ## FAQs ### Is this like Tornado Cash or mixing services? No. Incognito doesn't use on-chain mixing pools, zero-knowledge proofs, or encryption. It routes through centralized exchanges to unlink source and destination wallets. The exchanges involved are regulated and screen for illicit funds, so there's no risk of your funds being commingled with flagged wallets. ### Do I need KYC? No KYC is required under normal circumstances. However, if a transaction is flagged as suspicious by the compliance layer, KYC may be requested. If this happens, reach out to [Bungee support](https://discord.gg/DrvfYq6fvc) with your Order ID for assistance. ### How private is it? Incognito provides practical privacy. Your sending and receiving wallets are unlinked on-chain. The regulated exchanges involved in routing can see the transaction, similar to how your bank can see your transfers but the public can't. It's not total anonymity. For most users who just don't want every transfer publicly traceable, it's sufficient. ### How long does an incognito swap take? Timing depends on the chains and tokens involved, similar to regular Bungee swaps. Most transactions complete within 10-30 mins. The UI should show you an estimated time before you swap. ### Are there minimum or maximum amounts? Yes, some routes have min/max limits. The app will show these when you enter an amount outside the supported range. ### What if my transaction gets stuck? Use your Order ID to check status in the app. If it's been stuck for an extended period, reach out to [Bungee support](https://discord.gg/DrvfYq6fvc) with your Order ID. # Refuel Source: https://docs.bungee.exchange/overview/refuel Learn how Refuel adds destination-chain gas tokens during a Bungee swap. ### What is Refuel?[​](#what-is-refuel "Direct link to What is Refuel?") Users going to a new ecosystem frequently encounter the issue of lacking the native token required for transaction fees. Their options are limited to attempting to bridge the native token from a different blockchain. However, they often find that such small amounts are not feasible to be sent to the new chain and that this is an additional step after realizing the need or lack of native tokens on the new chain. For this reason, we have launched Refuel. Refuel is an optional addition to any swap to a chain. It ensures the user has the native token required for subsequent transactions on the destination chain. [Bungee Refuel](https://bungee.exchange/) integrates directly into the token bridging process, either via Bungee Auto or Bungee Manual. Simply toggle the Refuel option in the UI and receive the native token on the destination chain. Refuel ### How does Refuel work?[​](#how-does-refuel-work "Direct link to How does Refuel work?") Refuel operates in two modes: On Bungee Manual, Refuel adds native tokens from the source chain to the destination chain, even if the native tokens are not the same. A small amount will be sent alongside the swap and delivered with the output token to the user. On Bungee Auto it is even more convenient. Here no additional requirements for native input on the source chain is needed. All that is needed is taken from the input. A small amount will be used to fulfill the output plus some native token on the destination chain for further transactions. Refuel operates without charging any protocol fees. The only amount that is deducted from the amount sent to the user is for the gas fees incurred on the destination chain. ## Next Steps[​](#next-steps "Direct link to Next Steps") Add Refuel with Bungee Auto # Gasless Transactions Source: https://docs.bungee.exchange/overview/routing-methods/permit2 Bungee Auto uses Permit2 to enable efficient token transfers, while Bungee Manual uses traditional approvals. This page explains how token approvals work, your options, and important security considerations. ## Comparison of Token Approvals[​](#comparison-of-token-approvals "Direct link to Comparison of Token Approvals") | Aspect | Traditional Approvals (Bungee Manual) | Permit2 Approvals (Bungee Auto) | | ------------ | ------------------------------------------------------ | ------------------------------------------------------------------------------ | | **Gas Cost** | Two transactions needed (approve + transfer) | One-time approval, then gasless signatures | | **Control** | Basic approve amount and revoke onchain | Fine-grained with expiration times | | **Security** | Unlimited approvals can be used to transfer any amount | Unlimited approvals to permit2 contract cannot transfer without your signature | See [Uniswap Permit2](https://github.com/Uniswap/permit2) for technical details. ## How Signatures Work[​](#how-signatures-work "Direct link to How Signatures Work") Each signature for a Permit2 transfer includes: * **Token Details**: Address and amount * **Expiration Time**: When the signature becomes invalid * **Nonce**: Ensures signatures can't be reused * **Chain ID**: Prevents crosschain replay attacks ## How Bungee Uses Permit2[​](#how-bungee-uses-permit2 "Direct link to How Bungee Uses Permit2") Bungee Auto integrates Permit2 to create a better user experience: 1. Initial Setup: * Approve Permit2 for your tokens * Choose between limited or unlimited approval amounts 2. For Each Transfer: * Sign a message specifying exact amount and expiration * No gas needed for approval * Transfer only happens with your signature 3. Security Features: * Each signature has an expiration time * Signatures specify exact amounts * Transfers require explicit approval ## Approval Options[​](#approval-options "Direct link to Approval Options") Permit2 supports two approval methods: 1. **Limited**: Approve specific amounts. Requires new onchain approval for each request, using more gas. 2. **Unlimited**: One-time approval. Future requests only need signatures, saving gas. # Comparison Source: https://docs.bungee.exchange/overview/routing-methods/routing-methods Bungee offers two routing modes: Auto and Manual. Here's how these modes differ and what this means for you. ## Auto Mode[​](#auto-mode "Direct link to Auto Mode") **Auto Mode** is the new advanced routing mode, enabling users to just specify their preferences upfront via a gasless signature and Bungee automatically selects the best route and executes it onchain. Bungee Auto is designed to maximise efficiency, security and UX. Bungee Auto plugs into a vast marketplace of fillers, solvers and provers to provide best chain-abstracted swap execution to end users. Auto Mode ## Manual Mode[​](#manual-mode "Direct link to Manual Mode") **Manual Mode** surfaces multiple routes for users/integrators to choose from. You will need to manually select and execute those routes depending on what your preferences are and also send transactions. Manual Mode surfaces routes that include swapping-providers and bridging-providers integrated by Bungee Team on supported networks. It's a battle-tested solution with a proven track record. Manual Mode ## Key Differences[​](#key-differences "Direct link to Key Differences") ### Features Comparison[​](#features-comparison "Direct link to Features Comparison") | **Feature** | **Manual Mode** | **Auto Mode** | | ------------------------------ | ---------------------------------------------------------------------- | ----------------------------------------------------------------------------- | | **Asset Support** | Limited to bridge-supported tokens | Any token | | **Swap Support** | Only on source atomically, second transaction on destination if needed | Direct any-to-any token transfers | | **Smart Contract Integration** | Limited due to offchain API reliance | Direct integration possible | | **Chain Support** | Limited to existing bridges and DEXs | Any chain can be supported from day one | | **Bridge Integration** | Every bridge and dex needs to be integrated manually by Manual Mode | Marketplace offers to directly join | | **Security** | Dependent on individual bridge security | Protocol-level guarantees | | **Gas Management** | Manual handling required | [No gas required, offchain signature only](/overview/routing-methods/permit2) | ## Continue Reading[​](#continue-reading "Direct link to Continue Reading") Automated swaps with optimal routing Custom routes with manual route selection Integrate Bungee Start building with Bungee # Statistics Source: https://docs.bungee.exchange/overview/statistics View Bungee usage and volume statistics on DefiLlama. # API Status Source: https://docs.bungee.exchange/overview/status-api Check the current status and uptime of Bungee services. # Reach out to us Source: https://docs.bungee.exchange/overview/support Reach out to us for support and help. Open a ticket in our webapp via the chat widget in the bottom right corner. Open a ticket in our Discord server. # Terms of Use Source: https://docs.bungee.exchange/overview/tou Terms of Use for Bungee **SOCKET TECHNOLOGIES LIMITED** **TERMS OF USE** *Last updated: March 2nd, 2026* Socket Technologies Limited · Craigmuir Chambers, Road Town, Tortola, VG 1110, British Virgin Islands Socket Technologies Limited, a company incorporated in the British Virgin Islands ("Socket," "we," "our," or "us"), operates a cross-chain bridging and digital asset routing platform. "Socket" consists of: (i) our website and developer documentation located at bungee.exchange, socket.tech and docs.bungee.exchange (the "Socket Website"); (ii) the Bungee API (hosted application programming interfaces for building cross-chain and bridging applications); (iii) the Bungee SDK and any developer toolkits; and (iv) any underlying smart contracts and open-source protocol components (collectively, the "Functionalities"). Details on the components of Bungee can be found at docs.bungee.exchange. These Terms of Use (the "Terms") govern your relationship with Socket and your use of any of the Functionalities, whether you are accessing the Bungee Website as an end user, integrating the Bungee API into your own product or platform as a developer or business (an "Integrator"), or interacting with Socket's open-source protocol components. Please read these Terms and our carefully. By using any of the Functionalities, you agree to be bound by these Terms, which is incorporated herein by reference. If you do not agree completely to these Terms, do not use any of the Functionalities. If you access or use any of the Functionalities on behalf of a legal entity: (a) all references to "you" throughout these Terms include that entity; (b) you represent that you are authorised to accept these Terms on that entity's behalf; and (c) in the event you or the entity violates these Terms, the entity agrees to be responsible to us. > **ARBITRATION NOTICE:** THESE TERMS CONTAIN A BINDING INDIVIDUAL ARBITRATION AGREEMENT AND CLASS ACTION WAIVER IN SECTION 15 (DISPUTE RESOLUTION). THIS AFFECTS YOUR RIGHTS — DISPUTES MAY BE REQUIRED TO BE RESOLVED IN BINDING, INDIVIDUAL ARBITRATION RATHER THAN IN COURT, AND YOU MAY NOT BE ABLE TO HAVE CLAIMS RESOLVED BY A JURY OR AS A CLASS. PLEASE READ SECTION 15 CAREFULLY. YOU HAVE THE RIGHT TO OPT OUT OF ARBITRATION WITHIN 30 DAYS OF FIRST ACCEPTING THESE TERMS AS SET OUT IN SECTION 15.7. *** ## 1. Eligibility **1.1** **Age and Legal Capacity.** You must be at least the age of majority in your jurisdiction (and in any event at least eighteen (18) years of age) to access or use any of the Functionalities. By accessing or using any of the Functionalities, you represent that you meet this requirement and have the full right, power, and authority to enter into and comply with these Terms. **1.2** **Sanctions and Restricted Persons.** You further represent and warrant that you are not: (a) the subject of economic or trade sanctions administered or enforced by any governmental authority, or otherwise designated on any list of prohibited or restricted parties, including the list maintained by the Office of Foreign Assets Control of the U.S. Department of the Treasury ("OFAC"); (b) located, ordinarily resident, organised, established, or domiciled in any Restricted Jurisdiction (as defined in Schedule 1); or (c) engaged in or facilitating any business involving illegal or controlled products or services, including firearms, explosives, drugs, money laundering, terrorist financing, human trafficking, or any other activity that is illegal, dangerous, or harmful under applicable law. **1.3** **No VPN Circumvention.** You will not, and will not permit any person, use a virtual private network, proxy, or other technology to circumvent any geographic restriction or access control applicable to the Functionalities. **1.4** **Jurisdictional Availability.** Socket does not represent that the Functionalities are appropriate or available for use in all jurisdictions, including the United States, and may restrict access where required for legal or regulatory reasons. It is your responsibility to ensure that your access to and use of the Functionalities complies with all laws and regulations applicable to you in your jurisdiction. *** ## 2. Intellectual Property **2.1** **Socket Ownership.** You acknowledge and agree that Socket owns all legal right, title, and interest in: (i) the Socket Website and any contents made available on it, including software, text, images, trademarks, service marks, and trade names; (ii) the Bungee API; (iii) any developer toolkits and SDKs; and (iv) all corrections, bug fixes, enhancements, updates, improvements, or modifications to any of the foregoing (collectively, "Socket Materials"). Socket Materials are protected by intellectual property laws, international conventions, and applicable laws worldwide. **2.2** **Licence to You.** Subject to your compliance with these Terms, Socket grants you a limited, personal, non-exclusive, non-transferable, non-assignable, fully revocable licence to access and use the Functionalities solely for your own personal or internal business purposes or, if you are an Integrator, to integrate the Bungee API into your own product or platform for distribution to your own end users, provided that such distribution and use complies with these Terms and all applicable laws. This licence does not give you any ownership rights in Socket or the Socket Materials, and confers no right to sublicense, resell, or otherwise distribute the Bungee API or any data derived therefrom as a standalone product or service without our prior written consent. **2.3** **Data Use Restriction.** Any data provided to you through any of the Functionalities is for your personal or internal business use only. You may incorporate such data into your own product or service for use by your own end users, provided that such use complies with these Terms. You may not offer such data as a standalone product or service, or permit third parties to access or use such data outside of your own product or service, without our prior written consent. **2.4** **Open Source Components.** Certain components of Socket, including underlying smart contract code and protocol software, may be open-source software. Your use of any such open-source components is additionally governed by the applicable open-source licence terms. Nothing in these Terms limits or restricts your rights under any applicable open-source licence; equally, nothing in any open-source licence limits Socket's rights under these Terms with respect to the Socket Materials. **2.5** **No Implied Rights.** All rights not expressly granted are reserved by Socket. No licence is granted under these Terms by implication, estoppel, or otherwise, under any patent, copyright, trade secret, trademark, or other intellectual property right. Nothing herein shall be deemed to authorise you to use Socket's trademarks or trade names in any advertising, marketing, promotional, or related materials without Socket's prior written consent. **2.6** **Feedback.** You may voluntarily submit questions, comments, suggestions, ideas, or other information about the Functionalities ("Feedback") to us, including through third-party channels such as Discord or GitHub. By submitting any Feedback, you hereby irrevocably grant to Socket and its affiliates a worldwide, perpetual, irrevocable, royalty-free, fully sublicensable licence to use, reproduce, modify, adapt, publish, translate, create derivative works from, distribute, perform, and display such Feedback in any media and in any format now known or later developed, and to incorporate the Feedback into any of Socket's technology or products. You understand that Socket may treat Feedback as non-confidential. *** ## 3. Self-Custodial Nature; No Financial Services **3.1** **Non-Custodial Operation.** The Functionalities operate on a strictly non-custodial basis. Socket does not at any time take possession of, hold, or exercise control over your digital assets, tokens, private keys, or other property. You retain full and continuous possession, custody, and control of your digital assets and private keys at all times. Socket will never ask you for the private key to any wallet you connect to the Functionalities, and you are solely responsible for any disclosure of your private keys. Socket is not and does not become a custodian or counterparty to any transaction executed through or in connection with the Functionalities. **3.2** **No Fiduciary Duties.** Socket does not have a fiduciary relationship or obligation to you regarding any decisions or activities you engage in when using the Functionalities. These Terms do not create or impose any fiduciary duties on Socket. To the fullest extent permitted by applicable law, you acknowledge and agree that Socket owes no fiduciary duties or liabilities to you or any other party, and that to the extent any such duties or liabilities may exist at law or in equity, those duties and liabilities are hereby irrevocably disclaimed, waived, and eliminated. **3.3** **No Financial Services.** Socket does not provide, and the Functionalities do not constitute, any regulated financial service, including brokerage, exchange, payment services, investment advisory, or portfolio management services. Socket merely provides infrastructure for user-initiated, non-custodial transactions. **3.4** **No Investment Advice.** All transactions you submit through the Functionalities are unsolicited, meaning you have not received investment advice from Socket in connection with any such transaction. All information provided through the Functionalities is for informational purposes only and should not be construed as legal, financial, tax, or other professional advice. You should not take, or refrain from taking, any action based solely on information provided through the Functionalities. **3.5** **Third-Party Protocols.** The Functionalities route transactions through third-party bridging protocols, decentralised exchanges, and other blockchain-based services ("Third-Party Protocols"). Socket does not control, operate, or maintain any Third-Party Protocol. Socket disclaims all liability for any Third-Party Protocol, including for its availability, reliability, security, or operability. All transactions executed by Third-Party Protocols are exclusively initiated by you. Socket does not conduct a suitability review of any such transactions. **3.6** **No Support Obligations.** Socket has no maintenance, update, or support obligations with respect to any of the Functionalities. Any updates to the Functionalities may change the requirements necessary to use them, and you are responsible for any necessary actions, including updating software or hardware. Socket is not responsible for any loss or harm related to your inability to access or use any of the Functionalities. *** ## 4. Integrator Obligations **4.1** This Section 4 applies to you if you are an Integrator — meaning you access the Bungee API or SDK for the purpose of integrating the Functionalities into your own product, platform, or service for use by your own end users. **4.2** **Independent Integration.** When you integrate the Functionalities into your platform and make them accessible to your own end users, you will undertake sufficient measures to inform those end users (for example, through appropriate language in your own terms and conditions or end-user-facing documentation) that: (i) you provide this integration independently and without association to Socket; (ii) the Socket smart contracts and any smart contracts based thereon are non-custodial; (iii) such smart contracts route to Third-Party Protocols that execute the transactions initiated by your end users; and (iv) Socket does not warrant the availability, reliability, or operability of such Third-Party Protocols at any time. **4.3** **No Downstream Contractual Relationship.** Integration of the Functionalities into your platform and use of such integration by your end users does not establish any contractual relationship between Socket and those end users. You are solely responsible for your relationship with your end users, including all applicable terms of service, privacy policies, and regulatory compliance obligations. **4.4** **Implementation Responsibility.** You are fully responsible for ensuring the appropriate and successful implementation, configuration, integration, maintenance, and operation of the Functionalities within your platform, considering the specific requirements, constraints, and objectives of your business operations. You are solely responsible for ensuring that your integration complies with all applicable laws and regulations and does not infringe the rights, including intellectual property rights, of any third party. **4.5** **API Credential Security.** You shall treat all API keys, credentials, tokens, and access credentials provided by Socket ("API Credentials") as strictly confidential. You shall: (a) store API Credentials securely and not expose them in client-side code, public repositories, or any publicly accessible location; (b) restrict access to API Credentials to those of your personnel who have a legitimate need; (c) promptly notify Socket at [legal@socket.tech](mailto:legal@socket.tech) upon becoming aware of any actual or suspected unauthorised access to or disclosure of API Credentials; and (d) not transfer, share, or sublicense API Credentials to any third party without Socket's prior written consent. **4.6** **Cease Use on Request.** You undertake, upon Socket's reasonable written request, to immediately cease use of the Functionalities and delete any integration of the Bungee API if Socket determines this is necessary to protect its services, IT infrastructure, or business against immediate harm, damages, or legal risk. *** ## 5. Privacy and Data **5.1** **Privacy.** Socket collects, uses, and discloses information about you in connection with your use of the Functionalities. By using the Functionalities, you acknowledge that Socket may collect certain information as described in this Section 5, including technical data, wallet addresses, and transaction data, and that Socket will handle such information responsibly and in accordance with applicable law. **5.2** **Wallet Data.** When you connect a digital asset wallet to the Functionalities, Socket may collect on-chain data related to your wallet address, including transaction hashes and token balances. This data is publicly available on the relevant blockchain. Socket will never ask you for your private key, seed phrase, or wallet password, and you are solely responsible for the security of those credentials. **5.3** **Data Security.** Socket employs administrative, physical, and technical safeguards designed to protect your data from unauthorised access, disclosure, and use, including industry-standard encryption for data transmission and storage. In the event of a security breach affecting your data, Socket will notify you as required by applicable law and take reasonable steps to limit and remediate the breach. **5.4** **Data Protection Compliance.** Each party will comply with all privacy and data protection laws applicable to its processing of personal data in connection with the Functionalities. If you are an Integrator, you are independently responsible for complying with all data protection laws applicable to your collection and processing of your end users' personal data. *** ## 6. Prohibited Conduct **6.1** You agree not to engage in any of the following conduct (each a "Prohibited Activity") with respect to any of the Functionalities: * **(a) Unlawful or Fraudulent Activity.** Any activity that is illegal, fraudulent, deceptive, or harmful, including: (i) money laundering, terrorist financing, fraud, theft, or any other financial crime; (ii) purchasing, selling, or distributing illegal goods or services; (iii) evading, avoiding, or violating any applicable tax, sanctions, or regulatory requirement; or (iv) infringing, misappropriating, or violating the intellectual property, privacy, or proprietary rights of any person. * **(b) Sanctions Violations.** Transacting with, transferring assets to or from, or otherwise engaging with any person, entity, or jurisdiction that is the subject of applicable sanctions, export controls, embargoes, or other governmental restrictions, or using the Functionalities to circumvent any such restrictions. * **(c) System Interference.** Any activity that seeks to interfere with or compromise the integrity, security, or proper functioning of any computer, server, network, personal device, or information technology system, including the deployment of viruses, malware, or denial-of-service attacks. * **(d) Circumvention.** Any attempt to circumvent a usage or capacity limit of the Functionalities, or to bypass any access controls, authentication mechanisms, or security measures, including blocking measures or IP restrictions implemented by Socket. * **(e) Deceptive or Manipulative Conduct.** Any deceptive or manipulative activity, including: (i) impersonating any person or entity; (ii) providing false or misleading information; (iii) engaging in manipulative trading activities; (iv) using the Functionalities to conceal economic activity or launder proceeds; or (v) financing terrorism. * **(f) Reverse Engineering.** Any attempt to reverse engineer, disassemble, decompile, decode, adapt, or otherwise attempt to derive or gain access to any component of the Functionalities, in whole or in part. * **(g) Unauthorised Automation.** Accessing, querying, or interacting with the Functionalities through any automated means not expressly authorised by Socket, including bots, scrapers, or data-mining tools, or harvesting data from the Functionalities for resale or distribution as a standalone product. * **(h) Unlicensed Financial Activities.** Any activity that seeks to carry out financial activities subject to registration or licensing requirements under applicable law without the requisite authorisation. * **(i) Facilitating the Foregoing.** Causing or permitting any third party to engage in any of the above. **6.2** If you engage in any Prohibited Activity, Socket may, at its sole and absolute discretion, without notice or liability to you and without limiting any other rights or remedies, immediately suspend or terminate your access to any or all of the Functionalities. *** ## 7. Fees **7.1** Socket may charge fees for some or part of the Functionalities. Socket reserves the right to change those fees at its discretion. Socket will disclose the amount of any fees it will charge you at the time you access the relevant Functionality or as indicated in any applicable notice to you. Any fee charged by Socket will be clearly designated as such and presented before you submit your transaction. **7.2** You may also incur charges from Third-Party Protocols or other third parties in connection with your use of the Functionalities. Socket is not responsible for any such third-party fees or charges. **7.3** You are solely responsible for determining any tax implications of your use of the Functionalities and for reporting and remitting all applicable taxes to the appropriate authority. Socket does not provide tax advice. *** ## 8. Termination and Suspension **8.1** Socket may, at any time and in its sole discretion, suspend, terminate, deactivate, or delete your access to all or any part of the Functionalities, with or without notice, for any reason or for no reason at all, including if: (i) you breach any provision of these Terms; (ii) you infringe any intellectual property rights; (iii) you engage in any Prohibited Activity; (iv) your continued access poses a security, legal, or reputational risk to Socket; or (v) Socket is required to do so by applicable law or a regulatory authority. **8.2** If you are an Integrator and Socket terminates or suspends your access, you shall immediately cease all use of the Bungee API and destroy or return all API Credentials. **8.3** The following Sections of these Terms will survive termination: Section 2 (Intellectual Property), Section 5 (Privacy and Data), Section 6 (Prohibited Conduct), Section 9 (Disclaimers), Section 10 (Indemnification), Section 11 (Release), Section 12 (Limitation of Liability), Section 13 (Compliance), Section 15 (Dispute Resolution), Section 16 (Governing Law), and Section 17 (Miscellaneous). *** ## 9. Disclaimers and No Warranties **9.1** **AS IS AND AS AVAILABLE.** YOU EXPRESSLY UNDERSTAND AND AGREE THAT YOUR ACCESS TO AND USE OF ANY OF THE FUNCTIONALITIES IS AT YOUR SOLE RISK, AND THAT THE FUNCTIONALITIES ARE PROVIDED ON AN "AS IS" AND "AS AVAILABLE" BASIS. TO THE FULLEST EXTENT PERMISSIBLE UNDER APPLICABLE LAW, SOCKET MAKES NO EXPRESS WARRANTIES AND HEREBY DISCLAIMS ALL IMPLIED WARRANTIES REGARDING ANY PART OF THE FUNCTIONALITIES, INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, CORRECTNESS, ACCURACY, OR RELIABILITY. SOCKET DOES NOT REPRESENT OR WARRANT THAT ACCESS TO ANY OF THE FUNCTIONALITIES WILL BE CONTINUOUS, UNINTERRUPTED, TIMELY, OR SECURE; THAT INFORMATION CONTAINED IN OR PROVIDED THROUGH THE FUNCTIONALITIES WILL BE ACCURATE, RELIABLE, COMPLETE, OR CURRENT; OR THAT THE FUNCTIONALITIES WILL BE FREE FROM ERRORS, DEFECTS, VIRUSES, OR OTHER HARMFUL ELEMENTS. SOME JURISDICTIONS DO NOT ALLOW EXCLUSIONS OR LIMITATIONS OF IMPLIED WARRANTIES, SO THE ABOVE MAY NOT APPLY TO YOU. **9.2** **SECURITY RISKS.** YOU ACCEPT THE INHERENT SECURITY RISKS OF PROVIDING INFORMATION AND DEALING ONLINE OVER THE INTERNET. YOU AGREE THAT SOCKET HAS NO LIABILITY OR RESPONSIBILITY FOR ANY BREACH OF SECURITY UNLESS CAUSED BY SOCKET'S GROSS NEGLIGENCE OR WILFUL MISCONDUCT. **9.3** **BLOCKCHAIN AND SMART CONTRACT RISKS.** SOCKET WILL NOT BE RESPONSIBLE OR LIABLE TO YOU FOR ANY LOSSES YOU INCUR AS A RESULT OF YOUR USE OF ANY BLOCKCHAIN NETWORK OR ANY WALLET, INCLUDING LOSSES, DAMAGES, OR CLAIMS ARISING FROM: (i) USER ERROR, SUCH AS FORGOTTEN PASSWORDS, INCORRECTLY CONSTRUCTED SMART CONTRACTS, OR INCORRECT TRANSACTION PARAMETERS; (ii) SERVER FAILURE OR DATA LOSS; (iii) CORRUPTED OR INACCESSIBLE WALLET FILES; OR (iv) UNAUTHORISED ACCESS OR ACTIVITIES BY THIRD PARTIES, INCLUDING THE USE OF VIRUSES, PHISHING, BRUTE-FORCE ATTACKS, OR OTHER MEANS OF ATTACK AGAINST ANY BLOCKCHAIN NETWORK, ANY OF THE FUNCTIONALITIES, OR ANY WALLET. **9.4** **BLOCKCHAIN NETWORK RISKS.** SOCKET IS NOT RESPONSIBLE FOR LOSSES DUE TO BLOCKCHAINS OR ANY OTHER FEATURES OF ANY BLOCKCHAIN NETWORK OR WALLET, INCLUDING LATE OR NO REPORT BY DEVELOPERS OR REPRESENTATIVES OF ANY ISSUES WITH THE BLOCKCHAIN, INCLUDING FORKS, TECHNICAL NODE ISSUES, OR ANY OTHER ISSUES RESULTING IN FUND LOSSES. **9.5** **KEY MANAGEMENT.** YOU ARE SOLELY RESPONSIBLE FOR STORING AND SECURING YOUR PRIVATE KEY(S), RECOVERY PHRASE, SEED PHRASE, AND ANY OTHER CREDENTIALS NECESSARY TO ACCESS YOUR WALLET. SOCKET CANNOT RECOVER LOST KEYS, RECOVER LOST ACCESS, OR REVERSE ANY BLOCKCHAIN TRANSACTION ONCE CONFIRMED ON-CHAIN. **9.6** **THIRD-PARTY PROTOCOLS.** SOCKET DOES NOT CONTROL, ENDORSE, OR GUARANTEE THE AVAILABILITY, RELIABILITY, SECURITY, OR LEGALITY OF ANY THIRD-PARTY PROTOCOL. SOCKET DISCLAIMS ALL LIABILITY FOR ANY THIRD-PARTY PROTOCOL, INCLUDING FOR ANY LOSS OF ASSETS RESULTING FROM A VULNERABILITY, EXPLOIT, HACK, OR FAILURE OF ANY BRIDGE, DECENTRALISED EXCHANGE, OR OTHER THIRD-PARTY PROTOCOL USED IN CONNECTION WITH THE FUNCTIONALITIES. **9.7** **ADAPTOR LIABILITY.** FOR ANY ADAPTATIONS OR MODIFICATIONS OF THE FUNCTIONALITIES MADE BY YOU AS AN INTEGRATOR, SOCKET DISCLAIMS ANY AND ALL LIABILITY. *** ## 10. Indemnification **10.1** To the fullest extent permitted by applicable law, you will indemnify, defend, and hold harmless Socket Technologies Limited, its affiliates, and each of their respective officers, directors, employees, agents, partners, contractors, successors, and assigns (collectively, the "Socket Parties") from and against any and all losses, liabilities, claims, demands, damages, expenses, and costs (including reasonable attorneys' fees) ("Claims") arising out of or related to: (a) your access to or use of any of the Functionalities; (b) your violation of these Terms; (c) your violation, misappropriation, or infringement of any rights of another person or entity, including intellectual property rights or privacy rights; (d) your conduct in connection with any of the Functionalities; or (e) if you are an Integrator, any claim by your end users arising from or relating to your integration, platform, or products. **10.2** You agree to cooperate with the Socket Parties in defending such Claims and pay all fees, costs, and expenses associated with defending such Claims, including attorneys' fees. You agree that the Socket Parties will have control of the defence or settlement, at Socket's sole option, of any third-party Claims. You may not settle or compromise any Claim against any Socket Party without Socket's prior written consent. *** ## 11. Release **11.1** To the fullest extent permitted by applicable law, you release the Socket Parties from responsibility, liability, claims, demands, and damages (actual and consequential) of every kind and nature, known and unknown, including claims of negligence, arising out of or related to: (a) disputes between users of the Functionalities; (b) the acts or omissions of third parties, including Third-Party Protocols; or (c) your use of or interaction with any of the Functionalities. **11.2** If you are a consumer who resides in California, you hereby waive your rights under California Civil Code § 1542, which provides: "A general release does not extend to claims that the creditor or releasing party does not know or suspect to exist in his or her favour at the time of executing the release and that, if known by him or her, would have materially affected his or her settlement with the debtor or released party." *** ## 12. Limitation of Liability **12.1** TO THE FULLEST EXTENT PERMITTED BY APPLICABLE LAW, THE SOCKET PARTIES WILL NOT BE LIABLE TO YOU UNDER ANY THEORY OF LIABILITY — WHETHER BASED IN CONTRACT, TORT, NEGLIGENCE, STRICT LIABILITY, WARRANTY, OR OTHERWISE — FOR ANY INDIRECT, CONSEQUENTIAL, EXEMPLARY, INCIDENTAL, PUNITIVE, OR SPECIAL DAMAGES OR LOST PROFITS, EVEN IF THE SOCKET PARTIES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. **12.2** THE TOTAL LIABILITY OF THE SOCKET PARTIES FOR ANY CLAIM ARISING OUT OF OR RELATING TO THE FUNCTIONALITIES OR THESE TERMS, REGARDLESS OF THE FORM OF THE ACTION, IS LIMITED TO THE GREATER OF: (A) ONE HUNDRED UNITED STATES DOLLARS (USD \$100); OR (B) THE AMOUNT PAID BY YOU TO SOCKET DURING THE TWELVE (12) MONTHS PRECEDING THE CLAIM. **12.3** THE LIMITATIONS SET FORTH IN THIS SECTION 12 WILL NOT LIMIT OR EXCLUDE LIABILITY FOR: (A) GROSS NEGLIGENCE, FRAUD, OR INTENTIONAL MISCONDUCT OF SOCKET OR THE OTHER SOCKET PARTIES; OR (B) ANY OTHER MATTERS IN WHICH LIABILITY CANNOT BE EXCLUDED OR LIMITED UNDER APPLICABLE LAW. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THE ABOVE LIMITATIONS OR EXCLUSIONS MAY NOT APPLY TO YOU. **12.4** SOCKET HAS NO LIABILITY TO YOU OR TO ANY THIRD PARTY FOR ANY CLAIMS OR DAMAGES THAT MAY ARISE AS A RESULT OF ANY PAYMENTS OR TRANSACTIONS THAT YOU ENGAGE IN VIA THE FUNCTIONALITIES OR ANY THIRD-PARTY PROTOCOL. *** ## 13. Compliance **13.1** You agree that you are solely and entirely responsible for compliance with all laws and regulations that may apply to you in connection with your use of the Functionalities. Socket makes no representation that the Functionalities are appropriate or legally permissible in your jurisdiction. **13.2** If you are an Integrator, you are solely responsible for ensuring that your integration complies with all applicable laws and regulations, including financial services laws, data protection laws, consumer protection laws, and anti-money laundering requirements. *** ## 14. Changes to Terms and Functionalities **14.1** **Changes to Terms.** Socket may make changes to these Terms at any time and for any reason at its sole discretion. If Socket makes material changes, it will notify you by posting the changes on the Socket Website or through other reasonable means, and give you an opportunity to review the new Terms. Your continued access or use of any of the Functionalities after notice of changes will mean that you accept all such changes. If you do not agree to the amended Terms, you must stop using the Functionalities. **14.2** **Changes to Functionalities.** Socket may update, amend, alter, change, or stop any of the Functionalities at any time without prior notice. Socket is not responsible for any loss or harm related to your inability to access or use any of the Functionalities as a result of any such change. *** ## 15. Dispute Resolution and Binding Arbitration **15.1** Please read this Section carefully. It requires you to arbitrate certain disputes with Socket and limits the manner in which you can seek relief from us. No class or representative actions or arbitrations are permitted under this provision. **15.2** **Informal Resolution.** Before initiating any arbitration or legal proceedings, you and Socket agree to make reasonable good-faith efforts to resolve any dispute, claim, or controversy arising out of or relating to these Terms or the Functionalities (each, a "Dispute") informally. Either party may start this process by sending a written notice describing the Dispute and the relief sought to [legal@socket.tech](mailto:legal@socket.tech) (for notices to Socket) or to your registered email address (for notices to you). If the Dispute is not resolved within thirty (30) days after such notice is received, either party may proceed to arbitration as set out below. **15.3** **No Representative Actions.** You agree that any Dispute is personal to you and Socket and that any Dispute will be resolved solely through individual action. No Dispute will be brought as a class arbitration, class action, or any other type of representative or collective proceeding. **15.4** **Arbitration of Disputes.** Except for Disputes in which you or Socket seeks injunctive or other equitable relief for the alleged infringement or misappropriation of intellectual property, and except as provided in Section 15.6, you and Socket waive your rights to have any Dispute — including claims related to privacy and data security — resolved in court by a judge or jury. Instead, any such Dispute shall be finally resolved by binding arbitration administered by the International Centre for Dispute Resolution ("ICDR") under its International Arbitration Rules in effect at the time of the arbitration. The arbitration shall be conducted by a single neutral arbitrator with relevant experience in technology or digital-asset matters. The seat of arbitration shall be the British Virgin Islands, and the arbitration shall be conducted in the English language. The arbitrator may award any remedy available under applicable law, subject to the limitations in Section 12. The arbitral award shall be final and binding, and judgment may be entered in any court of competent jurisdiction. **15.5** **Arbitration Costs.** All filing, administration, and arbitrator fees ("Arbitration Fees") will be governed by the ICDR Rules, unless otherwise agreed. Socket and you will split Arbitration Fees equally; provided that if you demonstrate to the arbitrator that you are economically unable to pay your portion, or that the costs of arbitration would be prohibitive compared to the costs of litigation, Socket will pay as much of the Arbitration Fees as the arbitrator deems necessary to prevent the arbitration from being cost-prohibitive. **15.6** **Exceptions.** Nothing in this Section 15 prevents either party from: (a) seeking urgent or interim injunctive relief from a court of competent jurisdiction pending arbitration where necessary to prevent irreparable harm; or (b) bringing an individual claim in a small-claims tribunal or equivalent where permitted by applicable law. Residents of the European Union, the United Kingdom, or any jurisdiction whose laws prohibit mandatory pre-dispute arbitration may elect to bring any Dispute before the courts of their country of habitual residence, and any mandatory consumer rights under applicable local law are preserved and not waived by these Terms. **15.7** **Opt-Out.** You have the right to opt out of binding arbitration within thirty (30) days of the date you first accepted these Terms by sending written notice to [legal@socket.tech](mailto:legal@socket.tech) with the subject line "Arbitration Opt-Out" and including your full name, address, and a clear statement of your intent to opt out. By opting out, you agree to resolve Disputes in accordance with Section 16 (Governing Law). **15.8** **One-Year Limitation.** Any Dispute must be filed within one (1) year after the relevant claim arose; otherwise, the Dispute is permanently barred, and you and Socket will not have the right to assert the claim. **15.9** **Severability.** If any portion of this Section 15 is found to be unenforceable or unlawful for any reason, the unenforceable or unlawful provision shall be severed; such severance shall have no impact on the remainder of this Section 15 or the parties' ability to compel individual arbitration of any remaining claims. *** ## 16. Governing Law and Venue **16.1** These Terms and any Dispute arising from them will be governed by and construed in accordance with the laws of the British Virgin Islands, without regard to its conflict of law rules or principles that would cause the application of the laws of any other jurisdiction. **16.2** To the extent any Dispute is not subject to arbitration under Section 15, or for the purposes of enforcement of any arbitral award, the courts of the British Virgin Islands shall have non-exclusive jurisdiction. Either party may also seek enforcement in any jurisdiction where the other party's assets are located. **16.3** Notwithstanding the foregoing, Socket retains the right to seek urgent injunctive or other equitable relief in any court of competent jurisdiction worldwide. *** ## 17. Miscellaneous **17.1** **Entire Agreement.** These Terms, together with any other terms expressly incorporated herein, reflect the entire agreement between you and Socket relating to the subject matter hereof and supersede all prior agreements, representations, statements, and understandings. **17.2** **Severability.** If any provision or part of a provision of these Terms is unlawful, void, or unenforceable, that provision or part is deemed severable and does not affect the validity and enforceability of any remaining provisions. If a court or arbitrator finds that any provision is invalid but that limiting it would make it valid and enforceable, such provision shall be construed and enforced as so limited. **17.3** **Relationship.** Nothing in these Terms creates the relationship of principal and agent, partnership, joint venture, employment, or franchise between you and Socket. Socket is an independent contractor. **17.4** **Assignment.** Socket may assign or transfer its rights and obligations under these Terms without restriction, including to any affiliate or to any successor entity in connection with a merger, acquisition, or sale of all or substantially all of its assets. You may not assign any rights or obligations under these Terms without Socket's prior written consent, and any attempted assignment without consent is void. **17.5** **Non-Waiver.** Socket's failure to exercise or enforce any right or provision of these Terms will not operate as a waiver of such right or provision. **17.6** **No Third-Party Beneficiaries.** Except as otherwise expressly provided herein, these Terms are intended solely for the benefit of you and Socket and do not confer any third-party beneficiary rights on any other person or entity. **17.7** **Notices.** Socket will deliver notices to you via the email address associated with your account or via the Socket Website. You may deliver notices to Socket at [legal@socket.tech](mailto:legal@socket.tech). Notices are effective upon receipt. **17.8** **Electronic Communications.** You agree that communications and transactions between you and Socket may be conducted electronically. Electronic notices, agreements, and other communications satisfy any requirement that such communications be in writing. **17.9** **Interpretation.** In these Terms: (a) "including" means "including without limitation"; (b) "or" is not exclusive; (c) words in the singular include the plural and vice versa; (d) section headings are for convenience only and have no legal or contractual effect; and (e) "will" and "shall" have the same meaning. **17.10** **Force Majeure.** Neither party will be liable for any failure or delay in performance caused by circumstances beyond its reasonable control, including acts of God, government restrictions, wars, sanctions, insurrections, third-party supplier failures, pandemic, significant market volatility in digital assets, or internet infrastructure failures. This provision does not excuse payment obligations that accrued before the force majeure event. *** ## Schedule 1. Definitions **"Affiliate"** means any entity that directly or indirectly controls, is controlled by, or is under common control with Socket from time to time. **"API Credentials"** means all API keys, credentials, tokens, and access credentials issued by Socket to an Integrator to enable access to the Functionalities. **"Applicable Law"** means, with respect to any person, any federal, state, foreign, local, or other law, statute, legislation, principle of common law, case law, resolution, ordinance, code, decree, rule, regulation, or requirement issued, enacted, adopted, or promulgated by or under the authority of any governmental authority applicable to such person, including AML laws, sanctions laws, OFAC regulations, data privacy laws, and data security laws. **"Bridge Transaction"** means the conversion of a digital asset on one blockchain to the same or another digital asset on another blockchain. **"Claims"** means any and all losses, liabilities, claims, demands, damages, expenses, and costs, including reasonable attorneys' fees. **"Dispute"** means any dispute, claim, or controversy arising out of or in connection with these Terms or the Functionalities, including any question regarding their existence, validity, construction, or termination. **"Functionalities"** means, collectively, the Socket Website, the Bungee API, any developer toolkits and SDKs, and any underlying smart contract or open-source protocol components, as further described in the preamble to these Terms. **"Integrator"** means any person or entity that accesses the Bungee API or SDK for the purpose of integrating the Functionalities into their own product, platform, or service for use by their own end users. **"Loss"** means all monetary losses, claims, damages, liabilities, costs, charges, reasonable documented attorneys' fees, judgments, fines, expenses, amounts paid in settlement, and all other financial liabilities of every nature, kind, and description. **"Personal Data"** means any information relating to an identified or identifiable natural person, as further defined under applicable data protection laws including the General Data Protection Regulation 2016/679 (GDPR), the California Consumer Privacy Act (CCPA), and any equivalent applicable legislation. **"Protocol"** means a set of software rules and accompanying software tools that govern the creation, transmission, custody, use, and exchange of digital assets on a peer-to-peer cryptographic computer network. **"Restricted Jurisdictions"** means any country or territory that is, or whose government is, the subject of comprehensive trade or economic sanctions, embargoes, or similar restrictions imposed or administered by the United States, the United Kingdom, the European Union, the United Nations, or any other competent authority. Restricted Jurisdictions include, without limitation: Afghanistan, Balkans, Belarus, Bosnia and Herzegovina, Burma (Myanmar), Burundi, Central African Republic, the occupied regions of Ukraine, Cuba, Democratic Republic of the Congo, Egypt, Eritrea, Guinea (Rep. of Guinea-Conakry), Guinea-Bissau, Iran, Iraq, Lebanon, Liberia, Libya, Mali, Moldova, North Korea, People's Republic of China (PRC), Russia, Serbia, Somalia, South Sudan, Sudan, Syria, Tunisia, Ukraine, Venezuela, Yemen, and Zimbabwe, together with any other jurisdiction designated from time to time by OFAC, the UN Security Council, the EU, or His Majesty's Treasury (UK). **"Socket Materials"** means the Socket Website and its contents, the Bungee API, developer toolkits and SDKs, and all associated intellectual property, as described in Section 2.1. **"Third-Party Protocol"** means any third-party bridging protocol, decentralised exchange, or other blockchain-based service through which Socket routes transactions in connection with providing the Functionalities. # Account Funding Source: https://docs.bungee.exchange/overview/use-cases/account-funding Upcoming guide for funding onchain accounts with Bungee. Coming soon. # Bridging Source: https://docs.bungee.exchange/overview/use-cases/bridging Transfer assets from one blockchain to another with low cost (cents) and high speed (seconds) via Bungee ## Transfer/Bridge with Bungee Bungee functions as state of art bridging/transfer solution for users and developers due to its unique architecture that routes via multiple bridges and exchanges under the hood for the user. * **Guaranteed Best Execution**: Bungee automatically scans all existing exchanges and bridges to find the best routes and presents the best options to users/integrator * **More control and optionality**: Bungee presents options in an elegant and simple fashion with tags like `MAX-OUTPUT`, `FASTEST` and `SUGGESTED` giving users control and choice to optimise according to their usecase * **Works for any VM**: Bungee supports all leading EVM as well as non-EVM networks like Tron, Solana, Bitcoin * **Works for any token**: Bungee enables bridging/transfers for basically ANY token (16,000+ tokens today) that has onchain liquidity by composing the exchange and bridge together in 1-click * **Works for any size**:: Bungee enables users to transfer 10\$ or 10 million USD with same 1-click gasless experience due to its ability to route to the best exchange/bridge to fulfil the order under the hood. ## Trusted by leading teams Total volume routed Chains supported Users served Integrated by **MetaMask**, **Coinbase Wallet**, **Rainbow**, **Zerion**, **Synthetix**, **Polymarket**, **OpenSea**, **Zapper**, and more. ## Who this is for **As a user**, I want to simply and instantly move/transfer the asset I am holding on chain-A to chain-B so I can use my assets on applications on chain-B. **As a user**, I want to see various options to move my funds across networks and select the method based on my preferences without visiting 100 different bridging websites. **As a developer**, I want to help users on my app move funds to the network my application is on without them leaving my app-experience to have higher conversion rate **As a developer**, I want to rebalance my company operating funds spread across various blockchain networks for very low cost. ## Quick start Get a quote for moving USDC from Ethereum to Base as the same asset: ```bash theme={null} curl "https://public-backend.bungee.exchange/api/v1/bungee/quote?\ originChainId=1&\ destinationChainId=8453&\ inputToken=0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48&\ outputToken=0xd9aaec86b65d86f6a7b5b1b0c42ffa531710b6ca&\ inputAmount=100000000&\ receiverAddress=0xd8da6bf26964af9d7eed9e03e53415d37aa96045&\ userAddress=0xd8da6bf26964af9d7eed9e03e53415d37aa96045" ``` Guides for quotes, routes, asset mapping, status Start building! # CEX Connectivity Source: https://docs.bungee.exchange/overview/use-cases/cex-connectivity Upcoming guide for connecting centralized exchange flows with Bungee. Coming soon. # Checkout Source: https://docs.bungee.exchange/overview/use-cases/checkout Let users complete checkout with any asset they already hold across any chain via Bungee ## Checkout with Bungee Bungee functions as a state-of-the-art checkout solution for users and developers due to its unique architecture that handles funding, conversion, and delivery under the hood so users can pay with whatever they hold. * **Pay with any asset**: Users can complete checkout using any token on any chain — Bungee handles the conversion and delivery behind the scenes * **Guaranteed Best Execution**: Bungee automatically finds the best route to convert the user's held assets into the required payment token at the best price * **1-click gasless experience**: Users confirm once from their source chain — no manual bridging, swapping, or gas management required * **Works for any VM**: Bungee supports all leading EVM as well as non-EVM networks like Tron, Solana, Bitcoin * **Higher conversion rates**: By removing funding friction, more users complete checkout instead of dropping off to bridge or swap elsewhere ## Trusted by leading teams Total volume routed Chains supported Users served Integrated by **Fun**. ## Who this is for **As a user**, I want to complete checkout with the assets I already hold so that I can purchase without having to manually move or convert funds first. **As a user**, I want to pay for something on one chain using assets I hold on a different chain without leaving the checkout flow. **As a developer**, I want users to complete checkout with whatever assets they hold so that more purchases complete with less friction. **As a developer**, I want to accept payments in a specific token on a specific chain while letting users pay with anything they have. ## Quick start Get a quote for a checkout-style route from Arbitrum USDC to Base ETH: ```bash theme={null} curl "https://public-backend.bungee.exchange/api/v1/bungee/quote?\ originChainId=42161&\ destinationChainId=8453&\ inputToken=0xaf88d065e77c8cc2239327c5edb3a432268e5831&\ outputToken=0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee&\ inputAmount=100000000&\ receiverAddress=0xd8da6bf26964af9d7eed9e03e53415d37aa96045&\ userAddress=0xd8da6bf26964af9d7eed9e03e53415d37aa96045" ``` Guides for quotes, routes, asset mapping, status Start building! # Pay-in and Pay-out Source: https://docs.bungee.exchange/overview/use-cases/pay-in-and-pay-out Upcoming guide for building pay-in and pay-out flows with Bungee. Coming soon. # Swaps Source: https://docs.bungee.exchange/overview/use-cases/swaps Swap any token to any other token same-chain or cross-chain with best pricing and 1-click execution via Bungee ## Swap with Bungee Bungee is most powerful when used as a swapping platform due to following unique abilities: * **Works for any token**: Bungee enables swaps for basically ANY token (16,000+ today) that has onchain liquidity by composing the exchange and bridge together in 1-click * **Fast transactions**: Swaps can be executed with low latency (2 seconds) across chains, making the experience as good as same-chain swaps for the end user * **MEV Protection**: Bungee is the only solution in the market that protects users end to end from sophisticated MEV bots that target user-swaps causing loss of funds. * **Guaranteed Best Execution**: Bungee automatically scans all existing DEXs, exchanges, and bridges to find the best swap routes and presents the best options to users/integrators * **Works for any VM**: Bungee supports all leading EVM as well as non-EVM networks like Tron, Solana, Bitcoin * **Works for any size**: Bungee enables users to swap $10 or $10 million with the same 1-click gasless experience due to its ability to route to the best exchange/bridge to fulfil the order under the hood ## Trusted by leading teams Total volume routed Chains supported Users served Integrated by **MetaMask**, **Coinbase Wallet**, **Rainbow**, **Zerion**, **Synthetix**, **Polymarket**, **OpenSea**, **Zapper**, and more. ## Who this is for **As a user**, I want to swap USDC I hold on Base directly into another token on Solana. **As a user**, I want to see various swap options and select the one that best matches my preference for speed, price, or output amount. **As a developer**, I want users on my app to swap into any token they need without leaving my app experience to have higher conversion and engagement. **As a developer**, I want to earn fees on swaps happening on my platform with minimal setup. ## Quick start Get a quote for swapping USDC on Arbitrum to ETH on Base: ```bash theme={null} curl "https://public-backend.bungee.exchange/api/v1/bungee/quote?\ originChainId=42161&\ destinationChainId=8453&\ inputToken=0xaf88d065e77c8cc2239327c5edb3a432268e5831&\ outputToken=0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee&\ inputAmount=100000000&\ receiverAddress=0xd8da6bf26964af9d7eed9e03e53415d37aa96045&\ userAddress=0xd8da6bf26964af9d7eed9e03e53415d37aa96045" ``` Guides for quotes, routes, asset mapping, status Start building! # Zaps Source: https://docs.bungee.exchange/overview/use-cases/zaps Land users directly into a destination protocol action like vault deposits or position entry in 1-click via Bungee ## Zap with Bungee Bungee functions as a state-of-the-art zap solution for users and developers due to its unique architecture that combines funding, conversion, and destination action execution under the hood in a single flow. * **Fund + execute in 1-click**: Users go from holding any token on any chain to completing a protocol action (vault deposit, position entry, etc.) in a single transaction * **Guaranteed Best Execution**: Bungee automatically finds the best route to fund the destination action at the best price and speed * **Arbitrary destination calldata**: Attach any contract call to execute on the destination chain after funds arrive — vaults, staking, LP deposits, and more * **Works for any VM**: Bungee supports all leading EVM as well as non-EVM networks like Tron, Solana, Bitcoin * **Reduces drop-off**: By combining funding and the final action, users reach completion without extra steps or follow-up transactions ## Trusted by leading teams Total volume routed Chains supported Users served Integrated by **MetaMask**, **Coinbase Wallet**, **Rainbow**, **Zerion**, **Synthetix**, **Polymarket**, **OpenSea**, **Zapper**, and more. ## Who this is for **As a user**, I want to complete the action I came for (deposit into a vault, enter a position, etc.) with the assets I already hold so that I can act immediately. **As a user**, I want to go from holding USDC on Ethereum to being deposited in a vault on Base without multiple manual steps. **As a developer**, I want users to land directly into my protocol's action from any chain so that more users reach the final step without dropping off. **As a developer**, I want to attach my protocol's contract call to a cross-chain transfer so users complete everything in one flow. ## Quick start Start with a quote and then attach destination calldata: ```bash theme={null} curl "https://public-backend.bungee.exchange/api/v1/bungee/quote?\ originChainId=1&\ destinationChainId=8453&\ inputToken=0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48&\ outputToken=0xd9aaec86b65d86f6a7b5b1b0c42ffa531710b6ca&\ inputAmount=100000000&\ userAddress=0xd8da6bf26964af9d7eed9e03e53415d37aa96045&\ receiverAddress=0xd8da6bf26964af9d7eed9e03e53415d37aa96045&\ destinationPayload=0x1234acbd&\ destinationGasLimit=100000" ``` Execute arbitrary contract calls on the destination chain after transfers Start building! # What is Bungee Source: https://docs.bungee.exchange/overview/what-is-bungee Bungee provides seamless swaps between any blockchain. With over $25B in volume and trusted by major wallets and dApps, Bungee makes moving assets between networks efficient, secure, and accessible to everyone. Bungee statistics including total volume routed, chains supported, users served, and leading integrations. ## Why Bungee is trusted by leading teams Whether you're swapping tokens within the same chain or bridging assets across different networks, Bungee automatically finds and executes the optimal route. The platform combines the best of both worlds: the convenience of automated routing with access to the deepest liquidity pools across 30+ blockchain networks. **Key Benefits:** * **Any Token to Any Token**: Swap any token to any token across any supported chain. No restrictions, no limitations * **Best Price Guarantee**: Competitive auctions ensure optimal rates by aggregating liquidity from multiple bridges and DEXs * **Unified Interface**: One API, one integration, access to all major bridges and DEXs * **Seamless Cross-Chain Swaps**: Swap and bridge in a single transaction, eliminating multi-step processes * **Trusted & Secure**: Over \$25B in volume processed, trusted by major wallets and dApps ## Ways to Use Bungee Bungee offers multiple integration methods to suit different use cases and technical requirements: For simple integrations where you want to offload the full UI to Bungee For Apps that want to offer swaps without building custom UI For Apps that need full control over the swap and bridging experience For non-EVM chains like Hyperliquid, Tron and more ## Powered by SOCKET Bungee is built by the SOCKET team and leverages SOCKET Protocol as its underlying settlement mechanism. SOCKET is the first chain-abstraction protocol, enabling seamless interactions across 30+ blockchain networks. [Learn more about SOCKET Protocol →](https://docs.socket.tech/introduction/) Start building with Bungee # SKILL Source: https://docs.bungee.exchange/skills/fund-tempo/SKILL Use when the user wants to fund a Tempo wallet, bridge tokens to Tempo, top up Tempo, move assets to Tempo, or exit to Tempo from any EVM chain. Also matches: migrate to Tempo, transfer to Tempo, deposit to Tempo. # fund-tempo Bridge tokens from any EVM chain to a Tempo wallet. All tokens arrive as USDC.E on Tempo. Powered by Bungee. Tempo chain ID is `4217`. USDC.E on Tempo is `0x20c000000000000000000000b9537d11c60e8b50`. ## Step 1: Get the Tempo wallet address Run this to get the user's Tempo wallet address: ``` tempo wallet whoami ``` Use the returned address as `receiverAddress` in the quote request. This is the address that will receive USDC.E on Tempo. ## Step 2: Check what the user has Ask the user for their wallet address on the origin chain, then check their balances: ``` GET https://public-backend.bungee.exchange/api/v1/tokens/list?userAddress=0xUSER_ADDRESS ``` This returns all tokens with balances across all chains. Use this to confirm what the user has and on which chain. ## Step 3: Get a deposit quote ``` GET https://public-backend.bungee.exchange/api/v1/bungee/quote?originChainId=ORIGIN_CHAIN&destinationChainId=4217&inputAmount=AMOUNT&inputToken=INPUT_TOKEN&outputToken=0x20c000000000000000000000b9537d11c60e8b50&receiverAddress=TEMPO_ADDRESS&refundAddress=USER_ADDRESS&enableDepositAddress=true ``` * `originChainId`: the chain the user's tokens are on * `inputToken`: the token address on that chain * `outputToken`: always `0x20c000000000000000000000b9537d11c60e8b50` (USDC.E on Tempo) * `inputAmount`: amount in the token's smallest unit (e.g. 6 decimals for USDC, so `100000000` = 100 USDC) * `receiverAddress`: the user's Tempo wallet address * `refundAddress`: the user's address on the origin chain * `enableDepositAddress`: always `true` **Common USDC examples:** * 100 USDC from Base: `originChainId=8453&inputToken=0x833589fcd6edb6e08f4c7c32d4f71b54bda02913&inputAmount=100000000` * 100 USDC from Arbitrum: `originChainId=42161&inputToken=0xaf88d065e77c8cc2239327c5edb3a432268e5831&inputAmount=100000000` * 100 USDC from Ethereum: `originChainId=1&inputToken=0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48&inputAmount=100000000` * 100 USDC from Optimism: `originChainId=10&inputToken=0x0b2c639c533813f4aa9d7837caf62653d097ff85&inputAmount=100000000` * 100 USDC from Polygon: `originChainId=137&inputToken=0x3c499c542cef5e3811e1192ce70d8cc03d5c3359&inputAmount=100000000` ## Step 4: Present deposit instructions From the response, present clearly to the user: * **Amount**: convert `deposit.depositData.amount` to human-readable using `result.input.token.decimals` * **Token**: `result.input.token.symbol` * **Send to**: `deposit.depositData.address` * **On chain**: `deposit.depositData.chainId` * **You will receive**: `deposit.output.effectiveAmount` converted with `deposit.output.token.decimals` USDC.E on Tempo * **Estimated time**: `deposit.estimatedTime` seconds * **Track**: `https://socketscan.io/tx/{deposit.requestHash}` If the agent has wallet access, submit `deposit.txData` as a transaction instead. ## Step 5: Track status ``` GET https://public-backend.bungee.exchange/api/v1/bungee/status?requestHash=REQUEST_HASH ``` Status `3` or `4` = completed. Status `5`, `6`, or `7` = failed. Poll every 10 seconds. ## Notes * Always use `enableDepositAddress=true`. * `refundAddress` is required. Use the user's address on the origin chain. * Amounts are in smallest units (6 decimals for USDC: 1 USDC = 1000000). * Tempo has no native gas token. Gas fees are paid in the user's chosen fee token.