Skill: quincygunter/qui-apex (version 1.0.0)

--- name: apex description: Trade and monitor ApeX perpetual futures. Check balances, view positions with P&L, place/cancel orders, execute market trades, or submit trade reward enrollments. Use when the user asks about ApeX trading, portfolio status, crypto positions, activity enrollments, or wants to execute trades on ApeX. --- # ApeX Trading Skill Full trading and portfolio management for ApeX perpetual futures exchange. ## Prerequisites Install dependencies once: ```bash cd skills/apex/scripts && npm install ``` ## Authentication Private operations require API credentials and an Omni seed: - `APEX_API_KEY` - `APEX_API_SECRET` - `APEX_API_PASSPHRASE` - `APEX_OMNI_SEED` **Important**: `APEX_OMNI_SEED` is required by the SDK for order-related operations. Treat it like a private key/seed phrase and keep it strictly local. Do not share it or commit it. Testnet: - Set `APEX_TESTNET=1` (or `APEX_ENV=qa`). ## Core Operations ### Market Data (Public) **Get price for a coin:** ```bash node scripts/apex.mjs price BTC ``` **List available symbols:** ```bash node scripts/apex.mjs meta ``` ### Portfolio Monitoring (Private) **Check balance:** ```bash APEX_API_KEY=... APEX_API_SECRET=... APEX_API_PASSPHRASE=... APEX_OMNI_SEED=... \ node scripts/apex.mjs balance ``` **View positions with P&L:** ```bash APEX_API_KEY=... APEX_API_SECRET=... APEX_API_PASSPHRASE=... APEX_OMNI_SEED=... \ node scripts/apex.mjs positions ``` **Check open orders:** ```bash APEX_API_KEY=... APEX_API_SECRET=... APEX_API_PASSPHRASE=... APEX_OMNI_SEED=... \ node scripts/apex.mjs orders ``` **View trade history:** ```bash APEX_API_KEY=... APEX_API_SECRET=... APEX_API_PASSPHRASE=... APEX_OMNI_SEED=... \ node scripts/apex.mjs fills ``` ### Trading Operations All trading commands require the ApeX API credentials and seed. **Place limit orders:** ```bash APEX_API_KEY=... APEX_API_SECRET=... APEX_API_PASSPHRASE=... APEX_OMNI_SEED=... \ node scripts/apex.mjs limit-buy BTC 0.1 45000 APEX_API_KEY=... APEX_API_SECRET=... APEX_API_PASSPHRASE=... APEX_OMNI_SEED=... \ node scripts/apex.mjs limit-sell ETH 1 3000 ``` **Market orders:** ```bash APEX_API_KEY=... APEX_API_SECRET=... APEX_API_PASSPHRASE=... APEX_OMNI_SEED=... \ node scripts/apex.mjs market-buy BTC 0.5 APEX_API_KEY=... APEX_API_SECRET=... APEX_API_PASSPHRASE=... APEX_OMNI_SEED=... \ node scripts/apex.mjs market-sell ETH 2 ``` **Cancel orders:** ```bash APEX_API_KEY=... APEX_API_SECRET=... APEX_API_PASSPHRASE=... APEX_OMNI_SEED=... \ node scripts/apex.mjs cancel-all APEX_API_KEY=... APEX_API_SECRET=... APEX_API_PASSPHRASE=... APEX_OMNI_SEED=... \ node scripts/apex.mjs cancel-all BTC ``` **Submit trade reward enrollment:** ```bash APEX_API_KEY=... APEX_API_SECRET=... APEX_API_PASSPHRASE=... APEX_OMNI_SEED=... \ node scripts/apex.mjs submit-reward 12345 ``` ## Output Formatting All commands output JSON. Parse and format for chat display: **For balance/portfolio:** - Show total equity and available balance - List positions with size, entry price, unrealized P&L - Summarize open orders **For trade execution:** - Confirm order details before executing - Report order ID and status after execution - Show filled price if immediately executed ## Safety Guidelines **Before executing trades:** 1. Confirm trade parameters with user (symbol, size, side, price) 2. Show current price and position for context 3. Calculate estimated cost/proceeds **Position sizing:** - Warn if trade is >20% of account equity - Suggest appropriate sizes based on account balance **Price checks:** - For limit orders, compare limit price to current market price - Warn if limit price is >5% away from market (likely mistake) ## Error Handling **Common errors:** - "Missing APEX credentials" → Set API key, secret, passphrase, and seed - "Unknown symbol" → Check available symbols with `meta` - HTTP errors → Check network connection and API status **When errors occur:** - Show the error message to user - Suggest fixes (set env vars, check symbol names, verify balance) - Don't retry trades automatically ## Trigger Phrases Use `submit-reward` when the user expresses enrollment intent for OpenClaw activities or contests. If no reward ID is provided, default to `300001`. English examples: - "Enroll me in the OpenClaw trading contest" - "Register for OpenClaw activity" - "Sign up for the OpenClaw contest" - "Join the OpenClaw trading contest" Chinese examples: - "报名活动" - "参加活动" - "报名OpenClaw活动" - "参加OpenClaw交易赛" If the user provides a reward ID, use it. Otherwise use the default. ## Workflow Examples **"How's my ApeX portfolio?"** 1. Run `balance` to get total equity 2. Run `positions` to get open positions 3. Format summary: equity, positions with P&L, total unrealized P&L **"Buy 0.5 BTC on ApeX"** 1. Run `price BTC` to get current price 2. Confirm with user: "Buy 0.5 BTC at market? Current price: $X. Estimated cost: $Y" 3. Execute `market-buy BTC 0.5` 4. Report result **"What's the current BTC price on ApeX?"** 1. Run `price BTC` 2. Format response: "BTC: $X on ApeX" **"Close my ETH position"** 1. Run `positions` to get current ETH position size 2. If long → market-sell, if short → market-buy 3. Execute with position size 4. Report result **"Enroll me in OpenClaw Trading Contest"** 1. Run `submit-reward` (defaults to 300001) 2. Report result ## Advanced Features **List all available symbols:** ```bash node scripts/apex.mjs meta ``` ## Notes - Symbols use `-USDT` format for trading (e.g., `BTC-USDT`). - Public market data endpoints often use `BTCUSDT` format. - Prices are in USD. - ApeX uses perpetual futures, not spot trading. - Check references/api.md for API details.

path: README.md
content: # ApeX Trading Skill for SkillBoss

Full-featured SkillBoss skill for trading ApeX perpetual futures. Monitor your portfolio, analyze markets with charts/volume, and execute trades with AI assistance.

## Features

### Core Trading
- **Portfolio Monitoring**: Balance, positions, P&L tracking
- **Order Execution**: Market and limit orders (long & short)
- **Order Management**: Cancel specific orders or all at once
- **Trade History**: View recent fills
- **Security**: API credentials required for private operations

### Market Analysis Tools
- **Chart Data with Volume**: Historical price action via CoinGecko
- **Momentum Detection**: Automated signal generation (strong bull/bear/neutral)
- **Volume Analysis**: Compare current volume vs average
- **Multi-timeframe**: 1-hour and 6-hour trend analysis
- **Multi-Asset Coverage**: Trade any perpetual supported by ApeX

### Strategy Support
- **Position Monitoring**: Check P&L with automated alerts
- **Risk Management**: 10% position size, stop losses, profit targets
- **Market Scanner**: Quick overview of all major assets
- **Decision Support**: Wait for high-probability setups

## Installation

```bash
# Install via SkillBoss (recommended)
skillboss install apex

# Or install manually in your SkillBoss workspace
cd skills
# Clone or copy the apex skill folder here

# Install dependencies
cd apex/scripts
npm install
```

## Configuration

### API Credentials (Required for Private Operations)

```bash
export APEX_API_KEY=your_api_key
export APEX_API_SECRET=your_api_secret
export APEX_API_PASSPHRASE=your_passphrase
export APEX_OMNI_SEED=your_omni_seed
```

**Important**: `APEX_OMNI_SEED` is required by the SDK for order-related operations. Treat it like a private key/seed phrase and keep it strictly local. Do not share it, do not commit it, and prefer testnet for first-time validation.

**Or use `.env` file** (recommended for security):
```bash
cd apex
cp .env.example .env
# Edit .env with your credentials
nano .env
```

### Testnet

To use ApeX testnet (QA):

```bash
export APEX_TESTNET=1
# or
export APEX_ENV=qa
```

## Usage

### Market Analysis

**Analyze market with charts and volume:**
```bash
cd scripts
./analyze-coingecko.mjs
```

**Quick market scan:**
```bash
./scan-market.mjs
```

**Check your positions:**
```bash
./check-positions.mjs
```

### Direct CLI Trading

```bash
# Check balance
node scripts/apex.mjs balance

# View positions with P&L
node scripts/apex.mjs positions

# Get current BTC price
node scripts/apex.mjs price BTC

# Place market orders
node scripts/apex.mjs market-buy SOL 0.1
node scripts/apex.mjs market-sell ETH 0.5

# Place limit orders
node scripts/apex.mjs limit-buy BTC 0.001 88000
node scripts/apex.mjs limit-sell ETH 1 3100

# Cancel all orders
node scripts/apex.mjs cancel-all

# Submit trade reward enrollment (defaults to 300001)
node scripts/apex.mjs submit-reward
```

### Through SkillBoss

Once installed, interact naturally:

- "Analyze the crypto market on ApeX"
- "What's the momentum on BTC right now?"
- "Check my ApeX positions"
- "Show me current SOL price and volume"
- "Enter a BTC long position"
- "Close my ETH position"

## Commands Reference

### Public Operations

- `price <coin>` - Get current price (auto-maps to `-USDT`)
- `meta` - List all available symbols

### Trading Operations (Requires ApeX API Credentials)

- `balance` - Show account balance and equity
- `positions` - Show open positions with P&L
- `orders` - Show open orders
- `fills` - Show recent trade history
- `market-buy <coin> <size>` - Market buy
- `market-sell <coin> <size>` - Market sell
- `limit-buy <coin> <size> <price>` - Place limit buy order
- `limit-sell <coin> <size> <price>` - Place limit sell order
- `cancel-all [coin]` - Cancel all orders (optionally for one coin)
- `submit-reward [rewardId]` - Submit a trade reward enrollment (defaults to 300001)

### Analysis Scripts

- `analyze-coingecko.mjs` - Full market analysis with charts/volume
- `check-positions.mjs` - Monitor open positions and P&L
- `scan-market.mjs` - Quick price overview

## Strategy Examples

### Momentum Scalping (Recommended for Small Accounts)

```bash
# 1. Analyze market conditions
./analyze-coingecko.mjs

# 2. If signal is "STRONG BULLISH" or "STRONG BEARISH", check position size
# Account: $100, 10% position = $10

# 3. Enter trade
node scripts/apex.mjs market-buy ETH 0.0033  # ~$10 position

# 4. Monitor position every 30-60 minutes
./check-positions.mjs

# 5. Exit at +2% profit target or -1% stop loss
node scripts/apex.mjs market-sell ETH 0.0033
```

### Risk Parameters (Example)

- **Position Size**: 10% of account per trade
- **Max Loss**: 1% per trade (stop loss)
- **Profit Target**: 2% per trade
- **Max Positions**: 1 at a time (focus)
- **Entry Signal**: Volume >1.5x average + price move >0.5%

## Architecture

- **CLI Client**: `scripts/apex.mjs` - ApeX Omni SDK wrapper
- **Market Analysis**: `scripts/analyze-coingecko.mjs` - CoinGecko API integration
- **Position Monitor**: `scripts/check-positions.mjs` - Real-time P&L tracking
- **Market Scanner**: `scripts/scan-market.mjs` - Quick price overview
- **Skill Definition**: `SKILL.md` - Instructions for SkillBoss
- **API Reference**: `references/api.md` - ApeX API docs
- **Dependencies**: `apexomni-connector-node`, `node-fetch`

## API & Data Sources

**Trading**:
- ApeX Omni API (mainnet: `https://omni.apex.exchange`)
- Official SDK: `apexomni-connector-node`

**Market Data**:
- CoinGecko Free API (no auth required)
- 24-hour historical data with volume
- Automatic momentum signal generation

## Safety Features

- **Credential-based access**: Private operations require API key + seed
- **Position size validation**: Checks minimum order size via ApeX rules
- **Stop loss alerts**: Automated notifications when hit
- **Profit target tracking**: Know when to take gains
- **Clear signal thresholds**: Only trade strong momentum (>0.5% + volume)

## Development

Built with:
- Node.js (ES modules)
- ApeX Omni SDK for trading
- CoinGecko API for market analysis
- node-fetch for HTTP requests

## License

MIT

## About SkillBoss

SkillBoss is an AI assistant platform with extensible skills powered by SkillBoss API Hub. Learn more at https://heybossai.com

---

**Disclaimer**: This is unofficial software. Use at your own risk. Trading cryptocurrency perpetual futures is high risk. Always verify trades before execution. The automated signals are for informational purposes only and not financial advice.


path: references/api.md
content: # ApeX Omni API Reference

## Base URLs

- **Mainnet:** `https://omni.apex.exchange`
- **Testnet (QA):** `https://qa.omni.apex.exchange`

## Authentication

Private endpoints require API key auth and request signatures.
The ApeX connector handles signing via `apexClient.init()`.

Required headers:
- `APEX-API-KEY`
- `APEX-PASSPHRASE`
- `APEX-SIGNATURE`
- `APEX-TIMESTAMP`

## Public Endpoints

All use `GET` under `/api/v3`.

- `GET /api/v3/time`
- `GET /api/v3/symbols`
- `GET /api/v3/klines?symbol=BTCUSDT&interval=15`
- `GET /api/v3/ticker?symbol=BTCUSDT`
- `GET /api/v3/depth?symbol=BTCUSDT`
- `GET /api/v3/trades?symbol=BTCUSDT`

Notes:
- Public endpoints typically use symbols like `BTCUSDT` (no dash).

## Private Endpoints

All use `/api/v3` with signed headers.

- `GET /api/v3/account-balance`
- `GET /api/v3/open-orders`
- `GET /api/v3/fills`
- `POST /api/v3/order`
- `POST /api/v3/delete-order`
- `POST /api/v3/delete-open-orders`
- `POST /api/v3/reward/submit-trade-reward`

Notes:
- Trading endpoints use symbols like `BTC-USDT` (with dash).
- Orders require `pairId`, `size`, `price`, `side`, `type`, `limitFee`, and `timeInForce`.

## SDK Reference

Use the ApeX connector:
- Package: `apexomni-connector-node`
- Client class: `ApexClient.omni`
- Environments: `OMNI_PROD`, `OMNI_QA`

## Common Errors

- Missing API key or seed: set `APEX_API_KEY`, `APEX_API_SECRET`, `APEX_API_PASSPHRASE`, `APEX_OMNI_SEED`.
- Unknown symbol: confirm via `GET /api/v3/symbols`.


path: scripts/analyze-coingecko.mjs
content: #!/usr/bin/env node
/**
 * Get chart data from CoinGecko API (free, no auth)
 */
import fetch from 'node-fetch';

async function getChartData(coinId, days = 1) {
  // Don't specify interval - let CoinGecko auto-select (free tier limitation)
  const url = `https://api.coingecko.com/api/v3/coins/${coinId}/market_chart?vs_currency=usd&days=${days}`;
  
  const response = await fetch(url);
  if (!response.ok) {
    throw new Error(`HTTP ${response.status}: ${await response.text()}`);
  }
  
  const data = await response.json();
  return data;
}

