# tenderly-devtools

Use when working with Tenderly forks and need to manipulate chain state. Triggers on "fund address", "set balance", "set ERC20 balance", "inject code", "set storage", "tenderly cheat codes", "tenderly fork setup", "fund USDC", "fund UNI", "token address", "which chain".

- **Kind:** skill
- **Source:** https://github.com/NicoAcosta/tenderly-devtools
- **Page:** https://forefy.com/skills/6c8538ab-8806-4923-97ea-e9294ad72ab9
- **API (JSON + files):** https://forefy.com/api/skills/6c8538ab-8806-4923-97ea-e9294ad72ab9

---

## SKILL.md

---
name: tenderly-devtools
description: >
  Use when working with Tenderly forks and need to manipulate chain state.
  Triggers on "fund address", "set balance", "set ERC20 balance",
  "inject code", "set storage", "tenderly cheat codes", "tenderly fork setup",
  "fund USDC", "fund UNI", "token address", "which chain".
---

# Tenderly DevTools

## Overview

Cheat codes for Tenderly forks — fund addresses, manipulate storage, inject bytecode. All operations use `cast rpc` via the Bash tool with Tenderly-specific RPC methods.

## Workflow

1. **Discover RPC** — Find the Tenderly fork URL (see RPC Discovery below)
2. **Detect chain** — `cast rpc eth_chainId --rpc-url $RPC_URL` → parse hex result → look up in `references/tokens.md`
   - If chain ID not in registry: likely a Tenderly custom ID. Check `CLAUDE.md` or ask user which chain is forked.
3. **Resolve token** — If the user names a token (e.g., "UNI"), load `references/tokens.md`, find the entry for detected chain + symbol → get address + decimals
   - If token not found on this chain: tell user and ask for address + decimals
4. **Compute hex amount** — `python3 -c "print(hex(int(<amount> * 10**<decimals>)))"`
5. **Load reference** — Read the appropriate reference file for detailed syntax
6. **Execute** — Run `cast rpc` via Bash tool
7. **Verify** — Confirm the mutation took effect (see Verification table below)

## RPC Discovery

Before any operation, determine the fork RPC URL:

1. **Check `.mcp.json`** in the project root for `mcpServers.foundry.env.RPC_URL`
2. **Check `.env`** files for `RPC_URL`, `TENDERLY_FORK_URL`, or similar
3. **Check `CLAUDE.md`** for documented fork URLs
4. **Ask the user** if none found

Store the RPC URL in a variable for reuse:
```bash
RPC_URL="<discovered-url>"
```

## Chain Detection

After discovering the RPC URL, always detect the chain before any token operation:

```bash
cast rpc eth_chainId --rpc-url $RPC_URL
```

The result is a hex string (e.g., `"0x2105"` = 8453 = Base). Convert to decimal and look up in `references/tokens.md`.

**Tenderly custom chain IDs**: Tenderly forks may have a custom chain ID different from the original chain (e.g., 845302 for a Base fork). If the detected chain ID is not in the token registry, check `CLAUDE.md` for documentation about which chain the fork targets, or ask the user.

## Token Resolution

When the user references a token by name (e.g., "fund 10 UNI"):

1. Read `references/tokens.md`
2. Find the section for the detected chain ID
3. Look up the token symbol → get address + decimals
4. If not found, tell the user and ask for the address + decimals

## Hex Amount Conversion

```bash
# Universal: works for any decimals
python3 -c "print(hex(int(<amount> * 10**<decimals>)))"

# ETH shortcut (18 decimals only)
cast to-wei <amount> ether
```

## Quick Reference

| Method | Syntax | Ref |
|--------|--------|-----|
| `tenderly_setBalance` | `cast rpc tenderly_setBalance '"<addr>"' '"<weiHex>"' --rpc-url $RPC` | `references/funding.md` |
| `tenderly_addBalance` | `cast rpc tenderly_addBalance '"<addr>"' '"<weiHex>"' --rpc-url $RPC` | `references/funding.md` |
| `tenderly_setErc20Balance` | `cast rpc tenderly_setErc20Balance '"<token>"' '"<wallet>"' '"<weiHex>"' --rpc-url $RPC` | `references/funding.md` |
| `tenderly_setMaxErc20Balance` | `cast rpc tenderly_setMaxErc20Balance '"<token>"' '"<wallet>"' --rpc-url $RPC` | `references/funding.md` |
| `tenderly_setStorageAt` | `cast rpc tenderly_setStorageAt '"<addr>"' '"<slot>"' '"<value>"' --rpc-url $RPC` | `references/storage.md` |
| `tenderly_setCode` | `cast rpc tenderly_setCode '"<addr>"' '"<bytecode>"' --rpc-url $RPC` | `references/code-injection.md` |

**Parameter format**: Each param is a separate shell-quoted string (`'"0x..."'`). Never pass a JSON array.

## Common Hex Values