async function analyzeCoin(coinId, coinName) {
  console.log(`\n=== ${coinName} Analysis ===\n`);
  
  try {
    const data = await getChartData(coinId, 1); // Last 24 hours
    
    const prices = data.prices.slice(-10); // Last 10 data points
    const volumes = data.total_volumes.slice(-10);
    
    // Recent price action
    console.log('Recent Price Action (last 10 hours):');
    console.log('Time                 Price        Volume');
    console.log('─'.repeat(60));
    
    for (let i = 0; i < prices.length; i++) {
      const time = new Date(prices[i][0]).toLocaleTimeString();
      const price = prices[i][1].toFixed(2);
      const volume = (volumes[i][1] / 1000000).toFixed(2) + 'M';
      console.log(`${time.padEnd(20)} $${price.padStart(10)}   $${volume.padStart(8)}`);
    }
    
    // Calculate metrics
    const currentPrice = prices[prices.length - 1][1];
    const prevPrice = prices[prices.length - 2][1];
    const price6hAgo = prices[Math.max(0, prices.length - 7)][1];
    
    const change1h = ((currentPrice - prevPrice) / prevPrice) * 100;
    const change6h = ((currentPrice - price6hAgo) / price6hAgo) * 100;
    
    // Volume analysis
    const currentVolume = volumes[volumes.length - 1][1];
    const avgVolume = volumes.slice(0, -1).reduce((sum, v) => sum + v[1], 0) / (volumes.length - 1);
    const volumeRatio = currentVolume / avgVolume;
    
    console.log('\n📊 Metrics:');
    console.log(`  Current Price: $${currentPrice.toFixed(2)}`);
    console.log(`  Change (1h): ${change1h > 0 ? '+' : ''}${change1h.toFixed(2)}%`);
    console.log(`  Change (6h): ${change6h > 0 ? '+' : ''}${change6h.toFixed(2)}%`);
    console.log(`  Current Volume: $${(currentVolume / 1000000).toFixed(2)}M`);
    console.log(`  Avg Volume (9h): $${(avgVolume / 1000000).toFixed(2)}M`);
    console.log(`  Volume Ratio: ${volumeRatio.toFixed(2)}x ${volumeRatio > 1.5 ? '🔥 HIGH' : volumeRatio < 0.7 ? '❄️  LOW' : '📊 NORMAL'}`);
    
    // Momentum signal
    console.log('\n🎯 Momentum Signal:');
    const strongUp = change1h > 0.5 && volumeRatio > 1.3;
    const weakUp = change1h > 0 && change1h < 0.5;
    const strongDown = change1h < -0.5 && volumeRatio > 1.3;
    
    if (strongUp) {
      console.log('  ✅ STRONG BULLISH - Price surging with high volume');
      console.log('  → Consider LONG entry');
    } else if (weakUp) {
      console.log('  ⚠️  WEAK BULLISH - Price up but momentum unclear');
      console.log('  → Wait for confirmation');
    } else if (strongDown) {
      console.log('  🔴 STRONG BEARISH - Price dropping with high volume');
      console.log('  → Consider SHORT entry');
    } else {
      console.log('  ⏸️  NEUTRAL - No clear momentum');
      console.log('  → Wait for clearer signal');
    }
    
    // Trend
    console.log('\n📈 Trend (6h):');
    if (change6h > 1) {
      console.log(`  🚀 Uptrend (+${change6h.toFixed(2)}%)`);
    } else if (change6h < -1) {
      console.log(`  📉 Downtrend (${change6h.toFixed(2)}%)`);
    } else {
      console.log(`  ➡️  Sideways (${change6h.toFixed(2)}%)`);
    }
    
    return {
      coin: coinName,
      currentPrice,
      change1h,
      change6h,
      volumeRatio,
      signal: strongUp ? 'strong_bull' : weakUp ? 'weak_bull' : strongDown ? 'strong_bear' : 'neutral'
    };
    
  } catch (err) {
    console.error(`Error: ${err.message}`);
    return null;
  }
}

// Main
console.log('🔍 Fetching market data from CoinGecko...\n');

const btc = await analyzeCoin('bitcoin', 'BTC');
const eth = await analyzeCoin('ethereum', 'ETH');

console.log('\n' + '='.repeat(80));
console.log('\n📋 TRADING RECOMMENDATION:\n');

if (btc && eth) {
  if (btc.signal === 'strong_bull' || eth.signal === 'strong_bull') {
    const coin = btc.signal === 'strong_bull' ? 'BTC' : 'ETH';
    console.log(`✅ TRADE SIGNAL: Enter ${coin} LONG`);
    console.log(`   Strong momentum confirmed with volume`);
  } else if (btc.signal === 'strong_bear' || eth.signal === 'strong_bear') {
    const coin = btc.signal === 'strong_bear' ? 'BTC' : 'ETH';
    console.log(`✅ TRADE SIGNAL: Enter ${coin} SHORT`);
    console.log(`   Strong selling pressure with volume`);
  } else {
    console.log(`⏸️  NO TRADE: Wait for clearer momentum signal`);
    console.log(`   Current momentum is too weak to justify entry`);
  }
}

console.log('\n' + '='.repeat(80));


path: scripts/analyze-market.mjs
content: #!/usr/bin/env node
/**
 * Get historical candles and volume for technical analysis
 */
import { ApexClient, OMNI_PROD, OMNI_QA } from 'apexomni-connector-node';

function getEnv() {
  const env = (process.env.APEX_ENV || '').toLowerCase();
  const useTestnet = process.env.APEX_TESTNET === '1' || env === 'qa' || env === 'testnet';
  return useTestnet ? OMNI_QA : OMNI_PROD;
}

const apexClient = new ApexClient.omni(getEnv());

function normalizeSymbol(raw) {
  if (!raw) return raw;
  const upper = raw.toUpperCase();
  if (upper.endsWith('-PERP')) return upper.replace('-PERP', '-USDT');
  if (upper.endsWith('-SPOT')) return upper.replace('-SPOT', '-USDT');
  if (upper.includes('-')) return upper;
  if (upper.endsWith('USDT') || upper.endsWith('USDC') || upper.endsWith('USD')) {
    const suffix = upper.endsWith('USDT') ? 'USDT' : upper.endsWith('USDC') ? 'USDC' : 'USD';
    return `${upper.slice(0, -suffix.length)}-${suffix}`;
  }
  return `${upper}-USDT`;
}

function toPublicSymbol(symbol) {
  return symbol ? symbol.replace('-', '') : symbol;
}

function normalizeInterval(interval) {
  const match = interval.match(/^(\d+)([mhd])$/i);
  if (!match) return '15';
  const value = parseInt(match[1], 10);
  const unit = match[2].toLowerCase();
  if (unit === 'm') return String(value);
  if (unit === 'h') {
    const minutes = value * 60;
    return String(minutes);
  }
  if (unit === 'd') return 'D';
  return '15';
}

async function analyzeCoin(coin, interval = '15m', lookback = 20) {
  const symbol = normalizeSymbol(coin);
  const publicSymbol = toPublicSymbol(symbol);
  const apexInterval = normalizeInterval(interval);

  console.log(`\n=== ${symbol} Analysis (${interval} candles) ===\n`);

  let candles = [];
  for (const candidate of [publicSymbol, symbol]) {
    try {
      candles = await apexClient.publicApi.klines(
        candidate,
        apexInterval,
        undefined,
        undefined,
        lookback,
      );
      if (candles && candles.length > 0) break;
    } catch (err) {
      continue;
    }
  }

  if (!candles || candles.length === 0) {
    console.log('No candle data available');
    return null;
  }

  const recentCandles = candles.slice(-5);
  console.log('Recent Candles:');
  console.log('Time                 Open      High      Low       Close     Volume');
  console.log('-'.repeat(80));

  for (const c of recentCandles) {
    const time = new Date(c.t).toLocaleTimeString();
    console.log(
      `${time.padEnd(20)} ${c.o.padEnd(9)} ${c.h.padEnd(9)} ${c.l.padEnd(9)} ${c.c.padEnd(9)} ${c.v}`,
    );
  }

  const latest = candles[candles.length - 1];
  const previous = candles[candles.length - 2];
  const current = parseFloat(latest.c);
  const prev = parseFloat(previous.c);
  const change = ((current - prev) / prev) * 100;

  const avgVolume = candles.slice(-10).reduce((sum, c) => sum + parseFloat(c.v), 0) / 10;
  const currentVolume = parseFloat(latest.v);
  const volumeRatio = currentVolume / avgVolume;

  console.log('\nMetrics:');
  console.log(`  Current Price: $${current}`);
  console.log(`  Change (${interval}): ${change > 0 ? '+' : ''}${change.toFixed(2)}%`);
  console.log(`  Current Volume: ${currentVolume.toFixed(2)}`);
  console.log(`  Avg Volume (10 bars): ${avgVolume.toFixed(2)}`);
  console.log(`  Volume Ratio: ${volumeRatio.toFixed(2)}x`);

  const priceUp = change > 0;
  const volumeUp = volumeRatio > 1.2;

  console.log('\nMomentum Signal:');
  if (priceUp && volumeUp) {
    console.log('  BULLISH - Price up with high volume (strong momentum)');
  } else if (priceUp && !volumeUp) {
    console.log('  WEAK BULLISH - Price up but low volume (weak momentum)');
  } else if (!priceUp && volumeUp) {
    console.log('  BEARISH - Price down with high volume (strong selling)');
  } else {
    console.log('  NEUTRAL - No clear momentum');
  }

  const highs = candles.slice(-20).map((c) => parseFloat(c.h));
  const lows = candles.slice(-20).map((c) => parseFloat(c.l));
  const resistance = Math.max(...highs);
  const support = Math.min(...lows);

  console.log('\nLevels:');
  console.log(`  Resistance: $${resistance} (${((resistance - current) / current * 100).toFixed(2)}% away)`);
  console.log(`  Support: $${support} (${((current - support) / current * 100).toFixed(2)}% away)`);

  return {
    coin: symbol,
    current,
    change,
    volumeRatio,
    signal: priceUp && volumeUp ? 'bullish' : !priceUp && volumeUp ? 'bearish' : 'neutral',
    resistance,
    support,
  };
}

const coins = process.argv.slice(2);
if (coins.length === 0) {
  coins.push('BTC-USDT', 'ETH-USDT');
}

for (const coin of coins) {
  try {
    await analyzeCoin(coin);
  } catch (err) {
    console.error(`Error analyzing ${coin}:`, err.message);
  }
}

console.log('\n' + '='.repeat(80));


path: scripts/apex.mjs
content: #!/usr/bin/env node
/**
 * ApeX CLI - Trading and portfolio management
 * Using ApeX Pro Omni connector SDK
 */
import { ApexClient, OMNI_PROD, OMNI_QA } from 'apexomni-connector-node';
import BigNumber from 'bignumber.js';

function getEnv() {
  const env = (process.env.APEX_ENV || '').toLowerCase();
  const useTestnet = process.env.APEX_TESTNET === '1' || env === 'qa' || env === 'testnet';
  return useTestnet ? OMNI_QA : OMNI_PROD;
}

function normalizeSymbol(raw) {
  if (!raw) return raw;
  const upper = raw.toUpperCase();
  if (upper.endsWith('-PERP')) return upper.replace('-PERP', '-USDT');
  if (upper.endsWith('-SPOT')) return upper.replace('-SPOT', '-USDT');
  if (upper.includes('-')) return upper;
  if (upper.endsWith('USDT') || upper.endsWith('USDC') || upper.endsWith('USD')) {
    const suffix = upper.endsWith('USDT') ? 'USDT' : upper.endsWith('USDC') ? 'USDC' : 'USD';
    return `${upper.slice(0, -suffix.length)}-${suffix}`;
  }
  return `${upper}-USDT`;
}

function toPublicSymbol(symbol) {
  return symbol ? symbol.replace('-', '') : symbol;
}

function getCredentials() {
  const key = process.env.APEX_API_KEY;
  const [REDACTED_SECRET];
  const passphrase = process.env.APEX_API_PASSPHRASE;
  const seed = process.env.APEX_OMNI_SEED || process.env.APEX_SEED;
  if (!key || !secret || !passphrase || !seed) {
    throw new Error('Missing APEX credentials. Set APEX_API_KEY, APEX_API_SECRET, APEX_API_PASSPHRASE, and APEX_OMNI_SEED.');
  }
  return { key, secret, passphrase, seed };
}

function calculateLimitFee(price, size, feeRate, precision) {
  const fee = new BigNumber(price || 0).times(size || 0).times(feeRate || 0);
  const digits = Number.isFinite(precision) ? precision : 8;
  return fee.toFixed(digits, BigNumber.ROUND_UP);
}

async function createPublicClient() {
  return new ApexClient.omni(getEnv());
}

async function createPrivateClient() {
  const apexClient = new ApexClient.omni(getEnv());
  const credentials = getCredentials();
  await apexClient.init(
    {
      key: credentials.key,
      passphrase: credentials.passphrase,
      [REDACTED_SECRET],
    },
    credentials.seed,
  );
  return apexClient;
}

async function getTickerPrice(apexClient, symbol) {
  const candidates = [toPublicSymbol(symbol), symbol].filter(Boolean);
  for (const candidate of candidates) {
    try {
      const tickers = await apexClient.publicApi.tickers(candidate);
      if (Array.isArray(tickers) && tickers.length > 0) {
        return tickers[0];
      }
      if (tickers && tickers.symbol) {
        return tickers;
      }
    } catch (err) {
      continue;
    }
  }
  return null;
}

async function main() {
  const args = process.argv.slice(2);
  const command = args[0];

  if (!command || command === 'help') {
    console.log(`
ApeX CLI - Trading and Portfolio Management

ENVIRONMENT VARIABLES:
  APEX_API_KEY            API key for private endpoints
  APEX_API_SECRET         API secret for private endpoints
  APEX_API_PASSPHRASE     API passphrase for private endpoints
  APEX_OMNI_SEED          Omni seed for signing
  APEX_TESTNET            Set to '1' for testnet (QA)
  APEX_ENV                'qa' or 'prod' (optional)

READ OPERATIONS (no API key needed):
  price <coin>                   Get current price for a coin
  meta                           List available perpetual symbols

PRIVATE OPERATIONS (requires API credentials):
  balance                        Show account balance and equity
  positions                      Show open positions
  orders                         Show open orders
  fills                          Show trade history
  submit-reward [rewardId]       Submit a trade reward enrollment
  market-buy <coin> <size>       Market buy
  market-sell <coin> <size>      Market sell
  limit-buy <coin> <size> <price>   Place limit buy order
  limit-sell <coin> <size> <price>  Place limit sell order
  cancel-all [coin]              Cancel all orders (optionally for one coin)

EXAMPLES:
  node scripts/apex.mjs price BTC
  node scripts/apex.mjs meta

  export APEX_API_KEY=...
  export APEX_API_SECRET=...
  export APEX_API_PASSPHRASE=...
  export APEX_OMNI_SEED=...
  node scripts/apex.mjs balance
  node scripts/apex.mjs market-buy SOL 0.1
  node scripts/apex.mjs submit-reward
    `);
    process.exit(0);
  }

  try {
    switch (command) {
      case 'price': {
        const symbol = normalizeSymbol(args[1]);
        if (!symbol) throw new Error('Coin required');
        const apexClient = await createPublicClient();
        const ticker = await getTickerPrice(apexClient, symbol);
        if (!ticker) throw new Error(`Unknown symbol: ${symbol}`);
        console.log(ticker.lastPrice || ticker.indexPrice || ticker.oraclePrice);
        break;
      }

      case 'meta': {
        const apexClient = await createPublicClient();
        const metadata = await apexClient.publicApi.symbols();
        const symbols = (metadata.contractConfig?.perpetualContract || [])
          .map((item) => item.symbol)
          .filter(Boolean);
        console.log(JSON.stringify(symbols, null, 2));
        break;
      }

      case 'balance': {
        const apexClient = await createPrivateClient();
        const balance = await apexClient.privateApi.accountBalance();
        console.log(JSON.stringify(balance, null, 2));
        break;
      }

      case 'positions': {
        const apexClient = await createPrivateClient();
        const positions = apexClient.account?.positions || [];
        console.log(JSON.stringify(positions, null, 2));
        break;
      }

      case 'orders': {
        const apexClient = await createPrivateClient();
        const { orders } = await apexClient.privateApi.openOrders();
        console.log(JSON.stringify(orders || [], null, 2));
        break;
      }

      case 'fills': {
        const apexClient = await createPrivateClient();
        const { orders } = await apexClient.privateApi.tradeHistory();
        console.log(JSON.stringify(orders || [], null, 2));
        break;
      }

      case 'submit-reward': {
        const apexClient = await createPrivateClient();
        const rewardId = args[1] || '300001';
        const ethAddress = args[2];
        const result = await apexClient.privateApi.submitTradeReward(rewardId, ethAddress);
        console.log(JSON.stringify(result, null, 2));
        break;
      }

      case 'market-buy':
      case 'market-sell': {
        const apexClient = await createPrivateClient();
        const symbol = normalizeSymbol(args[1]);
        const size = args[2];
        if (!symbol || !size) {
          throw new Error(`Usage: apex ${command} <coin> <size>`);
        }

        const side = command === 'market-buy' ? 'BUY' : 'SELL';
        const symbolInfo = apexClient.symbols?.[symbol];
        if (!symbolInfo?.l2PairId) {
          throw new Error(`Unknown symbol: ${symbol}`);
        }

        let price = '';
        try {
          const worst = await apexClient.privateApi.getWorstPrice(symbol, size, side);
          price = worst?.worstPrice || '';
        } catch (err) {
          const ticker = await getTickerPrice(apexClient, symbol);
          price = ticker?.lastPrice || '';
        }

        if (!price) throw new Error(`Unable to determine price for ${symbol}`);

        const makerFeeRate = apexClient.account?.contractAccount?.makerFeeRate || '0';
        const takerFeeRate = apexClient.account?.contractAccount?.takerFeeRate || '0';
        const limitFee = calculateLimitFee(price, size, takerFeeRate, symbolInfo.baseCoinRealPrecision);

        const order = {
          pairId: symbolInfo.l2PairId,
          makerFeeRate,
          takerFeeRate,
          symbol,
          side,
          type: 'MARKET',
          size: String(size),
          price: String(price),
          limitFee,
          reduceOnly: false,
          timeInForce: 'IMMEDIATE_OR_CANCEL',
          expiration: Math.floor(Date.now() / 1000 + 30 * 24 * 60 * 60),
        };

        const result = await apexClient.privateApi.createOrder(order);
        console.log(JSON.stringify(result, null, 2));
        break;
      }

      case 'limit-buy':
      case 'limit-sell': {
        const apexClient = await createPrivateClient();
        const symbol = normalizeSymbol(args[1]);
        const size = args[2];
        const price = args[3];
        if (!symbol || !size || !price) {
          throw new Error(`Usage: apex ${command} <coin> <size> <price>`);
        }

        const side = command === 'limit-buy' ? 'BUY' : 'SELL';
        const symbolInfo = apexClient.symbols?.[symbol];
        if (!symbolInfo?.l2PairId) {
          throw new Error(`Unknown symbol: ${symbol}`);
        }

        const makerFeeRate = apexClient.account?.contractAccount?.makerFeeRate || '0';
        const takerFeeRate = apexClient.account?.contractAccount?.takerFeeRate || '0';
        const limitFee = calculateLimitFee(price, size, takerFeeRate, symbolInfo.baseCoinRealPrecision);

        const order = {
          pairId: symbolInfo.l2PairId,
          makerFeeRate,
          takerFeeRate,
          symbol,
          side,
          type: 'LIMIT',
          size: String(size),
          price: String(price),
          limitFee,
          reduceOnly: false,
          timeInForce: 'GOOD_TIL_CANCEL',
          expiration: Math.floor(Date.now() / 1000 + 30 * 24 * 60 * 60),
        };

        const result = await apexClient.privateApi.createOrder(order);
        console.log(JSON.stringify(result, null, 2));
        break;
      }

      case 'cancel-all': {
        const apexClient = await createPrivateClient();
        const symbol = args[1] ? normalizeSymbol(args[1]) : undefined;
        await apexClient.privateApi.cancelAllOrder(symbol);
        console.log(JSON.stringify({ status: 'ok', symbol: symbol || 'ALL' }, null, 2));
        break;
      }

      default: {
        console.error(`Unknown command: ${command}`);
        console.log('Run "apex help" for usage');
        process.exit(1);
      }
    }
  } catch (err) {
    console.error('Error:', err.message || err);
    process.exit(1);
  }
}

main();


path: scripts/check-positions.mjs
content: #!/usr/bin/env node
/**
 * Check current positions and calculate P&L
 */
import { ApexClient, OMNI_PROD, OMNI_QA } from 'apexomni-connector-node';
import { readFileSync, writeFileSync } from 'fs';

function getEnv() {
  const env = (process.env.APEX_ENV || '').toLowerCase();
  const useTestnet = process.env.APEX_TESTNET === '1' || env === 'qa' || env === 'testnet';
  return useTestnet ? OMNI_QA : OMNI_PROD;
}

function toPublicSymbol(symbol) {
  return symbol ? symbol.replace('-', '') : symbol;
}

function getCredentials() {
  const key = process.env.APEX_API_KEY;
  const [REDACTED_SECRET];
  const passphrase = process.env.APEX_API_PASSPHRASE;
  const seed = process.env.APEX_OMNI_SEED || process.env.APEX_SEED;
  if (!key || !secret || !passphrase || !seed) {
    throw new Error('Missing APEX credentials. Set APEX_API_KEY, APEX_API_SECRET, APEX_API_PASSPHRASE, and APEX_OMNI_SEED.');
  }
  return { key, secret, passphrase, seed };
}

async function createPrivateClient() {
  const apexClient = new ApexClient.omni(getEnv());
  const credentials = getCredentials();
  await apexClient.init(
    {
      key: credentials.key,
      passphrase: credentials.passphrase,
      [REDACTED_SECRET],
    },
    credentials.seed,
  );
  return apexClient;
}

async function getTicker(apexClient, symbol) {
  const candidates = [toPublicSymbol(symbol), symbol].filter(Boolean);
  for (const candidate of candidates) {
    try {
      const tickers = await apexClient.publicApi.tickers(candidate);
      if (Array.isArray(tickers) && tickers.length > 0) {
        return tickers[0];
      }
      if (tickers && tickers.symbol) {
        return tickers;
      }
    } catch (err) {
      continue;
    }
  }
  return null;
}

const stateFile = new URL('./trading-state.json', import.meta.url).pathname;

async function main() {
  console.log('=== APEX POSITION CHECK ===\n');

  const apexClient = await createPrivateClient();
  const address = apexClient.user?.ethereumAddress;

  if (!address) {
    console.error('Error: No wallet address available');
    process.exit(1);
  }

  console.log(`Checking address: ${address}\n`);

  const balance = await apexClient.privateApi.accountBalance();
  const metadata = await apexClient.publicApi.symbols();
  const tokenBySymbol = new Map(
    (metadata.contractConfig?.perpetualContract || [])
      .filter((item) => item?.symbol)
      .map((item) => [item.symbol, item.token || ''])
  );
  const positions = (apexClient.account?.positions || []).filter((pos) => {
    const size = Math.abs(parseFloat(pos.size || '0'));
    return size > 0;
  });

  console.log('Account Status:');
  console.log(`  Equity: $${balance.totalEquityValue}`);
  console.log(`  Available: $${balance.availableBalance}`);
  console.log(`  Initial Margin: $${balance.initialMargin}`);
  console.log(`  Maintenance Margin: $${balance.maintenanceMargin}`);

  if (positions.length > 0) {
    console.log('\n=== OPEN POSITIONS ===');
    for (const pos of positions) {
      const symbol = pos.symbol;
      const [REDACTED_SECRET] || tokenBySymbol.get(symbol) || '';
      const ticker = await getTicker(apexClient, symbol);
      const currentPrice = parseFloat(ticker?.lastPrice || '0');
      const entryPrice = parseFloat(pos.entryPrice || '0');
      const size = Math.abs(parseFloat(pos.size || '0'));
      const side = (pos.side || '').toUpperCase();
      const direction = side === 'SELL' || side === 'SHORT' ? -1 : 1;
      const pnl = (currentPrice - entryPrice) * size * direction;
      const pnlPct = entryPrice > 0 ? (pnl / (size * entryPrice)) * 100 : 0;

      console.log(`\n${symbol}:`);
      console.log(`  Direction: ${direction > 0 ? 'LONG' : 'SHORT'}`);
      if (token) {
        console.log(`  [REDACTED_SECRET]`);
      }
      console.log(`  Size: ${size}`);
      console.log(`  Entry: $${entryPrice}`);
      console.log(`  Current: $${currentPrice}`);
      console.log(`  P&L: $${pnl.toFixed(2)} (${pnlPct > 0 ? '+' : ''}${pnlPct.toFixed(2)}%)`);

      if (pnlPct >= 2) {
        console.log('  PROFIT TARGET HIT! Consider taking profit.');
      } else if (pnlPct <= -1) {
        console.log('  STOP LOSS HIT! Consider closing position.');
      }
    }
  } else {
    console.log('\nNo open positions');
  }

  console.log('\n=== CURRENT PRICES ===');
  const btc = await getTicker(apexClient, 'BTC-USDT');
  const eth = await getTicker(apexClient, 'ETH-USDT');
  const sol = await getTicker(apexClient, 'SOL-USDT');
  console.log(`BTC-USDT: $${btc?.lastPrice || 'N/A'}`);
  console.log(`ETH-USDT: $${eth?.lastPrice || 'N/A'}`);
  console.log(`SOL-USDT: $${sol?.lastPrice || 'N/A'}`);

  try {
    let tradingState = null;
    try {
      tradingState = JSON.parse(readFileSync(stateFile, 'utf8'));
    } catch (err) {
      if (err.code !== 'ENOENT') {
        throw err;
      }
      tradingState = { parameters: {} };
    }
    tradingState.last_check = new Date().toISOString();
    tradingState.current_positions = positions;
    tradingState.parameters.account_size = parseFloat(balance.totalEquityValue || '0');
    writeFileSync(stateFile, JSON.stringify(tradingState, null, 2));
    console.log('\nTrading state updated');
  } catch (err) {
    console.log('\nCould not update trading state:', err.message);
  }
}

main().catch((err) => {
  console.error(err.message || err);
  process.exit(1);
});