See [funding.md](references/funding.md#common-hex-amounts) for pre-computed ETH and USDC hex values.

## Verification

**After every mutation, verify the state changed.** Use Bash commands as primary verification:

| Operation | Verification (Bash) |
|-----------|---------------------|
| ETH balance | `cast balance <addr> -e --rpc-url $RPC_URL` |
| ERC20 balance | `cast call <token> "balanceOf(address)(uint256)" <addr> --rpc-url $RPC_URL` |
| Storage slot | `cast storage <addr> <slot> --rpc-url $RPC_URL` |
| Code injection | `cast code <addr> --rpc-url $RPC_URL` (check length or prefix) |

Note: If Foundry MCP is available, `cast_balance` and `cast_call` MCP tools also work.

## Common Mistakes

| Mistake | Fix |
|---------|-----|
| JSON array params `'["0x...", "0x..."]'` | Each param is a separate shell-quoted string `'"0x..."' '"0x..."'` |
| Truncated hex amounts | Use `python3 -c "print(hex(int(amount * 10**decimals)))"` — don't hand-compute |
| Wrong token address for chain | Always detect chain via `eth_chainId` first, then look up in `references/tokens.md` |
| Skipping verification after mutation | Always verify — see Verification table above |
| Using Tenderly fork's custom chain ID as real chain ID | Tenderly forks may remap chain IDs — check CLAUDE.md or ask user for the source chain |

## Reference Routing

Load the appropriate reference when you need detailed guidance:

- **Token registry** (addresses, decimals per chain) → Read `references/tokens.md`
- **Funding** (ETH/ERC20 balances, hex amounts) → Read `references/funding.md`
- **Storage** (slot math, mappings, packed vars, copy patterns) → Read `references/storage.md`
- **Code injection** (bytecode extraction, EIP-170 bypass, mocks) → Read `references/code-injection.md`

## references

```

```

## references/code-injection.md

# Code Injection

Replace the bytecode at any address on a Tenderly fork.

## Set Code

```bash
cast rpc tenderly_setCode '"<address>"' '"<bytecode>"' --rpc-url $RPC_URL
```

`<bytecode>` is the deployed bytecode (runtime bytecode), prefixed with `0x`.

## Extracting Bytecode

### From a local Foundry project

```bash
forge inspect <ContractName> deployedBytecode
```

Returns the runtime bytecode as a hex string (no `0x` prefix — add it when passing to `tenderly_setCode`).

### From a live chain

```bash
cast code <address> --rpc-url <rpcUrl>
```

Returns the deployed bytecode at that address (with `0x` prefix).

### From a Forge broadcast JSON

```bash
jq -r '.deployedBytecode.object' out/<ContractName>.sol/<ContractName>.json
```

Or from a broadcast run:
```bash
jq -r '.transactions[0].transaction.input' broadcast/<Script>.s.sol/<chainId>/run-latest.json
```

Note: `.transaction.input` is the creation bytecode (includes constructor). For runtime bytecode, prefer `forge inspect` or `cast code` from a deployed instance.

## Verify

Compare code length before and after:

```bash
# Before
cast code <address> --rpc-url $RPC_URL | wc -c

# After injection
cast rpc tenderly_setCode '"<address>"' '"<bytecode>"' --rpc-url $RPC_URL
cast code <address> --rpc-url $RPC_URL | wc -c
```

Or compare the full bytecode:
```bash
DEPLOYED=$(cast code <address> --rpc-url $RPC_URL)
echo "$DEPLOYED" | head -c 100  # Spot-check the prefix
```

## Use Cases

### EIP-170 bypass for oversized contracts

Contracts exceeding 24,576 bytes cannot be deployed normally. On a Tenderly fork, inject the bytecode directly:

```bash
# Get the bytecode from Foundry
BYTECODE=$(forge inspect OversizedContract deployedBytecode)

# Inject at the desired address
cast rpc tenderly_setCode '"0xTargetAddress"' "\"0x$BYTECODE\"" --rpc-url $RPC_URL
```

### Replace a deployed contract with a modified version

Useful for testing patches against existing state:

```bash
# Build the modified contract
forge build

# Extract the new bytecode
BYTECODE=$(forge inspect ModifiedContract deployedBytecode)

# Inject over the existing deployment
cast rpc tenderly_setCode '"0xExistingDeployment"' "\"0x$BYTECODE\"" --rpc-url $RPC_URL
```

The storage at that address is preserved — only the code changes.

### Inject a mock or stub

Replace a dependency with a mock for testing:

```bash
MOCK_BYTECODE=$(forge inspect MockOracle deployedBytecode)
cast rpc tenderly_setCode '"0xRealOracleAddress"' "\"0x$MOCK_BYTECODE\"" --rpc-url $RPC_URL
```

### Copy a contract from one chain to another

```bash
# Extract from source chain
BYTECODE=$(cast code 0xContractOnMainnet --rpc-url $MAINNET_RPC)

# Inject on fork
cast rpc tenderly_setCode '"0xTargetAddress"' "\"$BYTECODE\"" --rpc-url $RPC_URL
```

Note: This copies only code, not storage. Combine with `tenderly_setStorageAt` to replicate full state.

## Important Notes

- **Storage is preserved**: `tenderly_setCode` only replaces the bytecode. Existing storage slots remain unchanged. This is useful for upgrading logic while keeping state, but be careful with storage layout changes.
- **Constructor not executed**: Since you're injecting runtime bytecode directly, the constructor does not run. Any initialization done in the constructor must be handled manually via storage manipulation.
- **Immutables are baked in**: Solidity immutables are embedded in the runtime bytecode at deploy time. If you `forge inspect` a contract with immutables, the bytecode will have placeholder values. Use `cast code` from a real deployment instead, or set the immutable slots manually.

## references/funding.md

# Funding Operations

ETH and ERC20 balance manipulation on Tenderly forks.

## ETH Balance

### Set exact ETH balance

```bash
cast rpc tenderly_setBalance '"<address>"' '"<amountWei>"' --rpc-url $RPC_URL
```

Replaces the current balance entirely.

### Add to ETH balance

```bash
cast rpc tenderly_addBalance '"<address>"' '"<amountWei>"' --rpc-url $RPC_URL
```

Adds to the existing balance (does not replace).

### Verify ETH balance

```bash
cast balance <address> -e --rpc-url $RPC_URL
```

If Foundry MCP is available, `cast_balance` with `formatEther=true` also works.

## ERC20 Balance

### Set exact ERC20 balance

```bash
cast rpc tenderly_setErc20Balance '"<tokenAddress>"' '"<walletAddress>"' '"<amountWei>"' --rpc-url $RPC_URL
```

Note the parameter order: **token first, then wallet, then amount**.

### Max out ERC20 balance

```bash
cast rpc tenderly_setMaxErc20Balance '"<tokenAddress>"' '"<walletAddress>"' --rpc-url $RPC_URL
```

Sets balance to `type(uint256).max`. Useful when the exact amount doesn't matter.

### Verify ERC20 balance

```bash
cast call <tokenAddress> "balanceOf(address)(uint256)" <walletAddress> --rpc-url $RPC_URL
```

If Foundry MCP is available, `cast_call` with `functionSignature="balanceOf(address)(uint256)"` also works.

## Token Address Resolution

Token addresses vary by chain. Use `references/tokens.md` to look up the correct address and decimals for the detected chain. Always detect the chain first via `eth_chainId`.

## Hex Amount Conversion

### Universal (any decimals)

```bash
python3 -c "print(hex(int(<amount> * 10**<decimals>)))"
```

Examples:
```bash
# 10,000 USDC (6 decimals)
python3 -c "print(hex(int(10000 * 10**6)))"
# → 0x2540be400

# 50 UNI (18 decimals)
python3 -c "print(hex(int(50 * 10**18)))"
# → 0x2b5e3af16b1880000
```

### ETH shortcut (18 decimals only)

```bash
cast to-wei <amount> ether
```

This returns the decimal wei value. To get hex, pipe through:
```bash
python3 -c "print(hex($(cast to-wei <amount> ether)))"
```

## Parameter Format

**Critical**: Each parameter is a separate shell-quoted string. Do NOT pass a JSON array.

Correct:
```bash
cast rpc tenderly_setBalance '"0x1234..."' '"0xDE0B6B3A7640000"' --rpc-url $RPC_URL
```

Wrong:
```bash
# DO NOT do this
cast rpc tenderly_setBalance '["0x1234...", "0xDE0B6B3A7640000"]' --rpc-url $RPC_URL
```

## Common Hex Amounts

### ETH (18 decimals)

| Amount | Hex |
|--------|-----|
| 0.1 ETH | `0x16345785D8A0000` |
| 1 ETH | `0xDE0B6B3A7640000` |
| 10 ETH | `0x8AC7230489E80000` |
| 100 ETH | `0x56BC75E2D63100000` |
| 1,000 ETH | `0x3635C9ADC5DEA00000` |

### USDC (6 decimals)

| Amount | Hex |
|--------|-----|
| 100 USDC | `0x5F5E100` |
| 1,000 USDC | `0x3B9ACA00` |
| 10,000 USDC | `0x2540BE400` |
| 100,000 USDC | `0x174876E800` |
| 1,000,000 USDC | `0xE8D4A51000` |

### USDT / DAI (varies)

USDT uses 6 decimals (same hex as USDC). DAI uses 18 decimals (same hex as ETH amounts).

## Examples

### Fund an address with 100 ETH

```bash
cast rpc tenderly_setBalance '"0xYourAddress"' '"0x56BC75E2D63100000"' --rpc-url $RPC_URL
```

Verify:
```bash
cast balance 0xYourAddress -e --rpc-url $RPC_URL
```

### Give an address 10,000 USDC (after resolving address from tokens.md)

```bash
# 1. Detect chain
cast rpc eth_chainId --rpc-url $RPC_URL

# 2. Look up USDC address for that chain in references/tokens.md

# 3. Compute hex: python3 -c "print(hex(int(10000 * 10**6)))" → 0x2540be400

# 4. Execute
cast rpc tenderly_setErc20Balance '"<USDC_ADDRESS>"' '"0xYourAddress"' '"0x2540BE400"' --rpc-url $RPC_URL
```

Verify:
```bash
cast call <USDC_ADDRESS> "balanceOf(address)(uint256)" 0xYourAddress --rpc-url $RPC_URL
```

## references/storage.md

# Storage Manipulation

Read and write arbitrary storage slots on Tenderly forks.

## Set Storage Slot

```bash
cast rpc tenderly_setStorageAt '"<contractAddress>"' '"<slot>"' '"<value>"' --rpc-url $RPC_URL
```

All three params are hex-encoded, 32-byte padded.

## Read Before Write

Always read the current value first to understand what you're overwriting:

```bash
cast storage <contractAddress> <slot> --rpc-url $RPC_URL
```

This uses the standard `eth_getStorageAt` RPC method (not Tenderly-specific).

## Verify After Write

Read the slot again after writing to confirm the change took effect:

```bash
cast storage <contractAddress> <slot> --rpc-url $RPC_URL
```

## Slot Calculation

### Simple variables

Storage slot = declaration index in the contract. First `uint256` is slot 0, second is slot 1, etc.

```solidity
contract Example {
    uint256 public value;    // slot 0
    address public owner;    // slot 1
    bool public paused;      // slot 2
}
```

To set `owner` to `0xNewOwner`:
```bash
cast rpc tenderly_setStorageAt '"<contractAddr>"' '"0x1"' '"0x000000000000000000000000<NewOwnerWithout0x>"' --rpc-url $RPC_URL
```

Note: addresses are left-padded to 32 bytes (right-aligned in the slot).

### Packed variables

Multiple small variables can share a slot. `bool` (1 byte), `uint8` (1 byte), `address` (20 bytes) may pack together. Use `forge inspect <Contract> storage-layout` to see exact slot assignments.

### Mappings

For `mapping(KeyType => ValueType)` at base slot `s`, the slot for key `k` is:

```
slot = keccak256(abi.encode(k, s))
```

Compute with cast:
```bash
cast keccak256 $(cast abi-encode "f(address,uint256)" "0xKeyAddress" "0xBaseSlot")
```

Example — `mapping(address => uint256) public balances` at slot 3, key `0xABCD...`:
```bash
SLOT=$(cast keccak256 $(cast abi-encode "f(address,uint256)" "0xABCD..." "3"))
cast rpc tenderly_setStorageAt '"<contractAddr>"' "\"$SLOT\"" '"0x0000000000000000000000000000000000000000000000000DE0B6B3A7640000"' --rpc-url $RPC_URL
```

### Nested mappings

For `mapping(A => mapping(B => V))` at base slot `s`, key pair `(a, b)`:

```
innerSlot = keccak256(abi.encode(a, s))
finalSlot = keccak256(abi.encode(b, innerSlot))
```

### Dynamic arrays

For `uint256[] public items` at slot `s`:
- Length stored at slot `s`
- Element `i` stored at `keccak256(s) + i`

```bash
# Get base data slot
BASE=$(cast keccak256 $(cast abi-encode "f(uint256)" "0xSlotNumber"))
# Element 0 is at $BASE, element 1 is at $BASE + 1, etc.
```

### Strings and bytes

Short strings (< 32 bytes) store data and length in the same slot. Long strings store length at slot `s` and data starting at `keccak256(s)`.

## Copy Pattern

Read state from a live chain and replicate it on the fork:

```bash
# Read from mainnet
VALUE=$(cast storage <contractAddr> <slot> --rpc-url $MAINNET_RPC)

# Write to fork
cast rpc tenderly_setStorageAt '"<contractAddr>"' '"<slot>"' "\"$VALUE\"" --rpc-url $FORK_RPC
```

## Storage Layout Inspection

Use Foundry to inspect a contract's storage layout:

```bash
forge inspect <ContractName> storage-layout
```

This shows each variable's slot, offset, and type. Essential for computing the right slot to modify.

## Examples

### Set an ERC20 balance via storage (when `tenderly_setErc20Balance` doesn't work)

Some tokens have non-standard storage layouts. Find the balances mapping slot, then set directly:

```bash
# 1. Find the balances slot (usually slot 0 or slot 2 for OZ ERC20)
forge inspect MyToken storage-layout

# 2. Compute the slot for the target address
SLOT=$(cast keccak256 $(cast abi-encode "f(address,uint256)" "0xTargetAddr" "0"))

# 3. Set the value (e.g., 1M tokens with 18 decimals)
cast rpc tenderly_setStorageAt '"<tokenAddr>"' "\"$SLOT\"" '"0x00000000000000000000000000000000000000000000D3C21BCECCEDA1000000"' --rpc-url $RPC_URL
```

### Toggle a boolean (e.g., unpause a contract)

```bash
# Set slot 2 (paused) to false (0)
cast rpc tenderly_setStorageAt '"<contractAddr>"' '"0x2"' '"0x0000000000000000000000000000000000000000000000000000000000000000"' --rpc-url $RPC_URL

# Set to true (1)
cast rpc tenderly_setStorageAt '"<contractAddr>"' '"0x2"' '"0x0000000000000000000000000000000000000000000000000000000000000001"' --rpc-url $RPC_URL
```

## references/tokens.md

# Token Registry

Static token address + decimals lookup by chain. Used by the tenderly-devtools skill to resolve token symbols to addresses.

## How to Use

1. Detect chain ID via `cast rpc eth_chainId --rpc-url $RPC_URL`
2. Convert hex result to decimal (e.g., `0x2105` = 8453 = Base)
3. Find the chain section below
4. Look up the token symbol → get address + decimals

## Tenderly Custom Chain IDs

Tenderly forks may use a **custom chain ID** different from the original chain. For example, a Base fork might have chain ID `845302` instead of `8453`.

If the detected chain ID is **not in this registry**:
- Check the project's `CLAUDE.md` for documentation about which chain the fork targets
- Check the Tenderly fork URL pattern (e.g., `virtual.base.rpc.tenderly.co` → Base)
- Ask the user which chain the fork is based on

---

## Ethereum (Chain ID: 1)

| Symbol | Address | Decimals |
|--------|---------|----------|
| WETH | `0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2` | 18 |
| USDC | `0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48` | 6 |
| USDT | `0xdAC17F958D2ee523a2206206994597C13D831ec7` | 6 |
| DAI | `0x6B175474E89094C44Da98b954EedeAC495271d0F` | 18 |
| FRAX | `0x853d955aCEf822Db058eb8505911ED77F175b99e` | 18 |
| LUSD | `0x5f98805A4E8be255a32880FDeC7F6728C6568bA0` | 18 |
| crvUSD | `0xf939E0A03FB07F59A73314E73794Be0E57ac1b4E` | 18 |
| GHO | `0x40D16FC0246aD3160Ccc09B8D0D3A2cD28aE6C2f` | 18 |
| PYUSD | `0x6c3ea9036406852006290770BEdFcAbA0e23A0e8` | 6 |
| UNI | `0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984` | 18 |
| AAVE | `0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9` | 18 |
| LINK | `0x514910771AF9Ca656af840dff83E8264EcF986CA` | 18 |
| MKR | `0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2` | 18 |
| CRV | `0xD533a949740bb3306d119CC777fa900bA034cd52` | 18 |
| LDO | `0x5A98FcBEA516Cf06857215779Fd812CA3beF1B32` | 18 |
| SNX | `0xC011a73ee8576Fb46F5E1c5751cA3B9Fe0af2a6F` | 18 |
| COMP | `0xc00e94Cb662C3520282E6f5717214004A7f26888` | 18 |
| SUSHI | `0x6B3595068778DD592e39A122f4f5a5cF09C90fE2` | 18 |
| 1INCH | `0x111111111117dC0aa78b770fA6A738034120C302` | 18 |
| stETH | `0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84` | 18 |
| wstETH | `0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0` | 18 |
| rETH | `0xae78736Cd615f374D3085123A210448E74Fc6393` | 18 |
| cbETH | `0xBe9895146f7AF43049ca1c1AE358B0541Ea49704` | 18 |
| RPL | `0xD33526068D116cE69F19A9ee46F0bd304F21A51f` | 18 |
| ENS | `0xC18360217D8F7Ab5e7c516566761Ea12Ce7F9D72` | 18 |
| SHIB | `0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE` | 18 |
| PEPE | `0x6982508145454Ce325dDbE47a25d4ec3d2311933` | 18 |

## Optimism (Chain ID: 10)

| Symbol | Address | Decimals |
|--------|---------|----------|
| WETH | `0x4200000000000000000000000000000000000006` | 18 |
| USDC | `0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85` | 6 |
| USDC.e | `0x7F5c764cBc14f9669B88837ca1490cCa17c31607` | 6 |
| USDT | `0x94b008aA00579c1307B0EF2c499aD98a8ce58e58` | 6 |
| DAI | `0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1` | 18 |
| FRAX | `0x2E3D870790dC77A83DD1d18184Acc7439A53f475` | 18 |
| LUSD | `0xc40F949F8a4e094D1b49a23ea9241D289B7b2819` | 18 |
| OP | `0x4200000000000000000000000000000000000042` | 18 |
| UNI | `0x6fd9d7AD17242c41f7131d257212c54A0e816691` | 18 |
| AAVE | `0x76FB31fb4af56892A25e32cFC43De717950c9278` | 18 |
| LINK | `0x350a791Bfc2C21F9Ed5d10980Dad2e2638FFa7f6` | 18 |
| CRV | `0x0994206dfE8De6Ec6920FF4D779B0d950605Fb53` | 18 |
| LDO | `0xFdb794692724153d1488CcdBE0C56c0045991c2F` | 18 |
| SNX | `0x8700dAec35aF8Ff88c16BdF0418774CB3D7599B4` | 18 |
| COMP | `0x7e7d4467112689329f7E06571eD0E8CbAd4910eE` | 18 |
| SUSHI | `0x3eaEb77b03dBc0F6321AE1b72b2E9aDb0F60112B` | 18 |
| wstETH | `0x1F32b1c2345538c0c6f582fCB022739c4A194Ebb` | 18 |
| rETH | `0x9Bcef72be871e61ED4fBbc7630889beE758eb81D` | 18 |

## BNB Chain (Chain ID: 56)

| Symbol | Address | Decimals |
|--------|---------|----------|
| WBNB | `0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c` | 18 |
| USDC | `0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d` | 18 |
| USDT | `0x55d398326f99059fF775485246999027B3197955` | 18 |
| DAI | `0x1AF3F329e8BE154074D8769D1FFa4eE058B1DBc3` | 18 |
| BUSD | `0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56` | 18 |
| UNI | `0xBf5140A22578168FD562DCcF235E5D43A02ce9B1` | 18 |
| AAVE | `0xfb6115445Bff7b52FeB98650C87f44907E58f802` | 18 |
| LINK | `0xF8A0BF9cF54Bb92F17374d9e9A321E6a111a51bD` | 18 |
| CAKE | `0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82` | 18 |
| XVS | `0xcF6BB5389c92Bdda8a3747Ddb454cB7a64626C63` | 18 |

## Gnosis (Chain ID: 100)

| Symbol | Address | Decimals |
|--------|---------|----------|
| WXDAI | `0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d` | 18 |
| WETH | `0x6A023CCd1ff6F2045C3309768eAd9E68F978f6e1` | 18 |
| USDC | `0xDDAfbb505ad214D7b80b1f830fcCc89B60fb7A83` | 6 |
| USDT | `0x4ECaBa5870353805a9F068101A40E0f32ed605C6` | 6 |
| GNO | `0x9C58BAcC331c9aa871AFD802DB6379a98e80CEdb` | 18 |
| LINK | `0xE2e73A1c69ecF83F464EFCE6A5be353a37cA09b2` | 18 |
| wstETH | `0x6C76971f98945AE98dD7d4DFcA8711ebea946eA6` | 18 |

## Polygon (Chain ID: 137)

| Symbol | Address | Decimals |
|--------|---------|----------|
| WMATIC | `0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270` | 18 |
| WETH | `0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619` | 18 |
| USDC | `0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359` | 6 |
| USDC.e | `0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174` | 6 |
| USDT | `0xc2132D05D31c914a87C6611C10748AEb04B58e8F` | 6 |
| DAI | `0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063` | 18 |
| AAVE | `0xD6DF932A45C0f255f85145f286eA0b292B21C90B` | 18 |
| LINK | `0x53E0bca35eC356BD5ddDFebbD1Fc0fD03FaBad39` | 18 |
| CRV | `0x172370d5Cd63279eFa6d502DAB29171933a610AF` | 18 |
| UNI | `0xb33EaAd8d922B1083446DC23f610c2567fB5180f` | 18 |
| COMP | `0x8505b9d2254A7Ae468c0E9dd10Ccea3A837aef5c` | 18 |
| SUSHI | `0x0b3F868E0BE5597D5DB7fEB59E1CADBb0fdDa50a` | 18 |
| wstETH | `0x03b54A6e9a984069379fae1a4fC4dBAE93B3bCCD` | 18 |
| stMATIC | `0x3A58a54C066FdC0f2D55FC9C89F0415C92eBf3C4` | 18 |
| MaticX | `0xfa68FB4628DFF1028CFEc22b4162FCcd0d45efb6` | 18 |

## Fantom (Chain ID: 250)

| Symbol | Address | Decimals |
|--------|---------|----------|
| WFTM | `0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83` | 18 |
| USDC | `0x04068DA6C83AFCFA0e13ba15A6696662335D5B75` | 6 |
| USDT | `0x049d68029688eAbF473097a2fC38ef61633A3C7A` | 6 |
| DAI | `0x8D11eC38a3EB5E956B052f67Da8Bdc9bef8Abf3E` | 18 |
| FRAX | `0xdc301571e2a5e1E4Eb52b20F9d42aFc53CeC2E6b` | 18 |
| LINK | `0xb3654dc3D10Ea7645f8319668E8F54d2574FBdC8` | 18 |
| AAVE | `0x6a07A792ab2965C72a5B8088d3a069A7aC3a993B` | 18 |
| CRV | `0x1E4F97b9f9F913c46F1632781732927B9019C68b` | 18 |
| MIM | `0x82f0B8B456c1A451378467398982d4834b6829c1` | 18 |

## zkSync Era (Chain ID: 324)

| Symbol | Address | Decimals |
|--------|---------|----------|
| WETH | `0x5AEa5775959fBC2557Cc8789bC1bf90A239D9a91` | 18 |
| USDC | `0x1d17CBcF0D6D143135aE902365D2E5e2A16538D4` | 6 |
| USDC.e | `0x3355df6D4c9C3035724Fd0e3914dE96A5a83aaf4` | 6 |
| USDT | `0x493257fD37EDB34451f62EDf8D2a0C418852bA4C` | 6 |
| DAI | `0x4B9eb6c0b6ea15176BBF62841C6B2A8a398cb656` | 18 |
| LINK | `0x082fD9Aed78260b78CA6f28e19C5800fB0000000` | 18 |
| ZK | `0x5A7d6b2F92C77FAD6CCaBd7EE0624E64907Eaf3E` | 18 |

## Moonbeam (Chain ID: 1284)

| Symbol | Address | Decimals |
|--------|---------|----------|
| WGLMR | `0xAcc15dC74880C9944775448304B263D191c6077F` | 18 |
| WETH | `0xab3f0245B83feB11d15AAffeFD7AD465a59817eD` | 18 |
| USDC | `0x931715FEE2d06333043d11F658C8CE934aC61D0c` | 6 |
| USDT | `0xeFAeeE334F0Fd1712f9a8cc375f427D9Cdd40d73` | 6 |
| DAI | `0x765277EebeCA2e31912C9946eAe1021199B39C61` | 18 |
| FRAX | `0x322E86852e492a7Ee17f28a78c6a1Ef2d1ABc557` | 18 |

## Sei (Chain ID: 1329)

| Symbol | Address | Decimals |
|--------|---------|----------|
| WSEI | `0xE30feDd158A2e3b13e9badaeABaFc5516e95e8C7` | 18 |
| USDC | `0x3894085Ef7Ff0f0aeDf52E2A2704928d1Ec074F1` | 6 |
| USDT | `0xB75D0B03c06A926e488e2659DF1A861F860bD3d1` | 6 |

## Mantle (Chain ID: 5000)

| Symbol | Address | Decimals |
|--------|---------|----------|
| WMNT | `0x78c1b0C915c4FAA5FffA6CAbf0219DA63d7f4cb8` | 18 |
| WETH | `0xdEAddEaDdeadDEadDEADDEAddEADDEAddead1111` | 18 |
| USDC | `0x09Bc4E0D864854c6aFB6eB9A9cdF58aC190D0dF9` | 6 |
| USDT | `0x201EBa5CC46D216Ce6DC03F6a759e8E766e956aE` | 6 |
| MNT | `0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000` | 18 |

## Base (Chain ID: 8453)

| Symbol | Address | Decimals |
|--------|---------|----------|
| WETH | `0x4200000000000000000000000000000000000006` | 18 |
| USDC | `0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913` | 6 |
| USDbC | `0xd9aAEc86B65D86f6A7B5B1b0c42FFA531710b6CA` | 6 |
| DAI | `0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb` | 18 |
| AAVE | `0x64c56e6643c9D7a04bf07d6C09c1cFA1EEfc02a0` | 18 |
| LINK | `0x88Fb150BDc53A65fe94Dea0c9BA0a6dAf8C6e196` | 18 |
| CRV | `0x8Ee73c484A26e0A5df2Ee2a4960B789967dd0415` | 18 |
| cbETH | `0x2Ae3F1Ec7F1F5012CFEab0185bfc7aa3cf0DEc22` | 18 |
| wstETH | `0xc1CBa3fCea344f92D9239c08C0568f6F2F0ee452` | 18 |
| COMP | `0x9e1028F5F1D5eDE59748FFceE5532509976840E0` | 18 |
| rETH | `0xB6fe221Fe9EeF5aBa221c348bA20A1Bf5e73624c` | 18 |
| DEGEN | `0x4ed4E862860beD51a9570b96d89aF5E1B0Efefed` | 18 |
| BRETT | `0x532f27101965dd16442E59d40670FaF5eBB142E4` | 18 |
| TOSHI | `0xAC1Bd2486aAf3B5C0fc3Fd868558b082a531B2B4` | 18 |

## Celo (Chain ID: 42220)

| Symbol | Address | Decimals |
|--------|---------|----------|
| WCELO | `0x471EcE3750Da237f93B8E339c536989b8978a438` | 18 |
| USDC | `0xcebA9300f2b948710d2653dD7B07f33A8B32118C` | 6 |
| USDT | `0x48065fbBE25f71C9282ddf5e1cD6D6A887483D5e` | 6 |
| cUSD | `0x765DE816845861e75A25fCA122bb6898B8B1282a` | 18 |
| cEUR | `0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73` | 18 |
| cREAL | `0xe8537a3d056DA446677B9E9d6c5dB704EaAb4787` | 18 |

## Arbitrum (Chain ID: 42161)

| Symbol | Address | Decimals |
|--------|---------|----------|
| WETH | `0x82aF49447D8a07e3bd95BD0d56f35241523fBab1` | 18 |
| USDC | `0xaf88d065e77c8cC2239327C5EDb3A432268e5831` | 6 |
| USDC.e | `0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8` | 6 |
| USDT | `0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9` | 6 |
| DAI | `0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1` | 18 |
| FRAX | `0x17FC002b466eEc40DaE837Fc4bE5c67993ddBd6F` | 18 |
| UNI | `0xFa7F8980b0f1E64A2062791cc3b0871572f1F7f0` | 18 |
| AAVE | `0xba5DdD1f9d7F570dc94a51479a000E3BCE967196` | 18 |
| LINK | `0xf97f4df75117a78c1A5a0DBb814Af92458539FB4` | 18 |
| CRV | `0x11cDb42B0EB46D95f990BeDD4695A6e3fA034978` | 18 |
| LDO | `0x13Ad51ed4F1B7e9Dc168d8a00cB3f4dDD85EfA6E` | 18 |
| COMP | `0x354A6dA3fcde098F8389cad84b0182725c6C91dE` | 18 |
| SUSHI | `0xd4d42F0b6DEF4CE0383636770eF773390d85c61A` | 18 |
| GMX | `0xfc5A1A6EB076a2C7aD06eD22C90d7E710E35ad0a` | 18 |
| ARB | `0x912CE59144191C1204E64559FE8253a0e49E6548` | 18 |
| wstETH | `0x5979D7b546E38E414F7E9822514be443A4800529` | 18 |
| rETH | `0xEC70Dcb4A1EFa46b8F2D97C310C9c4790ba5ffA8` | 18 |
| MAGIC | `0x539bdE0d7Dbd336b79148AA742883198BBF60342` | 18 |
| GRT | `0x9623063377AD1B27544C965cCd7342f7EA7e88C7` | 18 |
| RDNT | `0x3082CC23568eA640225c2467653dB90e9250AaA0` | 18 |

## Avalanche (Chain ID: 43114)

| Symbol | Address | Decimals |
|--------|---------|----------|
| WAVAX | `0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7` | 18 |
| WETH.e | `0x49D5c2BdFfac6CE2BFdB6640F4F80f226bc10bAB` | 18 |
| USDC | `0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E` | 6 |
| USDC.e | `0xA7D7079b0FEaD91F3e65f86E8915Cb59c1a4C664` | 6 |
| USDT | `0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7` | 6 |
| USDT.e | `0xc7198437980c041c805A1EDcbA50c1Ce5db95118` | 6 |
| DAI.e | `0xd586E7F844cEa2F87f50152665BCbc2C279D8d70` | 18 |
| FRAX | `0xD24C2Ad096400B6FBcd2ad8B24E7acBc21A1da64` | 18 |
| AAVE.e | `0x63a72806098Bd3D9520cC43356dD78afe5D386D9` | 18 |
| LINK.e | `0x5947BB275c521040051D82396192181b413227A3` | 18 |
| JOE | `0x6e84a6216eA6dACC71eE8E6b0a5B7322EEbC0fDd` | 18 |
| sAVAX | `0x2b2C81e08f1Af8835a78Bb2A90AE924ACE0eA4bE` | 18 |
| ggAVAX | `0xA25EaF2906FA1a3a13EdAc9B9657108Af7B703e3` | 18 |

## Linea (Chain ID: 59144)

| Symbol | Address | Decimals |
|--------|---------|----------|
| WETH | `0xe5D7C2a44FfDDf6b295A15c148167daaAf5Cf34f` | 18 |
| USDC | `0x176211869cA2b568f2A7D4EE941E073a821EE1ff` | 6 |
| USDT | `0xA219439258ca9da29E9Cc4cE5596924745e12B93` | 6 |
| DAI | `0x4AF15ec2A0BD43Db75dd04E62FAA3B8EF36b00d5` | 18 |
| wstETH | `0xB5beDd42000b71FddE22D3eE8a79Bd49A568fC8F` | 18 |

## Blast (Chain ID: 81457)

| Symbol | Address | Decimals |
|--------|---------|----------|
| WETH | `0x4300000000000000000000000000000000000004` | 18 |
| USDB | `0x4300000000000000000000000000000000000003` | 18 |
| BLAST | `0xb1a5700fA2358173Fe465e6eA4Ff52E36e88E2ad` | 18 |

## Scroll (Chain ID: 534352)

| Symbol | Address | Decimals |
|--------|---------|----------|
| WETH | `0x5300000000000000000000000000000000000004` | 18 |
| USDC | `0x06eFdBFf2a14a7c8E15944D1F4A48F9F95F663A4` | 6 |
| USDT | `0xf55BEC9cafDbE8730f096Aa55dad6D22d44099Df` | 6 |
| DAI | `0xcA77eB3fEFe3725Dc33bccB54eDEFc3D9f764f97` | 18 |
| wstETH | `0xf610A9dfB7C89644979b4A0f27063E9e7d7Cda32` | 18 |
| SCR | `0xd29687c813D741E2F938F4aC377128810E217b1b` | 18 |

## Zora (Chain ID: 7777777)

| Symbol | Address | Decimals |
|--------|---------|----------|
| WETH | `0x4200000000000000000000000000000000000006` | 18 |

## Aurora (Chain ID: 1313161554)

| Symbol | Address | Decimals |
|--------|---------|----------|
| WETH | `0xC9BdeEd33CD01541e1eeD10f90519d2C06Fe3feB` | 18 |
| USDC | `0xB12BFcA5A55806AaF64E99521918A4bf0fC40802` | 6 |
| USDT | `0x4988a896b1227218e4A686fdE5EabdcAbd91571f` | 6 |
| DAI | `0xe3520349F477A5F6EB06107066048508498A291b` | 18 |
| AURORA | `0x8BEc47865aDe3B172A928df8f990Bc7f2A3b9f79` | 18 |
| wNEAR | `0xC42C30aC6Cc15faC9bD938618BcaA1a1FaE8501d` | 24 |