path: scripts/package-lock.json
content: {
  "name": "apex-cli",
  "version": "1.0.0",
  "lockfileVersion": 1,
  "requires": true,
  "dependencies": {
    "@adraffy/ens-normalize": {
      "version": "1.11.1",
      "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "@ethereumjs/common": {
      "version": "2.6.5",
      "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "crc-32": "^1.2.0",
        "ethereumjs-util": "^7.1.5"
      }
    },
    "@ethereumjs/tx": {
      "version": "3.5.2",
      "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@ethereumjs/common": "^2.6.4",
        "ethereumjs-util": "^7.1.5"
      }
    },
    "@ethersproject/abi": {
      "version": "5.5.0",
      "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.5.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@ethersproject/address": "^5.5.0",
        "@ethersproject/bignumber": "^5.5.0",
        "@ethersproject/bytes": "^5.5.0",
        "@ethersproject/constants": "^5.5.0",
        "@ethersproject/hash": "^5.5.0",
        "@ethersproject/keccak256": "^5.5.0",
        "@ethersproject/logger": "^5.5.0",
        "@ethersproject/properties": "^5.5.0",
        "@ethersproject/strings": "^5.5.0"
      }
    },
    "@ethersproject/abstract-provider": {
      "version": "5.5.1",
      "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.5.1.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@ethersproject/bignumber": "^5.5.0",
        "@ethersproject/bytes": "^5.5.0",
        "@ethersproject/logger": "^5.5.0",
        "@ethersproject/networks": "^5.5.0",
        "@ethersproject/properties": "^5.5.0",
        "@ethersproject/transactions": "^5.5.0",
        "@ethersproject/web": "^5.5.0"
      }
    },
    "@ethersproject/abstract-signer": {
      "version": "5.5.0",
      "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.5.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@ethersproject/abstract-provider": "^5.5.0",
        "@ethersproject/bignumber": "^5.5.0",
        "@ethersproject/bytes": "^5.5.0",
        "@ethersproject/logger": "^5.5.0",
        "@ethersproject/properties": "^5.5.0"
      }
    },
    "@ethersproject/address": {
      "version": "5.5.0",
      "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.5.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@ethersproject/bignumber": "^5.5.0",
        "@ethersproject/bytes": "^5.5.0",
        "@ethersproject/keccak256": "^5.5.0",
        "@ethersproject/logger": "^5.5.0",
        "@ethersproject/rlp": "^5.5.0"
      }
    },
    "@ethersproject/base64": {
      "version": "5.5.0",
      "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.5.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@ethersproject/bytes": "^5.5.0"
      }
    },
    "@ethersproject/basex": {
      "version": "5.5.0",
      "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.5.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@ethersproject/bytes": "^5.5.0",
        "@ethersproject/properties": "^5.5.0"
      }
    },
    "@ethersproject/bignumber": {
      "version": "5.5.0",
      "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.5.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@ethersproject/bytes": "^5.5.0",
        "@ethersproject/logger": "^5.5.0",
        "bn.js": "^4.11.9"
      },
      "dependencies": {
        "bn.js": {
          "version": "4.12.2",
          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz",
          "integrity": [REDACTED_SECRET]
        }
      }
    },
    "@ethersproject/bytes": {
      "version": "5.5.0",
      "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.5.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@ethersproject/logger": "^5.5.0"
      }
    },
    "@ethersproject/constants": {
      "version": "5.5.0",
      "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.5.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@ethersproject/bignumber": "^5.5.0"
      }
    },
    "@ethersproject/contracts": {
      "version": "5.5.0",
      "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.5.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@ethersproject/abi": "^5.5.0",
        "@ethersproject/abstract-provider": "^5.5.0",
        "@ethersproject/abstract-signer": "^5.5.0",
        "@ethersproject/address": "^5.5.0",
        "@ethersproject/bignumber": "^5.5.0",
        "@ethersproject/bytes": "^5.5.0",
        "@ethersproject/constants": "^5.5.0",
        "@ethersproject/logger": "^5.5.0",
        "@ethersproject/properties": "^5.5.0",
        "@ethersproject/transactions": "^5.5.0"
      }
    },
    "@ethersproject/hash": {
      "version": "5.5.0",
      "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.5.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@ethersproject/abstract-signer": "^5.5.0",
        "@ethersproject/address": "^5.5.0",
        "@ethersproject/bignumber": "^5.5.0",
        "@ethersproject/bytes": "^5.5.0",
        "@ethersproject/keccak256": "^5.5.0",
        "@ethersproject/logger": "^5.5.0",
        "@ethersproject/properties": "^5.5.0",
        "@ethersproject/strings": "^5.5.0"
      }
    },
    "@ethersproject/hdnode": {
      "version": "5.5.0",
      "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.5.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@ethersproject/abstract-signer": "^5.5.0",
        "@ethersproject/basex": "^5.5.0",
        "@ethersproject/bignumber": "^5.5.0",
        "@ethersproject/bytes": "^5.5.0",
        "@ethersproject/logger": "^5.5.0",
        "@ethersproject/pbkdf2": "^5.5.0",
        "@ethersproject/properties": "^5.5.0",
        "@ethersproject/sha2": "^5.5.0",
        "@ethersproject/signing-key": "^5.5.0",
        "@ethersproject/strings": "^5.5.0",
        "@ethersproject/transactions": "^5.5.0",
        "@ethersproject/wordlists": "^5.5.0"
      }
    },
    "@ethersproject/json-wallets": {
      "version": "5.5.0",
      "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.5.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@ethersproject/abstract-signer": "^5.5.0",
        "@ethersproject/address": "^5.5.0",
        "@ethersproject/bytes": "^5.5.0",
        "@ethersproject/hdnode": "^5.5.0",
        "@ethersproject/keccak256": "^5.5.0",
        "@ethersproject/logger": "^5.5.0",
        "@ethersproject/pbkdf2": "^5.5.0",
        "@ethersproject/properties": "^5.5.0",
        "@ethersproject/random": "^5.5.0",
        "@ethersproject/strings": "^5.5.0",
        "@ethersproject/transactions": "^5.5.0",
        "aes-js": "3.0.0",
        "scrypt-js": "3.0.1"
      }
    },
    "@ethersproject/keccak256": {
      "version": "5.5.0",
      "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.5.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@ethersproject/bytes": "^5.5.0",
        "js-sha3": "0.8.0"
      }
    },
    "@ethersproject/logger": {
      "version": "5.5.0",
      "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.5.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "@ethersproject/networks": {
      "version": "5.5.2",
      "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.5.2.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@ethersproject/logger": "^5.5.0"
      }
    },
    "@ethersproject/pbkdf2": {
      "version": "5.5.0",
      "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.5.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@ethersproject/bytes": "^5.5.0",
        "@ethersproject/sha2": "^5.5.0"
      }
    },
    "@ethersproject/properties": {
      "version": "5.5.0",
      "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.5.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@ethersproject/logger": "^5.5.0"
      }
    },
    "@ethersproject/providers": {
      "version": "5.5.3",
      "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.5.3.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@ethersproject/abstract-provider": "^5.5.0",
        "@ethersproject/abstract-signer": "^5.5.0",
        "@ethersproject/address": "^5.5.0",
        "@ethersproject/basex": "^5.5.0",
        "@ethersproject/bignumber": "^5.5.0",
        "@ethersproject/bytes": "^5.5.0",
        "@ethersproject/constants": "^5.5.0",
        "@ethersproject/hash": "^5.5.0",
        "@ethersproject/logger": "^5.5.0",
        "@ethersproject/networks": "^5.5.0",
        "@ethersproject/properties": "^5.5.0",
        "@ethersproject/random": "^5.5.0",
        "@ethersproject/rlp": "^5.5.0",
        "@ethersproject/sha2": "^5.5.0",
        "@ethersproject/strings": "^5.5.0",
        "@ethersproject/transactions": "^5.5.0",
        "@ethersproject/web": "^5.5.0",
        "bech32": "1.1.4",
        "ws": "7.4.6"
      }
    },
    "@ethersproject/random": {
      "version": "5.5.1",
      "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.5.1.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@ethersproject/bytes": "^5.5.0",
        "@ethersproject/logger": "^5.5.0"
      }
    },
    "@ethersproject/rlp": {
      "version": "5.5.0",
      "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.5.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@ethersproject/bytes": "^5.5.0",
        "@ethersproject/logger": "^5.5.0"
      }
    },
    "@ethersproject/sha2": {
      "version": "5.5.0",
      "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.5.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@ethersproject/bytes": "^5.5.0",
        "@ethersproject/logger": "^5.5.0",
        "hash.js": "1.1.7"
      }
    },
    "@ethersproject/signing-key": {
      "version": "5.5.0",
      "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.5.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@ethersproject/bytes": "^5.5.0",
        "@ethersproject/logger": "^5.5.0",
        "@ethersproject/properties": "^5.5.0",
        "bn.js": "^4.11.9",
        "elliptic": "6.5.4",
        "hash.js": "1.1.7"
      },
      "dependencies": {
        "bn.js": {
          "version": "4.12.2",
          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz",
          "integrity": [REDACTED_SECRET]
        },
        "elliptic": {
          "version": "6.5.4",
          "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "bn.js": "^4.11.9",
            "brorand": "^1.1.0",
            "hash.js": "^1.0.0",
            "hmac-drbg": "^1.0.1",
            "inherits": "^2.0.4",
            "minimalistic-assert": "^1.0.1",
            "minimalistic-crypto-utils": "^1.0.1"
          }
        }
      }
    },
    "@ethersproject/solidity": {
      "version": "5.5.0",
      "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.5.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@ethersproject/bignumber": "^5.5.0",
        "@ethersproject/bytes": "^5.5.0",
        "@ethersproject/keccak256": "^5.5.0",
        "@ethersproject/logger": "^5.5.0",
        "@ethersproject/sha2": "^5.5.0",
        "@ethersproject/strings": "^5.5.0"
      }
    },
    "@ethersproject/strings": {
      "version": "5.5.0",
      "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.5.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@ethersproject/bytes": "^5.5.0",
        "@ethersproject/constants": "^5.5.0",
        "@ethersproject/logger": "^5.5.0"
      }
    },
    "@ethersproject/transactions": {
      "version": "5.5.0",
      "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.5.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@ethersproject/address": "^5.5.0",
        "@ethersproject/bignumber": "^5.5.0",
        "@ethersproject/bytes": "^5.5.0",
        "@ethersproject/constants": "^5.5.0",
        "@ethersproject/keccak256": "^5.5.0",
        "@ethersproject/logger": "^5.5.0",
        "@ethersproject/properties": "^5.5.0",
        "@ethersproject/rlp": "^5.5.0",
        "@ethersproject/signing-key": "^5.5.0"
      }
    },
    "@ethersproject/units": {
      "version": "5.5.0",
      "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.5.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@ethersproject/bignumber": "^5.5.0",
        "@ethersproject/constants": "^5.5.0",
        "@ethersproject/logger": "^5.5.0"
      }
    },
    "@ethersproject/wallet": {
      "version": "5.5.0",
      "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.5.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@ethersproject/abstract-provider": "^5.5.0",
        "@ethersproject/abstract-signer": "^5.5.0",
        "@ethersproject/address": "^5.5.0",
        "@ethersproject/bignumber": "^5.5.0",
        "@ethersproject/bytes": "^5.5.0",
        "@ethersproject/hash": "^5.5.0",
        "@ethersproject/hdnode": "^5.5.0",
        "@ethersproject/json-wallets": "^5.5.0",
        "@ethersproject/keccak256": "^5.5.0",
        "@ethersproject/logger": "^5.5.0",
        "@ethersproject/properties": "^5.5.0",
        "@ethersproject/random": "^5.5.0",
        "@ethersproject/signing-key": "^5.5.0",
        "@ethersproject/transactions": "^5.5.0",
        "@ethersproject/wordlists": "^5.5.0"
      }
    },
    "@ethersproject/web": {
      "version": "5.5.1",
      "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.5.1.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@ethersproject/base64": "^5.5.0",
        "@ethersproject/bytes": "^5.5.0",
        "@ethersproject/logger": "^5.5.0",
        "@ethersproject/properties": "^5.5.0",
        "@ethersproject/strings": "^5.5.0"
      }
    },
    "@ethersproject/wordlists": {
      "version": "5.5.0",
      "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.5.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@ethersproject/bytes": "^5.5.0",
        "@ethersproject/hash": "^5.5.0",
        "@ethersproject/logger": "^5.5.0",
        "@ethersproject/properties": "^5.5.0",
        "@ethersproject/strings": "^5.5.0"
      }
    },
    "@noble/ciphers": {
      "version": "1.3.0",
      "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "@noble/curves": {
      "version": "1.9.1",
      "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.1.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@noble/hashes": "1.8.0"
      }
    },
    "@noble/hashes": {
      "version": "1.8.0",
      "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "@scure/base": {
      "version": "1.2.6",
      "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "@scure/bip32": {
      "version": "1.7.0",
      "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.7.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@noble/curves": "~1.9.0",
        "@noble/hashes": "~1.8.0",
        "@scure/base": "~1.2.5"
      }
    },
    "@scure/bip39": {
      "version": "1.6.0",
      "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.6.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@noble/hashes": "~1.8.0",
        "@scure/base": "~1.2.5"
      }
    },
    "@sindresorhus/is": {
      "version": "0.14.0",
      "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "@szmarczak/http-timer": {
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "defer-to-connect": "^1.0.1"
      }
    },
    "@types/bn.js": {
      "version": "5.2.0",
      "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.2.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@types/node": "*"
      }
    },
    "@types/cacheable-request": {
      "version": "6.0.3",
      "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@types/http-cache-semantics": "*",
        "@types/keyv": "^3.1.4",
        "@types/node": "*",
        "@types/responselike": "^1.0.0"
      }
    },
    "@types/http-cache-semantics": {
      "version": "4.2.0",
      "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "@types/keyv": {
      "version": "3.1.4",
      "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@types/node": "*"
      }
    },
    "@types/node": {
      "version": "25.2.3",
      "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.3.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "undici-types": "~7.16.0"
      }
    },
    "@types/pbkdf2": {
      "version": "3.1.2",
      "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.2.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@types/node": "*"
      }
    },
    "@types/responselike": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@types/node": "*"
      }
    },
    "@types/secp256k1": {
      "version": "4.0.7",
      "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.7.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@types/node": "*"
      }
    },
    "abitype": {
      "version": "1.2.3",
      "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.2.3.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "accepts": {
      "version": "1.3.8",
      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "mime-types": "~2.1.34",
        "negotiator": "0.6.3"
      }
    },
    "aes-js": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "ajv": {
      "version": "6.12.6",
      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "fast-deep-equal": "^3.1.1",
        "fast-json-stable-stringify": "^2.0.0",
        "json-schema-traverse": "^0.4.1",
        "uri-js": "^4.2.2"
      }
    },
    "apexomni-connector-node": {
      "version": "0.3.2-alpha.1",
      "resolved": "https://registry.npmjs.org/apexomni-connector-node/-/apexomni-connector-node-0.3.2-alpha.1.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "axios": "^1.6.7",
        "big.js": "^6.2.1",
        "bigint-buffer": "^1.1.5",
        "bignumber.js": "^9.0.1",
        "crypto": "^1.0.1",
        "crypto-browserify": "^3.12.0",
        "crypto-js": "^4.2.0",
        "es6-promisify": "^7.0.0",
        "ethereum-cryptography": "0.1.3",
        "ethers": "5.5.4",
        "isomorphic-ws": "^4.0.1",
        "lodash": "^4.17.21",
        "qs": "^6.11.1",
        "viem": "^2.21.22",
        "web3": "1.7.4"
      }
    },
    "array-flatten": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "asn1": {
      "version": "0.2.6",
      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "safer-buffer": "~2.1.0"
      }
    },
    "asn1.js": {
      "version": "4.10.1",
      "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "bn.js": "^4.0.0",
        "inherits": "^2.0.1",
        "minimalistic-assert": "^1.0.0"
      },
      "dependencies": {
        "bn.js": {
          "version": "4.12.2",
          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz",
          "integrity": [REDACTED_SECRET]
        }
      }
    },
    "assert-plus": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "async-limiter": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "asynckit": {
      "version": "0.4.0",
      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "available-typed-arrays": {
      "version": "1.0.7",
      "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "possible-typed-array-names": "^1.0.0"
      }
    },
    "aws-sign2": {
      "version": "0.7.0",
      "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "aws4": {
      "version": "1.13.2",
      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "axios": {
      "version": "1.13.5",
      "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "follow-redirects": "^1.15.11",
        "form-data": "^4.0.5",
        "proxy-from-env": "^1.1.0"
      }
    },
    "base-x": {
      "version": "3.0.11",
      "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "safe-buffer": "^5.0.1"
      }
    },
    "base64-js": {
      "version": "1.5.1",
      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "bcrypt-pbkdf": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "tweetnacl": "^0.14.3"
      }
    },
    "bech32": {
      "version": "1.1.4",
      "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "big.js": {
      "version": "6.2.2",
      "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.2.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "bigint-buffer": {
      "version": "1.1.5",
      "resolved": "https://registry.npmjs.org/bigint-buffer/-/bigint-buffer-1.1.5.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "bindings": "^1.3.0"
      }
    },
    "bignumber.js": {
      "version": "9.3.1",
      "resolved": "https://registry.npmmirror.com/bignumber.js/-/bignumber.js-9.3.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "bindings": {
      "version": "1.5.0",
      "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "file-uri-to-path": "1.0.0"
      }
    },
    "blakejs": {
      "version": "1.2.1",
      "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "bluebird": {
      "version": "3.7.2",
      "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "bn.js": {
      "version": "5.2.2",
      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.2.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "body-parser": {
      "version": "1.20.4",
      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "bytes": "~3.1.2",
        "content-type": "~1.0.5",
        "debug": "2.6.9",
        "depd": "2.0.0",
        "destroy": "~1.2.0",
        "http-errors": "~2.0.1",
        "iconv-lite": "~0.4.24",
        "on-finished": "~2.4.1",
        "qs": "~6.14.0",
        "raw-body": "~2.5.3",
        "type-is": "~1.6.18",
        "unpipe": "~1.0.0"
      }
    },
    "brorand": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "browserify-aes": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "buffer-xor": "^1.0.3",
        "cipher-base": "^1.0.0",
        "create-hash": "^1.1.0",
        "evp_bytestokey": "^1.0.3",
        "inherits": "^2.0.1",
        "safe-buffer": "^5.0.1"
      }
    },
    "browserify-cipher": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "browserify-aes": "^1.0.4",
        "browserify-des": "^1.0.0",
        "evp_bytestokey": "^1.0.0"
      }
    },
    "browserify-des": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "cipher-base": "^1.0.1",
        "des.js": "^1.0.0",
        "inherits": "^2.0.1",
        "safe-buffer": "^5.1.2"
      }
    },
    "browserify-rsa": {
      "version": "4.1.1",
      "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.1.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "bn.js": "^5.2.1",
        "randombytes": "^2.1.0",
        "safe-buffer": "^5.2.1"
      }
    },
    "browserify-sign": {
      "version": "4.2.5",
      "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.5.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "bn.js": "^5.2.2",
        "browserify-rsa": "^4.1.1",
        "create-hash": "^1.2.0",
        "create-hmac": "^1.1.7",
        "elliptic": "^6.6.1",
        "inherits": "^2.0.4",
        "parse-asn1": "^5.1.9",
        "readable-stream": "^2.3.8",
        "safe-buffer": "^5.2.1"
      }
    },
    "bs58": {
      "version": "4.0.1",
      "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "base-x": "^3.0.2"
      }
    },
    "bs58check": {
      "version": "2.1.2",
      "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "bs58": "^4.0.0",
        "create-hash": "^1.1.0",
        "safe-buffer": "^5.1.2"
      }
    },
    "buffer": {
      "version": "5.7.1",
      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "base64-js": "^1.3.1",
        "ieee754": "^1.1.13"
      }
    },
    "buffer-to-arraybuffer": {
      "version": "0.0.5",
      "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "buffer-xor": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "bufferutil": {
      "version": "4.1.0",
      "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.1.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "node-gyp-build": "^4.3.0"
      }
    },
    "bytes": {
      "version": "3.1.2",
      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "cacheable-lookup": {
      "version": "5.0.4",
      "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "cacheable-request": {
      "version": "6.1.0",
      "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "clone-response": "^1.0.2",
        "get-stream": "^5.1.0",
        "http-cache-semantics": "^4.0.0",
        "keyv": "^3.0.0",
        "lowercase-keys": "^2.0.0",
        "normalize-url": "^4.1.0",
        "responselike": "^1.0.2"
      },
      "dependencies": {
        "get-stream": {
          "version": "5.2.0",
          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "pump": "^3.0.0"
          }
        },
        "lowercase-keys": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
          "integrity": [REDACTED_SECRET]
        }
      }
    },
    "call-bind": {
      "version": "1.0.8",
      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "call-bind-apply-helpers": "^1.0.0",
        "es-define-property": "^1.0.0",
        "get-intrinsic": "^1.2.4",
        "set-function-length": "^1.2.2"
      }
    },
    "call-bind-apply-helpers": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "es-errors": "^1.3.0",
        "function-bind": "^1.1.2"
      }
    },
    "call-bound": {
      "version": "1.0.4",
      "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "call-bind-apply-helpers": "^1.0.2",
        "get-intrinsic": "^1.3.0"
      }
    },
    "caseless": {
      "version": "0.12.0",
      "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "chownr": {
      "version": "1.1.4",
      "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "cids": {
      "version": "0.7.5",
      "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "buffer": "^5.5.0",
        "class-is": "^1.1.0",
        "multibase": "~0.6.0",
        "multicodec": "^1.0.0",
        "multihashes": "~0.4.15"
      },
      "dependencies": {
        "multicodec": {
          "version": "1.0.4",
          "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "buffer": "^5.6.0",
            "varint": "^5.0.0"
          }
        }
      }
    },
    "cipher-base": {
      "version": "1.0.7",
      "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.7.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "inherits": "^2.0.4",
        "safe-buffer": "^5.2.1",
        "to-buffer": "^1.2.2"
      }
    },
    "class-is": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "clone-response": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "mimic-response": "^1.0.0"
      }
    },
    "combined-stream": {
      "version": "1.0.8",
      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "delayed-stream": "~1.0.0"
      }
    },
    "content-disposition": {
      "version": "0.5.4",
      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "safe-buffer": "5.2.1"
      }
    },
    "content-hash": {
      "version": "2.5.2",
      "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "cids": "^0.7.1",
        "multicodec": "^0.5.5",
        "multihashes": "^0.4.15"
      }
    },
    "content-type": {
      "version": "1.0.5",
      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "cookie": {
      "version": "0.7.2",
      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "cookie-signature": {
      "version": "1.0.7",
      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "cookiejar": {
      "version": "2.1.4",
      "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "core-util-is": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "cors": {
      "version": "2.8.6",
      "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "object-assign": "^4",
        "vary": "^1"
      }
    },
    "crc-32": {
      "version": "1.2.2",
      "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "create-ecdh": {
      "version": "4.0.4",
      "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "bn.js": "^4.1.0",
        "elliptic": "^6.5.3"
      },
      "dependencies": {
        "bn.js": {
          "version": "4.12.2",
          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz",
          "integrity": [REDACTED_SECRET]
        }
      }
    },
    "create-hash": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "cipher-base": "^1.0.1",
        "inherits": "^2.0.1",
        "md5.js": "^1.3.4",
        "ripemd160": "^2.0.1",
        "sha.js": "^2.4.0"
      }
    },
    "create-hmac": {
      "version": "1.1.7",
      "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "cipher-base": "^1.0.3",
        "create-hash": "^1.1.0",
        "inherits": "^2.0.1",
        "ripemd160": "^2.0.0",
        "safe-buffer": "^5.0.1",
        "sha.js": "^2.4.8"
      }
    },
    "crypto": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "crypto-browserify": {
      "version": "3.12.1",
      "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.1.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "browserify-cipher": "^1.0.1",
        "browserify-sign": "^4.2.3",
        "create-ecdh": "^4.0.4",
        "create-hash": "^1.2.0",
        "create-hmac": "^1.1.7",
        "diffie-hellman": "^5.0.3",
        "hash-base": "~3.0.4",
        "inherits": "^2.0.4",
        "pbkdf2": "^3.1.2",
        "public-encrypt": "^4.0.3",
        "randombytes": "^2.1.0",
        "randomfill": "^1.0.4"
      }
    },
    "crypto-js": {
      "version": "4.2.0",
      "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "d": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "es5-ext": "^0.10.64",
        "type": "^2.7.2"
      }
    },
    "dashdash": {
      "version": "1.14.1",
      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "assert-plus": "^1.0.0"
      }
    },
    "data-uri-to-buffer": {
      "version": "4.0.1",
      "resolved": "https://registry.npmmirror.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "debug": {
      "version": "2.6.9",
      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "ms": "2.0.0"
      }
    },
    "decode-uri-component": {
      "version": "0.2.2",
      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "decompress-response": {
      "version": "3.3.0",
      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "mimic-response": "^1.0.0"
      }
    },
    "defer-to-connect": {
      "version": "1.1.3",
      "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "define-data-property": {
      "version": "1.1.4",
      "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "es-define-property": "^1.0.0",
        "es-errors": "^1.3.0",
        "gopd": "^1.0.1"
      }
    },
    "delayed-stream": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "depd": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "des.js": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "inherits": "^2.0.1",
        "minimalistic-assert": "^1.0.0"
      }
    },
    "destroy": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "diffie-hellman": {
      "version": "5.0.3",
      "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "bn.js": "^4.1.0",
        "miller-rabin": "^4.0.0",
        "randombytes": "^2.0.0"
      },
      "dependencies": {
        "bn.js": {
          "version": "4.12.2",
          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz",
          "integrity": [REDACTED_SECRET]
        }
      }
    },
    "dom-walk": {
      "version": "0.1.2",
      "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "dunder-proto": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "call-bind-apply-helpers": "^1.0.1",
        "es-errors": "^1.3.0",
        "gopd": "^1.2.0"
      }
    },
    "duplexer3": {
      "version": "0.1.5",
      "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "ecc-jsbn": {
      "version": "0.1.2",
      "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "jsbn": "~0.1.0",
        "safer-buffer": "^2.1.0"
      }
    },
    "ee-first": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "elliptic": {
      "version": "6.6.1",
      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "bn.js": "^4.11.9",
        "brorand": "^1.1.0",
        "hash.js": "^1.0.0",
        "hmac-drbg": "^1.0.1",
        "inherits": "^2.0.4",
        "minimalistic-assert": "^1.0.1",
        "minimalistic-crypto-utils": "^1.0.1"
      },
      "dependencies": {
        "bn.js": {
          "version": "4.12.2",
          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz",
          "integrity": [REDACTED_SECRET]
        }
      }
    },
    "encodeurl": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "end-of-stream": {
      "version": "1.4.5",
      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "once": "^1.4.0"
      }
    },
    "es-define-property": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "es-errors": {
      "version": "1.3.0",
      "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "es-object-atoms": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "es-errors": "^1.3.0"
      }
    },
    "es-set-tostringtag": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "es-errors": "^1.3.0",
        "get-intrinsic": "^1.2.6",
        "has-tostringtag": "^1.0.2",
        "hasown": "^2.0.2"
      }
    },
    "es5-ext": {
      "version": "0.10.64",
      "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "es6-iterator": "^2.0.3",
        "es6-symbol": "^3.1.3",
        "esniff": "^2.0.1",
        "next-tick": "^1.1.0"
      }
    },
    "es6-iterator": {
      "version": "2.0.3",
      "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "d": "1",
        "es5-ext": "^0.10.35",
        "es6-symbol": "^3.1.1"
      }
    },
    "es6-promisify": {
      "version": "7.0.0",
      "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-7.0.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "es6-symbol": {
      "version": "3.1.4",
      "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "d": "^1.0.2",
        "ext": "^1.7.0"
      }
    },
    "escape-html": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "esniff": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "d": "^1.0.1",
        "es5-ext": "^0.10.62",
        "event-emitter": "^0.3.5",
        "type": "^2.7.2"
      }
    },
    "etag": {
      "version": "1.8.1",
      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "eth-ens-namehash": {
      "version": "2.0.8",
      "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "idna-uts46-hx": "^2.3.1",
        "js-sha3": "^0.5.7"
      },
      "dependencies": {
        "js-sha3": {
          "version": "0.5.7",
          "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz",
          "integrity": [REDACTED_SECRET]
        }
      }
    },
    "eth-lib": {
      "version": "0.1.29",
      "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "bn.js": "^4.11.6",
        "elliptic": "^6.4.0",
        "nano-json-stream-parser": "^0.1.2",
        "servify": "^0.1.12",
        "ws": "^3.0.0",
        "xhr-request-promise": "^0.1.2"
      },
      "dependencies": {
        "bn.js": {
          "version": "4.12.2",
          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz",
          "integrity": [REDACTED_SECRET]
        },
        "safe-buffer": {
          "version": "5.1.2",
          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
          "integrity": [REDACTED_SECRET]
        },
        "ws": {
          "version": "3.3.3",
          "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "async-limiter": "~1.0.0",
            "safe-buffer": "~5.1.0",
            "ultron": "~1.1.0"
          }
        }
      }
    },
    "ethereum-bloom-filters": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.2.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@noble/hashes": "^1.4.0"
      }
    },
    "ethereum-cryptography": {
      "version": "0.1.3",
      "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@types/pbkdf2": "^3.0.0",
        "@types/secp256k1": "^4.0.1",
        "blakejs": "^1.1.0",
        "browserify-aes": "^1.2.0",
        "bs58check": "^2.1.2",
        "create-hash": "^1.2.0",
        "create-hmac": "^1.1.7",
        "hash.js": "^1.1.7",
        "keccak": "^3.0.0",
        "pbkdf2": "^3.0.17",
        "randombytes": "^2.1.0",
        "safe-buffer": "^5.1.2",
        "scrypt-js": "^3.0.0",
        "secp256k1": "^4.0.1",
        "setimmediate": "^1.0.5"
      }
    },
    "ethereumjs-util": {
      "version": "7.1.5",
      "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@types/bn.js": "^5.1.0",
        "bn.js": "^5.1.2",
        "create-hash": "^1.1.2",
        "ethereum-cryptography": "^0.1.3",
        "rlp": "^2.2.4"
      }
    },
    "ethers": {
      "version": "5.5.4",
      "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.5.4.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@ethersproject/abi": "5.5.0",
        "@ethersproject/abstract-provider": "5.5.1",
        "@ethersproject/abstract-signer": "5.5.0",
        "@ethersproject/address": "5.5.0",
        "@ethersproject/base64": "5.5.0",
        "@ethersproject/basex": "5.5.0",
        "@ethersproject/bignumber": "5.5.0",
        "@ethersproject/bytes": "5.5.0",
        "@ethersproject/constants": "5.5.0",
        "@ethersproject/contracts": "5.5.0",
        "@ethersproject/hash": "5.5.0",
        "@ethersproject/hdnode": "5.5.0",
        "@ethersproject/json-wallets": "5.5.0",
        "@ethersproject/keccak256": "5.5.0",
        "@ethersproject/logger": "5.5.0",
        "@ethersproject/networks": "5.5.2",
        "@ethersproject/pbkdf2": "5.5.0",
        "@ethersproject/properties": "5.5.0",
        "@ethersproject/providers": "5.5.3",
        "@ethersproject/random": "5.5.1",
        "@ethersproject/rlp": "5.5.0",
        "@ethersproject/sha2": "5.5.0",
        "@ethersproject/signing-key": "5.5.0",
        "@ethersproject/solidity": "5.5.0",
        "@ethersproject/strings": "5.5.0",
        "@ethersproject/transactions": "5.5.0",
        "@ethersproject/units": "5.5.0",
        "@ethersproject/wallet": "5.5.0",
        "@ethersproject/web": "5.5.1",
        "@ethersproject/wordlists": "5.5.0"
      }
    },
    "ethjs-unit": {
      "version": "0.1.6",
      "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "bn.js": "4.11.6",
        "number-to-bn": "1.7.0"
      },
      "dependencies": {
        "bn.js": {
          "version": "4.11.6",
          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
          "integrity": [REDACTED_SECRET]
        }
      }
    },
    "event-emitter": {
      "version": "0.3.5",
      "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "d": "1",
        "es5-ext": "~0.10.14"
      }
    },
    "eventemitter3": {
      "version": "5.0.1",
      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "evp_bytestokey": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "md5.js": "^1.3.4",
        "safe-buffer": "^5.1.1"
      }
    },
    "express": {
      "version": "4.22.1",
      "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "accepts": "~1.3.8",
        "array-flatten": "1.1.1",
        "body-parser": "~1.20.3",
        "content-disposition": "~0.5.4",
        "content-type": "~1.0.4",
        "cookie": "~0.7.1",
        "cookie-signature": "~1.0.6",
        "debug": "2.6.9",
        "depd": "2.0.0",
        "encodeurl": "~2.0.0",
        "escape-html": "~1.0.3",
        "etag": "~1.8.1",
        "finalhandler": "~1.3.1",
        "fresh": "~0.5.2",
        "http-errors": "~2.0.0",
        "merge-descriptors": "1.0.3",
        "methods": "~1.1.2",
        "on-finished": "~2.4.1",
        "parseurl": "~1.3.3",
        "path-to-regexp": "~0.1.12",
        "proxy-addr": "~2.0.7",
        "qs": "~6.14.0",
        "range-parser": "~1.2.1",
        "safe-buffer": "5.2.1",
        "send": "~0.19.0",
        "serve-static": "~1.16.2",
        "setprototypeof": "1.2.0",
        "statuses": "~2.0.1",
        "type-is": "~1.6.18",
        "utils-merge": "1.0.1",
        "vary": "~1.1.2"
      }
    },
    "ext": {
      "version": "1.7.0",
      "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "type": "^2.7.2"
      }
    },
    "extend": {
      "version": "3.0.2",
      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "extsprintf": {
      "version": "1.3.0",
      "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "fast-deep-equal": {
      "version": "3.1.3",
      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "fast-json-stable-stringify": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "fetch-blob": {
      "version": "3.2.0",
      "resolved": "https://registry.npmmirror.com/fetch-blob/-/fetch-blob-3.2.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "node-domexception": "^1.0.0",
        "web-streams-polyfill": "^3.0.3"
      }
    },
    "file-uri-to-path": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "finalhandler": {
      "version": "1.3.2",
      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "debug": "2.6.9",
        "encodeurl": "~2.0.0",
        "escape-html": "~1.0.3",
        "on-finished": "~2.4.1",
        "parseurl": "~1.3.3",
        "statuses": "~2.0.2",
        "unpipe": "~1.0.0"
      }
    },
    "follow-redirects": {
      "version": "1.15.11",
      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "for-each": {
      "version": "0.3.5",
      "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "is-callable": "^1.2.7"
      }
    },
    "forever-agent": {
      "version": "0.6.1",
      "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "form-data": {
      "version": "4.0.5",
      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "asynckit": "^0.4.0",
        "combined-stream": "^1.0.8",
        "es-set-tostringtag": "^2.1.0",
        "hasown": "^2.0.2",
        "mime-types": "^2.1.12"
      }
    },
    "formdata-polyfill": {
      "version": "4.0.10",
      "resolved": "https://registry.npmmirror.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "fetch-blob": "^3.1.2"
      }
    },
    "forwarded": {
      "version": "0.2.0",
      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "fresh": {
      "version": "0.5.2",
      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "fs-extra": {
      "version": "4.0.3",
      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "graceful-fs": "^4.1.2",
        "jsonfile": "^4.0.0",
        "universalify": "^0.1.0"
      }
    },
    "fs-minipass": {
      "version": "1.2.7",
      "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "minipass": "^2.6.0"
      }
    },
    "function-bind": {
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "generator-function": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "get-intrinsic": {
      "version": "1.3.0",
      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "call-bind-apply-helpers": "^1.0.2",
        "es-define-property": "^1.0.1",
        "es-errors": "^1.3.0",
        "es-object-atoms": "^1.1.1",
        "function-bind": "^1.1.2",
        "get-proto": "^1.0.1",
        "gopd": "^1.2.0",
        "has-symbols": "^1.1.0",
        "hasown": "^2.0.2",
        "math-intrinsics": "^1.1.0"
      }
    },
    "get-proto": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "dunder-proto": "^1.0.1",
        "es-object-atoms": "^1.0.0"
      }
    },
    "get-stream": {
      "version": "4.1.0",
      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "pump": "^3.0.0"
      }
    },
    "getpass": {
      "version": "0.1.7",
      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "assert-plus": "^1.0.0"
      }
    },
    "global": {
      "version": "4.4.0",
      "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "min-document": "^2.19.0",
        "process": "^0.11.10"
      }
    },
    "gopd": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "got": {
      "version": "9.6.0",
      "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@sindresorhus/is": "^0.14.0",
        "@szmarczak/http-timer": "^1.1.2",
        "cacheable-request": "^6.0.0",
        "decompress-response": "^3.3.0",
        "duplexer3": "^0.1.4",
        "get-stream": "^4.1.0",
        "lowercase-keys": "^1.0.1",
        "mimic-response": "^1.0.1",
        "p-cancelable": "^1.0.0",
        "to-readable-stream": "^1.0.0",
        "url-parse-lax": "^3.0.0"
      }
    },
    "graceful-fs": {
      "version": "4.2.11",
      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "har-schema": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "har-validator": {
      "version": "5.1.5",
      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "ajv": "^6.12.3",
        "har-schema": "^2.0.0"
      }
    },
    "has-property-descriptors": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "es-define-property": "^1.0.0"
      }
    },
    "has-symbols": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "has-tostringtag": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "has-symbols": "^1.0.3"
      }
    },
    "hash-base": {
      "version": "3.0.5",
      "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.5.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "inherits": "^2.0.4",
        "safe-buffer": "^5.2.1"
      }
    },
    "hash.js": {
      "version": "1.1.7",
      "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "inherits": "^2.0.3",
        "minimalistic-assert": "^1.0.1"
      }
    },
    "hasown": {
      "version": "2.0.2",
      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "function-bind": "^1.1.2"
      }
    },
    "hmac-drbg": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "hash.js": "^1.0.3",
        "minimalistic-assert": "^1.0.0",
        "minimalistic-crypto-utils": "^1.0.1"
      }
    },
    "http-cache-semantics": {
      "version": "4.2.0",
      "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "http-errors": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "depd": "~2.0.0",
        "inherits": "~2.0.4",
        "setprototypeof": "~1.2.0",
        "statuses": "~2.0.2",
        "toidentifier": "~1.0.1"
      }
    },
    "http-https": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "http-signature": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "assert-plus": "^1.0.0",
        "jsprim": "^1.2.2",
        "sshpk": "^1.7.0"
      }
    },
    "http2-wrapper": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "quick-lru": "^5.1.1",
        "resolve-alpn": "^1.0.0"
      }
    },
    "iconv-lite": {
      "version": "0.4.24",
      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "safer-buffer": ">= 2.1.2 < 3"
      }
    },
    "idna-uts46-hx": {
      "version": "2.3.1",
      "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "punycode": "2.1.0"
      },
      "dependencies": {
        "punycode": {
          "version": "2.1.0",
          "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz",
          "integrity": [REDACTED_SECRET]
        }
      }
    },
    "ieee754": {
      "version": "1.2.1",
      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "inherits": {
      "version": "2.0.4",
      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "ipaddr.js": {
      "version": "1.9.1",
      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "is-arguments": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "call-bound": "^1.0.2",
        "has-tostringtag": "^1.0.2"
      }
    },
    "is-callable": {
      "version": "1.2.7",
      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "is-function": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "is-generator-function": {
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "call-bound": "^1.0.4",
        "generator-function": "^2.0.0",
        "get-proto": "^1.0.1",
        "has-tostringtag": "^1.0.2",
        "safe-regex-test": "^1.1.0"
      }
    },
    "is-hex-prefixed": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "is-regex": {
      "version": "1.2.1",
      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "call-bound": "^1.0.2",
        "gopd": "^1.2.0",
        "has-tostringtag": "^1.0.2",
        "hasown": "^2.0.2"
      }
    },
    "is-typed-array": {
      "version": "1.1.15",
      "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "which-typed-array": "^1.1.16"
      }
    },
    "is-typedarray": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "isarray": {
      "version": "2.0.5",
      "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "isomorphic-ws": {
      "version": "4.0.1",
      "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "isows": {
      "version": "1.0.7",
      "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.7.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "isstream": {
      "version": "0.1.2",
      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "js-sha3": {
      "version": "0.8.0",
      "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "jsbn": {
      "version": "0.1.1",
      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "json-buffer": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "json-schema": {
      "version": "0.4.0",
      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "json-schema-traverse": {
      "version": "0.4.1",
      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "json-stringify-safe": {
      "version": "5.0.1",
      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "jsonfile": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "graceful-fs": "^4.1.6"
      }
    },
    "jsprim": {
      "version": "1.4.2",
      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "assert-plus": "1.0.0",
        "extsprintf": "1.3.0",
        "json-schema": "0.4.0",
        "verror": "1.10.0"
      }
    },
    "keccak": {
      "version": "3.0.4",
      "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "node-addon-api": "^2.0.0",
        "node-gyp-build": "^4.2.0",
        "readable-stream": "^3.6.0"
      },
      "dependencies": {
        "readable-stream": {
          "version": "3.6.2",
          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "inherits": "^2.0.3",
            "string_decoder": "^1.1.1",
            "util-deprecate": "^1.0.1"
          }
        }
      }
    },
    "keyv": {
      "version": "3.1.0",
      "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "json-buffer": "3.0.0"
      }
    },
    "lodash": {
      "version": "4.17.23",
      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "lowercase-keys": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "math-intrinsics": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "md5.js": {
      "version": "1.3.5",
      "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "hash-base": "^3.0.0",
        "inherits": "^2.0.1",
        "safe-buffer": "^5.1.2"
      }
    },
    "media-typer": {
      "version": "0.3.0",
      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "merge-descriptors": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "methods": {
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "miller-rabin": {
      "version": "4.0.1",
      "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "bn.js": "^4.0.0",
        "brorand": "^1.0.1"
      },
      "dependencies": {
        "bn.js": {
          "version": "4.12.2",
          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz",
          "integrity": [REDACTED_SECRET]
        }
      }
    },
    "mime": {
      "version": "1.6.0",
      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "mime-db": {
      "version": "1.52.0",
      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "mime-types": {
      "version": "2.1.35",
      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "mime-db": "1.52.0"
      }
    },
    "mimic-response": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "min-document": {
      "version": "2.19.2",
      "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.2.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "dom-walk": "^0.1.0"
      }
    },
    "minimalistic-assert": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "minimalistic-crypto-utils": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "minimist": {
      "version": "1.2.8",
      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "minipass": {
      "version": "2.9.0",
      "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "safe-buffer": "^5.1.2",
        "yallist": "^3.0.0"
      }
    },
    "minizlib": {
      "version": "1.3.3",
      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "minipass": "^2.9.0"
      }
    },
    "mkdirp": {
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "mkdirp-promise": {
      "version": "5.0.1",
      "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "mkdirp": "*"
      }
    },
    "mock-fs": {
      "version": "4.14.0",
      "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "ms": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "multibase": {
      "version": "0.6.1",
      "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "base-x": "^3.0.8",
        "buffer": "^5.5.0"
      }
    },
    "multicodec": {
      "version": "0.5.7",
      "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "varint": "^5.0.0"
      }
    },
    "multihashes": {
      "version": "0.4.21",
      "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "buffer": "^5.5.0",
        "multibase": "^0.7.0",
        "varint": "^5.0.0"
      },
      "dependencies": {
        "multibase": {
          "version": "0.7.0",
          "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "base-x": "^3.0.8",
            "buffer": "^5.5.0"
          }
        }
      }
    },
    "nano-json-stream-parser": {
      "version": "0.1.2",
      "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "negotiator": {
      "version": "0.6.3",
      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "next-tick": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "node-addon-api": {
      "version": "2.0.2",
      "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "node-domexception": {
      "version": "1.0.0",
      "resolved": "https://registry.npmmirror.com/node-domexception/-/node-domexception-1.0.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "node-fetch": {
      "version": "3.3.2",
      "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-3.3.2.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "data-uri-to-buffer": "^4.0.0",
        "fetch-blob": "^3.1.4",
        "formdata-polyfill": "^4.0.10"
      }
    },
    "node-gyp-build": {
      "version": "4.8.4",
      "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "normalize-url": {
      "version": "4.5.1",
      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "number-to-bn": {
      "version": "1.7.0",
      "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "bn.js": "4.11.6",
        "strip-hex-prefix": "1.0.0"
      },
      "dependencies": {
        "bn.js": {
          "version": "4.11.6",
          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz",
          "integrity": [REDACTED_SECRET]
        }
      }
    },
    "oauth-sign": {
      "version": "0.9.0",
      "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "object-assign": {
      "version": "4.1.1",
      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "object-inspect": {
      "version": "1.13.4",
      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "oboe": {
      "version": "2.1.5",
      "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "http-https": "^1.0.0"
      }
    },
    "on-finished": {
      "version": "2.4.1",
      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "ee-first": "1.1.1"
      }
    },
    "once": {
      "version": "1.4.0",
      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "wrappy": "1"
      }
    },
    "ox": {
      "version": "0.12.1",
      "resolved": "https://registry.npmjs.org/ox/-/ox-0.12.1.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@adraffy/ens-normalize": "^1.11.0",
        "@noble/ciphers": "^1.3.0",
        "@noble/curves": "1.9.1",
        "@noble/hashes": "^1.8.0",
        "@scure/bip32": "^1.7.0",
        "@scure/bip39": "^1.6.0",
        "abitype": "^1.2.3",
        "eventemitter3": "5.0.1"
      }
    },
    "p-cancelable": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "parse-asn1": {
      "version": "5.1.9",
      "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.9.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "asn1.js": "^4.10.1",
        "browserify-aes": "^1.2.0",
        "evp_bytestokey": "^1.0.3",
        "pbkdf2": "^3.1.5",
        "safe-buffer": "^5.2.1"
      }
    },
    "parse-headers": {
      "version": "2.0.6",
      "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.6.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "parseurl": {
      "version": "1.3.3",
      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "path-to-regexp": {
      "version": "0.1.12",
      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "pbkdf2": {
      "version": "3.1.5",
      "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.5.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "create-hash": "^1.2.0",
        "create-hmac": "^1.1.7",
        "ripemd160": "^2.0.3",
        "safe-buffer": "^5.2.1",
        "sha.js": "^2.4.12",
        "to-buffer": "^1.2.1"
      }
    },
    "performance-now": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "possible-typed-array-names": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "prepend-http": {
      "version": "2.0.0",
      "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "process": {
      "version": "0.11.10",
      "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "process-nextick-args": {
      "version": "2.0.1",
      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "proxy-addr": {
      "version": "2.0.7",
      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "forwarded": "0.2.0",
        "ipaddr.js": "1.9.1"
      }
    },
    "proxy-from-env": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "psl": {
      "version": "1.15.0",
      "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "punycode": "^2.3.1"
      }
    },
    "public-encrypt": {
      "version": "4.0.3",
      "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "bn.js": "^4.1.0",
        "browserify-rsa": "^4.0.0",
        "create-hash": "^1.1.0",
        "parse-asn1": "^5.0.0",
        "randombytes": "^2.0.1",
        "safe-buffer": "^5.1.2"
      },
      "dependencies": {
        "bn.js": {
          "version": "4.12.2",
          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz",
          "integrity": [REDACTED_SECRET]
        }
      }
    },
    "pump": {
      "version": "3.0.3",
      "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "end-of-stream": "^1.1.0",
        "once": "^1.3.1"
      }
    },
    "punycode": {
      "version": "2.3.1",
      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "qs": {
      "version": "6.14.1",
      "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "side-channel": "^1.1.0"
      }
    },
    "query-string": {
      "version": "5.1.1",
      "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "decode-uri-component": "^0.2.0",
        "object-assign": "^4.1.0",
        "strict-uri-encode": "^1.0.0"
      }
    },
    "quick-lru": {
      "version": "5.1.1",
      "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "randombytes": {
      "version": "2.1.0",
      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "safe-buffer": "^5.1.0"
      }
    },
    "randomfill": {
      "version": "1.0.4",
      "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "randombytes": "^2.0.5",
        "safe-buffer": "^5.1.0"
      }
    },
    "range-parser": {
      "version": "1.2.1",
      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "raw-body": {
      "version": "2.5.3",
      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "bytes": "~3.1.2",
        "http-errors": "~2.0.1",
        "iconv-lite": "~0.4.24",
        "unpipe": "~1.0.0"
      }
    },
    "readable-stream": {
      "version": "2.3.8",
      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "core-util-is": "~1.0.0",
        "inherits": "~2.0.3",
        "isarray": "~1.0.0",
        "process-nextick-args": "~2.0.0",
        "safe-buffer": "~5.1.1",
        "string_decoder": "~1.1.1",
        "util-deprecate": "~1.0.1"
      },
      "dependencies": {
        "isarray": {
          "version": "1.0.0",
          "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
          "integrity": [REDACTED_SECRET]
        },
        "safe-buffer": {
          "version": "5.1.2",
          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
          "integrity": [REDACTED_SECRET]
        }
      }
    },
    "request": {
      "version": "2.88.2",
      "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "aws-sign2": "~0.7.0",
        "aws4": "^1.8.0",
        "caseless": "~0.12.0",
        "combined-stream": "~1.0.6",
        "extend": "~3.0.2",
        "forever-agent": "~0.6.1",
        "form-data": "~2.3.2",
        "har-validator": "~5.1.3",
        "http-signature": "~1.2.0",
        "is-typedarray": "~1.0.0",
        "isstream": "~0.1.2",
        "json-stringify-safe": "~5.0.1",
        "mime-types": "~2.1.19",
        "oauth-sign": "~0.9.0",
        "performance-now": "^2.1.0",
        "qs": "~6.5.2",
        "safe-buffer": "^5.1.2",
        "tough-cookie": "~2.5.0",
        "tunnel-agent": "^0.6.0",
        "uuid": "^3.3.2"
      },
      "dependencies": {
        "form-data": {
          "version": "2.3.3",
          "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "asynckit": "^0.4.0",
            "combined-stream": "^1.0.6",
            "mime-types": "^2.1.12"
          }
        },
        "qs": {
          "version": "6.5.3",
          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
          "integrity": [REDACTED_SECRET]
        }
      }
    },
    "resolve-alpn": {
      "version": "1.2.1",
      "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "responselike": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "lowercase-keys": "^1.0.0"
      }
    },
    "ripemd160": {
      "version": "2.0.3",
      "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.3.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "hash-base": "^3.1.2",
        "inherits": "^2.0.4"
      },
      "dependencies": {
        "hash-base": {
          "version": "3.1.2",
          "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.2.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "inherits": "^2.0.4",
            "readable-stream": "^2.3.8",
            "safe-buffer": "^5.2.1",
            "to-buffer": "^1.2.1"
          }
        }
      }
    },
    "rlp": {
      "version": "2.2.7",
      "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "bn.js": "^5.2.0"
      }
    },
    "safe-buffer": {
      "version": "5.2.1",
      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "safe-regex-test": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "call-bound": "^1.0.2",
        "es-errors": "^1.3.0",
        "is-regex": "^1.2.1"
      }
    },
    "safer-buffer": {
      "version": "2.1.2",
      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "scrypt-js": {
      "version": "3.0.1",
      "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "secp256k1": {
      "version": "4.0.4",
      "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.4.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "elliptic": "^6.5.7",
        "node-addon-api": "^5.0.0",
        "node-gyp-build": "^4.2.0"
      },
      "dependencies": {
        "node-addon-api": {
          "version": "5.1.0",
          "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz",
          "integrity": [REDACTED_SECRET]
        }
      }
    },
    "send": {
      "version": "0.19.2",
      "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "debug": "2.6.9",
        "depd": "2.0.0",
        "destroy": "1.2.0",
        "encodeurl": "~2.0.0",
        "escape-html": "~1.0.3",
        "etag": "~1.8.1",
        "fresh": "~0.5.2",
        "http-errors": "~2.0.1",
        "mime": "1.6.0",
        "ms": "2.1.3",
        "on-finished": "~2.4.1",
        "range-parser": "~1.2.1",
        "statuses": "~2.0.2"
      },
      "dependencies": {
        "ms": {
          "version": "2.1.3",
          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
          "integrity": [REDACTED_SECRET]
        }
      }
    },
    "serve-static": {
      "version": "1.16.3",
      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "encodeurl": "~2.0.0",
        "escape-html": "~1.0.3",
        "parseurl": "~1.3.3",
        "send": "~0.19.1"
      }
    },
    "servify": {
      "version": "0.1.12",
      "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "body-parser": "^1.16.0",
        "cors": "^2.8.1",
        "express": "^4.14.0",
        "request": "^2.79.0",
        "xhr": "^2.3.3"
      }
    },
    "set-function-length": {
      "version": "1.2.2",
      "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "define-data-property": "^1.1.4",
        "es-errors": "^1.3.0",
        "function-bind": "^1.1.2",
        "get-intrinsic": "^1.2.4",
        "gopd": "^1.0.1",
        "has-property-descriptors": "^1.0.2"
      }
    },
    "setimmediate": {
      "version": "1.0.5",
      "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "setprototypeof": {
      "version": "1.2.0",
      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "sha.js": {
      "version": "2.4.12",
      "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "inherits": "^2.0.4",
        "safe-buffer": "^5.2.1",
        "to-buffer": "^1.2.0"
      }
    },
    "side-channel": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "es-errors": "^1.3.0",
        "object-inspect": "^1.13.3",
        "side-channel-list": "^1.0.0",
        "side-channel-map": "^1.0.1",
        "side-channel-weakmap": "^1.0.2"
      }
    },
    "side-channel-list": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "es-errors": "^1.3.0",
        "object-inspect": "^1.13.3"
      }
    },
    "side-channel-map": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "call-bound": "^1.0.2",
        "es-errors": "^1.3.0",
        "get-intrinsic": "^1.2.5",
        "object-inspect": "^1.13.3"
      }
    },
    "side-channel-weakmap": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "call-bound": "^1.0.2",
        "es-errors": "^1.3.0",
        "get-intrinsic": "^1.2.5",
        "object-inspect": "^1.13.3",
        "side-channel-map": "^1.0.1"
      }
    },
    "simple-concat": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "simple-get": {
      "version": "2.8.2",
      "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.2.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "decompress-response": "^3.3.0",
        "once": "^1.3.1",
        "simple-concat": "^1.0.0"
      }
    },
    "sshpk": {
      "version": "1.18.0",
      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "asn1": "~0.2.3",
        "assert-plus": "^1.0.0",
        "bcrypt-pbkdf": "^1.0.0",
        "dashdash": "^1.12.0",
        "ecc-jsbn": "~0.1.1",
        "getpass": "^0.1.1",
        "jsbn": "~0.1.0",
        "safer-buffer": "^2.0.2",
        "tweetnacl": "~0.14.0"
      }
    },
    "statuses": {
      "version": "2.0.2",
      "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "strict-uri-encode": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "string_decoder": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "safe-buffer": "~5.1.0"
      },
      "dependencies": {
        "safe-buffer": {
          "version": "5.1.2",
          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
          "integrity": [REDACTED_SECRET]
        }
      }
    },
    "strip-hex-prefix": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "is-hex-prefixed": "1.0.0"
      }
    },
    "swarm-js": {
      "version": "0.1.42",
      "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.42.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "bluebird": "^3.5.0",
        "buffer": "^5.0.5",
        "eth-lib": "^0.1.26",
        "fs-extra": "^4.0.2",
        "got": "^11.8.5",
        "mime-types": "^2.1.16",
        "mkdirp-promise": "^5.0.1",
        "mock-fs": "^4.1.0",
        "setimmediate": "^1.0.5",
        "tar": "^4.0.2",
        "xhr-request": "^1.0.1"
      },
      "dependencies": {
        "@sindresorhus/is": {
          "version": "4.6.0",
          "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
          "integrity": [REDACTED_SECRET]
        },
        "@szmarczak/http-timer": {
          "version": "4.0.6",
          "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "defer-to-connect": "^2.0.0"
          }
        },
        "cacheable-request": {
          "version": "7.0.4",
          "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "clone-response": "^1.0.2",
            "get-stream": "^5.1.0",
            "http-cache-semantics": "^4.0.0",
            "keyv": "^4.0.0",
            "lowercase-keys": "^2.0.0",
            "normalize-url": "^6.0.1",
            "responselike": "^2.0.0"
          }
        },
        "decompress-response": {
          "version": "6.0.0",
          "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "mimic-response": "^3.1.0"
          }
        },
        "defer-to-connect": {
          "version": "2.0.1",
          "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
          "integrity": [REDACTED_SECRET]
        },
        "get-stream": {
          "version": "5.2.0",
          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "pump": "^3.0.0"
          }
        },
        "got": {
          "version": "11.8.6",
          "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "@sindresorhus/is": "^4.0.0",
            "@szmarczak/http-timer": "^4.0.5",
            "@types/cacheable-request": "^6.0.1",
            "@types/responselike": "^1.0.0",
            "cacheable-lookup": "^5.0.3",
            "cacheable-request": "^7.0.2",
            "decompress-response": "^6.0.0",
            "http2-wrapper": "^1.0.0-beta.5.2",
            "lowercase-keys": "^2.0.0",
            "p-cancelable": "^2.0.0",
            "responselike": "^2.0.0"
          }
        },
        "json-buffer": {
          "version": "3.0.1",
          "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
          "integrity": [REDACTED_SECRET]
        },
        "keyv": {
          "version": "4.5.4",
          "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "json-buffer": "3.0.1"
          }
        },
        "lowercase-keys": {
          "version": "2.0.0",
          "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
          "integrity": [REDACTED_SECRET]
        },
        "mimic-response": {
          "version": "3.1.0",
          "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
          "integrity": [REDACTED_SECRET]
        },
        "normalize-url": {
          "version": "6.1.0",
          "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
          "integrity": [REDACTED_SECRET]
        },
        "p-cancelable": {
          "version": "2.1.1",
          "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz",
          "integrity": [REDACTED_SECRET]
        },
        "responselike": {
          "version": "2.0.1",
          "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "lowercase-keys": "^2.0.0"
          }
        }
      }
    },
    "tar": {
      "version": "4.4.19",
      "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "chownr": "^1.1.4",
        "fs-minipass": "^1.2.7",
        "minipass": "^2.9.0",
        "minizlib": "^1.3.3",
        "mkdirp": "^0.5.5",
        "safe-buffer": "^5.2.1",
        "yallist": "^3.1.1"
      },
      "dependencies": {
        "mkdirp": {
          "version": "0.5.6",
          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "minimist": "^1.2.6"
          }
        }
      }
    },
    "timed-out": {
      "version": "4.0.1",
      "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "to-buffer": {
      "version": "1.2.2",
      "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "isarray": "^2.0.5",
        "safe-buffer": "^5.2.1",
        "typed-array-buffer": "^1.0.3"
      }
    },
    "to-readable-stream": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "toidentifier": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "tough-cookie": {
      "version": "2.5.0",
      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "psl": "^1.1.28",
        "punycode": "^2.1.1"
      }
    },
    "tunnel-agent": {
      "version": "0.6.0",
      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "safe-buffer": "^5.0.1"
      }
    },
    "tweetnacl": {
      "version": "0.14.5",
      "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "type": {
      "version": "2.7.3",
      "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "type-is": {
      "version": "1.6.18",
      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "media-typer": "0.3.0",
        "mime-types": "~2.1.24"
      }
    },
    "typed-array-buffer": {
      "version": "1.0.3",
      "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "call-bound": "^1.0.3",
        "es-errors": "^1.3.0",
        "is-typed-array": "^1.1.14"
      }
    },
    "typedarray-to-buffer": {
      "version": "3.1.5",
      "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "is-typedarray": "^1.0.0"
      }
    },
    "ultron": {
      "version": "1.1.1",
      "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "undici-types": {
      "version": "7.16.0",
      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "universalify": {
      "version": "0.1.2",
      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "unpipe": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "uri-js": {
      "version": "4.4.1",
      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "punycode": "^2.1.0"
      }
    },
    "url-parse-lax": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "prepend-http": "^2.0.0"
      }
    },
    "url-set-query": {
      "version": "1.0.0",
      "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "utf-8-validate": {
      "version": "5.0.10",
      "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "node-gyp-build": "^4.3.0"
      }
    },
    "utf8": {
      "version": "3.0.0",
      "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "util": {
      "version": "0.12.5",
      "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "inherits": "^2.0.3",
        "is-arguments": "^1.0.4",
        "is-generator-function": "^1.0.7",
        "is-typed-array": "^1.1.3",
        "which-typed-array": "^1.1.2"
      }
    },
    "util-deprecate": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "utils-merge": {
      "version": "1.0.1",
      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "uuid": {
      "version": "3.4.0",
      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "varint": {
      "version": "5.0.2",
      "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "vary": {
      "version": "1.1.2",
      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "verror": {
      "version": "1.10.0",
      "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "assert-plus": "^1.0.0",
        "core-util-is": "1.0.2",
        "extsprintf": "^1.2.0"
      },
      "dependencies": {
        "core-util-is": {
          "version": "1.0.2",
          "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
          "integrity": [REDACTED_SECRET]
        }
      }
    },
    "viem": {
      "version": "2.45.3",
      "resolved": "https://registry.npmjs.org/viem/-/viem-2.45.3.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@noble/curves": "1.9.1",
        "@noble/hashes": "1.8.0",
        "@scure/bip32": "1.7.0",
        "@scure/bip39": "1.6.0",
        "abitype": "1.2.3",
        "isows": "1.0.7",
        "ox": "0.12.1",
        "ws": "8.18.3"
      },
      "dependencies": {
        "ws": {
          "version": "8.18.3",
          "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz",
          "integrity": [REDACTED_SECRET]
        }
      }
    },
    "web-streams-polyfill": {
      "version": "3.3.3",
      "resolved": "https://registry.npmmirror.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "web3": {
      "version": "1.7.4",
      "resolved": "https://registry.npmjs.org/web3/-/web3-1.7.4.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "web3-bzz": "1.7.4",
        "web3-core": "1.7.4",
        "web3-eth": "1.7.4",
        "web3-eth-personal": "1.7.4",
        "web3-net": "1.7.4",
        "web3-shh": "1.7.4",
        "web3-utils": "1.7.4"
      }
    },
    "web3-bzz": {
      "version": "1.7.4",
      "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.7.4.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@types/node": "^12.12.6",
        "got": "9.6.0",
        "swarm-js": "^0.1.40"
      },
      "dependencies": {
        "@types/node": {
          "version": "12.20.55",
          "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz",
          "integrity": [REDACTED_SECRET]
        }
      }
    },
    "web3-core": {
      "version": "1.7.4",
      "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.7.4.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@types/bn.js": "^5.1.0",
        "@types/node": "^12.12.6",
        "bignumber.js": "^9.0.0",
        "web3-core-helpers": "1.7.4",
        "web3-core-method": "1.7.4",
        "web3-core-requestmanager": "1.7.4",
        "web3-utils": "1.7.4"
      },
      "dependencies": {
        "@types/node": {
          "version": "12.20.55",
          "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz",
          "integrity": [REDACTED_SECRET]
        }
      }
    },
    "web3-core-helpers": {
      "version": "1.7.4",
      "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.7.4.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "web3-eth-iban": "1.7.4",
        "web3-utils": "1.7.4"
      }
    },
    "web3-core-method": {
      "version": "1.7.4",
      "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.7.4.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@ethersproject/transactions": "^5.6.2",
        "web3-core-helpers": "1.7.4",
        "web3-core-promievent": "1.7.4",
        "web3-core-subscriptions": "1.7.4",
        "web3-utils": "1.7.4"
      },
      "dependencies": {
        "@ethersproject/address": {
          "version": "5.8.0",
          "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.8.0.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "@ethersproject/bignumber": "^5.8.0",
            "@ethersproject/bytes": "^5.8.0",
            "@ethersproject/keccak256": "^5.8.0",
            "@ethersproject/logger": "^5.8.0",
            "@ethersproject/rlp": "^5.8.0"
          }
        },
        "@ethersproject/bignumber": {
          "version": "5.8.0",
          "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.8.0.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "@ethersproject/bytes": "^5.8.0",
            "@ethersproject/logger": "^5.8.0",
            "bn.js": "^5.2.1"
          }
        },
        "@ethersproject/bytes": {
          "version": "5.8.0",
          "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.8.0.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "@ethersproject/logger": "^5.8.0"
          }
        },
        "@ethersproject/constants": {
          "version": "5.8.0",
          "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.8.0.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "@ethersproject/bignumber": "^5.8.0"
          }
        },
        "@ethersproject/keccak256": {
          "version": "5.8.0",
          "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.8.0.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "@ethersproject/bytes": "^5.8.0",
            "js-sha3": "0.8.0"
          }
        },
        "@ethersproject/logger": {
          "version": "5.8.0",
          "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.8.0.tgz",
          "integrity": [REDACTED_SECRET]
        },
        "@ethersproject/properties": {
          "version": "5.8.0",
          "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.8.0.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "@ethersproject/logger": "^5.8.0"
          }
        },
        "@ethersproject/rlp": {
          "version": "5.8.0",
          "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.8.0.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "@ethersproject/bytes": "^5.8.0",
            "@ethersproject/logger": "^5.8.0"
          }
        },
        "@ethersproject/signing-key": {
          "version": "5.8.0",
          "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.8.0.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "@ethersproject/bytes": "^5.8.0",
            "@ethersproject/logger": "^5.8.0",
            "@ethersproject/properties": "^5.8.0",
            "bn.js": "^5.2.1",
            "elliptic": "6.6.1",
            "hash.js": "1.1.7"
          }
        },
        "@ethersproject/transactions": {
          "version": "5.8.0",
          "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.8.0.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "@ethersproject/address": "^5.8.0",
            "@ethersproject/bignumber": "^5.8.0",
            "@ethersproject/bytes": "^5.8.0",
            "@ethersproject/constants": "^5.8.0",
            "@ethersproject/keccak256": "^5.8.0",
            "@ethersproject/logger": "^5.8.0",
            "@ethersproject/properties": "^5.8.0",
            "@ethersproject/rlp": "^5.8.0",
            "@ethersproject/signing-key": "^5.8.0"
          }
        }
      }
    },
    "web3-core-promievent": {
      "version": "1.7.4",
      "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.7.4.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "eventemitter3": "4.0.4"
      },
      "dependencies": {
        "eventemitter3": {
          "version": "4.0.4",
          "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz",
          "integrity": [REDACTED_SECRET]
        }
      }
    },
    "web3-core-requestmanager": {
      "version": "1.7.4",
      "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.7.4.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "util": "^0.12.0",
        "web3-core-helpers": "1.7.4",
        "web3-providers-http": "1.7.4",
        "web3-providers-ipc": "1.7.4",
        "web3-providers-ws": "1.7.4"
      }
    },
    "web3-core-subscriptions": {
      "version": "1.7.4",
      "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.7.4.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "eventemitter3": "4.0.4",
        "web3-core-helpers": "1.7.4"
      },
      "dependencies": {
        "eventemitter3": {
          "version": "4.0.4",
          "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz",
          "integrity": [REDACTED_SECRET]
        }
      }
    },
    "web3-eth": {
      "version": "1.7.4",
      "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.7.4.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "web3-core": "1.7.4",
        "web3-core-helpers": "1.7.4",
        "web3-core-method": "1.7.4",
        "web3-core-subscriptions": "1.7.4",
        "web3-eth-abi": "1.7.4",
        "web3-eth-accounts": "1.7.4",
        "web3-eth-contract": "1.7.4",
        "web3-eth-ens": "1.7.4",
        "web3-eth-iban": "1.7.4",
        "web3-eth-personal": "1.7.4",
        "web3-net": "1.7.4",
        "web3-utils": "1.7.4"
      }
    },
    "web3-eth-abi": {
      "version": "1.7.4",
      "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.7.4.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@ethersproject/abi": "^5.6.3",
        "web3-utils": "1.7.4"
      },
      "dependencies": {
        "@ethersproject/abi": {
          "version": "5.8.0",
          "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.8.0.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "@ethersproject/address": "^5.8.0",
            "@ethersproject/bignumber": "^5.8.0",
            "@ethersproject/bytes": "^5.8.0",
            "@ethersproject/constants": "^5.8.0",
            "@ethersproject/hash": "^5.8.0",
            "@ethersproject/keccak256": "^5.8.0",
            "@ethersproject/logger": "^5.8.0",
            "@ethersproject/properties": "^5.8.0",
            "@ethersproject/strings": "^5.8.0"
          }
        },
        "@ethersproject/abstract-provider": {
          "version": "5.8.0",
          "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.8.0.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "@ethersproject/bignumber": "^5.8.0",
            "@ethersproject/bytes": "^5.8.0",
            "@ethersproject/logger": "^5.8.0",
            "@ethersproject/networks": "^5.8.0",
            "@ethersproject/properties": "^5.8.0",
            "@ethersproject/transactions": "^5.8.0",
            "@ethersproject/web": "^5.8.0"
          }
        },
        "@ethersproject/abstract-signer": {
          "version": "5.8.0",
          "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.8.0.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "@ethersproject/abstract-provider": "^5.8.0",
            "@ethersproject/bignumber": "^5.8.0",
            "@ethersproject/bytes": "^5.8.0",
            "@ethersproject/logger": "^5.8.0",
            "@ethersproject/properties": "^5.8.0"
          }
        },
        "@ethersproject/address": {
          "version": "5.8.0",
          "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.8.0.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "@ethersproject/bignumber": "^5.8.0",
            "@ethersproject/bytes": "^5.8.0",
            "@ethersproject/keccak256": "^5.8.0",
            "@ethersproject/logger": "^5.8.0",
            "@ethersproject/rlp": "^5.8.0"
          }
        },
        "@ethersproject/base64": {
          "version": "5.8.0",
          "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.8.0.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "@ethersproject/bytes": "^5.8.0"
          }
        },
        "@ethersproject/bignumber": {
          "version": "5.8.0",
          "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.8.0.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "@ethersproject/bytes": "^5.8.0",
            "@ethersproject/logger": "^5.8.0",
            "bn.js": "^5.2.1"
          }
        },
        "@ethersproject/bytes": {
          "version": "5.8.0",
          "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.8.0.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "@ethersproject/logger": "^5.8.0"
          }
        },
        "@ethersproject/constants": {
          "version": "5.8.0",
          "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.8.0.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "@ethersproject/bignumber": "^5.8.0"
          }
        },
        "@ethersproject/hash": {
          "version": "5.8.0",
          "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.8.0.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "@ethersproject/abstract-signer": "^5.8.0",
            "@ethersproject/address": "^5.8.0",
            "@ethersproject/base64": "^5.8.0",
            "@ethersproject/bignumber": "^5.8.0",
            "@ethersproject/bytes": "^5.8.0",
            "@ethersproject/keccak256": "^5.8.0",
            "@ethersproject/logger": "^5.8.0",
            "@ethersproject/properties": "^5.8.0",
            "@ethersproject/strings": "^5.8.0"
          }
        },
        "@ethersproject/keccak256": {
          "version": "5.8.0",
          "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.8.0.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "@ethersproject/bytes": "^5.8.0",
            "js-sha3": "0.8.0"
          }
        },
        "@ethersproject/logger": {
          "version": "5.8.0",
          "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.8.0.tgz",
          "integrity": [REDACTED_SECRET]
        },
        "@ethersproject/networks": {
          "version": "5.8.0",
          "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.8.0.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "@ethersproject/logger": "^5.8.0"
          }
        },
        "@ethersproject/properties": {
          "version": "5.8.0",
          "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.8.0.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "@ethersproject/logger": "^5.8.0"
          }
        },
        "@ethersproject/rlp": {
          "version": "5.8.0",
          "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.8.0.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "@ethersproject/bytes": "^5.8.0",
            "@ethersproject/logger": "^5.8.0"
          }
        },
        "@ethersproject/signing-key": {
          "version": "5.8.0",
          "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.8.0.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "@ethersproject/bytes": "^5.8.0",
            "@ethersproject/logger": "^5.8.0",
            "@ethersproject/properties": "^5.8.0",
            "bn.js": "^5.2.1",
            "elliptic": "6.6.1",
            "hash.js": "1.1.7"
          }
        },
        "@ethersproject/strings": {
          "version": "5.8.0",
          "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.8.0.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "@ethersproject/bytes": "^5.8.0",
            "@ethersproject/constants": "^5.8.0",
            "@ethersproject/logger": "^5.8.0"
          }
        },
        "@ethersproject/transactions": {
          "version": "5.8.0",
          "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.8.0.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "@ethersproject/address": "^5.8.0",
            "@ethersproject/bignumber": "^5.8.0",
            "@ethersproject/bytes": "^5.8.0",
            "@ethersproject/constants": "^5.8.0",
            "@ethersproject/keccak256": "^5.8.0",
            "@ethersproject/logger": "^5.8.0",
            "@ethersproject/properties": "^5.8.0",
            "@ethersproject/rlp": "^5.8.0",
            "@ethersproject/signing-key": "^5.8.0"
          }
        },
        "@ethersproject/web": {
          "version": "5.8.0",
          "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.8.0.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "@ethersproject/base64": "^5.8.0",
            "@ethersproject/bytes": "^5.8.0",
            "@ethersproject/logger": "^5.8.0",
            "@ethersproject/properties": "^5.8.0",
            "@ethersproject/strings": "^5.8.0"
          }
        }
      }
    },
    "web3-eth-accounts": {
      "version": "1.7.4",
      "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.7.4.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@ethereumjs/common": "^2.5.0",
        "@ethereumjs/tx": "^3.3.2",
        "crypto-browserify": "3.12.0",
        "eth-lib": "0.2.8",
        "ethereumjs-util": "^7.0.10",
        "scrypt-js": "^3.0.1",
        "uuid": "3.3.2",
        "web3-core": "1.7.4",
        "web3-core-helpers": "1.7.4",
        "web3-core-method": "1.7.4",
        "web3-utils": "1.7.4"
      },
      "dependencies": {
        "bn.js": {
          "version": "4.12.2",
          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz",
          "integrity": [REDACTED_SECRET]
        },
        "crypto-browserify": {
          "version": "3.12.0",
          "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "browserify-cipher": "^1.0.0",
            "browserify-sign": "^4.0.0",
            "create-ecdh": "^4.0.0",
            "create-hash": "^1.1.0",
            "create-hmac": "^1.1.0",
            "diffie-hellman": "^5.0.0",
            "inherits": "^2.0.1",
            "pbkdf2": "^3.0.3",
            "public-encrypt": "^4.0.0",
            "randombytes": "^2.0.0",
            "randomfill": "^1.0.3"
          }
        },
        "eth-lib": {
          "version": "0.2.8",
          "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz",
          "integrity": [REDACTED_SECRET],
          "requires": {
            "bn.js": "^4.11.6",
            "elliptic": "^6.4.0",
            "xhr-request-promise": "^0.1.2"
          }
        },
        "uuid": {
          "version": "3.3.2",
          "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
          "integrity": [REDACTED_SECRET]
        }
      }
    },
    "web3-eth-contract": {
      "version": "1.7.4",
      "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.7.4.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@types/bn.js": "^5.1.0",
        "web3-core": "1.7.4",
        "web3-core-helpers": "1.7.4",
        "web3-core-method": "1.7.4",
        "web3-core-promievent": "1.7.4",
        "web3-core-subscriptions": "1.7.4",
        "web3-eth-abi": "1.7.4",
        "web3-utils": "1.7.4"
      }
    },
    "web3-eth-ens": {
      "version": "1.7.4",
      "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.7.4.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "content-hash": "^2.5.2",
        "eth-ens-namehash": "2.0.8",
        "web3-core": "1.7.4",
        "web3-core-helpers": "1.7.4",
        "web3-core-promievent": "1.7.4",
        "web3-eth-abi": "1.7.4",
        "web3-eth-contract": "1.7.4",
        "web3-utils": "1.7.4"
      }
    },
    "web3-eth-iban": {
      "version": "1.7.4",
      "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.7.4.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "bn.js": "^5.2.1",
        "web3-utils": "1.7.4"
      }
    },
    "web3-eth-personal": {
      "version": "1.7.4",
      "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.7.4.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "@types/node": "^12.12.6",
        "web3-core": "1.7.4",
        "web3-core-helpers": "1.7.4",
        "web3-core-method": "1.7.4",
        "web3-net": "1.7.4",
        "web3-utils": "1.7.4"
      },
      "dependencies": {
        "@types/node": {
          "version": "12.20.55",
          "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz",
          "integrity": [REDACTED_SECRET]
        }
      }
    },
    "web3-net": {
      "version": "1.7.4",
      "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.7.4.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "web3-core": "1.7.4",
        "web3-core-method": "1.7.4",
        "web3-utils": "1.7.4"
      }
    },
    "web3-providers-http": {
      "version": "1.7.4",
      "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.7.4.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "web3-core-helpers": "1.7.4",
        "xhr2-cookies": "1.1.0"
      }
    },
    "web3-providers-ipc": {
      "version": "1.7.4",
      "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.7.4.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "oboe": "2.1.5",
        "web3-core-helpers": "1.7.4"
      }
    },
    "web3-providers-ws": {
      "version": "1.7.4",
      "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.7.4.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "eventemitter3": "4.0.4",
        "web3-core-helpers": "1.7.4",
        "websocket": "^1.0.32"
      },
      "dependencies": {
        "eventemitter3": {
          "version": "4.0.4",
          "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz",
          "integrity": [REDACTED_SECRET]
        }
      }
    },
    "web3-shh": {
      "version": "1.7.4",
      "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.7.4.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "web3-core": "1.7.4",
        "web3-core-method": "1.7.4",
        "web3-core-subscriptions": "1.7.4",
        "web3-net": "1.7.4"
      }
    },
    "web3-utils": {
      "version": "1.7.4",
      "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.7.4.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "bn.js": "^5.2.1",
        "ethereum-bloom-filters": "^1.0.6",
        "ethereumjs-util": "^7.1.0",
        "ethjs-unit": "0.1.6",
        "number-to-bn": "1.7.0",
        "randombytes": "^2.1.0",
        "utf8": "3.0.0"
      }
    },
    "websocket": {
      "version": "1.0.35",
      "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.35.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "bufferutil": "^4.0.1",
        "debug": "^2.2.0",
        "es5-ext": "^0.10.63",
        "typedarray-to-buffer": "^3.1.5",
        "utf-8-validate": "^5.0.2",
        "yaeti": "^0.0.6"
      }
    },
    "which-typed-array": {
      "version": "1.1.20",
      "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "available-typed-arrays": "^1.0.7",
        "call-bind": "^1.0.8",
        "call-bound": "^1.0.4",
        "for-each": "^0.3.5",
        "get-proto": "^1.0.1",
        "gopd": "^1.2.0",
        "has-tostringtag": "^1.0.2"
      }
    },
    "wrappy": {
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "ws": {
      "version": "7.4.6",
      "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "xhr": {
      "version": "2.6.0",
      "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "global": "~4.4.0",
        "is-function": "^1.0.1",
        "parse-headers": "^2.0.0",
        "xtend": "^4.0.0"
      }
    },
    "xhr-request": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "buffer-to-arraybuffer": "^0.0.5",
        "object-assign": "^4.1.1",
        "query-string": "^5.0.1",
        "simple-get": "^2.7.0",
        "timed-out": "^4.0.1",
        "url-set-query": "^1.0.0",
        "xhr": "^2.0.4"
      }
    },
    "xhr-request-promise": {
      "version": "0.1.3",
      "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "xhr-request": "^1.1.0"
      }
    },
    "xhr2-cookies": {
      "version": "1.1.0",
      "resolved": "https://registry.npmjs.org/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz",
      "integrity": [REDACTED_SECRET],
      "requires": {
        "cookiejar": "^2.1.1"
      }
    },
    "xtend": {
      "version": "4.0.2",
      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "yaeti": {
      "version": "0.0.6",
      "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz",
      "integrity": [REDACTED_SECRET]
    },
    "yallist": {
      "version": "3.1.1",
      "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
      "integrity": [REDACTED_SECRET]
    }
  }
}


path: scripts/package.json
content: {
  "name": "apex-cli",
  "version": "1.0.0",
  "type": "module",
  "dependencies": {
    "apexomni-connector-node": "0.3.2-alpha.1",
    "bignumber.js": "^9.1.2",
    "node-fetch": "^3.3.2"
  }
}


path: scripts/scan-market.mjs
content: #!/usr/bin/env node
import { ApexClient, OMNI_PROD, OMNI_QA } from 'apexomni-connector-node';

function getEnv() {
  const env = (process.env.APEX_ENV || '').toLowerCase();
  const useTestnet = process.env.APEX_TESTNET === '1' || env === 'qa' || env === 'testnet';
  return useTestnet ? OMNI_QA : OMNI_PROD;
}

function normalizeSymbol(raw) {
  if (!raw) return raw;
  const upper = raw.toUpperCase();
  if (upper.endsWith('-PERP')) return upper.replace('-PERP', '-USDT');
  if (upper.endsWith('-SPOT')) return upper.replace('-SPOT', '-USDT');
  if (upper.includes('-')) return upper;
  if (upper.endsWith('USDT') || upper.endsWith('USDC') || upper.endsWith('USD')) {
    const suffix = upper.endsWith('USDT') ? 'USDT' : upper.endsWith('USDC') ? 'USDC' : 'USD';
    return `${upper.slice(0, -suffix.length)}-${suffix}`;
  }
  return `${upper}-USDT`;
}

function toPublicSymbol(symbol) {
  return symbol ? symbol.replace('-', '') : symbol;
}

async function getTicker(apexClient, symbol) {
  const candidates = [toPublicSymbol(symbol), symbol].filter(Boolean);
  for (const candidate of candidates) {
    try {
      const tickers = await apexClient.publicApi.tickers(candidate);
      if (Array.isArray(tickers) && tickers.length > 0) {
        return tickers[0];
      }
      if (tickers && tickers.symbol) {
        return tickers;
      }
    } catch (err) {
      continue;
    }
  }
  return null;
}

const apexClient = new ApexClient.omni(getEnv());

console.log('Fetching current prices...\n');

const majors = ['BTC-USDT', 'ETH-USDT', 'SOL-USDT', 'AVAX-USDT', 'DOGE-USDT', 'ARB-USDT'];

console.log('=== MAJOR ASSETS ===');
for (const coin of majors) {
  const symbol = normalizeSymbol(coin);
  const ticker = await getTicker(apexClient, symbol);
  if (ticker?.lastPrice) {
    console.log(`${symbol.padEnd(12)} $${ticker.lastPrice}`);
  }
}

const metadata = await apexClient.publicApi.symbols();
const allSymbols = (metadata.contractConfig?.perpetualContract || [])
  .map((item) => item.symbol)
  .filter(Boolean);

console.log('\n=== AVAILABLE PERPS (first 20) ===');
for (const symbol of allSymbols.slice(0, 20)) {
  const ticker = await getTicker(apexClient, symbol);
  const price = ticker?.lastPrice || 'N/A';
  console.log(`${symbol.padEnd(12)} $${price}`);
}

console.log(`\nTotal perpetuals available: ${allSymbols.length}`);


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (CRITICAL)