diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..f13cefa Binary files /dev/null and b/.DS_Store differ diff --git a/.github/workflows/build-app.yaml b/.github/workflows/build-app.yaml new file mode 100644 index 0000000..5ce9f11 --- /dev/null +++ b/.github/workflows/build-app.yaml @@ -0,0 +1,33 @@ +name: Vercel Production Deployment + +env: + VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} + VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} + +on: + push: + branches: + - main + +jobs: + Deploy-Production: + runs-on: ubuntu-latest + steps: + + - name: Checkout code + uses: actions/checkout@v3 + + - name: Install Vercel CLI + run: npm install --global vercel + + - name: Pull Vercel Environment Information + # Retrieves Vercel environment variables + run: vercel pull --yes --environment=production --token=${{ secrets.VERCEL_TOKEN }} + + - name: Build Project Artifacts + # Builds the project locally, creating .vercel/output + run: vercel build --prod --token=${{ secrets.VERCEL_TOKEN }} + + - name: Deploy Project Artifacts + # Deploys the prebuilt output + run: vercel deploy --prebuilt --prod --token=${{ secrets.VERCEL_TOKEN }} \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f0f7c0a --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +out +broadcast +cache +.env +.DS_Store +__init__.py +__pycache__ +myenv +venv +node_modules +cache +.vscode +.wake +cache +.env.local +.env.production +out diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..7d9a7b2 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,15 @@ +[submodule "lib/openzeppelin-contracts-upgradeable"] + path = lib/openzeppelin-contracts-upgradeable + url = https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable +[submodule "lib/openzeppelin-contracts"] + path = lib/openzeppelin-contracts + url = https://github.com/OpenZeppelin/openzeppelin-contracts +[submodule "lib/chainlink-local"] + path = lib/chainlink-local + url = https://github.com/smartcontractkit/chainlink-local +[submodule "contracts/lib/forge-std"] + path = contracts/lib/forge-std + url = https://github.com/foundry-rs/forge-std +[submodule "contracts/lib/openzeppelin-contracts"] + path = contracts/lib/openzeppelin-contracts + url = https://github.com/openzeppelin/openzeppelin-contracts diff --git a/Dockerfile.anvil b/Dockerfile.anvil new file mode 100644 index 0000000..3b146f5 --- /dev/null +++ b/Dockerfile.anvil @@ -0,0 +1,23 @@ +# Use the official Foundry image +FROM ghcr.io/foundry-rs/foundry:latest + +# Set environment variables for Anvil +ENV ANVIL_IP_ADDR=0.0.0.0 +ENV FOUNDRY_DISABLE_NIGHTLY_WARNING=true + +# Create app directory +WORKDIR /app + +# Copy configuration files if any +COPY . . + +# Expose the default Anvil port +EXPOSE 8545 + +# Health check (using a simple TCP check instead of curl) +HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=3 \ + CMD timeout 5s bash -c 'echo > /dev/tcp/localhost/8545' || exit 1 + +# Use ENTRYPOINT to ensure the full command executes with chain ID 1 +ENTRYPOINT ["anvil", "--fork-url", "https://eth-mainnet.g.alchemy.com/v2/KywLaq2zlVzePOhip0BY3U8ztfHkYDmo", "--chain-id", "1"] + \ No newline at end of file diff --git a/README.md b/README.md index beb2bb8..e37537b 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,285 @@ -Intent Engine for Aave and Compound +# πŸš€ Stratos +An advanced AI-powered cryptocurrency trading platform featuring three specialized assistants for seamless blockchain interactions. Built with React, Node.js, Python, and Solidity smart contracts. +**🌐 Live Demo**: [https://foundryup-frontend.vercel.app/](https://foundryup-frontend.vercel.app/) + +--- + +## 🎯 Overview + +AI Quant Trader is a comprehensive DeFi platform that combines artificial intelligence with quantitative trading strategies. Users can interact with blockchain protocols through natural language commands, execute sophisticated trading algorithms, and manage DeFi positionsβ€”all through an intuitive chat interface. + +--- + +## ✨ Features + +### πŸ€– Three Specialized AI Assistants + +#### 1. **General Assistant** +**Send & Swap Made Simple** +- πŸ’Έ **Send Tokens**: Transfer ETH and ERC-20 tokens to any address +- πŸ”„ **Token Swaps**: Swap between different cryptocurrencies via Uniswap integration +- 🎯 **Natural Language**: Use commands like "send 1 ETH to 0x..." or "swap 100 USDC for WETH" + +#### 2. **DeFi Assistant** +**Aave Protocol Integration** +- 🏦 **Deposit**: Earn yield by depositing assets into Aave lending pools +- πŸ’° **Borrow**: Take loans against your collateral +- πŸ“€ **Withdraw**: Remove your deposits from lending pools +- πŸ’³ **Repay**: Pay back borrowed amounts +- πŸ“Š **Commands**: Simple chat commands like "deposit 1000 USDC" or "borrow 0.5 WETH" + +#### 3. **Trading Assistant** +**Advanced Quantitative Trading Algorithms** + +| Algorithm | Risk Level | Term | Strategy | +|-----------|------------|------|----------| +| **RSI** | High | Short | Relative Strength Index momentum trading | +| **MACD** | High | Long | Moving Average Convergence Divergence | +| **Moving Average** | Low | Short | MA crossover signals | +| **DCA** | Low | Long | Dollar Cost Averaging | + +**Features:** +- πŸ“ˆ **Real-time Signals**: Live trading signals from Python-based algorithms +- ⚑ **Auto-execution**: One-click trade execution with slippage protection +- πŸ›‘οΈ **Risk Management**: Configurable risk levels and position sizing +- πŸ“Š **Portfolio Tracking**: Real-time balance and performance monitoring + +--- + +## πŸ—οΈ Architecture + +```mermaid +graph TD + A[React Frontend] --> B[Node.js Backend] + B --> C[Python Trading Algorithms] + A --> D[Smart Contracts] + D --> E[Anvil Fork] + C --> F[Market Data APIs] + + subgraph "Smart Contracts" + D1[TradingEngine] + D2[AaveV3Interactor] + D3[SimpleIE] + end + + subgraph "Python Algorithms" + C1[RSI Strategy] + C2[MACD Strategy] + C3[MA Strategy] + C4[DCA Strategy] + end +``` + +--- + +## πŸš€ Getting Started + +### Prerequisites + +- **Node.js** (v16 or higher) +- **Python** (v3.8 or higher) +- **Foundry** (for smart contract development) +- **MetaMask** or compatible Web3 wallet + +### Local Development Setup + +#### 1. Clone the Repository +```bash +git clone https://github.com/your-username/AI-Quant-Trader.git +cd AI-Quant-Trader +``` + +#### 2. Install Dependencies + +**Frontend:** +```bash +cd frontend +npm install +``` + +**Backend:** +```bash +cd backend +npm install +``` + +**Python Environment:** +```bash +cd backend/Python +python -m venv myenv +source myenv/bin/activate # On Windows: myenv\Scripts\activate +pip install -r requirements.txt +``` + +#### 3. Smart Contract Setup + +**Install Foundry:** +```bash +curl -L https://foundry.paradigm.xyz | bash +foundryup +``` + +**Compile Contracts:** +```bash +forge build +``` + +#### 4. Start Local Anvil Chain +```bash +anvil --fork-url https://eth-mainnet.g.alchemy.com/v2/YOUR_ALCHEMY_KEY +``` + +#### 5. Deploy Contracts ```bash -forge script script/DeployTradeIntent.sol:DeployTradeIntent --rpc-url http://127.0.0.1:8545 --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --broadcast +forge script script/DeployAll.sol --rpc-url http://127.0.0.1:8545 --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --broadcast ``` + +#### 6. Start Development Servers + +**Python Trading Servers:** ```bash -anvil --fork-url https://eth-mainnet.g.alchemy.com/v2/KywLaq2zlVzePOhip0BY3U8ztfHkYDmo -``` \ No newline at end of file +cd backend/Python +python main.py # Starts servers on ports 5049-5052 +``` + +**Node.js Backend:** +```bash +cd backend +npm start # Starts on port 3001 +``` + +**React Frontend:** +```bash +cd frontend +npm start # Starts on port 3000 +``` + +#### 7. Configure MetaMask +- Add local network: RPC URL `http://127.0.0.1:8545`, Chain ID `31337` +- Import test account with private key: `0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80` + +--- + +## 🌐 Production Deployment + +### Live Application +- **Frontend**: [https://foundryup-frontend.vercel.app/](https://foundryup-frontend.vercel.app/) +- **Anvil Instance**: [https://anvil-mainnet-fork.onrender.com](https://anvil-mainnet-fork.onrender.com) +- **Backend Servers**: Deployed on Render + +### Important Notes +⚠️ **Server Limitations**: Backend servers may go down after 15 minutes of inactivity due to Render's free tier limitations. If contracts become unresponsive, they may need to be redeployed. In that case prefer building on local for testing. + + +--- + +## πŸ› οΈ Tech Stack + +### Frontend +- **React** - User interface +- **Web3.js** - Blockchain interactions +- **Tailwind CSS** - Styling +- **Spline** - 3D animations + +### Backend +- **Node.js** - API server +- **Express** - Web framework +- **Python** - Trading algorithms +- **NumPy/Pandas** - Data analysis + +### Blockchain +- **Solidity** - Smart contracts +- **Foundry** - Development framework +- **Anvil** - Local/Remote blockchain +- **Uniswap V2** - DEX integration +- **Aave V3** - Lending protocol + +--- + +## πŸ“Š Smart Contracts + +| Contract | Purpose | Features | +|----------|---------|----------| +| **TradingEngine** | Automated trading | USDC-based trading, slippage protection, multi-token support | +| **AaveV3Interactor** | DeFi operations | Deposit, withdraw, borrow, repay on Aave | +| **SimpleIE** | General operations | Token transfers, swaps, intent execution | + +--- + +## πŸ” Usage Examples + +### General Assistant +``` +"Send 1 ETH to 0x742d35Cc6635C0532925a3b8D31Fc3c06f6e6d1b" +"Swap 100 USDC for WETH" +``` + +### DeFi Assistant +``` +"Deposit 1000 USDC" +"Borrow 0.5 WETH" +"Withdraw all DAI" +"Repay 100 USDC" +``` + +### Trading Assistant +1. Select risk level (Low/High) +2. Choose term (Short/Long) +3. Generate signals +4. Execute trades with one click + +--- + +## πŸ§ͺ Testing + +### Contract Verification +Use the built-in "πŸ” Verify Contracts" button in the UI to test: +- Contract deployment status +- Function accessibility +- Network connectivity + +### Manual Testing +1. Connect MetaMask to the appropriate network +2. Ensure you have test tokens (ETH, USDC, etc.) +3. Test each assistant's functionality +4. Monitor transaction confirmations + +--- + +## 🀝 Contributing + +1. Fork the repository +2. Create a feature branch (`git checkout -b feature/amazing-feature`) +3. Commit your changes (`git commit -m 'Add amazing feature'`) +4. Push to the branch (`git push origin feature/amazing-feature`) +5. Open a Pull Request + +--- + +## πŸ“œ License + +This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. + +--- + +## πŸ†˜ Support + +- **Issues**: [GitHub Issues](https://github.com/your-username/AI-Quant-Trader/issues) +- **Documentation**: Check the `/docs` folder for detailed guides +- **Community**: Join our Discord for real-time support + +--- + +## ⚑ Quick Start (TL;DR) + +1. **Try Live Demo**: [https://foundryup-frontend.vercel.app/](https://foundryup-frontend.vercel.app/) +2. **Connect Wallet**: Use MetaMask with the remote Anvil network +3. **Test Features**: Use "Verify Contracts" button, then try each assistant +4. **Local Setup**: Follow the detailed setup guide above for development + +--- + +**Built with ❀️ by the AI Quant Trader Team** + diff --git a/lib/.DS_Store b/backend/.DS_Store similarity index 67% rename from lib/.DS_Store rename to backend/.DS_Store index 90f345c..11fb747 100644 Binary files a/lib/.DS_Store and b/backend/.DS_Store differ diff --git a/backend/.env.sample b/backend/.env.sample new file mode 100644 index 0000000..ecbaada --- /dev/null +++ b/backend/.env.sample @@ -0,0 +1 @@ +GROQ_API_KEY="abcd" \ No newline at end of file diff --git a/backend/Python/Algorithms/DCA.py b/backend/Python/Algorithms/DCA.py new file mode 100644 index 0000000..f4a42bd --- /dev/null +++ b/backend/Python/Algorithms/DCA.py @@ -0,0 +1,258 @@ +############################# LONG TERM LOW RISK TRADING STRATEGY ############################# +############################# DOLLAR COST AVERAGING ############################# + + +def extract_weth_prices(graph_data): + """ + Extracts a chronological list of WETH prices in USD from the subgraph swap data. + Assumes that the JSON structure is: + { + "data": { + "swaps": [ + { + "pool": { ... }, + "tokenIn": { "lastPriceUSD": "xxx", "symbol": "..." }, + "tokenOut": { "lastPriceUSD": "xxx", "symbol": "..." } + }, + ... + ] + } + } + + Since the query orders swaps by timestamp in descending order, this function reverses the list + to create a chronological (oldest-first) price series. + """ + swaps = graph_data.get("data", {}).get("swaps", []) + prices = [] + # Reverse the list so that the earliest swap is first. + for swap in reversed(swaps): + price = None + token_in = swap.get("tokenOut", {}) + # We assume WETH is the asset of interest. + try: + price = float(token_in.get("lastPriceUSD", "0")) + except ValueError: + price = 0.0 + if price and price > 0: + prices.append(price) + return prices + +def calculate_dca_with_signals(prices, investment_interval=7, investment_amount=100): + """ + Calculate DCA strategy and generate consistent trading signals. + For DCA (Dollar Cost Averaging), we consistently recommend BUY at regular intervals. + This function is expected by the unified server. + + Parameters: + prices - List of float prices in chronological order + investment_interval - How often to invest (default: 7 = weekly) + investment_amount - Amount to invest each time (default: 100 USDC) + + Returns: + Dictionary with DCA values and signals + """ + if len(prices) < investment_interval: + return { + "prices": [], + "signals": [], + "average_price": 0, + "error": "Insufficient data for DCA calculation" + } + + signals = [] + investment_points = [] + total_invested = 0 + total_tokens = 0 + + # DCA strategy: invest at regular intervals + for i in range(investment_interval-1, len(prices), investment_interval): + price = prices[i] + signals.append("BUY") # DCA always buys + investment_points.append({ + "price": price, + "amount": investment_amount, + "tokens_bought": investment_amount / price + }) + total_invested += investment_amount + total_tokens += investment_amount / price + + # Fill remaining periods with HOLD + current_signals = [] + signal_index = 0 + for i in range(len(prices)): + if i % investment_interval == investment_interval - 1 and signal_index < len(signals): + current_signals.append(signals[signal_index]) + signal_index += 1 + else: + current_signals.append("HOLD") + + average_price = total_invested / total_tokens if total_tokens > 0 else 0 + + return { + "prices": prices, + "signals": current_signals, + "investment_points": investment_points, + "average_price": average_price, + "total_invested": total_invested, + "total_tokens": total_tokens, + "latest_signal": current_signals[-1] if current_signals else "BUY" + } + +def extract_latest_price(graph_data, asset_type="WETH"): + """ + Extracts the most recent price (in USDC) from the subgraph data for the specified asset. + """ + prices = extract_prices(graph_data, asset_type) + if not prices: + return None + return prices[-1] + +def extract_prices(graph_data, asset_type="WETH"): + """ + Extracts a chronological list of prices in USD from the subgraph swap data for the specified asset. + """ + swaps = graph_data.get("data", {}).get("swaps", []) + prices = [] + # Reverse the list so that the earliest swap is first. + for swap in reversed(swaps): + price = None + token_in = swap.get("tokenOut", {}) + try: + price = float(token_in.get("lastPriceUSD", "0")) + except ValueError: + price = 0.0 + if price and price > 0: + prices.append(price) + return prices + +def compute_portfolio_value(portfolio, price_data): + """ + Computes the total portfolio value in USDC. + Each asset is valued at its current price. + Portfolio is a dictionary with keys representing different assets. + """ + total_value = 0 + for asset, amount in portfolio.items(): + if asset == "USDC": + total_value += amount + elif asset in price_data and price_data[asset] is not None: + total_value += amount * price_data[asset] + return total_value + +def dca_investment(graph_data, invest_amount, portfolio, asset="WETH"): + """ + Executes a Dollar-Cost Averaging (DCA) investment. + + Parameters: + - graph_data: The graph data containing price information. + - invest_amount: The USDC amount allocated for this investment cycle. + - portfolio: A dictionary representing current holdings. + - asset: The asset to invest in (default is "WETH"). + + Returns: + The updated portfolio and details of the transaction. + """ + current_price = extract_latest_price(graph_data[asset], asset) if asset in graph_data else None + if current_price is None: + return portfolio, {"invested": 0, "bought": 0, "price": None, "asset": asset} + + # For DCA, assume that if the portfolio does not have sufficient USDC, + # additional funds are injected (or invest_amount is added externally). + if portfolio.get("USDC", 0) < invest_amount: + portfolio["USDC"] = portfolio.get("USDC", 0) + invest_amount + + assets_bought = invest_amount / current_price + portfolio["USDC"] -= invest_amount + portfolio[asset] = portfolio.get(asset, 0) + assets_bought + + return portfolio, { + "action": "BUY", # For DCA, we always buy at regular intervals + "position_size": assets_bought, + "price": current_price, + "invested": invest_amount, + "asset": asset + } + +def rebalance_portfolio(portfolio, target_allocation, graph_data, tolerance=0.02): + """ + Rebalances the portfolio to meet the target allocation using a buy-and-hold approach. + + Parameters: + - portfolio: Dictionary with keys for different assets. + - target_allocation: Dictionary indicating desired ratios. + - tolerance: The allowable deviation before triggering a rebalance. + - graph_data: Latest subgraph data to determine current prices. + + Returns: + The updated portfolio along with trade instructions. + """ + # Extract current prices for all assets + price_data = {} + for asset in portfolio: + if asset == "USDC": + price_data[asset] = 1.0 + elif asset in graph_data and graph_data[asset]: + price_data[asset] = extract_latest_price(graph_data[asset], asset) + + total_value = compute_portfolio_value(portfolio, price_data) + + # Calculate current allocation for each asset + current_alloc = {} + for asset in portfolio: + if asset == "USDC": + current_alloc[asset] = portfolio[asset] / total_value if total_value > 0 else 0 + elif asset in price_data and price_data[asset]: + current_alloc[asset] = (portfolio[asset] * price_data[asset]) / total_value if total_value > 0 else 0 + + trade_instructions = {"trades": []} + needs_rebalance = False + + # Check deviation for each asset + for asset in target_allocation: + if asset not in current_alloc: + current_alloc[asset] = 0 + + target = target_allocation.get(asset, 0) + deviation = current_alloc[asset] - target + + if abs(deviation) >= tolerance: + needs_rebalance = True + + if deviation > 0: + # Overallocated: Sell some asset + if asset != "USDC": + value_to_sell = deviation * total_value + units_to_sell = value_to_sell / price_data[asset] if asset in price_data and price_data[asset] else 0 + portfolio[asset] -= units_to_sell + portfolio["USDC"] += value_to_sell + trade_instructions["trades"].append({ + "asset": asset, + "action": "SELL", + "units": units_to_sell, + "value": value_to_sell + }) + elif deviation < 0 and asset != "USDC": + # Underallocated: Buy asset using USDC + value_to_buy = -deviation * total_value + + # Ensure there is enough USDC available + if portfolio.get("USDC", 0) < value_to_buy: + value_to_buy = portfolio.get("USDC", 0) + + if value_to_buy > 0 and asset in price_data and price_data[asset]: + units_to_buy = value_to_buy / price_data[asset] + portfolio["USDC"] -= value_to_buy + portfolio[asset] = portfolio.get(asset, 0) + units_to_buy + trade_instructions["trades"].append({ + "asset": asset, + "action": "BUY", + "units": units_to_buy, + "value": value_to_buy + }) + + if not needs_rebalance: + trade_instructions["message"] = "Portfolio within tolerance. No rebalancing required." + else: + trade_instructions["message"] = "Portfolio rebalanced." + + return portfolio, trade_instructions \ No newline at end of file diff --git a/backend/Python/Algorithms/MA.py b/backend/Python/Algorithms/MA.py new file mode 100644 index 0000000..5a040c6 --- /dev/null +++ b/backend/Python/Algorithms/MA.py @@ -0,0 +1,179 @@ +#############################SHORT TERM LOW RISK TRADING STRATEGY############################# +############################# Moving Average Crossover Decision ############################# + + +def extract_weth_prices(graph_data): + """ + Extracts a chronological list of WETH prices in USD from the subgraph swap data. + Assumes that the JSON structure is: + { + "data": { + "swaps": [ + { + "pool": { ... }, + "tokenIn": { "lastPriceUSD": "xxx", "symbol": "..." }, + "tokenOut": { "lastPriceUSD": "xxx", "symbol": "..." } + }, + ... + ] + } + } + + Since the query orders swaps by timestamp in descending order, this function reverses the list + to create a chronological (oldest-first) price series. + """ + swaps = graph_data.get("data", {}).get("swaps", []) + prices = [] + # Reverse the list so that the earliest swap is first. + # print("swapsL",swaps) + for swap in reversed(swaps): + price = None + token_in = swap.get("tokenOut", {}) + # We assume WETH is the asset of interest. + # print(token_in) + try: + price = float(token_in.get("lastPriceUSD", "0")) + print(price) + except ValueError: + price = 0.0 + if price and price > 0: + prices.append(price) + # print(prices) + return prices + +def calculate_ma_with_signals(prices, short_window=3, long_window=5, threshold=0.005): + """ + Calculate Moving Average and generate trading signals for a list of prices. + This function is expected by the unified server. + + Parameters: + prices - List of float prices in chronological order + short_window - Short moving average window (default: 3) + long_window - Long moving average window (default: 5) + threshold - Minimum relative difference to trigger trades (default: 0.005 = 0.5%) + + Returns: + Dictionary with MA values and signals + """ + if len(prices) < long_window: + return { + "short_ma": [], + "long_ma": [], + "signals": [], + "error": "Insufficient data for MA calculation" + } + + short_ma_values = [] + long_ma_values = [] + signals = [] + + # Calculate moving averages for each valid point + for i in range(long_window - 1, len(prices)): + short_ma = compute_moving_average(prices[:i+1], short_window) + long_ma = compute_moving_average(prices[:i+1], long_window) + + short_ma_values.append(short_ma) + long_ma_values.append(long_ma) + + # Generate signal based on crossover + if short_ma and long_ma: + relative_difference = (short_ma - long_ma) / long_ma + + if relative_difference > threshold: + signals.append("BUY") + elif relative_difference < -threshold: + signals.append("SELL") + else: + signals.append("HOLD") + else: + signals.append("HOLD") + + return { + "short_ma": short_ma_values, + "long_ma": long_ma_values, + "signals": signals, + "latest_short_ma": short_ma_values[-1] if short_ma_values else 0, + "latest_long_ma": long_ma_values[-1] if long_ma_values else 0, + "latest_signal": signals[-1] if signals else "HOLD" + } + +def compute_moving_average(prices, window): + """ + Compute the simple moving average (SMA) for the last 'window' prices. + + Parameters: + prices - List of float prices in chronological order. + window - Number of periods over which to compute the average. + + Returns: + The computed moving average as a float, or None if insufficient data. + """ + if len(prices) < window: + return None + return sum(prices[-window:]) / window + +def moving_average_crossover_decision(graph_data, short_window=3, long_window=5, threshold=0.005): + """ + Implements a moving average crossover strategy designed for short-term, low-risk trading. + + Process: + 1. Extract a price series for WETH from the subgraph data. + 2. Compute the short-term moving average (SMA) using 'short_window' periods. + 3. Compute the long-term moving average (SMA) using 'long_window' periods. + 4. Calculate the relative difference between the short-term and long-term averages. + 5. Generate a trading signal based on conservative thresholds: + - If the short-term SMA exceeds the long-term SMA by more than the 'threshold' percentage, signal BUY. + - If the short-term SMA falls below the long-term SMA by more than the 'threshold' percentage, signal SELL. + - Otherwise, signal HOLD. + + Parameters: + graph_data - JSON response from the subgraph. + short_window - Number of periods for the short-term moving average. + long_window - Number of periods for the long-term moving average. + threshold - Minimum relative percentage difference required to trigger a trade. + For example, 0.005 corresponds to 0.5%. + + Returns: + A dictionary with: + - 'decision': Trading decision ("BUY", "SELL", or "HOLD"). + - 'short_ma': The short-term moving average. + - 'long_ma': The long-term moving average. + - 'latest_price': The most recent WETH price. + - 'price_series': The extracted price series. + - 'relative_difference': The percentage difference between the averages. + """ + prices = extract_weth_prices(graph_data) + if not prices: + return {"decision": "NO_DATA", "reason": "No valid price data found."} + + # Ensure sufficient data points for the long-term average. + if len(prices) < long_window: + return {"decision": "INSUFFICIENT_DATA", "reason": "Not enough price data for long-term average."} + + short_ma = compute_moving_average(prices, short_window) + long_ma = compute_moving_average(prices, long_window) + + # Calculate relative difference between the moving averages. + relative_difference = (short_ma - long_ma) / long_ma # expressed as a fraction + + # Determine decision based on conservative thresholds. + if relative_difference > threshold: + decision = "BUY" + elif relative_difference < -threshold: + decision = "SELL" + else: + decision = "HOLD" + + return { + "decision": decision, + "short_ma": short_ma, + "long_ma": long_ma, + "latest_price": prices[-1], + "price_series": prices, + "relative_difference": relative_difference + } + +# Example usage: +# Assuming 'graph_json' is the JSON response obtained from your subgraph: +# result = moving_average_crossover_decision(graph_json, short_window=3, long_window=5, threshold=0.005) +# print("Moving Average Crossover Decision:", result) diff --git a/backend/Python/Algorithms/MACD.py b/backend/Python/Algorithms/MACD.py new file mode 100644 index 0000000..125432e --- /dev/null +++ b/backend/Python/Algorithms/MACD.py @@ -0,0 +1,201 @@ +#############################LONG TERM HIGH RISK TRADING STRATEGY############################# +#############################MOVING AVERAGE CONVERGENCE DIVERGENCE############################# + +def extract_USDC_prices(graph_data): + """ + Extracts a chronological list of WETH prices in USD from the subgraph swap data. + Assumes that the JSON structure is: + { + "data": { + "swaps": [ + { + "pool": { ... }, + "tokenIn": { "lastPriceUSD": "xxx", "symbol": "..." }, + "tokenOut": { "lastPriceUSD": "xxx", "symbol": "..." } + }, + ... + ] + } + } + + Since the query orders swaps by timestamp in descending order, this function reverses the list + to create a chronological (oldest-first) price series. + """ + swaps = graph_data.get("data", {}).get("swaps", []) + prices = [] + # Reverse the list so that the earliest swap is first. + # print("swapsL",swaps) + for swap in reversed(swaps): + price = None + token_in = swap.get("tokenOut", {}) + # We assume WETH is the asset of interest. + # print(token_in) + try: + price = float(token_in.get("lastPriceUSD", "0")) + print(price) + except ValueError: + price = 0.0 + if price and price > 0: + prices.append(price) + # print(prices) + return prices + +def calculate_macd_with_signals(prices, short=12, long=26, signal=9): + """ + Calculate MACD and generate trading signals for a list of prices. + This function is expected by the unified server. + Uses adaptive periods for smaller datasets. + + Parameters: + prices - List of float prices in chronological order + short - Short EMA period (default: 12) + long - Long EMA period (default: 26) + signal - Signal line EMA period (default: 9) + + Returns: + Dictionary with MACD values and signals + """ + data_length = len(prices) + + # Adaptive periods for smaller datasets + if data_length < 26: + if data_length >= 14: + # Use smaller periods for limited data + short = min(short, 5) + long = min(long, 10) + signal = min(signal, 5) + else: + return { + "macd": [], + "signal": [], + "signals": [], + "error": "Insufficient data for MACD calculation" + } + + if data_length < max(short, long, signal): + return { + "macd": [], + "signal": [], + "signals": [], + "error": f"Need at least {max(short, long, signal)} data points for MACD calculation" + } + + macd_line, signal_line = compute_macd(prices, short, long, signal) + + # Generate trading signals based on MACD crossovers + signals = [] + for i in range(1, len(macd_line)): + if macd_line[i] is None or signal_line[i] is None: + signals.append("HOLD") + continue + if macd_line[i-1] is None or signal_line[i-1] is None: + signals.append("HOLD") + continue + + # Crossover detection + if macd_line[i] > signal_line[i] and macd_line[i-1] <= signal_line[i-1]: + signals.append("BUY") + elif macd_line[i] < signal_line[i] and macd_line[i-1] >= signal_line[i-1]: + signals.append("SELL") + else: + signals.append("HOLD") + + return { + "macd": [m for m in macd_line if m is not None], + "signal": [s for s in signal_line if s is not None], + "signals": signals, + "latest_macd": macd_line[-1] if macd_line and macd_line[-1] is not None else 0, + "latest_signal": signal_line[-1] if signal_line and signal_line[-1] is not None else 0, + "latest_trading_signal": signals[-1] if signals else "HOLD", + "parameters": {"short": short, "long": long, "signal": signal} + } + +def compute_ema(prices, period): + """Robust EMA calculation with input validation""" + if not prices or len(prices) < period: + return [] + + ema_values = [] + smoothing = 2 / (period + 1) + + # Simple moving average as initial EMA + try: + current_ema = sum(prices[:period]) / period + except ZeroDivisionError: + return [] + + ema_values.append(current_ema) + + for price in prices[period:]: + current_ema = (price - current_ema) * smoothing + current_ema + ema_values.append(current_ema) + + # Pad with None for alignment + return [None]*(period-1) + ema_values + +def compute_macd(prices, short=12, long=26, signal=9): + """MACD calculation with alignment guarantees""" + if len(prices) < max(short, long): + return [], [] + + # Compute EMAs with proper alignment + short_ema = compute_ema(prices, short) + long_ema = compute_ema(prices, long) + + # Calculate MACD line (ensure equal length) + min_length = min(len(short_ema), len(long_ema)) + macd_line = [ + (s - l) if s is not None and l is not None else None + for s, l in zip(short_ema[:min_length], long_ema[:min_length]) + ] + + # Calculate signal line using valid MACD values + valid_macd = [m for m in macd_line if m is not None] + if len(valid_macd) >= signal: + signal_ema = compute_ema(valid_macd, signal) + signal_padding = len(macd_line) - len(signal_ema) + signal_line = [None]*signal_padding + signal_ema + else: + signal_line = [None]*len(macd_line) + + return macd_line, signal_line + +def macd_strategy_decision(graph_data): + """Final decision logic with safety checks""" + prices = extract_USDC_prices(graph_data) + + if not prices: + return {"decision": "NO_DATA", "reason": "Empty price series"} + + macd, signal = compute_macd(prices) + + # Ensure we have at least 2 valid points for crossover detection + valid_macd = [m for m in macd[-2:] if m is not None] + valid_signal = [s for s in signal[-2:] if s is not None] + + if len(valid_macd) < 2 or len(valid_signal) < 2: + return {"decision": "INSUFFICIENT_DATA", "reason": "Need 2+ MACD/Signal points"} + + latest_price = prices[-1] + current_macd = valid_macd[-1] + current_signal = valid_signal[-1] + + # Crossover detection + prev_macd = valid_macd[-2] + prev_signal = valid_signal[-2] + + decision = "HOLD" + if current_macd > current_signal and prev_macd <= prev_signal: + decision = "BUY" + elif current_macd < current_signal and prev_macd >= prev_signal: + decision = "SELL" + + return { + "decision": decision, + "macd": current_macd, + "signal": current_signal, + "latest_price": latest_price, + "price_series": prices, + "macd_line": macd, + "signal_line": signal + } diff --git a/backend/Python/Algorithms/RSI.py b/backend/Python/Algorithms/RSI.py new file mode 100644 index 0000000..ffd54cb --- /dev/null +++ b/backend/Python/Algorithms/RSI.py @@ -0,0 +1,189 @@ +#############################SHORT TERM HIGH RISK TRADING STRATEGY############################# +############################# RSI ############################# + +def extract_weth_prices(graph_data): + """ + Extracts a chronological list of WETH prices in USD from the subgraph swap data. + Assumes that the JSON structure is: + { + "data": { + "swaps": [ + { + "pool": { ... }, + "tokenIn": { "lastPriceUSD": "xxx", "symbol": "..." }, + "tokenOut": { "lastPriceUSD": "xxx", "symbol": "..." } + }, + ... + ] + } + } + + Since the query orders swaps by timestamp in descending order, this function reverses the list + to create a chronological (oldest-first) price series. + """ + swaps = graph_data.get("data", {}).get("swaps", []) + prices = [] + # Reverse the list so that the earliest swap is first. + # print("swapsL",swaps) + for swap in reversed(swaps): + price = None + token_in = swap.get("tokenOut", {}) + # We assume WETH is the asset of interest. + # print(token_in) + try: + price = float(token_in.get("lastPriceUSD", "0")) + print(price) + except ValueError: + price = 0.0 + if price and price > 0: + prices.append(price) + # print(prices) + return prices + +def calculate_rsi_with_signals(prices, period=14): + """ + Calculate RSI and generate trading signals for a list of prices. + This is the function expected by the server files. + + Parameters: + prices - List of float prices in chronological order + period - RSI calculation period (default: 14) + + Returns: + Dictionary with RSI values and signals + """ + if len(prices) < period + 1: + return { + "rsi": [], + "signals": [], + "error": "Insufficient data for RSI calculation" + } + + rsi_values = [] + signals = [] + + # Calculate RSI for each point where we have enough data + for i in range(period, len(prices)): + price_window = prices[i-period:i+1] + rsi = compute_rsi(price_window, period) + if rsi is not None: + rsi_values.append(rsi) + + # Generate signal based on RSI (more sensitive thresholds for demo) + if rsi > 55: + signals.append("SELL") + elif rsi < 45: + signals.append("BUY") + else: + signals.append("HOLD") + else: + rsi_values.append(50) # Neutral RSI if calculation fails + signals.append("HOLD") + + return { + "rsi": rsi_values, + "signals": signals, + "latest_rsi": rsi_values[-1] if rsi_values else 50, + "latest_signal": signals[-1] if signals else "HOLD" + } + +def compute_rsi(prices, period=5): + """ + Computes the Relative Strength Index (RSI) from a list of prices. + Uses a simple moving average approach for both gains and losses over the specified period. + + Parameters: + prices - List of float prices in chronological order. + period - Number of periods to use for the RSI calculation. + + Returns: + RSI value (float) calculated over the price series, or None if insufficient data. + """ + if len(prices) < period + 1: + return None # Not enough data points to compute RSI + + gains = [] + losses = [] + # Calculate price differences (delta) + for i in range(1, len(prices)): + delta = prices[i] - prices[i - 1] + if delta > 0: + gains.append(delta) + losses.append(0) + else: + gains.append(0) + losses.append(abs(delta)) + + # Calculate initial average gain and loss + avg_gain = sum(gains[:period]) / period + avg_loss = sum(losses[:period]) / period + + # Use a rolling average for the remainder of the data + for i in range(period, len(gains)): + current_gain = gains[i] + current_loss = losses[i] + avg_gain = ((avg_gain * (period - 1)) + current_gain) / period + avg_loss = ((avg_loss * (period - 1)) + current_loss) / period + + # Avoid division by zero: if avg_loss is zero, RSI is 100. + if avg_loss == 0: + return 100.0 + + rs = avg_gain / avg_loss + rsi = 100 - (100 / (1 + rs)) + return rsi + +def rsi_strategy_decision(graph_data, rsi_period=5, overbought_threshold=55, oversold_threshold=45): + """ + Implements an RSI-based trading decision strategy for short-term, high-risk trading. + + Process: + 1. Extract the price series for WETH from the subgraph data. + 2. Compute the RSI over a short period (default is 5 periods). + 3. Generate a trading signal: + - If RSI is above the overbought threshold, signal SELL. + - If RSI is below the oversold threshold, signal BUY. + - Otherwise, signal HOLD. + + Parameters: + graph_data - JSON response from the subgraph. + rsi_period - The lookback period for the RSI calculation. + overbought_threshold - RSI value above which the asset is considered overbought (default: 55). + oversold_threshold - RSI value below which the asset is considered oversold (default: 45). + + Returns: + A dictionary containing: + - 'decision': Trading decision ("BUY", "SELL", or "HOLD"). + - 'rsi': The computed RSI value. + - 'latest_price': The most recent WETH price. + - 'price_series': The full extracted price series. + """ + print(graph_data) + prices = extract_weth_prices(graph_data) + if not prices: + return {"decision": "NO_DATA", "reason": "No valid price data found."} + + rsi = compute_rsi(prices, period=rsi_period) + if rsi is None: + return {"decision": "INSUFFICIENT_DATA", "reason": "Not enough data to compute RSI."} + + if rsi > overbought_threshold: + decision = "SELL" + elif rsi < oversold_threshold: + decision = "BUY" + else: + decision = "HOLD" + + return { + "decision": decision, + "rsi": rsi, + "latest_price": prices[-1], + "price_series": prices + } + +# Example of how to use the above functions: +# Suppose 'graph_json' is the JSON response directly obtained from the subgraph. +# The AI agent would call: +# +# result = rsi_strategy_decision(graph_json, rsi_period=5, overbought_threshold=70, oversold_threshold=30) +# print("RSI Strategy Decision:", result) \ No newline at end of file diff --git a/backend/Python/Decisions/DCA_dis.py b/backend/Python/Decisions/DCA_dis.py new file mode 100644 index 0000000..9a61d88 --- /dev/null +++ b/backend/Python/Decisions/DCA_dis.py @@ -0,0 +1,132 @@ +import time +import json +from datetime import datetime +from ..SubGraph.weth_usdc import fetch_graph_data_weth_usdc +from ..SubGraph.wbtc_usdc import fetch_graph_data_wbtc_usdc +from ..SubGraph.dai_usdc import fetch_graph_data_dai_usdc +from ..Algorithms.DCA import dca_investment, rebalance_portfolio, extract_latest_price, extract_prices +from dotenv import load_dotenv +import os +from groq import Groq + +load_dotenv() +client = Groq(api_key=os.getenv("GROQ_API_KEY")) # New Groq client + +def get_llm_decision(portfolio_before, portfolio_after, dca_details, rebalance_details): + prompt = f""" + We executed a DCA investment and possibly rebalanced the portfolio. + + Before: + {portfolio_before} + + After: + {portfolio_after} + + DCA Details: + {dca_details} + + Rebalance Details: + {rebalance_details} + + Should we continue this approach or adjust our strategy? + Respond with a brief explanation or recommendation. + """ + + chat_completion = client.chat.completions.create( + messages=[{"role": "user", "content": prompt}], + model="llama3-70b-8192", + temperature=0.3, + max_tokens=300 + ) + + return chat_completion.choices[0].message.content.strip() + +def fetch_graph_data(): + pools = { + "BTC": fetch_graph_data_wbtc_usdc, + "DAI": fetch_graph_data_dai_usdc, + "WETH": fetch_graph_data_weth_usdc + } + + data = {} + for asset, fetch_data in pools.items(): + print(f"Fetching data for {asset}...") + graph_data = fetch_data() + + if not graph_data: + data[asset] = None + else: + data[asset] = graph_data + return data + +def generate_decision_json(dca_details, portfolio): + """ + Generates a JSON response with decision data for each asset. + """ + decisions = {} + timestamp = int(time.time()) + + for asset in ["BTC", "DAI", "WETH"]: + if asset not in dca_details: + decisions[asset] = { + "action": "HOLD", + "position_size": portfolio.get(asset, 0), + "price": None, + "invested": 0 + } + continue + + asset_details = dca_details.get(asset, {}) + + decisions[asset] = { + "action": asset_details.get("action", "HOLD"), + "position_size": portfolio.get(asset, 0), + "price": asset_details.get("price"), + "invested": asset_details.get("invested", 0) + } + + return { + "decisions": decisions, + "timestamp": timestamp + } + +def dca_decision_loop(): + portfolio = {"USDC": 1000.0, "WETH": 1000.0, "BTC": 1000.0, "DAI": 1000.0} + target_allocation = {"WETH": 0.4, "BTC": 0.4, "DAI": 0.2, "USDC": 0.0} # Example allocation + invest_amount = 100.0 # invest 100 USDC each cycle + tolerance = 0.02 # 2% tolerance for rebalancing + + while True: + print("\n--- DCA Decision Loop Cycle ---") + portfolio_before = portfolio.copy() + + # Fetch latest data + graph_data = fetch_graph_data() + if not any(graph_data.values()): + print("No data fetched. Retrying next interval...") + continue + + # Perform DCA for each asset + dca_details = {} + for asset in ["WETH", "BTC", "DAI"]: + if asset in graph_data and graph_data[asset]: + asset_invest_amount = invest_amount * target_allocation.get(asset, 0) + if asset_invest_amount > 0: + portfolio, asset_details = dca_investment(graph_data, asset_invest_amount, portfolio, asset) + dca_details[asset] = asset_details + print(f"DCA executed for {asset}. Details: {asset_details}") + + # Rebalance portfolio + portfolio, rebalance_details = rebalance_portfolio( + portfolio, target_allocation, graph_data, tolerance + ) + print(f"Rebalance attempt. Details: {rebalance_details}") + + # Generate decision JSON + decision_json = generate_decision_json(dca_details, portfolio) + print("Decision JSON:") + print(json.dumps(decision_json, indent=4)) + return decision_json + + + diff --git a/backend/Python/Decisions/MACD_dis.py b/backend/Python/Decisions/MACD_dis.py new file mode 100644 index 0000000..fca5075 --- /dev/null +++ b/backend/Python/Decisions/MACD_dis.py @@ -0,0 +1,89 @@ +import time +import json +from datetime import datetime +from ..SubGraph.weth_usdc import fetch_graph_data_weth_usdc +from ..SubGraph.wbtc_usdc import fetch_graph_data_wbtc_usdc +from ..SubGraph.dai_usdc import fetch_graph_data_dai_usdc +from ..Algorithms.MACD import macd_strategy_decision +from dotenv import load_dotenv +import os +from groq import Groq + +load_dotenv() +client = Groq(api_key=os.getenv("GROQ_API_KEY")) # New Groq client + +def get_llm_decision(algo_result): + prompt = f""" + The MACD-based strategy suggests: {algo_result['decision']}. + Latest MACD: {algo_result['macd']} + Latest Signal: {algo_result['signal']} + Latest Price: {algo_result['latest_price']} + + Do we BUY, SELL, or HOLD? + Respond with only one word: BUY, SELL, or HOLD. + """ + chat_completion = client.chat.completions.create( + messages=[{"role": "user", "content": prompt}], + model="llama3-70b-8192", + temperature=0.3, + max_tokens=3 + ) + return chat_completion.choices[0].message.content.strip() + +def fetch_and_analyze(): + pools = { + "BTC": fetch_graph_data_wbtc_usdc, + "DAI": fetch_graph_data_dai_usdc, + "WETH": fetch_graph_data_weth_usdc + } + + decisions = {} + for asset, fetch_data in pools.items(): + print(f"Fetching data for {asset}...") + graph_data = fetch_data() + + if not graph_data: + decisions[asset] = { + "action": "HOLD", + "position_size": 0, + "reason": "No data available" + } + continue + + algo_result = macd_strategy_decision(graph_data) + print(f"MACD Algorithm Output for {asset}:", algo_result) + + if algo_result.get("decision") in ("NO_DATA", "INSUFFICIENT_DATA"): + decisions[asset] = { + "action": "HOLD", + "position_size": 0, + } + continue + + llm_decision = get_llm_decision(algo_result) + position_size = 100 if llm_decision == "BUY" else 0 # Example logic + + decisions[asset] = { + "action": llm_decision, + "position_size": position_size, + "macd": algo_result["macd"], + "signal": algo_result["signal"], + "price": algo_result["latest_price"] + } + + return { + "decisions": decisions, + "timestamp": int(time.time()) + } + +def macd_decision_loop(interval=600): + while True: + print("\n--- MACD Decision Loop Cycle ---") + decision_data = fetch_and_analyze() + print(json.dumps(decision_data, indent=2)) + + print(f"Waiting {interval} seconds before next cycle...\n") + time.sleep(interval) + +if __name__ == "__main__": + macd_decision_loop(interval=600) diff --git a/backend/Python/Decisions/MA_dis.py b/backend/Python/Decisions/MA_dis.py new file mode 100644 index 0000000..6db1d38 --- /dev/null +++ b/backend/Python/Decisions/MA_dis.py @@ -0,0 +1,88 @@ +import time +import json +from datetime import datetime +from ..SubGraph.weth_usdc import fetch_graph_data_weth_usdc +from ..SubGraph.wbtc_usdc import fetch_graph_data_wbtc_usdc +from ..SubGraph.dai_usdc import fetch_graph_data_dai_usdc +from ..Algorithms.MA import moving_average_crossover_decision +from dotenv import load_dotenv +import os + +from groq import Groq +load_dotenv() +client = Groq(api_key=os.getenv("GROQ_API_KEY")) # New Groq client + + + +def get_llm_decision(algo_result): + prompt = f""" + The Moving Average Crossover algorithm suggests: {algo_result['decision']}. + Short-term MA: {algo_result['short_ma']} + Long-term MA: {algo_result['long_ma']} + Latest Price: {algo_result['latest_price']} + Relative Diff: {algo_result.get('relative_difference')} + + Please confirm the final decision: BUY, SELL, or HOLD. + Respond with only one word: BUY, SELL, or HOLD. + """ + chat_completion = client.chat.completions.create( + messages=[{"role": "user", "content": prompt}], + model="llama3-70b-8192", + temperature=0.3, + max_tokens=3 + ) + return chat_completion.choices[0].message.content.strip() + +def fetch_and_analyze(): + pools = { + "BTC": fetch_graph_data_wbtc_usdc, + "DAI": fetch_graph_data_dai_usdc, + "WETH": fetch_graph_data_weth_usdc + } + + decisions = {} + for asset, fetch_data in pools.items(): + print(f"Fetching data for {asset}...") + graph_data = fetch_data() + + if not graph_data: + decisions[asset] = { + "action": "HOLD", + "position_size": 0, + "reason": "No data available" + } + continue + + algo_result = moving_average_crossover_decision(graph_data, short_window=3, long_window=5, threshold=0.005) + print(f"MA Algorithm Output for {asset}:", algo_result) + + if algo_result.get("decision") == "NO_DATA": + decisions[asset] = { + "action": "HOLD", + "position_size": 0, + "reason": "Insufficient data" + } + continue + + llm_decision = get_llm_decision(algo_result) + position_size = 100 if llm_decision == "BUY" else 0 # Example logic + + decisions[asset] = { + "action": llm_decision, + "position_size": position_size, + "short_ma": algo_result["short_ma"], + "long_ma": algo_result["long_ma"], + "price": algo_result["latest_price"], + "relative_difference": algo_result.get("relative_difference") + } + + return { + "decisions": decisions, + "timestamp": int(time.time()) + } + +def ma_decision_loop(): + print("\n--- MA Decision Loop Cycle ---") + decision_data = fetch_and_analyze() + return decision_data # Ensure function returns JSON string + diff --git a/backend/Python/Decisions/RSI_dis.py b/backend/Python/Decisions/RSI_dis.py new file mode 100644 index 0000000..a34ef88 --- /dev/null +++ b/backend/Python/Decisions/RSI_dis.py @@ -0,0 +1,104 @@ +import time +from ..Algorithms.RSI import rsi_strategy_decision +from ..SubGraph.weth_usdc import fetch_graph_data_weth_usdc +from ..SubGraph.wbtc_usdc import fetch_graph_data_wbtc_usdc +from ..SubGraph.dai_usdc import fetch_graph_data_dai_usdc +import json +from dotenv import load_dotenv +import os +from groq import Groq +load_dotenv() +client = Groq(api_key=os.getenv("GROQ_API_KEY")) # New Groq client + +SYSTEM_PROMPT = """You are an expert trading AI specializing in low-risk cryptocurrency +strategies. Analyze the RSI data and provide only BUY/SELL/HOLD decisions considering: +- Current market conditions +- Low risk tolerance +- Historical price patterns +- Volatility indicators""" + +def get_llm_decision(algo_result): + """ + Modified for Groq API with risk-averse strategy + """ + user_prompt = f""" + Trading Context: + - RSI Strategy Suggestion: {algo_result['decision']} + - Current RSI: {algo_result['rsi']} + - Latest Price: {algo_result['latest_price']} + - Recent Prices: {algo_result['price_series'][-5:]} + + Required Action: For a LOW-RISK strategy, should we BUY, SELL, or HOLD? + Respond with ONLY the action word in uppercase. + """ + + try: + chat_completion = client.chat.completions.create( + messages=[ + {"role": "system", "content": SYSTEM_PROMPT}, + {"role": "user", "content": user_prompt} + ], + model="llama3-70b-8192", + temperature=0.3, + max_tokens=3 # Allowing up to 3 tokens to avoid truncation + ) + return chat_completion.choices[0].message.content.strip() + + except Exception as e: + print(f"Groq API Error: {str(e)}") + return "HOLD" # Fail-safe default + +def rsi_decision_loop(): + """ + Executes once per API call and returns JSON-formatted decisions. + """ + print("\n--- RSI Decision Execution ---") + decisions = {} + + # Process all trading pairs + for pair, fetch_fn in [ + ("BTC", fetch_graph_data_wbtc_usdc), + ("DAI", fetch_graph_data_dai_usdc), + ("WETH", fetch_graph_data_weth_usdc) + ]: + graph_data = fetch_fn() + if not graph_data: + decisions[pair] = {"action": "HOLD", "position_size": 0, "reason": "No data"} + continue + + algo_result = rsi_strategy_decision( + graph_data, + rsi_period=5, + overbought_threshold=70, + oversold_threshold=30 + ) + print(algo_result) + if algo_result.get("decision") in ("NO_DATA", "INSUFFICIENT_DATA"): + print(algo_result.get("decision")) + decisions[pair] = {"action": "HOLD", "position_size": 0, "reason": "Insufficient data"} + continue + + try: + llm_decision = get_llm_decision(algo_result) + + # Dynamically calculate position size (example logic) + position_size = max(10, min(100, 100 - algo_result["rsi"])) + + decisions[pair] = { + "action": llm_decision, + "position_size": position_size, + "rsi": algo_result['rsi'], + "price": algo_result['latest_price'] + } + + except Exception as e: + decisions[pair] = {"action": "HOLD", "position_size": 0, "reason": str(e)} + + # Create final JSON output + output_json = { + "timestamp": int(time.time()), + "decisions": decisions + } + + print("Final Output:", json.dumps(output_json, indent=2)) + return output_json # Returning JSON instead of running indefinitely diff --git a/backend/Python/Decisions/RSI_server.py.backup b/backend/Python/Decisions/RSI_server.py.backup new file mode 100644 index 0000000..1e515c8 --- /dev/null +++ b/backend/Python/Decisions/RSI_server.py.backup @@ -0,0 +1,43 @@ +from flask import Flask, jsonify +from flask_cors import CORS +from .RSI_dis import rsi_decision_loop +from .MACD_dis import fetch_and_analyze +from .DCA_dis import dca_decision_loop +from .MA_dis import ma_decision_loop +app = Flask(__name__) +CORS(app) # Enable CORS for all origins + +@app.route("/decisions/high/short", methods=["GET"]) +def rsi_decision(): + """ + API endpoint to return RSI-based trading decisions. + """ + output_json = rsi_decision_loop() # Execute once and return response + return jsonify(output_json) + +@app.route("/decisions/high/long", methods=["GET"]) +def macd_decision(): + """ + API endpoint to return RSI-based trading decisions. + """ + output_json = fetch_and_analyze() # Execute once and return response + return jsonify(output_json) + +@app.route("/decisions/low/short", methods=["GET"]) +def ma_decision(): + """ + API endpoint to return RSI-based trading decisions. + """ + output_json = ma_decision_loop() # Execute once and return response + return output_json + +@app.route("/decisions/low/long", methods=["GET"]) +def dca_decision(): + """ + API endpoint to return RSI-based trading decisions. + """ + output_json = dca_decision_loop() # Execute once and return response + return output_json + +if __name__ == "__main__": + app.run(host="0.0.0.0", port=5050, debug=True) diff --git a/backend/Python/SubGraph/dai_usdc.py b/backend/Python/SubGraph/dai_usdc.py new file mode 100644 index 0000000..5e6bc33 --- /dev/null +++ b/backend/Python/SubGraph/dai_usdc.py @@ -0,0 +1,173 @@ +import requests +import json +import os + +def get_price_range(range_choice, current_price): + if range_choice == "narrow": + return current_price * 0.95, current_price * 1.05 + elif range_choice == "medium": + return current_price * 0.9, current_price * 1.1 + elif range_choice == "wide": + return current_price * 0.8, current_price * 1.2 + else: + return current_price * 0.9, current_price * 1.1 + +def get_swaps(): + # Use the provided API key and endpoint + api_key = "73419c7a18a27c80dcea6b9416db18bd" + subgraph_url = f"https://gateway.thegraph.com/api/{api_key}/subgraphs/id/5zvR82QoaXYFyDEKLZ9t6v9adgnptxYpKpSbxtgVENFV" + + # Ethereum mainnet DAI/USDC pool address (0.05% fee tier) + pool_address = "0x5777d92f208679db4b9778590fa3cab3ac9e2168" + + query = f""" + {{ + swaps( + orderBy: timestamp, + orderDirection: desc, + first: 20, + where: {{ + pool: "{pool_address}" + }} + ) {{ + id + timestamp + amount0 + amount1 + amountUSD + tick + transaction {{ + id + }} + pool {{ + id + token0 {{ + symbol + decimals + }} + token1 {{ + symbol + decimals + }} + token0Price + token1Price + }} + }} + }} + """ + + try: + response = requests.post(subgraph_url, json={'query': query}, timeout=10) + + print(f"SubGraph Response Status: {response.status_code}") + + if response.status_code == 200: + response_json = response.json() + + if 'errors' in response_json: + print(f"SubGraph errors: {response_json['errors']}") + return [] + + if 'data' in response_json and 'swaps' in response_json['data']: + swaps = response_json['data']['swaps'] + print(f"Successfully fetched {len(swaps)} swaps") + return swaps + else: + print("No 'data' or 'swaps' in response") + return [] + else: + print(f"Failed to fetch data: {response.status_code} - {response.text}") + return [] + + except Exception as e: + print(f"Error fetching swaps data: {e}") + return [] + +def get_pool_data(): + # Use the provided API key and endpoint + api_key = "73419c7a18a27c80dcea6b9416db18bd" + subgraph_url = f"https://gateway.thegraph.com/api/{api_key}/subgraphs/id/5zvR82QoaXYFyDEKLZ9t6v9adgnptxYpKpSbxtgVENFV" + + # Ethereum mainnet DAI/USDC pool address (0.05% fee tier) + pool_address = "0x5777d92f208679db4b9778590fa3cab3ac9e2168" + + query = f""" + {{ + pool(id: "{pool_address}") {{ + id + liquidity + totalValueLockedETH + totalValueLockedToken0 + totalValueLockedToken1 + totalValueLockedUSD + volumeToken0 + volumeToken1 + volumeUSD + token0 {{ + symbol + decimals + name + }} + token1 {{ + symbol + decimals + name + }} + token0Price + token1Price + feeTier + tick + sqrtPrice + }} + }} + """ + + try: + response = requests.post(subgraph_url, json={'query': query}, timeout=10) + + if response.status_code == 200: + response_json = response.json() + + if 'errors' in response_json: + print(f"SubGraph errors: {response_json['errors']}") + return None + + if 'data' in response_json and 'pool' in response_json['data']: + pool_data = response_json['data']['pool'] + if pool_data: + print("Successfully fetched pool data") + return pool_data + else: + print("Pool not found") + return None + else: + print("No pool data in response") + return None + else: + print(f"Failed to fetch pool data: {response.status_code}") + return None + + except Exception as e: + print(f"Error fetching pool data: {e}") + return None + +def main(): + print("Testing DAI/USDC SubGraph with provided API key...") + + # Test pool data + pool_data = get_pool_data() + if pool_data: + print("Pool Data:") + print(json.dumps(pool_data, indent=2)) + + # Test swaps data + swaps_data = get_swaps() + if swaps_data: + print(f"\nSwaps Data (showing first 3):") + for i, swap in enumerate(swaps_data[:3]): + print(f"Swap {i+1}: {json.dumps(swap, indent=2)}") + else: + print("Failed to fetch swaps data.") + +if __name__ == "__main__": + main() diff --git a/backend/Python/SubGraph/dai_usdc_subgraph.py b/backend/Python/SubGraph/dai_usdc_subgraph.py new file mode 100644 index 0000000..e92ca7e --- /dev/null +++ b/backend/Python/SubGraph/dai_usdc_subgraph.py @@ -0,0 +1,191 @@ +import requests +import json +import os + +def get_price_range(range_choice, current_price): + if range_choice == "narrow": + return current_price * 0.95, current_price * 1.05 + elif range_choice == "medium": + return current_price * 0.9, current_price * 1.1 + elif range_choice == "wide": + return current_price * 0.8, current_price * 1.2 + else: + return current_price * 0.9, current_price * 1.1 + +def get_swaps(): + # Use the provided API key and endpoint + api_key = "73419c7a18a27c80dcea6b9416db18bd" + subgraph_url = f"https://gateway.thegraph.com/api/{api_key}/subgraphs/id/5zvR82QoaXYFyDEKLZ9t6v9adgnptxYpKpSbxtgVENFV" + + # Ethereum mainnet DAI/USDC pool address (0.05% fee tier) + pool_address = "0x5777d92f208679db4b9778590fa3cab3ac9e2168" + + query = f""" + {{ + swaps( + orderBy: timestamp, + orderDirection: desc, + first: 20, + where: {{ + pool: "{pool_address}" + }} + ) {{ + id + timestamp + amount0 + amount1 + amountUSD + tick + transaction {{ + id + }} + pool {{ + id + token0 {{ + symbol + decimals + }} + token1 {{ + symbol + decimals + }} + token0Price + token1Price + }} + }} + }} + """ + + try: + response = requests.post(subgraph_url, json={'query': query}, timeout=10) + + print(f"SubGraph Response Status: {response.status_code}") + + if response.status_code == 200: + response_json = response.json() + + if 'errors' in response_json: + print(f"SubGraph errors: {response_json['errors']}") + return [] + + if 'data' in response_json and 'swaps' in response_json['data']: + swaps = response_json['data']['swaps'] + print(f"Successfully fetched {len(swaps)} swaps") + return swaps + else: + print("No 'data' or 'swaps' in response") + return [] + else: + print(f"Failed to fetch data: {response.status_code} - {response.text}") + return [] + + except Exception as e: + print(f"Error fetching swaps data: {e}") + return [] + +def fetch_dai_usdc_data(): + """Main function expected by main.py - returns swaps data in expected format""" + try: + swaps = get_swaps() + if swaps: + return { + "swaps": swaps, + "pair": "DAI/USDC", + "total_swaps": len(swaps) + } + else: + return { + "error": "Failed to fetch DAI/USDC swaps data", + "swaps": [], + "total_swaps": 0 + } + except Exception as e: + return { + "error": f"Error in fetch_dai_usdc_data: {str(e)}", + "swaps": [], + "total_swaps": 0 + } + +def get_pool_data(): + # Use the provided API key and endpoint + api_key = "73419c7a18a27c80dcea6b9416db18bd" + subgraph_url = f"https://gateway.thegraph.com/api/{api_key}/subgraphs/id/5zvR82QoaXYFyDEKLZ9t6v9adgnptxYpKpSbxtgVENFV" + + # Ethereum mainnet DAI/USDC pool address (0.05% fee tier) + pool_address = "0x5777d92f208679db4b9778590fa3cab3ac9e2168" + + query = f""" + {{ + pool(id: "{pool_address}") {{ + id + liquidity + totalValueLockedETH + totalValueLockedToken0 + totalValueLockedToken1 + totalValueLockedUSD + volumeToken0 + volumeToken1 + volumeUSD + token0 {{ + symbol + decimals + name + }} + token1 {{ + symbol + decimals + name + }} + token0Price + token1Price + feeTier + tick + sqrtPrice + }} + }} + """ + + try: + response = requests.post(subgraph_url, json={'query': query}, timeout=10) + + if response.status_code == 200: + response_json = response.json() + + if 'errors' in response_json: + print(f"SubGraph errors: {response_json['errors']}") + return None + + if 'data' in response_json and 'pool' in response_json['data']: + pool_data = response_json['data']['pool'] + if pool_data: + print("Successfully fetched pool data") + return pool_data + else: + print("Pool not found") + return None + else: + print("No pool data in response") + return None + else: + print(f"Failed to fetch pool data: {response.status_code}") + return None + + except Exception as e: + print(f"Error fetching pool data: {e}") + return None + +def main(): + print("Testing DAI/USDC SubGraph with provided API key...") + + # Test the main fetch function + data = fetch_dai_usdc_data() + if "error" in data: + print(f"Error: {data['error']}") + else: + print(f"Successfully fetched {data['total_swaps']} swaps for {data['pair']}") + if data['swaps']: + print("Sample swap data:") + print(json.dumps(data['swaps'][0], indent=2)) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/backend/Python/SubGraph/wbtc_usdc.py b/backend/Python/SubGraph/wbtc_usdc.py new file mode 100644 index 0000000..04af1de --- /dev/null +++ b/backend/Python/SubGraph/wbtc_usdc.py @@ -0,0 +1,173 @@ +import requests +import json +import os + +def get_price_range(range_choice, current_price): + if range_choice == "narrow": + return current_price * 0.95, current_price * 1.05 + elif range_choice == "medium": + return current_price * 0.9, current_price * 1.1 + elif range_choice == "wide": + return current_price * 0.8, current_price * 1.2 + else: + return current_price * 0.9, current_price * 1.1 + +def get_swaps(): + # Use the provided API key and endpoint + api_key = "73419c7a18a27c80dcea6b9416db18bd" + subgraph_url = f"https://gateway.thegraph.com/api/{api_key}/subgraphs/id/5zvR82QoaXYFyDEKLZ9t6v9adgnptxYpKpSbxtgVENFV" + + # Ethereum mainnet WBTC/USDC pool address (0.3% fee tier) + pool_address = "0x99ac8ca7087fa4a2a1fb6357269965a2014abc35" + + query = f""" + {{ + swaps( + orderBy: timestamp, + orderDirection: desc, + first: 20, + where: {{ + pool: "{pool_address}" + }} + ) {{ + id + timestamp + amount0 + amount1 + amountUSD + tick + transaction {{ + id + }} + pool {{ + id + token0 {{ + symbol + decimals + }} + token1 {{ + symbol + decimals + }} + token0Price + token1Price + }} + }} + }} + """ + + try: + response = requests.post(subgraph_url, json={'query': query}, timeout=10) + + print(f"SubGraph Response Status: {response.status_code}") + + if response.status_code == 200: + response_json = response.json() + + if 'errors' in response_json: + print(f"SubGraph errors: {response_json['errors']}") + return [] + + if 'data' in response_json and 'swaps' in response_json['data']: + swaps = response_json['data']['swaps'] + print(f"Successfully fetched {len(swaps)} swaps") + return swaps + else: + print("No 'data' or 'swaps' in response") + return [] + else: + print(f"Failed to fetch data: {response.status_code} - {response.text}") + return [] + + except Exception as e: + print(f"Error fetching swaps data: {e}") + return [] + +def get_pool_data(): + # Use the provided API key and endpoint + api_key = "73419c7a18a27c80dcea6b9416db18bd" + subgraph_url = f"https://gateway.thegraph.com/api/{api_key}/subgraphs/id/5zvR82QoaXYFyDEKLZ9t6v9adgnptxYpKpSbxtgVENFV" + + # Ethereum mainnet WBTC/USDC pool address (0.3% fee tier) + pool_address = "0x99ac8ca7087fa4a2a1fb6357269965a2014abc35" + + query = f""" + {{ + pool(id: "{pool_address}") {{ + id + liquidity + totalValueLockedETH + totalValueLockedToken0 + totalValueLockedToken1 + totalValueLockedUSD + volumeToken0 + volumeToken1 + volumeUSD + token0 {{ + symbol + decimals + name + }} + token1 {{ + symbol + decimals + name + }} + token0Price + token1Price + feeTier + tick + sqrtPrice + }} + }} + """ + + try: + response = requests.post(subgraph_url, json={'query': query}, timeout=10) + + if response.status_code == 200: + response_json = response.json() + + if 'errors' in response_json: + print(f"SubGraph errors: {response_json['errors']}") + return None + + if 'data' in response_json and 'pool' in response_json['data']: + pool_data = response_json['data']['pool'] + if pool_data: + print("Successfully fetched pool data") + return pool_data + else: + print("Pool not found") + return None + else: + print("No pool data in response") + return None + else: + print(f"Failed to fetch pool data: {response.status_code}") + return None + + except Exception as e: + print(f"Error fetching pool data: {e}") + return None + +def main(): + print("Testing WBTC/USDC SubGraph with provided API key...") + + # Test pool data + pool_data = get_pool_data() + if pool_data: + print("Pool Data:") + print(json.dumps(pool_data, indent=2)) + + # Test swaps data + swaps_data = get_swaps() + if swaps_data: + print(f"\nSwaps Data (showing first 3):") + for i, swap in enumerate(swaps_data[:3]): + print(f"Swap {i+1}: {json.dumps(swap, indent=2)}") + else: + print("Failed to fetch swaps data.") + +if __name__ == "__main__": + main() diff --git a/backend/Python/SubGraph/wbtc_usdc_subgraph.py b/backend/Python/SubGraph/wbtc_usdc_subgraph.py new file mode 100644 index 0000000..ab35a5c --- /dev/null +++ b/backend/Python/SubGraph/wbtc_usdc_subgraph.py @@ -0,0 +1,191 @@ +import requests +import json +import os + +def get_price_range(range_choice, current_price): + if range_choice == "narrow": + return current_price * 0.95, current_price * 1.05 + elif range_choice == "medium": + return current_price * 0.9, current_price * 1.1 + elif range_choice == "wide": + return current_price * 0.8, current_price * 1.2 + else: + return current_price * 0.9, current_price * 1.1 + +def get_swaps(): + # Use the provided API key and endpoint + api_key = "73419c7a18a27c80dcea6b9416db18bd" + subgraph_url = f"https://gateway.thegraph.com/api/{api_key}/subgraphs/id/5zvR82QoaXYFyDEKLZ9t6v9adgnptxYpKpSbxtgVENFV" + + # Ethereum mainnet WBTC/USDC pool address (0.05% fee tier) + pool_address = "0x99ac8ca7087fa4a2a1fb6357269965a2014abc35" + + query = f""" + {{ + swaps( + orderBy: timestamp, + orderDirection: desc, + first: 20, + where: {{ + pool: "{pool_address}" + }} + ) {{ + id + timestamp + amount0 + amount1 + amountUSD + tick + transaction {{ + id + }} + pool {{ + id + token0 {{ + symbol + decimals + }} + token1 {{ + symbol + decimals + }} + token0Price + token1Price + }} + }} + }} + """ + + try: + response = requests.post(subgraph_url, json={'query': query}, timeout=10) + + print(f"SubGraph Response Status: {response.status_code}") + + if response.status_code == 200: + response_json = response.json() + + if 'errors' in response_json: + print(f"SubGraph errors: {response_json['errors']}") + return [] + + if 'data' in response_json and 'swaps' in response_json['data']: + swaps = response_json['data']['swaps'] + print(f"Successfully fetched {len(swaps)} swaps") + return swaps + else: + print("No 'data' or 'swaps' in response") + return [] + else: + print(f"Failed to fetch data: {response.status_code} - {response.text}") + return [] + + except Exception as e: + print(f"Error fetching swaps data: {e}") + return [] + +def fetch_wbtc_usdc_data(): + """Main function expected by main.py - returns swaps data in expected format""" + try: + swaps = get_swaps() + if swaps: + return { + "swaps": swaps, + "pair": "WBTC/USDC", + "total_swaps": len(swaps) + } + else: + return { + "error": "Failed to fetch WBTC/USDC swaps data", + "swaps": [], + "total_swaps": 0 + } + except Exception as e: + return { + "error": f"Error in fetch_wbtc_usdc_data: {str(e)}", + "swaps": [], + "total_swaps": 0 + } + +def get_pool_data(): + # Use the provided API key and endpoint + api_key = "73419c7a18a27c80dcea6b9416db18bd" + subgraph_url = f"https://gateway.thegraph.com/api/{api_key}/subgraphs/id/5zvR82QoaXYFyDEKLZ9t6v9adgnptxYpKpSbxtgVENFV" + + # Ethereum mainnet WBTC/USDC pool address (0.05% fee tier) + pool_address = "0x99ac8ca7087fa4a2a1fb6357269965a2014abc35" + + query = f""" + {{ + pool(id: "{pool_address}") {{ + id + liquidity + totalValueLockedETH + totalValueLockedToken0 + totalValueLockedToken1 + totalValueLockedUSD + volumeToken0 + volumeToken1 + volumeUSD + token0 {{ + symbol + decimals + name + }} + token1 {{ + symbol + decimals + name + }} + token0Price + token1Price + feeTier + tick + sqrtPrice + }} + }} + """ + + try: + response = requests.post(subgraph_url, json={'query': query}, timeout=10) + + if response.status_code == 200: + response_json = response.json() + + if 'errors' in response_json: + print(f"SubGraph errors: {response_json['errors']}") + return None + + if 'data' in response_json and 'pool' in response_json['data']: + pool_data = response_json['data']['pool'] + if pool_data: + print("Successfully fetched pool data") + return pool_data + else: + print("Pool not found") + return None + else: + print("No pool data in response") + return None + else: + print(f"Failed to fetch pool data: {response.status_code}") + return None + + except Exception as e: + print(f"Error fetching pool data: {e}") + return None + +def main(): + print("Testing WBTC/USDC SubGraph with provided API key...") + + # Test the main fetch function + data = fetch_wbtc_usdc_data() + if "error" in data: + print(f"Error: {data['error']}") + else: + print(f"Successfully fetched {data['total_swaps']} swaps for {data['pair']}") + if data['swaps']: + print("Sample swap data:") + print(json.dumps(data['swaps'][0], indent=2)) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/backend/Python/SubGraph/weth_usdc.py b/backend/Python/SubGraph/weth_usdc.py new file mode 100644 index 0000000..1773c9a --- /dev/null +++ b/backend/Python/SubGraph/weth_usdc.py @@ -0,0 +1,173 @@ +import requests +import json +import os + +def get_price_range(range_choice, current_price): + if range_choice == "narrow": + return current_price * 0.95, current_price * 1.05 + elif range_choice == "medium": + return current_price * 0.9, current_price * 1.1 + elif range_choice == "wide": + return current_price * 0.8, current_price * 1.2 + else: + return current_price * 0.9, current_price * 1.1 + +def get_swaps(): + # Use the provided API key and endpoint + api_key = "73419c7a18a27c80dcea6b9416db18bd" + subgraph_url = f"https://gateway.thegraph.com/api/{api_key}/subgraphs/id/5zvR82QoaXYFyDEKLZ9t6v9adgnptxYpKpSbxtgVENFV" + + # Ethereum mainnet WETH/USDC pool address (0.05% fee tier) + pool_address = "0x88e6a0c2ddd26feeb64f039a2c41296fcb3f5640" + + query = f""" + {{ + swaps( + orderBy: timestamp, + orderDirection: desc, + first: 20, + where: {{ + pool: "{pool_address}" + }} + ) {{ + id + timestamp + amount0 + amount1 + amountUSD + tick + transaction {{ + id + }} + pool {{ + id + token0 {{ + symbol + decimals + }} + token1 {{ + symbol + decimals + }} + token0Price + token1Price + }} + }} + }} + """ + + try: + response = requests.post(subgraph_url, json={'query': query}, timeout=10) + + print(f"SubGraph Response Status: {response.status_code}") + + if response.status_code == 200: + response_json = response.json() + + if 'errors' in response_json: + print(f"SubGraph errors: {response_json['errors']}") + return [] + + if 'data' in response_json and 'swaps' in response_json['data']: + swaps = response_json['data']['swaps'] + print(f"Successfully fetched {len(swaps)} swaps") + return swaps + else: + print("No 'data' or 'swaps' in response") + return [] + else: + print(f"Failed to fetch data: {response.status_code} - {response.text}") + return [] + + except Exception as e: + print(f"Error fetching swaps data: {e}") + return [] + +def get_pool_data(): + # Use the provided API key and endpoint + api_key = "73419c7a18a27c80dcea6b9416db18bd" + subgraph_url = f"https://gateway.thegraph.com/api/{api_key}/subgraphs/id/5zvR82QoaXYFyDEKLZ9t6v9adgnptxYpKpSbxtgVENFV" + + # Ethereum mainnet WETH/USDC pool address (0.05% fee tier) + pool_address = "0x88e6a0c2ddd26feeb64f039a2c41296fcb3f5640" + + query = f""" + {{ + pool(id: "{pool_address}") {{ + id + liquidity + totalValueLockedETH + totalValueLockedToken0 + totalValueLockedToken1 + totalValueLockedUSD + volumeToken0 + volumeToken1 + volumeUSD + token0 {{ + symbol + decimals + name + }} + token1 {{ + symbol + decimals + name + }} + token0Price + token1Price + feeTier + tick + sqrtPrice + }} + }} + """ + + try: + response = requests.post(subgraph_url, json={'query': query}, timeout=10) + + if response.status_code == 200: + response_json = response.json() + + if 'errors' in response_json: + print(f"SubGraph errors: {response_json['errors']}") + return None + + if 'data' in response_json and 'pool' in response_json['data']: + pool_data = response_json['data']['pool'] + if pool_data: + print("Successfully fetched pool data") + return pool_data + else: + print("Pool not found") + return None + else: + print("No pool data in response") + return None + else: + print(f"Failed to fetch pool data: {response.status_code}") + return None + + except Exception as e: + print(f"Error fetching pool data: {e}") + return None + +def main(): + print("Testing WETH/USDC SubGraph with provided API key...") + + # Test pool data + pool_data = get_pool_data() + if pool_data: + print("Pool Data:") + print(json.dumps(pool_data, indent=2)) + + # Test swaps data + swaps_data = get_swaps() + if swaps_data: + print(f"\nSwaps Data (showing first 3):") + for i, swap in enumerate(swaps_data[:3]): + print(f"Swap {i+1}: {json.dumps(swap, indent=2)}") + else: + print("Failed to fetch swaps data.") + +if __name__ == "__main__": + main() diff --git a/backend/Python/SubGraph/weth_usdc_subgraph.py b/backend/Python/SubGraph/weth_usdc_subgraph.py new file mode 100644 index 0000000..9e470c2 --- /dev/null +++ b/backend/Python/SubGraph/weth_usdc_subgraph.py @@ -0,0 +1,191 @@ +import requests +import json +import os + +def get_price_range(range_choice, current_price): + if range_choice == "narrow": + return current_price * 0.95, current_price * 1.05 + elif range_choice == "medium": + return current_price * 0.9, current_price * 1.1 + elif range_choice == "wide": + return current_price * 0.8, current_price * 1.2 + else: + return current_price * 0.9, current_price * 1.1 + +def get_swaps(): + # Use the provided API key and endpoint + api_key = "73419c7a18a27c80dcea6b9416db18bd" + subgraph_url = f"https://gateway.thegraph.com/api/{api_key}/subgraphs/id/5zvR82QoaXYFyDEKLZ9t6v9adgnptxYpKpSbxtgVENFV" + + # Ethereum mainnet WETH/USDC pool address (0.05% fee tier) + pool_address = "0x88e6a0c2ddd26feeb64f039a2c41296fcb3f5640" + + query = f""" + {{ + swaps( + orderBy: timestamp, + orderDirection: desc, + first: 20, + where: {{ + pool: "{pool_address}" + }} + ) {{ + id + timestamp + amount0 + amount1 + amountUSD + tick + transaction {{ + id + }} + pool {{ + id + token0 {{ + symbol + decimals + }} + token1 {{ + symbol + decimals + }} + token0Price + token1Price + }} + }} + }} + """ + + try: + response = requests.post(subgraph_url, json={'query': query}, timeout=10) + + print(f"SubGraph Response Status: {response.status_code}") + + if response.status_code == 200: + response_json = response.json() + + if 'errors' in response_json: + print(f"SubGraph errors: {response_json['errors']}") + return [] + + if 'data' in response_json and 'swaps' in response_json['data']: + swaps = response_json['data']['swaps'] + print(f"Successfully fetched {len(swaps)} swaps") + return swaps + else: + print("No 'data' or 'swaps' in response") + return [] + else: + print(f"Failed to fetch data: {response.status_code} - {response.text}") + return [] + + except Exception as e: + print(f"Error fetching swaps data: {e}") + return [] + +def fetch_weth_usdc_data(): + """Main function expected by main.py - returns swaps data in expected format""" + try: + swaps = get_swaps() + if swaps: + return { + "swaps": swaps, + "pair": "WETH/USDC", + "total_swaps": len(swaps) + } + else: + return { + "error": "Failed to fetch WETH/USDC swaps data", + "swaps": [], + "total_swaps": 0 + } + except Exception as e: + return { + "error": f"Error in fetch_weth_usdc_data: {str(e)}", + "swaps": [], + "total_swaps": 0 + } + +def get_pool_data(): + # Use the provided API key and endpoint + api_key = "73419c7a18a27c80dcea6b9416db18bd" + subgraph_url = f"https://gateway.thegraph.com/api/{api_key}/subgraphs/id/5zvR82QoaXYFyDEKLZ9t6v9adgnptxYpKpSbxtgVENFV" + + # Ethereum mainnet WETH/USDC pool address (0.05% fee tier) + pool_address = "0x88e6a0c2ddd26feeb64f039a2c41296fcb3f5640" + + query = f""" + {{ + pool(id: "{pool_address}") {{ + id + liquidity + totalValueLockedETH + totalValueLockedToken0 + totalValueLockedToken1 + totalValueLockedUSD + volumeToken0 + volumeToken1 + volumeUSD + token0 {{ + symbol + decimals + name + }} + token1 {{ + symbol + decimals + name + }} + token0Price + token1Price + feeTier + tick + sqrtPrice + }} + }} + """ + + try: + response = requests.post(subgraph_url, json={'query': query}, timeout=10) + + if response.status_code == 200: + response_json = response.json() + + if 'errors' in response_json: + print(f"SubGraph errors: {response_json['errors']}") + return None + + if 'data' in response_json and 'pool' in response_json['data']: + pool_data = response_json['data']['pool'] + if pool_data: + print("Successfully fetched pool data") + return pool_data + else: + print("Pool not found") + return None + else: + print("No pool data in response") + return None + else: + print(f"Failed to fetch pool data: {response.status_code}") + return None + + except Exception as e: + print(f"Error fetching pool data: {e}") + return None + +def main(): + print("Testing WETH/USDC SubGraph with provided API key...") + + # Test the main fetch function + data = fetch_weth_usdc_data() + if "error" in data: + print(f"Error: {data['error']}") + else: + print(f"Successfully fetched {data['total_swaps']} swaps for {data['pair']}") + if data['swaps']: + print("Sample swap data:") + print(json.dumps(data['swaps'][0], indent=2)) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/backend/Python/main.py b/backend/Python/main.py new file mode 100644 index 0000000..9fbacb7 --- /dev/null +++ b/backend/Python/main.py @@ -0,0 +1,237 @@ +import subprocess +import time +import requests +from flask import Flask, jsonify, request +from flask_cors import CORS +import sys +import signal +import os + +app = Flask(__name__) +CORS(app) + +# Import algorithm functions directly for cloud deployment +sys.path.append(os.path.join(os.path.dirname(__file__), 'Algorithms')) +from RSI import calculate_rsi_with_signals +from MACD import calculate_macd_with_signals +from MA import calculate_ma_with_signals +from DCA import calculate_dca_with_signals + +sys.path.append(os.path.join(os.path.dirname(__file__), 'SubGraph')) +from weth_usdc_subgraph import fetch_weth_usdc_data +from wbtc_usdc_subgraph import fetch_wbtc_usdc_data +from dai_usdc_subgraph import fetch_dai_usdc_data + +# Algorithm mapping +ALGORITHM_MAP = { + "short_high": "RSI", + "long_high": "MACD", + "short_low": "MA", + "long_low": "DCA" +} + +ALGORITHM_FUNCTIONS = { + "RSI": calculate_rsi_with_signals, + "MACD": calculate_macd_with_signals, + "MA": calculate_ma_with_signals, + "DCA": calculate_dca_with_signals +} + +# Data fetching functions +DATA_FETCHERS = { + "weth_usdc": fetch_weth_usdc_data, + "wbtc_usdc": fetch_wbtc_usdc_data, + "dai_usdc": fetch_dai_usdc_data +} + +def get_formatted_data(pair): + """Get formatted price data for a trading pair""" + try: + fetcher = DATA_FETCHERS.get(pair) + if not fetcher: + return {"error": f"No data fetcher for pair: {pair}"} + + data = fetcher() + if "error" in data: + return data + + # Convert to float and sort by timestamp + prices = [] + for swap in data.get("swaps", []): + try: + if pair == "dai_usdc": + # For DAI/USDC, price is amount1 / amount0 (USDC per DAI) + price = float(swap["amount1"]) / float(swap["amount0"]) + else: + # For other pairs, price is amount0 / amount1 + price = float(swap["amount0"]) / abs(float(swap["amount1"])) + prices.append(price) + except (ValueError, ZeroDivisionError): + continue + + return {"prices": prices, "total_swaps": len(prices)} + + except Exception as e: + return {"error": f"Failed to fetch data for {pair}: {str(e)}"} + +def determine_confidence(algorithm, algo_data): + """Determine confidence level based on algorithm-specific metrics""" + try: + if algorithm == "RSI": + rsi_value = algo_data.get("latest_rsi", 50) + if rsi_value <= 20 or rsi_value >= 80: + return "HIGH" + elif rsi_value <= 35 or rsi_value >= 65: + return "MEDIUM" + else: + return "LOW" + + elif algorithm == "MACD": + histogram = algo_data.get("latest_histogram", 0) + if abs(histogram) > 0.1: + return "HIGH" + elif abs(histogram) > 0.05: + return "MEDIUM" + else: + return "LOW" + + elif algorithm == "MA": + short_ma = algo_data.get("latest_short_ma", 0) + long_ma = algo_data.get("latest_long_ma", 0) + if long_ma != 0: + diff_pct = abs((short_ma - long_ma) / long_ma) + if diff_pct > 0.02: + return "HIGH" + elif diff_pct > 0.01: + return "MEDIUM" + else: + return "LOW" + return "LOW" + + elif algorithm == "DCA": + return "MEDIUM" + + return "MEDIUM" + + except Exception: + return "MEDIUM" + +@app.route('/health', methods=['GET']) +def health_check(): + """Health check endpoint""" + return jsonify({ + "status": "healthy", + "algorithms": ALGORITHM_MAP, + "supported_pairs": list(DATA_FETCHERS.keys()) + }) + +@app.route('/pairs', methods=['GET']) +def get_pairs(): + """Get list of available trading pairs""" + return jsonify({ + "pairs": list(DATA_FETCHERS.keys()), + "algorithms": ALGORITHM_MAP, + "endpoints": { + "format": "/decisions/{pair}/{term}/{risk}" + } + }) + +@app.route('/decisions///', methods=['GET']) +def get_pair_decision_with_algorithm(pair, term, risk): + """ + Get algorithmic decision for a specific pair with term and risk parameters + + Parameters: + pair: Token pair (weth_usdc, wbtc_usdc, dai_usdc) + term: 'short' or 'long' + risk: 'high' or 'low' + + Routes to appropriate algorithm: + short + high = RSI + long + high = MACD + short + low = MA + long + low = DCA + """ + try: + # Validate parameters + if pair not in DATA_FETCHERS: + return jsonify({"error": f"Pair '{pair}' not supported. Available pairs: {list(DATA_FETCHERS.keys())}"}), 400 + + if term not in ['short', 'long']: + return jsonify({"error": "Term must be 'short' or 'long'"}), 400 + if risk not in ['high', 'low']: + return jsonify({"error": "Risk must be 'high' or 'low'"}), 400 + + # Get algorithm for this combination + combo_key = f"{term}_{risk}" + algorithm = ALGORITHM_MAP.get(combo_key) + + if not algorithm: + return jsonify({"error": f"No algorithm found for {term} term {risk} risk"}), 400 + + # Get formatted data + data = get_formatted_data(pair) + + if "error" in data: + return jsonify(data), 500 + + prices = data["prices"] + + if len(prices) < 14: + return jsonify({"error": f"Insufficient data for {algorithm} calculation. Got {len(prices)} prices, need at least 14"}), 400 + + # Calculate using the appropriate algorithm + algo_function = ALGORITHM_FUNCTIONS[algorithm] + algo_data = algo_function(prices) + + if "error" in algo_data: + return jsonify({"error": algo_data["error"]}), 500 + + # Get the latest signal + latest_signal = algo_data.get("latest_trading_signal") or algo_data.get("latest_signal", "HOLD") + + # Determine confidence level + confidence = determine_confidence(algorithm, algo_data) + + return jsonify({ + "pair": pair, + "algorithm": algorithm, + "term": term, + "risk": risk, + "decision": { + "signal": latest_signal, + "confidence": confidence + }, + "algorithm_data": algo_data, + "data_points": len(prices), + "timestamp": time.time() + }) + + except Exception as e: + return jsonify({"error": f"Calculation failed: {str(e)}"}), 500 + +# Legacy endpoints for backward compatibility +@app.route('/decisions//high', methods=['GET']) +def get_pair_decision_legacy(pair): + """Legacy endpoint - defaults to short term high risk (RSI)""" + return get_pair_decision_with_algorithm(pair, 'short', 'high') + +@app.route('/decisions/high', methods=['GET']) +def get_high_frequency_decision_legacy(): + """Original legacy endpoint - defaults to WETH/USDC short term high risk (RSI)""" + return get_pair_decision_with_algorithm('weth_usdc', 'short', 'high') + +if __name__ == '__main__': + # For local development, use port 5049 + # For cloud deployment, use environment PORT variable + port = int(os.environ.get('PORT', 5049)) + + print("🎯 Unified trading server starting...") + print(f"πŸ“Š Available pairs: {list(DATA_FETCHERS.keys())}") + print(f"🧠 Algorithm mapping: {ALGORITHM_MAP}") + print("πŸ”— Endpoints:") + print(" GET /decisions/{pair}/{term}/{risk} - Algorithm-specific decisions") + print(" GET /health - Server status") + print(" GET /pairs - Available pairs and algorithms") + + app.run(host='0.0.0.0', port=port, debug=False) diff --git a/backend/Python/servers/dai_usdc/server.py b/backend/Python/servers/dai_usdc/server.py new file mode 100644 index 0000000..d51319d --- /dev/null +++ b/backend/Python/servers/dai_usdc/server.py @@ -0,0 +1,276 @@ +from flask import Flask, jsonify, request +from flask_cors import CORS +import sys +import os + +# Add the parent directories to the path +current_dir = os.path.dirname(os.path.abspath(__file__)) +parent_dir = os.path.dirname(os.path.dirname(current_dir)) +sys.path.append(parent_dir) + +# Import the updated SubGraph and algorithms +from SubGraph.dai_usdc import get_swaps, get_pool_data +from Algorithms.RSI import calculate_rsi_with_signals +from Algorithms.MACD import calculate_macd_with_signals +from Algorithms.MA import calculate_ma_with_signals +from Algorithms.DCA import calculate_dca_with_signals + +app = Flask(__name__) +CORS(app) + +# Algorithm mapping based on risk/term combinations +ALGORITHM_MAP = { + "short_high": "RSI", # SHORT TERM HIGH RISK + "long_high": "MACD", # LONG TERM HIGH RISK + "short_low": "MA", # SHORT TERM LOW RISK + "long_low": "DCA" # LONG TERM LOW RISK +} + +ALGORITHM_FUNCTIONS = { + "RSI": calculate_rsi_with_signals, + "MACD": calculate_macd_with_signals, + "MA": calculate_ma_with_signals, + "DCA": calculate_dca_with_signals +} + +def extract_prices_from_swaps(swaps_data, pool_data): + """ + Extract prices from swap data for algorithm calculations. + For DAI/USDC, we want DAI price in USD (should be close to 1.0). + """ + prices = [] + + if not swaps_data or not pool_data: + return [] + + # Get token order from pool data + token0_symbol = pool_data.get('token0', {}).get('symbol', '') + token1_symbol = pool_data.get('token1', {}).get('symbol', '') + + print(f"Pool tokens: {token0_symbol}/{token1_symbol}") + + for swap in reversed(swaps_data): # Reverse to get chronological order + try: + # Extract actual swap price based on amounts + amount_usd = float(swap.get('amountUSD', 0)) + amount0 = float(swap.get('amount0', 0)) + amount1 = float(swap.get('amount1', 0)) + + price = None + + # For DAI/USDC pool, calculate DAI price from swap amounts + if token0_symbol == 'USDC' and token1_symbol == 'DAI': + # USDC is token0, DAI is token1 + if amount1 != 0: + # Price = USD amount / DAI amount + price = amount_usd / abs(amount1) + elif token0_symbol == 'DAI' and token1_symbol == 'USDC': + # DAI is token0, USDC is token1 + if amount0 != 0: + # Price = USD amount / DAI amount + price = amount_usd / abs(amount0) + + # Fallback: try to calculate from amounts ratio + if price is None or price <= 0: + if token0_symbol == 'USDC' and token1_symbol == 'DAI' and amount0 != 0 and amount1 != 0: + # USDC amount / DAI amount = DAI price in USDC + price = abs(amount0) / abs(amount1) + elif token0_symbol == 'DAI' and token1_symbol == 'USDC' and amount0 != 0 and amount1 != 0: + # USDC amount / DAI amount = DAI price in USDC + price = abs(amount1) / abs(amount0) + + if price and price > 0.5 and price < 2.0: # Sanity check for reasonable DAI price (should be ~$1) + prices.append(price) + print(f"Extracted price: ${price:.4f}") + + except (ValueError, KeyError, ZeroDivisionError) as e: + print(f"Error extracting price from swap: {e}") + continue + + return prices + +def get_formatted_data(): + """ + Fetch and format data for DAI/USDC pair + """ + try: + # Get swap data from the SubGraph + swaps_data = get_swaps() + pool_data = get_pool_data() + + if not swaps_data or not pool_data: + return {"error": "Failed to fetch data from SubGraph"} + + print(f"Fetched {len(swaps_data)} swaps and pool data") + + # Extract prices from swaps + prices = extract_prices_from_swaps(swaps_data, pool_data) + + if not prices: + return {"error": "No valid price data extracted"} + + return { + "pair": "DAI/USDC", + "pool_address": "0x5777d92f208679db4b9778590fa3cab3ac9e2168", + "prices": prices, + "swaps_count": len(swaps_data), + "pool_data": pool_data + } + + except Exception as e: + print(f"Error in get_formatted_data: {e}") + return {"error": str(e)} + +def determine_confidence(algorithm, result_data): + """ + Determine confidence level based on algorithm-specific metrics + """ + if algorithm == "RSI": + rsi_value = result_data.get("latest_rsi", 50) + if rsi_value < 30 or rsi_value > 70: + return "HIGH" + elif rsi_value < 40 or rsi_value > 60: + return "MEDIUM" + else: + return "LOW" + elif algorithm == "MACD": + # For MACD, high confidence when there's a clear crossover + macd = result_data.get("latest_macd", 0) + signal = result_data.get("latest_signal", 0) + diff = abs(macd - signal) + if diff > 0.1: + return "HIGH" + elif diff > 0.05: + return "MEDIUM" + else: + return "LOW" + elif algorithm == "MA": + # For MA, confidence based on the spread between averages + short_ma = result_data.get("latest_short_ma", 0) + long_ma = result_data.get("latest_long_ma", 0) + if long_ma > 0: + diff = abs(short_ma - long_ma) / long_ma + if diff > 0.01: + return "HIGH" + elif diff > 0.005: + return "MEDIUM" + return "LOW" + elif algorithm == "DCA": + # DCA always has medium confidence as it's a consistent strategy + return "MEDIUM" + + return "LOW" + +@app.route('/health', methods=['GET']) +def health_check(): + """Health check endpoint""" + return jsonify({"status": "healthy", "pair": "DAI/USDC"}) + +@app.route('/pool/info', methods=['GET']) +def pool_info(): + """Get pool information""" + pool_data = get_pool_data() + if pool_data: + return jsonify(pool_data) + else: + return jsonify({"error": "Failed to fetch pool data"}), 500 + +@app.route('/swaps/recent', methods=['GET']) +def recent_swaps(): + """Get recent swaps data""" + swaps_data = get_swaps() + if swaps_data: + return jsonify({"swaps": swaps_data}) + else: + return jsonify({"error": "Failed to fetch swaps data"}), 500 + +@app.route('/decisions//', methods=['GET']) +def get_algorithmic_decision(term, risk): + """ + Main endpoint for algorithmic decisions based on term and risk combinations + + Parameters: + term: 'short' or 'long' + risk: 'high' or 'low' + + Algorithm mapping: + short + high = RSI + long + high = MACD + short + low = MA + long + low = DCA + """ + try: + # Validate parameters + if term not in ['short', 'long']: + return jsonify({"error": "Term must be 'short' or 'long'"}), 400 + if risk not in ['high', 'low']: + return jsonify({"error": "Risk must be 'high' or 'low'"}), 400 + + # Get algorithm for this combination + combo_key = f"{term}_{risk}" + algorithm = ALGORITHM_MAP.get(combo_key) + + if not algorithm: + return jsonify({"error": f"No algorithm found for {term} term {risk} risk"}), 400 + + # Get formatted swap data + data = get_formatted_data() + + if "error" in data: + return jsonify(data), 500 + + prices = data["prices"] + + if len(prices) < 14: # Most algorithms need at least 14 data points + return jsonify({"error": f"Insufficient data for {algorithm} calculation. Got {len(prices)} prices, need at least 14"}), 400 + + # Calculate using the appropriate algorithm + algo_function = ALGORITHM_FUNCTIONS[algorithm] + algo_data = algo_function(prices) + + if "error" in algo_data: + return jsonify({"error": algo_data["error"]}), 500 + + # Get the latest signal - prioritize latest_trading_signal + latest_signal = algo_data.get("latest_trading_signal") or algo_data.get("latest_signal", "HOLD") + + # Determine confidence level + confidence = determine_confidence(algorithm, algo_data) + + response = { + "pair": "DAI/USDC", + "pool_address": data["pool_address"], + "algorithm": algorithm, + "term": term.upper(), + "risk": risk.upper(), + "decision": { + "signal": latest_signal, + "confidence": confidence, + "timestamp": int(data["pool_data"].get("tick", 0)) if data["pool_data"] else None + }, + "algorithm_data": algo_data, + "price_info": { + "latest_price": prices[-1] if prices else 0, + "price_count": len(prices), + "price_range": { + "min": min(prices) if prices else 0, + "max": max(prices) if prices else 0 + } + }, + "data_points": len(prices) + } + + return jsonify(response) + + except Exception as e: + print(f"Error in get_algorithmic_decision: {e}") + return jsonify({"error": str(e)}), 500 + +# Legacy endpoints for backward compatibility +@app.route('/decisions/high', methods=['GET']) +def get_high_frequency_decision(): + """Legacy endpoint - defaults to short term high risk (RSI)""" + return get_algorithmic_decision('short', 'high') + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=5052, debug=True) \ No newline at end of file diff --git a/backend/Python/servers/wbtc_usdc/server.py b/backend/Python/servers/wbtc_usdc/server.py new file mode 100644 index 0000000..90cead2 --- /dev/null +++ b/backend/Python/servers/wbtc_usdc/server.py @@ -0,0 +1,276 @@ +from flask import Flask, jsonify, request +from flask_cors import CORS +import sys +import os + +# Add the parent directories to the path +current_dir = os.path.dirname(os.path.abspath(__file__)) +parent_dir = os.path.dirname(os.path.dirname(current_dir)) +sys.path.append(parent_dir) + +# Import the updated SubGraph and algorithms +from SubGraph.wbtc_usdc import get_swaps, get_pool_data +from Algorithms.RSI import calculate_rsi_with_signals +from Algorithms.MACD import calculate_macd_with_signals +from Algorithms.MA import calculate_ma_with_signals +from Algorithms.DCA import calculate_dca_with_signals + +app = Flask(__name__) +CORS(app) + +# Algorithm mapping based on risk/term combinations +ALGORITHM_MAP = { + "short_high": "RSI", # SHORT TERM HIGH RISK + "long_high": "MACD", # LONG TERM HIGH RISK + "short_low": "MA", # SHORT TERM LOW RISK + "long_low": "DCA" # LONG TERM LOW RISK +} + +ALGORITHM_FUNCTIONS = { + "RSI": calculate_rsi_with_signals, + "MACD": calculate_macd_with_signals, + "MA": calculate_ma_with_signals, + "DCA": calculate_dca_with_signals +} + +def extract_prices_from_swaps(swaps_data, pool_data): + """ + Extract prices from swap data for algorithm calculations. + For WBTC/USDC, we want WBTC price in USD. + """ + prices = [] + + if not swaps_data or not pool_data: + return [] + + # Get token order from pool data + token0_symbol = pool_data.get('token0', {}).get('symbol', '') + token1_symbol = pool_data.get('token1', {}).get('symbol', '') + + print(f"Pool tokens: {token0_symbol}/{token1_symbol}") + + for swap in reversed(swaps_data): # Reverse to get chronological order + try: + # Extract actual swap price based on amounts + amount_usd = float(swap.get('amountUSD', 0)) + amount0 = float(swap.get('amount0', 0)) + amount1 = float(swap.get('amount1', 0)) + + price = None + + # For WBTC/USDC pool, calculate WBTC price from swap amounts + if token0_symbol == 'USDC' and token1_symbol == 'WBTC': + # USDC is token0, WBTC is token1 + if amount1 != 0: + # Price = USD amount / WBTC amount + price = amount_usd / abs(amount1) + elif token0_symbol == 'WBTC' and token1_symbol == 'USDC': + # WBTC is token0, USDC is token1 + if amount0 != 0: + # Price = USD amount / WBTC amount + price = amount_usd / abs(amount0) + + # Fallback: try to calculate from amounts ratio + if price is None or price <= 0: + if token0_symbol == 'USDC' and token1_symbol == 'WBTC' and amount0 != 0 and amount1 != 0: + # USDC amount / WBTC amount = WBTC price in USDC + price = abs(amount0) / abs(amount1) + elif token0_symbol == 'WBTC' and token1_symbol == 'USDC' and amount0 != 0 and amount1 != 0: + # USDC amount / WBTC amount = WBTC price in USDC + price = abs(amount1) / abs(amount0) + + if price and price > 0 and price < 1000000: # Sanity check for reasonable WBTC price + prices.append(price) + print(f"Extracted price: ${price:.2f}") + + except (ValueError, KeyError, ZeroDivisionError) as e: + print(f"Error extracting price from swap: {e}") + continue + + return prices + +def get_formatted_data(): + """ + Fetch and format data for WBTC/USDC pair + """ + try: + # Get swap data from the SubGraph + swaps_data = get_swaps() + pool_data = get_pool_data() + + if not swaps_data or not pool_data: + return {"error": "Failed to fetch data from SubGraph"} + + print(f"Fetched {len(swaps_data)} swaps and pool data") + + # Extract prices from swaps + prices = extract_prices_from_swaps(swaps_data, pool_data) + + if not prices: + return {"error": "No valid price data extracted"} + + return { + "pair": "WBTC/USDC", + "pool_address": "0x99ac8ca7087fa4a2a1fb6357269965a2014abc35", + "prices": prices, + "swaps_count": len(swaps_data), + "pool_data": pool_data + } + + except Exception as e: + print(f"Error in get_formatted_data: {e}") + return {"error": str(e)} + +def determine_confidence(algorithm, result_data): + """ + Determine confidence level based on algorithm-specific metrics + """ + if algorithm == "RSI": + rsi_value = result_data.get("latest_rsi", 50) + if rsi_value < 30 or rsi_value > 70: + return "HIGH" + elif rsi_value < 40 or rsi_value > 60: + return "MEDIUM" + else: + return "LOW" + elif algorithm == "MACD": + # For MACD, high confidence when there's a clear crossover + macd = result_data.get("latest_macd", 0) + signal = result_data.get("latest_signal", 0) + diff = abs(macd - signal) + if diff > 0.1: + return "HIGH" + elif diff > 0.05: + return "MEDIUM" + else: + return "LOW" + elif algorithm == "MA": + # For MA, confidence based on the spread between averages + short_ma = result_data.get("latest_short_ma", 0) + long_ma = result_data.get("latest_long_ma", 0) + if long_ma > 0: + diff = abs(short_ma - long_ma) / long_ma + if diff > 0.01: + return "HIGH" + elif diff > 0.005: + return "MEDIUM" + return "LOW" + elif algorithm == "DCA": + # DCA always has medium confidence as it's a consistent strategy + return "MEDIUM" + + return "LOW" + +@app.route('/health', methods=['GET']) +def health_check(): + """Health check endpoint""" + return jsonify({"status": "healthy", "pair": "WBTC/USDC"}) + +@app.route('/pool/info', methods=['GET']) +def pool_info(): + """Get pool information""" + pool_data = get_pool_data() + if pool_data: + return jsonify(pool_data) + else: + return jsonify({"error": "Failed to fetch pool data"}), 500 + +@app.route('/swaps/recent', methods=['GET']) +def recent_swaps(): + """Get recent swaps data""" + swaps_data = get_swaps() + if swaps_data: + return jsonify({"swaps": swaps_data}) + else: + return jsonify({"error": "Failed to fetch swaps data"}), 500 + +@app.route('/decisions//', methods=['GET']) +def get_algorithmic_decision(term, risk): + """ + Main endpoint for algorithmic decisions based on term and risk combinations + + Parameters: + term: 'short' or 'long' + risk: 'high' or 'low' + + Algorithm mapping: + short + high = RSI + long + high = MACD + short + low = MA + long + low = DCA + """ + try: + # Validate parameters + if term not in ['short', 'long']: + return jsonify({"error": "Term must be 'short' or 'long'"}), 400 + if risk not in ['high', 'low']: + return jsonify({"error": "Risk must be 'high' or 'low'"}), 400 + + # Get algorithm for this combination + combo_key = f"{term}_{risk}" + algorithm = ALGORITHM_MAP.get(combo_key) + + if not algorithm: + return jsonify({"error": f"No algorithm found for {term} term {risk} risk"}), 400 + + # Get formatted swap data + data = get_formatted_data() + + if "error" in data: + return jsonify(data), 500 + + prices = data["prices"] + + if len(prices) < 14: # Most algorithms need at least 14 data points + return jsonify({"error": f"Insufficient data for {algorithm} calculation. Got {len(prices)} prices, need at least 14"}), 400 + + # Calculate using the appropriate algorithm + algo_function = ALGORITHM_FUNCTIONS[algorithm] + algo_data = algo_function(prices) + + if "error" in algo_data: + return jsonify({"error": algo_data["error"]}), 500 + + # Get the latest signal - prioritize latest_trading_signal + latest_signal = algo_data.get("latest_trading_signal") or algo_data.get("latest_signal", "HOLD") + + # Determine confidence level + confidence = determine_confidence(algorithm, algo_data) + + response = { + "pair": "WBTC/USDC", + "pool_address": data["pool_address"], + "algorithm": algorithm, + "term": term.upper(), + "risk": risk.upper(), + "decision": { + "signal": latest_signal, + "confidence": confidence, + "timestamp": int(data["pool_data"].get("tick", 0)) if data["pool_data"] else None + }, + "algorithm_data": algo_data, + "price_info": { + "latest_price": prices[-1] if prices else 0, + "price_count": len(prices), + "price_range": { + "min": min(prices) if prices else 0, + "max": max(prices) if prices else 0 + } + }, + "data_points": len(prices) + } + + return jsonify(response) + + except Exception as e: + print(f"Error in get_algorithmic_decision: {e}") + return jsonify({"error": str(e)}), 500 + +# Legacy endpoints for backward compatibility +@app.route('/decisions/high', methods=['GET']) +def get_high_frequency_decision(): + """Legacy endpoint - defaults to short term high risk (RSI)""" + return get_algorithmic_decision('short', 'high') + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=5051, debug=True) \ No newline at end of file diff --git a/backend/Python/servers/weth_usdc/server.py b/backend/Python/servers/weth_usdc/server.py new file mode 100644 index 0000000..2c47e36 --- /dev/null +++ b/backend/Python/servers/weth_usdc/server.py @@ -0,0 +1,276 @@ +from flask import Flask, jsonify, request +from flask_cors import CORS +import sys +import os + +# Add the parent directories to the path +current_dir = os.path.dirname(os.path.abspath(__file__)) +parent_dir = os.path.dirname(os.path.dirname(current_dir)) +sys.path.append(parent_dir) + +# Import the updated SubGraph and algorithms +from SubGraph.weth_usdc import get_swaps, get_pool_data +from Algorithms.RSI import calculate_rsi_with_signals +from Algorithms.MACD import calculate_macd_with_signals +from Algorithms.MA import calculate_ma_with_signals +from Algorithms.DCA import calculate_dca_with_signals + +app = Flask(__name__) +CORS(app) + +# Algorithm mapping based on risk/term combinations +ALGORITHM_MAP = { + "short_high": "RSI", # SHORT TERM HIGH RISK + "long_high": "MACD", # LONG TERM HIGH RISK + "short_low": "MA", # SHORT TERM LOW RISK + "long_low": "DCA" # LONG TERM LOW RISK +} + +ALGORITHM_FUNCTIONS = { + "RSI": calculate_rsi_with_signals, + "MACD": calculate_macd_with_signals, + "MA": calculate_ma_with_signals, + "DCA": calculate_dca_with_signals +} + +def extract_prices_from_swaps(swaps_data, pool_data): + """ + Extract prices from swap data for algorithm calculations. + For WETH/USDC, we want WETH price in USD. + """ + prices = [] + + if not swaps_data or not pool_data: + return [] + + # Get token order from pool data + token0_symbol = pool_data.get('token0', {}).get('symbol', '') + token1_symbol = pool_data.get('token1', {}).get('symbol', '') + + print(f"Pool tokens: {token0_symbol}/{token1_symbol}") + + for swap in reversed(swaps_data): # Reverse to get chronological order + try: + # Extract actual swap price based on amounts + amount_usd = float(swap.get('amountUSD', 0)) + amount0 = float(swap.get('amount0', 0)) + amount1 = float(swap.get('amount1', 0)) + + price = None + + # For WETH/USDC pool, calculate WETH price from swap amounts + if token0_symbol == 'USDC' and token1_symbol == 'WETH': + # USDC is token0, WETH is token1 + if amount1 != 0: + # Price = USD amount / WETH amount + price = amount_usd / abs(amount1) + elif token0_symbol == 'WETH' and token1_symbol == 'USDC': + # WETH is token0, USDC is token1 + if amount0 != 0: + # Price = USD amount / WETH amount + price = amount_usd / abs(amount0) + + # Fallback: try to calculate from amounts ratio + if price is None or price <= 0: + if token0_symbol == 'USDC' and token1_symbol == 'WETH' and amount0 != 0 and amount1 != 0: + # USDC amount / WETH amount = WETH price in USDC + price = abs(amount0) / abs(amount1) + elif token0_symbol == 'WETH' and token1_symbol == 'USDC' and amount0 != 0 and amount1 != 0: + # USDC amount / WETH amount = WETH price in USDC + price = abs(amount1) / abs(amount0) + + if price and price > 0 and price < 1000000: # Sanity check for reasonable WETH price + prices.append(price) + print(f"Extracted price: ${price:.2f}") + + except (ValueError, KeyError, ZeroDivisionError) as e: + print(f"Error extracting price from swap: {e}") + continue + + return prices + +def get_formatted_data(): + """ + Fetch and format data for WETH/USDC pair + """ + try: + # Get swap data from the SubGraph + swaps_data = get_swaps() + pool_data = get_pool_data() + + if not swaps_data or not pool_data: + return {"error": "Failed to fetch data from SubGraph"} + + print(f"Fetched {len(swaps_data)} swaps and pool data") + + # Extract prices from swaps + prices = extract_prices_from_swaps(swaps_data, pool_data) + + if not prices: + return {"error": "No valid price data extracted"} + + return { + "pair": "WETH/USDC", + "pool_address": "0x88e6a0c2ddd26feeb64f039a2c41296fcb3f5640", + "prices": prices, + "swaps_count": len(swaps_data), + "pool_data": pool_data + } + + except Exception as e: + print(f"Error in get_formatted_data: {e}") + return {"error": str(e)} + +def determine_confidence(algorithm, result_data): + """ + Determine confidence level based on algorithm-specific metrics + """ + if algorithm == "RSI": + rsi_value = result_data.get("latest_rsi", 50) + if rsi_value < 30 or rsi_value > 70: + return "HIGH" + elif rsi_value < 40 or rsi_value > 60: + return "MEDIUM" + else: + return "LOW" + elif algorithm == "MACD": + # For MACD, high confidence when there's a clear crossover + macd = result_data.get("latest_macd", 0) + signal = result_data.get("latest_signal", 0) + diff = abs(macd - signal) + if diff > 0.1: + return "HIGH" + elif diff > 0.05: + return "MEDIUM" + else: + return "LOW" + elif algorithm == "MA": + # For MA, confidence based on the spread between averages + short_ma = result_data.get("latest_short_ma", 0) + long_ma = result_data.get("latest_long_ma", 0) + if long_ma > 0: + diff = abs(short_ma - long_ma) / long_ma + if diff > 0.01: + return "HIGH" + elif diff > 0.005: + return "MEDIUM" + return "LOW" + elif algorithm == "DCA": + # DCA always has medium confidence as it's a consistent strategy + return "MEDIUM" + + return "LOW" + +@app.route('/health', methods=['GET']) +def health_check(): + """Health check endpoint""" + return jsonify({"status": "healthy", "pair": "WETH/USDC"}) + +@app.route('/pool/info', methods=['GET']) +def pool_info(): + """Get pool information""" + pool_data = get_pool_data() + if pool_data: + return jsonify(pool_data) + else: + return jsonify({"error": "Failed to fetch pool data"}), 500 + +@app.route('/swaps/recent', methods=['GET']) +def recent_swaps(): + """Get recent swaps data""" + swaps_data = get_swaps() + if swaps_data: + return jsonify({"swaps": swaps_data}) + else: + return jsonify({"error": "Failed to fetch swaps data"}), 500 + +@app.route('/decisions//', methods=['GET']) +def get_algorithmic_decision(term, risk): + """ + Main endpoint for algorithmic decisions based on term and risk combinations + + Parameters: + term: 'short' or 'long' + risk: 'high' or 'low' + + Algorithm mapping: + short + high = RSI + long + high = MACD + short + low = MA + long + low = DCA + """ + try: + # Validate parameters + if term not in ['short', 'long']: + return jsonify({"error": "Term must be 'short' or 'long'"}), 400 + if risk not in ['high', 'low']: + return jsonify({"error": "Risk must be 'high' or 'low'"}), 400 + + # Get algorithm for this combination + combo_key = f"{term}_{risk}" + algorithm = ALGORITHM_MAP.get(combo_key) + + if not algorithm: + return jsonify({"error": f"No algorithm found for {term} term {risk} risk"}), 400 + + # Get formatted swap data + data = get_formatted_data() + + if "error" in data: + return jsonify(data), 500 + + prices = data["prices"] + + if len(prices) < 14: # Most algorithms need at least 14 data points + return jsonify({"error": f"Insufficient data for {algorithm} calculation. Got {len(prices)} prices, need at least 14"}), 400 + + # Calculate using the appropriate algorithm + algo_function = ALGORITHM_FUNCTIONS[algorithm] + algo_data = algo_function(prices) + + if "error" in algo_data: + return jsonify({"error": algo_data["error"]}), 500 + + # Get the latest signal - prioritize latest_trading_signal + latest_signal = algo_data.get("latest_trading_signal") or algo_data.get("latest_signal", "HOLD") + + # Determine confidence level + confidence = determine_confidence(algorithm, algo_data) + + response = { + "pair": "WETH/USDC", + "pool_address": data["pool_address"], + "algorithm": algorithm, + "term": term.upper(), + "risk": risk.upper(), + "decision": { + "signal": latest_signal, + "confidence": confidence, + "timestamp": int(data["pool_data"].get("tick", 0)) if data["pool_data"] else None + }, + "algorithm_data": algo_data, + "price_info": { + "latest_price": prices[-1] if prices else 0, + "price_count": len(prices), + "price_range": { + "min": min(prices) if prices else 0, + "max": max(prices) if prices else 0 + } + }, + "data_points": len(prices) + } + + return jsonify(response) + + except Exception as e: + print(f"Error in get_algorithmic_decision: {e}") + return jsonify({"error": str(e)}), 500 + +# Legacy endpoints for backward compatibility +@app.route('/decisions/high', methods=['GET']) +def get_high_frequency_decision(): + """Legacy endpoint - defaults to short term high risk (RSI)""" + return get_algorithmic_decision('short', 'high') + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=5050, debug=True) \ No newline at end of file diff --git a/backend/agent.js b/backend/agent.js deleted file mode 100644 index b58e93b..0000000 --- a/backend/agent.js +++ /dev/null @@ -1,58 +0,0 @@ -import dotenv from "dotenv"; -dotenv.config(); - -import { SYSTEM_PROMPT } from "./config/prompt.js"; -import { createPublicClient, createWalletClient, http } from "viem"; -import { generatePrivateKey, privateKeyToAccount } from "viem/accounts"; -import { mainnet } from "viem/chains"; -import { createNaniTools } from "./tools/index.js"; -import { openai } from "@ai-sdk/openai"; -import {createOpenAI as createGroq} from '@ai-sdk/openai' -import { generateText } from "ai"; - -const groq = createGroq({ - baseURL: 'https://api.groq.com/openai/v1', - apiKey: process.env.GROQ_API_KEY, -}); - -let PRIVATE_KEY = process.env.PRIVATE_KEY; -console.log("Private Key:", PRIVATE_KEY); -if (!PRIVATE_KEY) { - PRIVATE_KEY = generatePrivateKey(); - console.log("Generated Private Key:", PRIVATE_KEY); -} -const account = privateKeyToAccount(PRIVATE_KEY); -console.log("Agent Address: ", account.address); -const walletClient = createWalletClient({ - account, - chain: mainnet, //change to eth - transport: http(), -}); -const publicClient = createPublicClient({ - chain: mainnet, - transport: http(`https://rpc.ankr.com/eth/${process.env.ANKR_API_KEY}`), -}); -const tools = createNaniTools({ - account, - walletClient, - publicClient, -}); - -const { text } = await generateText({ - model: groq('llama3-8b-8192'), - maxSteps: 10, - system: SYSTEM_PROMPT, - tools, - prompt: - "i have some tokens give me insights on trading them i dont have a high risk apetite so kepe that in mind", - onStepFinish({ text, toolCalls, toolResults, finishReason, usage }) { - if (toolCalls[0]?.toolName) { - console.log(`[${toolCalls[0].toolName}]`, toolResults[0]?.result); - } - }, -}); -console.log("Output:", text); -console.log("typeof:", typeof text); -let response = text + " uniswap"; -console.log("response:", response); -console.log("typeof:", typeof response); diff --git a/backend/config/prompt.js b/backend/config/prompt.js index 85f2bd8..9a9cd2d 100644 --- a/backend/config/prompt.js +++ b/backend/config/prompt.js @@ -1,64 +1,158 @@ -export const SYSTEM_PROMPT = ` -You are an autonomous trading agent in a SIMULATED development environment on the Ethereum Mainnet. Your core directive is to interpret trading requests, extract necessary details, and analyze liquidity pool prices. +export const SEND_SWAP_PROMPT = `You are an intent parser that only understands two actionsβ€”sending tokens and swapping tokensβ€”and must always output exactly one JSON object with a single key, "command", whose value is the DSL string. + +Types you will see: +β€’ amount / amountIn: a positive decimal (e.g. "0.1", "100") or the literal "all" +β€’ token / tokenIn / tokenOut: either a known symbol (e.g. "eth", "usdc", "dai") or a 0x-prefixed 42-byte address +β€’ recipient: a 0x-prefixed 42-byte address + +Rules: +1. If the user wants to send tokens, output: + send +2. If the user wants to swap tokens, output one of: + swap for + or (with custom receiver) + swap for to +3. Never output anything elseβ€”no explanation, no markdown, no extra fields, just: + { "command": "…" } + +Examples: +User: "Please send 50 USDC to 0xAbC1234567890abcdef1234567890ABCDef1234" +Output: +{"command":"send 50 usdc 0xAbC1234567890abcdef1234567890ABCDef1234"} + +User: "Swap 0.5 weth for dai" +Output: +{"command":"swap 0.5 weth for dai"} + +Now parse the next input and return the JSON only.` + +export const DEFI_AAVE_PROMPT = `You are a DeFi assistant that specializes in Aave protocol interactions. You understand four main operations: deposit, borrow, repay, and withdraw. + +You must always output exactly one JSON object with either: +- A "command" key containing the operation to execute +- A "message" key for informational responses + +Types you will see: +β€’ amount: a positive decimal (e.g. "0.1", "100") or the literal "all" +β€’ asset: either a token symbol (e.g. "eth", "usdc", "dai", "wbtc") or a 0x-prefixed address +β€’ interestRateMode: "1" for stable rate, "2" for variable rate (default to "2" if not specified) + +Available Commands: +1. **Deposit**: Lock collateral in Aave + Format: deposit + +2. **Borrow**: Borrow against collateral + Format: borrow + +3. **Repay**: Pay back borrowed amount + Format: repay + +4. **Withdraw**: Remove collateral from Aave + Format: withdraw + +Rules: +1. For deposit operations: {"command":"deposit "} +2. For borrow operations: {"command":"borrow "} +3. For repay operations: {"command":"repay "} +4. For withdraw operations: {"command":"withdraw "} +5. For general questions or explanations: {"message":"your explanation here"} +6. If unclear or invalid request: {"message":"Please specify a valid Aave operation: deposit, borrow, repay, or withdraw"} + +Examples: +User: "I want to deposit 100 USDC as collateral" +Output: {"command":"deposit 100 usdc"} + +User: "Borrow 0.5 ETH with variable rate" +Output: {"command":"borrow 0.5 eth 2"} + +User: "Repay 50 DAI" +Output: {"command":"repay 50 dai 2"} + +User: "Withdraw all my WBTC" +Output: {"command":"withdraw all wbtc"} + +User: "What is Aave?" +Output: {"message":"Aave is a decentralized lending protocol where you can deposit collateral to earn interest and borrow assets against your collateral. You can deposit, borrow, repay loans, and withdraw your collateral."} + +User: "How does borrowing work?" +Output: {"message":"To borrow on Aave, you first need to deposit collateral. Then you can borrow up to a certain percentage of your collateral value. You'll pay interest on borrowed amounts and must maintain a healthy collateral ratio to avoid liquidation."} + +Now parse the next input and return the JSON only.` + +export const TRADING_PROMPT = `You are an AI-powered quantitative trading assistant specializing in cryptocurrency trading strategies. You have access to sophisticated algorithms and real-time market data to provide trading signals and analysis. + +You must always output exactly one JSON object with either: +- A "command" key containing the trading operation to execute +- A "message" key for informational responses +- A "analysis" key for market analysis requests + +Available Trading Pairs: +β€’ WETH/USDC (weth_usdc) +β€’ WBTC/USDC (wbtc_usdc) +β€’ DAI/USDC (dai_usdc) + +Available Algorithms: +β€’ RSI (Relative Strength Index) - Short-term high-risk strategy +β€’ MACD (Moving Average Convergence Divergence) - Long-term high-risk strategy +β€’ MA (Moving Averages) - Short-term low-risk strategy +β€’ DCA (Dollar Cost Averaging) - Long-term low-risk strategy + +Available Commands: +1. **Get Trading Signal**: Get algorithmic trading recommendations + Format: signal + - pair: weth_usdc, wbtc_usdc, dai_usdc + - term: short, long + - risk: high, low + +2. **Execute Trade**: Execute a trading decision + Format: trade + - action: BUY, SELL, HOLD + - token: WETH, WBTC, DAI + - amount: decimal amount or "all" + +3. **Portfolio Analysis**: Analyze current portfolio + Format: analyze portfolio + +4. **Market Analysis**: Get market insights for a specific pair + Format: analyze + +Algorithm Mapping: +- short + high = RSI (best for quick scalps, high volatility) +- long + high = MACD (best for trend following, momentum plays) +- short + low = MA (best for safer short-term trades) +- long + low = DCA (best for consistent accumulation) + +Rules: +1. For trading signals: {"command":"signal "} +2. For trade execution: {"command":"trade "} +3. For portfolio analysis: {"command":"analyze portfolio"} +4. For market analysis: {"command":"analyze "} +5. For educational content: {"message":"your explanation"} +6. For strategy recommendations: {"message":"strategy explanation with specific algorithm recommendations"} + +Examples: +User: "What's the current signal for WETH/USDC using RSI?" +Output: {"command":"signal weth_usdc short high"} + +User: "I want a long-term low-risk strategy for Bitcoin" +Output: {"command":"signal wbtc_usdc long low"} + +User: "Buy 0.1 WETH" +Output: {"command":"trade BUY WETH 0.1"} + +User: "Analyze my portfolio" +Output: {"command":"analyze portfolio"} + +User: "What's the market looking like for DAI/USDC?" +Output: {"command":"analyze dai_usdc"} + +User: "What trading strategies do you offer?" +Output: {"message":"I offer 4 sophisticated algorithmic trading strategies: 1) RSI for short-term high-risk scalping, 2) MACD for long-term high-risk trend following, 3) Moving Averages for short-term low-risk trades, and 4) DCA for long-term low-risk accumulation. Each algorithm analyzes real-time market data to provide precise entry/exit signals."} + +User: "How does RSI work?" +Output: {"message":"RSI (Relative Strength Index) measures momentum by comparing recent gains to losses. Values above 70 indicate overbought conditions (potential sell signal), while values below 30 indicate oversold conditions (potential buy signal). Our RSI strategy uses a 5-period window for quick scalping opportunities, ideal for short-term high-risk trading."} + +User: "Should I buy WETH now?" +Output: {"command":"signal weth_usdc short high"} -PRIMARY OBJECTIVE: Extract and output only the relevant information. - -You have access to these tools: -- getLiquidityPoolPrice: Fetches liquidity pool price using Moralis from the pool address from getPoolData. πŸ“ˆ -- getBalance: Sees the balances of the tokens which the user has. πŸ’Ό - -Your task: -1. **Extract and output the following three keys** in format based on the user's query: - - token-0: The name of the token the user has and wants to trade (e.g., ETH, BTC, DAI, SOL). **Only the name, nothing else.** - - token-1: The name of the token the user wants to trade for (e.g., ETH, BTC, DAI, SOL). **Only the name, nothing else.** - - amount: The amount of "token-0" the user wants to trade. **Only the number, nothing else.** - -2. **Analyze the liquidity pool data** for the following two pools: - - **First token pair**: 0x231B7589426Ffe1b75405526fC32aC09D44364c4 (WBTC/DAI) - - **Second token pair**: 0xa43fe16908251ee70ef74718545e4fe6c5ccec9f (PEPE/WETH) - - Fetch the liquidity pool stats for both token pairs using the "getLiquidityPoolPrice" tool. - -3. **Compare the liquidity pool data**: - - You will receive a JSON response for each pool containing details like pool price, volume, liquidity, market cap, price change, and other metrics. - - **Based on the data** from both pools, output insights for each pool: - - Whether the pool is trading at a good price. - - Insights on price trends, liquidity, and market activity. - - Future predictions or recommendations based on the data. - -4. **Provide a recommendation** on which liquidity pool is better to trade based on the stats: - - Compare the price trends, liquidity, market cap, and price change. - - Choose the pool with better liquidity, more stable pricing, and higher market activity for trading. - - -**Note**: -- Do not include the insights or recommendations in the output. -- The only relevant information in the response should be in format with the token-0, token-1, and amount. - -Example query: -"Give me trading insights." - -**Output format**: -- First, extract the trade details: - - **token-0**, **token-1**, and **amount** from the user's query. - -- Then, output **only the trade details** - - -Output EXACTLY in format: -"{token-0} {token-1} {amount}" - -The ouput should be a String but without the quotes - -Replace the placeholders with the extracted values. - -but if the user specified pool does not align with any of the above specified pools return "the pool specified is not avaliable" - -where - - * token-0: Source token (UPPERCASE, token symbol only) - * token-1: Target token (UPPERCASE, token symbol only) - * amount: See the amount using the getBalance tool after seeing the trading tokens available . It should be the Numeric trading quantity (raw value, /1e18 normalized) - - -`; +Now parse the next input and return the JSON only.` \ No newline at end of file diff --git a/backend/package-lock.json b/backend/package-lock.json index aaafe3c..c310512 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -8,6 +8,7 @@ "name": "sepolia-trading-bot", "version": "1.0.0", "dependencies": { + "@ai-sdk/groq": "^1.2.9", "@ai-sdk/openai": "^1.1.1", "@ankr.com/ankr.js": "0.5.2", "@openrouter/ai-sdk-provider": "0.0.6", @@ -15,10 +16,13 @@ "axios": "^1.7.9", "cors": "^2.8.5", "dotenv": "^16.1.4", + "ethers": "^6.13.5", "express": "^4.21.2", "groq-sdk": "^0.12.0", "moralis": "^2.27.2", + "nodemon": "^3.1.9", "openai": "^4.80.0", + "python-shell": "^5.0.0", "tsconfig-paths": "^4.2.0", "viem": "2.21.53" }, @@ -32,6 +36,48 @@ "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.0.tgz", "integrity": "sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==" }, + "node_modules/@ai-sdk/groq": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@ai-sdk/groq/-/groq-1.2.9.tgz", + "integrity": "sha512-7MoDaxm8yWtiRbD1LipYZG0kBl+Xe0sv/EeyxnHnGPZappXdlgtdOgTZVjjXkT3nWP30jjZi9A45zoVrBMb3Xg==", + "dependencies": { + "@ai-sdk/provider": "1.1.3", + "@ai-sdk/provider-utils": "2.2.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.0.0" + } + }, + "node_modules/@ai-sdk/groq/node_modules/@ai-sdk/provider": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.1.3.tgz", + "integrity": "sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==", + "dependencies": { + "json-schema": "^0.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ai-sdk/groq/node_modules/@ai-sdk/provider-utils": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.2.8.tgz", + "integrity": "sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==", + "dependencies": { + "@ai-sdk/provider": "1.1.3", + "nanoid": "^3.3.8", + "secure-json-parse": "^2.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "zod": "^3.23.8" + } + }, "node_modules/@ai-sdk/openai": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-1.1.1.tgz", @@ -1052,6 +1098,11 @@ "node": ">= 0.6" } }, + "node_modules/aes-js": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" + }, "node_modules/agentkeepalive": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", @@ -1133,6 +1184,18 @@ "node": ">=18.0.0" } }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -1153,6 +1216,11 @@ "proxy-from-env": "^1.1.0" } }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, "node_modules/base-x": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", @@ -1177,6 +1245,17 @@ } ] }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/blakejs": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", @@ -1210,6 +1289,26 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", @@ -1336,6 +1435,29 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, "node_modules/cipher-base": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.6.tgz", @@ -1359,6 +1481,11 @@ "node": ">= 0.8" } }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -1620,6 +1747,93 @@ "node": ">=10.0.0" } }, + "node_modules/ethers": { + "version": "6.13.5", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.5.tgz", + "integrity": "sha512-+knKNieu5EKRThQJWwqaJ10a6HE9sSehGeqWN65//wE7j47ZpFhKAnHB/JJFibwwg61I/koxaPsXbXpD/skNOQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@adraffy/ens-normalize": "1.10.1", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@types/node": "22.7.5", + "aes-js": "4.0.0-beta.5", + "tslib": "2.7.0", + "ws": "8.17.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/ethers/node_modules/@adraffy/ens-normalize": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", + "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==" + }, + "node_modules/ethers/node_modules/@noble/curves": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "dependencies": { + "@noble/hashes": "1.3.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ethers/node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ethers/node_modules/@types/node": { + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", + "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/ethers/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" + }, + "node_modules/ethers/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/ethjs-unit": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", @@ -1713,6 +1927,17 @@ "url": "https://opencollective.com/express" } }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/finalhandler": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", @@ -1795,6 +2020,19 @@ "node": ">= 0.6" } }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -1838,6 +2076,17 @@ "node": ">= 0.4" } }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -1876,6 +2125,14 @@ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", @@ -1983,6 +2240,11 @@ } ] }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -1996,6 +2258,36 @@ "node": ">= 0.10" } }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-hex-prefixed": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", @@ -2005,6 +2297,14 @@ "npm": ">=3" } }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/isows": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.6.tgz", @@ -2157,6 +2457,17 @@ "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", @@ -2267,6 +2578,57 @@ "node-gyp-build-test": "build-test.js" } }, + "node_modules/nodemon": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.9.tgz", + "integrity": "sha512-hdr1oIb2p6ZSxu3PB2JWWYS7ZQ0qvaZsc3hK8DR8f02kRzc8rjYmxAIvdz+aYC+8F2IjNaB7HMcSDg8nQpJxyg==", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/number-to-bn": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", @@ -2413,6 +2775,17 @@ "node": ">=0.12" } }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -2430,6 +2803,19 @@ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" + }, + "node_modules/python-shell": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/python-shell/-/python-shell-5.0.0.tgz", + "integrity": "sha512-RUOOOjHLhgR1MIQrCtnEqz/HJ1RMZBIN+REnpSUrfft2bXqXy69fwJASVziWExfFXsR1bCY0TznnHooNsCo0/w==", + "engines": { + "node": ">=0.10" + } + }, "node_modules/qs": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", @@ -2496,6 +2882,17 @@ "node": ">= 6" } }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/ripemd160": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", @@ -2588,6 +2985,17 @@ "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==" }, + "node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/send": { "version": "0.19.0", "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", @@ -2723,6 +3131,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -2759,6 +3178,17 @@ "npm": ">=3" } }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/swr": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.0.tgz", @@ -2782,6 +3212,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -2790,6 +3231,14 @@ "node": ">=0.6" } }, + "node_modules/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -2808,6 +3257,11 @@ "node": ">=6" } }, + "node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" + }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -2833,6 +3287,11 @@ "node": ">=14.17" } }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" + }, "node_modules/undici-types": { "version": "6.20.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", diff --git a/backend/package.json b/backend/package.json index eee5135..2a1b0fa 100644 --- a/backend/package.json +++ b/backend/package.json @@ -4,6 +4,7 @@ "description": "A trading bot for the Sepolia testnet using Alchemy and 0x APIs.", "type": "module", "dependencies": { + "@ai-sdk/groq": "^1.2.9", "@ai-sdk/openai": "^1.1.1", "@ankr.com/ankr.js": "0.5.2", "@openrouter/ai-sdk-provider": "0.0.6", @@ -11,10 +12,13 @@ "axios": "^1.7.9", "cors": "^2.8.5", "dotenv": "^16.1.4", + "ethers": "^6.13.5", "express": "^4.21.2", "groq-sdk": "^0.12.0", "moralis": "^2.27.2", + "nodemon": "^3.1.9", "openai": "^4.80.0", + "python-shell": "^5.0.0", "tsconfig-paths": "^4.2.0", "viem": "2.21.53" }, diff --git a/backend/server.js b/backend/server.js index cd17ac1..52c4e6d 100644 --- a/backend/server.js +++ b/backend/server.js @@ -3,89 +3,224 @@ dotenv.config(); import express from "express"; import cors from "cors"; -import { SYSTEM_PROMPT } from "./config/prompt.js"; -import { createPublicClient, createWalletClient, http } from "viem"; -import { generatePrivateKey, privateKeyToAccount } from "viem/accounts"; -import { mainnet } from "viem/chains"; -import { createNaniTools } from "./tools/index.js"; -import { openai } from "@ai-sdk/openai"; +import { SEND_SWAP_PROMPT, DEFI_AAVE_PROMPT, TRADING_PROMPT } from "./config/prompt.js"; +import { createFoundryUpTools } from "./tools/index.js"; import { generateText } from "ai"; -import { createOpenAI as createGroq } from '@ai-sdk/openai'; +import { groq } from '@ai-sdk/groq'; const app = express(); -const PORT = process.env.PORT || 5000; +const PORT = process.env.PORT || 5001; + +// CORS configuration - allow all origins for development, specific origins for production +const corsOptions = { + origin: function (origin, callback) { + // Allow requests with no origin (mobile apps, Postman, etc.) + if (!origin) return callback(null, true); + + // Allow localhost for development + if (origin.includes('localhost') || origin.includes('127.0.0.1')) { + return callback(null, true); + } + + // Allow Vercel domains + if (origin.includes('vercel.app')) { + return callback(null, true); + } + + // Allow any origin for now (you can restrict this later) + return callback(null, true); + }, + credentials: true, + methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], + allowedHeaders: ['Content-Type', 'Authorization', 'Accept', 'Origin'] +}; // Middleware -app.use(cors()); // Enable CORS for frontend communication +app.use(cors(corsOptions)); // Enable CORS with specific configuration app.use(express.json()); // Parse JSON request bodies -// Initialize wallet and tools -let PRIVATE_KEY = process.env.PRIVATE_KEY; -if (!PRIVATE_KEY) { - PRIVATE_KEY = generatePrivateKey(); - console.log("Generated Private Key:", PRIVATE_KEY); -} -const account = privateKeyToAccount(PRIVATE_KEY); -console.log("Agent Address: ", account.address); - -const walletClient = createWalletClient({ - account, - chain: mainnet, // Change to Ethereum mainnet - transport: http(), +app.get("/health", (req, res) => { + res.send("Server is running successfully..."); }); -const publicClient = createPublicClient({ - chain: mainnet, - transport: http(`https://rpc.ankr.com/eth/${process.env.ANKR_API_KEY}`), -}); +// New API endpoint for general AI chat without tools +app.post("/api/generalchat", async (req, res) => { + try { + const { prompt } = req.body; + + if (!prompt) { + return res.status(400).json({ error: "Prompt is required" }); + } + + const { text } = await generateText({ + model: groq("llama3-70b-8192"), + maxSteps: 10, + system: SEND_SWAP_PROMPT, + prompt, + }); -const tools = createNaniTools({ - account, - walletClient, - publicClient, + console.log("General Chat Output:", text); + res.json({ response: text }); + } catch (error) { + console.error("Error generating general chat response:", error); + res.status(500).json({ error: "Failed to generate response" }); + } }); -// API endpoint to handle requests from the frontend -app.post("/api/generate-insights", async (req, res) => { +// New API endpoint for DeFi chat with Aave protocol +app.post("/api/defichat", async (req, res) => { try { - const { prompt } = req.body; // Get the prompt from the frontend + const { prompt, balances, account } = req.body; if (!prompt) { return res.status(400).json({ error: "Prompt is required" }); } - const groq = createGroq({ - baseURL: "https://api.groq.com/openai/v1", - apiKey: process.env.GROQ_API_KEY, + + const { text } = await generateText({ + model: groq("llama3-70b-8192"), + maxSteps: 10, + system: DEFI_AAVE_PROMPT, + prompt: `User account: ${account}\nUser balances: ${JSON.stringify(balances)}\nUser request: ${prompt}`, }); + console.log("DeFi Chat Output:", text); + res.json({ response: text }); + } catch (error) { + console.error("Error generating DeFi chat response:", error); + res.status(500).json({ error: "Failed to generate DeFi response" }); + } +}); + +// New API endpoint for Trading chat with algorithmic analysis +app.post("/api/tradingchat", async (req, res) => { + try { + const { prompt, balances, account } = req.body; + + if (!prompt) { + return res.status(400).json({ error: "Prompt is required" }); + } + const { text } = await generateText({ model: groq("llama3-70b-8192"), maxSteps: 10, - system: SYSTEM_PROMPT, - tools, - prompt: - "i have some tokens give me insights on trading them i dont have a high risk apetite so kepe that in mind", - onStepFinish({ text, toolCalls, toolResults, finishReason, usage }) { - if (toolCalls[0]?.toolName) { - console.log(`[${toolCalls[0].toolName}]`, toolResults[0]?.result); - } - }, + system: TRADING_PROMPT, + prompt: `User account: ${account}\nUser balances: ${JSON.stringify(balances)}\nUser request: ${prompt}`, }); - console.log("Output:", text); - let response = text + " uniswap"; // Modify the response as needed - console.log("Response:", response); + console.log("Trading Chat Output:", text); + + // Parse the AI response + let responseObj; + try { + responseObj = JSON.parse(text); + } catch (parseError) { + console.error("Error parsing AI response:", parseError); + return res.status(500).json({ error: "Invalid response format from AI" }); + } + + // If it's a command that needs to interact with Python backend + if (responseObj.command) { + const command = responseObj.command; + console.log("Processing trading command:", command); - // Send the response back to the frontend - res.json({ response }); + // Handle signal commands - fetch from Python backend + if (command.startsWith('signal ')) { + const parts = command.split(' '); + if (parts.length === 4) { + const [, pair, term, risk] = parts; + try { + // Use environment variable for Python backend URL with proper fallback + const PYTHON_BACKEND_URL = process.env.PYTHON_BACKEND_URL || process.env.REACT_APP_PYTHON_BACKEND_URL || 'http://localhost:5049'; + + console.log("Using Python backend URL:", PYTHON_BACKEND_URL); + + // Fetch signal from Python backend using unified endpoint + const pythonResponse = await fetch(`${PYTHON_BACKEND_URL}/decisions/${pair}/${term}/${risk}`); + if (!pythonResponse.ok) { + throw new Error(`Python backend error: ${pythonResponse.status}`); + } + + const signalData = await pythonResponse.json(); + console.log("Signal data from Python backend:", signalData); + + return res.json({ + response: JSON.stringify({ + signal: signalData, + message: `Here's the ${term}-term ${risk}-risk trading signal for ${pair.toUpperCase().replace('_', '/')}:` + }) + }); + + } catch (pythonError) { + console.error("Error fetching from Python backend:", pythonError); + return res.json({ + response: JSON.stringify({ + message: "Unable to fetch trading signals at the moment. Please ensure the Python trading servers are running." + }) + }); + } + } + } + + // Handle analyze commands + if (command.startsWith('analyze ')) { + const parts = command.split(' '); + if (parts.length === 2) { + const target = parts[1]; + + if (target === 'portfolio') { + return res.json({ + response: JSON.stringify({ + analysis: { + balances: balances, + account: account, + timestamp: new Date().toISOString() + }, + message: "Here's your current portfolio analysis:" + }) + }); + } else { + // Market analysis for specific pair + const PYTHON_BACKEND_URL = process.env.PYTHON_BACKEND_URL || process.env.REACT_APP_PYTHON_BACKEND_URL || 'http://localhost:5049'; + + try { + const pythonResponse = await fetch(`${PYTHON_BACKEND_URL}/health`); + if (pythonResponse.ok) { + const healthData = await pythonResponse.json(); + return res.json({ + response: JSON.stringify({ + analysis: healthData, + message: `Here's the current system status for trading algorithms:` + }) + }); + } + } catch (error) { + console.error("Error fetching system data:", error); + } + } + } + } + + // Handle trade commands - pass through as is for frontend to execute + if (command.startsWith('trade ')) { + return res.json({ + response: JSON.stringify({ + command: command, + message: "I'll help you execute this trade. Please confirm the transaction in your wallet." + }) + }); + } + } + + // For message responses or other cases + res.json({ response: text }); + } catch (error) { - console.error("Error generating insights:", error); - res.status(500).json({ error: "Failed to generate insights" }); + console.error("Error generating trading response:", error); + res.status(500).json({ error: "Failed to generate trading response" }); } }); - // Start the server app.listen(PORT, () => { - console.log(`Server is running on http://localhost:${PORT}`); + console.log(`Server is running on PORT => ${PORT}`); }); \ No newline at end of file diff --git a/backend/tools/index.js b/backend/tools/index.js index 88b1406..202b2f0 100644 --- a/backend/tools/index.js +++ b/backend/tools/index.js @@ -1,22 +1,10 @@ import dotenv from "dotenv"; dotenv.config(); -import Moralis from "moralis"; -import { AnkrProvider } from "@ankr.com/ankr.js"; import { z } from "zod"; import { tool } from "ai"; -import { http } from "viem"; -if (!process.env.ANKR_API_KEY) { - throw new Error("ANKR_API_KEY environment variable must be set"); -} -const provider = new AnkrProvider( - `https://rpc.ankr.com/multichain/${process.env.ANKR_API_KEY}` -); - -// const ZEROX_API_URL = "https://arbitrum.api.0x.org"; - -export const createNaniTools = ({ account, walletClient, publicClient }) => ({ +export const createFoundryUpTools = (tokenBalance) => ({ getLiquidityPoolPrice: tool({ description: "Get liquidity pool price using Moralis", parameters: z.object({ @@ -32,33 +20,19 @@ export const createNaniTools = ({ account, walletClient, publicClient }) => ({ throw new Error("Network response was not ok " + response.statusText); } const data = await response.json(); - console.log(data); // Process your data here - return data; + console.log(data.pair); // Process your data here //Change this as it gives more detailed Data** + return data.pair; } catch (error) { console.error("Fetch error: ", error); } }, }), - getBalance: tool({ description: "Check token balances with current prices", parameters: z.object({}), execute: async () => { - try { - const [address] = await walletClient.getAddresses(); - const response = await provider.getAccountBalance({ - blockchain: "eth", - walletAddress: address, - onlyWhitelisted: false, - }); - if (!response) { - throw new Error("Failed to fetch balance"); - } - return response; - } catch (error) { - console.error("Error fetching balance:", error); - return { error: error.message || "An unknown error occurred" }; - } + console.log("balances json in backend : ", tokenBalance) + return tokenBalance }, }), -}); +}); \ No newline at end of file diff --git a/broadcast/DeployTradeIntent.sol/1/run-1738490619.json b/broadcast/DeployTradeIntent.sol/1/run-1738490619.json new file mode 100644 index 0000000..b1a9c4f --- /dev/null +++ b/broadcast/DeployTradeIntent.sol/1/run-1738490619.json @@ -0,0 +1,52 @@ +{ + "transactions": [ + { + "hash": "0x5bc9a0859057bccac9b5d403a21a32b2cd9f93e67f9e8468a33ea3beaf36a5ff", + "transactionType": "CREATE", + "contractName": "IntentEngine", + "contractAddress": "0x2ca60d89144d4cdf85da87af4fe12abf9265f28c", + "function": null, + "arguments": null, + "transaction": { + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "gas": "0x138270", + "value": "0x0", + "input": "0x6080806040523460ef57630eecae8d60e31b81525f600480830182905260249283902080546001600160a01b031990811673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21790915560408051637573646360e01b81528084018590528590208054831673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4817905580516264616960e81b8152600381018590526023902080548316736b175474e89094c44da98b954eedeac495271d0f1790558051637762746360e01b8152928301939093529290208054909216732260fac5e5542a773aa44fbcfedf7c193bc2c5991790915551610f5190816100f48239f35b5f80fdfe60806040526004361015610010575b005b5f3560e01c806308e90235146103625780631aeac183146100815763a3c7ed7f0361000e573461007d57602073ffffffffffffffffffffffffffffffffffffffff818061005c36610a1e565b604051928184925191829101835e81015f8152030190205416604051908152f35b5f80fd5b3461007d5761009761009236610a1e565b610bc4565b6100a86100a2610a7b565b82610cbc565b90600482510361033a576100c56100be83610ab6565b5182610e9f565b916101106100dc6100d583610af0565b5184610e9f565b926101096101036100fc6100f76100f1610a7b565b85610cbc565b610b00565b5183610e9f565b93610b10565b5190610e9f565b905f908051905f915f915f5b8281106101ea575b50505090155f1461019357509073ffffffffffffffffffffffffffffffffffffffff61016981610161670de0b6b3a764000061018f960297610b64565b541694610b64565b54169360405194859485526020850152604084015260806060840152608083019061093b565b0390f35b601281959295106101c6575b509073ffffffffffffffffffffffffffffffffffffffff6101698161016161018f95610b64565b601203600a0a9093029273ffffffffffffffffffffffffffffffffffffffff61019f565b6101f48183610bb3565b517fff0000000000000000000000000000000000000000000000000000000000000081167f300000000000000000000000000000000000000000000000000000000000000081101580610310575b156102a157508596600a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd09260f89897981c910201019561028b575b6001905b0193929361011c565b9360010193601285111561027e57939293610124565b7f2e00000000000000000000000000000000000000000000000000000000000000915095919495149081610307575b50156102df5760018093610282565b7f312a9f56000000000000000000000000000000000000000000000000000000005f5260045ffd5b905015896102d0565b507f3900000000000000000000000000000000000000000000000000000000000000811115610242565b7f1e3382cb000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461007d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261007d5760043567ffffffffffffffff811161007d573660238201121561007d57806004013567ffffffffffffffff811161007d57366024828401011161007d576103e0916100929160243692016109e8565b6103eb6100a2610a7b565b90600482510361033a576104016100be83610ab6565b9061042c6104116100fc85610af0565b916101096104266100fc6100f76100f1610a7b565b95610b10565b925f908051905f915f915f5b828110610813575b50505090155f146107f15750670de0b6b3a764000002915b6040516020810190610484602082885180838b01875e81015f838201520301601f1981018352826109a9565b51902060405160208101907f756e6973776170000000000000000000000000000000000000000000000000008252600781526104c16027826109a9565b519020146104e8575b505061018f604051928392835260406020840152604083019061093b565b5f604051926104f86060856109a9565b6002845273ffffffffffffffffffffffffffffffffffffffff6105338161052b6020880196601f19606001368937610b64565b541692610b64565b54168161053f86610ab6565b5261054985610af0565b52602073ffffffffffffffffffffffffffffffffffffffff61056a86610ab6565b51166064604051809581937f23b872dd0000000000000000000000000000000000000000000000000000000083523360048401523060248401528a60448401525af1908115610742575f926020926107d6575b506044604051809481937f095ea7b3000000000000000000000000000000000000000000000000000000008352737a250d5630b4cf539739df2c5dacb4c659f2488d60048401528960248401525af18015610742576107a9575b50610bb8420180421161077c5790916040519283917f38ed173900000000000000000000000000000000000000000000000000000000835260a48301908660048501525f602485015260a060448501525180915260c4830191905f5b81811061074d5750505081905f933360648401526084830152038183737a250d5630b4cf539739df2c5dacb4c659f2488d5af18015610742576106b7575b806104ca565b3d805f833e6106c681836109a9565b81019060208183031261007d5780519067ffffffffffffffff821161007d570181601f8201121561007d5780519060208061070084610b34565b61070d60405191826109a9565b848152019260051b82010192831161007d57602001905b8282106107325750506106b1565b8151815260209182019101610724565b6040513d5f823e3d90fd5b825173ffffffffffffffffffffffffffffffffffffffff16845286945060209384019390920191600101610673565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6107ca9060203d6020116107cf575b6107c281836109a9565b810190610b4c565b610617565b503d6107b8565b6107ec90833d85116107cf576107c281836109a9565b6105bd565b60128194929410610803575b50610458565b601203600a0a90920291846107fd565b61081d8183610bb3565b517fff0000000000000000000000000000000000000000000000000000000000000081167f300000000000000000000000000000000000000000000000000000000000000081101580610911575b156108ca57508596600a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd09260f89897981c91020101956108b4575b6001905b01939293610438565b936001019360128511156108a757939293610440565b7f2e00000000000000000000000000000000000000000000000000000000000000915095919495149081610908575b50156102df57600180936108ab565b905015896108f9565b507f390000000000000000000000000000000000000000000000000000000000000081111561086b565b90601f19601f602080948051918291828752018686015e5f8582860101520116010190565b6040810190811067ffffffffffffffff82111761097c57604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b90601f601f19910116810190811067ffffffffffffffff82111761097c57604052565b67ffffffffffffffff811161097c57601f01601f191660200190565b9291926109f4826109cc565b91610a0260405193846109a9565b82948184528183011161007d578281602093845f960137010152565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261007d576004359067ffffffffffffffff821161007d578060238301121561007d57816024610a78936004013591016109e8565b90565b60405190610a8a6040836109a9565b600182527f20000000000000000000000000000000000000000000000000000000000000006020830152565b805115610ac35760200190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b805160011015610ac35760400190565b805160021015610ac35760600190565b805160031015610ac35760800190565b8051821015610ac35760209160051b010190565b67ffffffffffffffff811161097c5760051b60200190565b9081602091031261007d5751801515810361007d5790565b60208091604051928184925191829101835e81015f81520301902090565b90610b8c826109cc565b610b9960405191826109a9565b828152601f19610ba982946109cc565b0190602036910137565b908151811015610ac3570160200190565b90610bcf8251610b82565b915f5b8151811015610cb857610be58183610bb3565b517fff0000000000000000000000000000000000000000000000000000000000000081167f410000000000000000000000000000000000000000000000000000000000000081101580610c8e575b15610c84575060f81c6020019060ff821161077c577fff0000000000000000000000000000000000000000000000000000000000000060019260f81b165b5f1a610c7d8287610bb3565b5301610bd2565b6001929150610c71565b507f5a00000000000000000000000000000000000000000000000000000000000000811115610c33565b5050565b91906001815103610e4157805115610ac357602001518251907fff00000000000000000000000000000000000000000000000000000000000000165f805b838110610dfa575060010193601f19610d2b610d1587610b34565b96610d2360405198896109a9565b808852610b34565b015f5b818110610dd7575050845f915f935f5b86811115610d4f5750505050505050565b8681148015610da2575b610d66575b600101610d3e565b9493610d979060405195610d7987610960565b86528660208701526001810195610d908287610b20565b5284610b20565b506001850194610d5e565b50817fff00000000000000000000000000000000000000000000000000000000000000610dcf8386610bb3565b511614610d59565b602090604051610de681610960565b5f81525f8382015282828a01015201610d2e565b827fff00000000000000000000000000000000000000000000000000000000000000610e268389610bb3565b511614610e36575b600101610cfa565b600190910190610e2e565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f44656c696d69746572206d757374206265206f6e6520636861726163746572006044820152fd5b919060208101518151810390811161077c57610eba90610b82565b905f5b8251811015610f155781519080820180921161077c577fff00000000000000000000000000000000000000000000000000000000000000610f0060019388610bb3565b51165f1a610f0e8286610bb3565b5301610ebd565b5050915056fea26469706673582212204978914b7c617b418b61ce2659c8ed3e36df35b90742285e1533499a05a8b99a64736f6c634300081c0033", + "nonce": "0x34d", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0xf01e0", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x5bc9a0859057bccac9b5d403a21a32b2cd9f93e67f9e8468a33ea3beaf36a5ff", + "transactionIndex": "0x0", + "blockHash": "0x36c26873f7412caf34085e5f954c6b4ed8440dbc7ffc818f5411f9f37e1c4331", + "blockNumber": "0x14c0090", + "gasUsed": "0xf01e0", + "effectiveGasPrice": "0x753dfae3", + "blobGasPrice": "0xbd1745", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": null, + "contractAddress": "0x2ca60d89144d4cdf85da87af4fe12abf9265f28c" + } + ], + "libraries": [], + "pending": [], + "returns": { + "0": { + "internal_type": "contract IntentEngine", + "value": "0x2ca60d89144D4cdf85dA87af4FE12aBF9265F28C" + } + }, + "timestamp": 1738490619, + "chain": 1, + "commit": "1912bfd" +} \ No newline at end of file diff --git a/broadcast/DeployTradeIntent.sol/1/run-1738491205.json b/broadcast/DeployTradeIntent.sol/1/run-1738491205.json new file mode 100644 index 0000000..bb5b2ab --- /dev/null +++ b/broadcast/DeployTradeIntent.sol/1/run-1738491205.json @@ -0,0 +1,52 @@ +{ + "transactions": [ + { + "hash": "0x41eac749c1ae0413cef2582e905e1306673703feabed61347003c96db0117533", + "transactionType": "CREATE", + "contractName": "IntentEngine", + "contractAddress": "0x2ca60d89144d4cdf85da87af4fe12abf9265f28c", + "function": null, + "arguments": null, + "transaction": { + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "gas": "0x138270", + "value": "0x0", + "input": "0x6080806040523460ef57630eecae8d60e31b81525f600480830182905260249283902080546001600160a01b031990811673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21790915560408051637573646360e01b81528084018590528590208054831673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4817905580516264616960e81b8152600381018590526023902080548316736b175474e89094c44da98b954eedeac495271d0f1790558051637762746360e01b8152928301939093529290208054909216732260fac5e5542a773aa44fbcfedf7c193bc2c5991790915551610f5190816100f48239f35b5f80fdfe60806040526004361015610010575b005b5f3560e01c806308e90235146103625780631aeac183146100815763a3c7ed7f0361000e573461007d57602073ffffffffffffffffffffffffffffffffffffffff818061005c36610a1e565b604051928184925191829101835e81015f8152030190205416604051908152f35b5f80fd5b3461007d5761009761009236610a1e565b610bc4565b6100a86100a2610a7b565b82610cbc565b90600482510361033a576100c56100be83610ab6565b5182610e9f565b916101106100dc6100d583610af0565b5184610e9f565b926101096101036100fc6100f76100f1610a7b565b85610cbc565b610b00565b5183610e9f565b93610b10565b5190610e9f565b905f908051905f915f915f5b8281106101ea575b50505090155f1461019357509073ffffffffffffffffffffffffffffffffffffffff61016981610161670de0b6b3a764000061018f960297610b64565b541694610b64565b54169360405194859485526020850152604084015260806060840152608083019061093b565b0390f35b601281959295106101c6575b509073ffffffffffffffffffffffffffffffffffffffff6101698161016161018f95610b64565b601203600a0a9093029273ffffffffffffffffffffffffffffffffffffffff61019f565b6101f48183610bb3565b517fff0000000000000000000000000000000000000000000000000000000000000081167f300000000000000000000000000000000000000000000000000000000000000081101580610310575b156102a157508596600a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd09260f89897981c910201019561028b575b6001905b0193929361011c565b9360010193601285111561027e57939293610124565b7f2e00000000000000000000000000000000000000000000000000000000000000915095919495149081610307575b50156102df5760018093610282565b7f312a9f56000000000000000000000000000000000000000000000000000000005f5260045ffd5b905015896102d0565b507f3900000000000000000000000000000000000000000000000000000000000000811115610242565b7f1e3382cb000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461007d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261007d5760043567ffffffffffffffff811161007d573660238201121561007d57806004013567ffffffffffffffff811161007d57366024828401011161007d576103e0916100929160243692016109e8565b6103eb6100a2610a7b565b90600482510361033a576104016100be83610ab6565b9061042c6104116100fc85610af0565b916101096104266100fc6100f76100f1610a7b565b95610b10565b925f908051905f915f915f5b828110610813575b50505090155f146107f15750670de0b6b3a764000002915b6040516020810190610484602082885180838b01875e81015f838201520301601f1981018352826109a9565b51902060405160208101907f756e6973776170000000000000000000000000000000000000000000000000008252600781526104c16027826109a9565b519020146104e8575b505061018f604051928392835260406020840152604083019061093b565b5f604051926104f86060856109a9565b6002845273ffffffffffffffffffffffffffffffffffffffff6105338161052b6020880196601f19606001368937610b64565b541692610b64565b54168161053f86610ab6565b5261054985610af0565b52602073ffffffffffffffffffffffffffffffffffffffff61056a86610ab6565b51166064604051809581937f23b872dd0000000000000000000000000000000000000000000000000000000083523360048401523060248401528a60448401525af1908115610742575f926020926107d6575b506044604051809481937f095ea7b3000000000000000000000000000000000000000000000000000000008352737a250d5630b4cf539739df2c5dacb4c659f2488d60048401528960248401525af18015610742576107a9575b50610bb8420180421161077c5790916040519283917f38ed173900000000000000000000000000000000000000000000000000000000835260a48301908660048501525f602485015260a060448501525180915260c4830191905f5b81811061074d5750505081905f933360648401526084830152038183737a250d5630b4cf539739df2c5dacb4c659f2488d5af18015610742576106b7575b806104ca565b3d805f833e6106c681836109a9565b81019060208183031261007d5780519067ffffffffffffffff821161007d570181601f8201121561007d5780519060208061070084610b34565b61070d60405191826109a9565b848152019260051b82010192831161007d57602001905b8282106107325750506106b1565b8151815260209182019101610724565b6040513d5f823e3d90fd5b825173ffffffffffffffffffffffffffffffffffffffff16845286945060209384019390920191600101610673565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6107ca9060203d6020116107cf575b6107c281836109a9565b810190610b4c565b610617565b503d6107b8565b6107ec90833d85116107cf576107c281836109a9565b6105bd565b60128194929410610803575b50610458565b601203600a0a90920291846107fd565b61081d8183610bb3565b517fff0000000000000000000000000000000000000000000000000000000000000081167f300000000000000000000000000000000000000000000000000000000000000081101580610911575b156108ca57508596600a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd09260f89897981c91020101956108b4575b6001905b01939293610438565b936001019360128511156108a757939293610440565b7f2e00000000000000000000000000000000000000000000000000000000000000915095919495149081610908575b50156102df57600180936108ab565b905015896108f9565b507f390000000000000000000000000000000000000000000000000000000000000081111561086b565b90601f19601f602080948051918291828752018686015e5f8582860101520116010190565b6040810190811067ffffffffffffffff82111761097c57604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b90601f601f19910116810190811067ffffffffffffffff82111761097c57604052565b67ffffffffffffffff811161097c57601f01601f191660200190565b9291926109f4826109cc565b91610a0260405193846109a9565b82948184528183011161007d578281602093845f960137010152565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261007d576004359067ffffffffffffffff821161007d578060238301121561007d57816024610a78936004013591016109e8565b90565b60405190610a8a6040836109a9565b600182527f20000000000000000000000000000000000000000000000000000000000000006020830152565b805115610ac35760200190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b805160011015610ac35760400190565b805160021015610ac35760600190565b805160031015610ac35760800190565b8051821015610ac35760209160051b010190565b67ffffffffffffffff811161097c5760051b60200190565b9081602091031261007d5751801515810361007d5790565b60208091604051928184925191829101835e81015f81520301902090565b90610b8c826109cc565b610b9960405191826109a9565b828152601f19610ba982946109cc565b0190602036910137565b908151811015610ac3570160200190565b90610bcf8251610b82565b915f5b8151811015610cb857610be58183610bb3565b517fff0000000000000000000000000000000000000000000000000000000000000081167f410000000000000000000000000000000000000000000000000000000000000081101580610c8e575b15610c84575060f81c6020019060ff821161077c577fff0000000000000000000000000000000000000000000000000000000000000060019260f81b165b5f1a610c7d8287610bb3565b5301610bd2565b6001929150610c71565b507f5a00000000000000000000000000000000000000000000000000000000000000811115610c33565b5050565b91906001815103610e4157805115610ac357602001518251907fff00000000000000000000000000000000000000000000000000000000000000165f805b838110610dfa575060010193601f19610d2b610d1587610b34565b96610d2360405198896109a9565b808852610b34565b015f5b818110610dd7575050845f915f935f5b86811115610d4f5750505050505050565b8681148015610da2575b610d66575b600101610d3e565b9493610d979060405195610d7987610960565b86528660208701526001810195610d908287610b20565b5284610b20565b506001850194610d5e565b50817fff00000000000000000000000000000000000000000000000000000000000000610dcf8386610bb3565b511614610d59565b602090604051610de681610960565b5f81525f8382015282828a01015201610d2e565b827fff00000000000000000000000000000000000000000000000000000000000000610e268389610bb3565b511614610e36575b600101610cfa565b600190910190610e2e565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f44656c696d69746572206d757374206265206f6e6520636861726163746572006044820152fd5b919060208101518151810390811161077c57610eba90610b82565b905f5b8251811015610f155781519080820180921161077c577fff00000000000000000000000000000000000000000000000000000000000000610f0060019388610bb3565b51165f1a610f0e8286610bb3565b5301610ebd565b5050915056fea26469706673582212204978914b7c617b418b61ce2659c8ed3e36df35b90742285e1533499a05a8b99a64736f6c634300081c0033", + "nonce": "0x34d", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0xf01e0", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x41eac749c1ae0413cef2582e905e1306673703feabed61347003c96db0117533", + "transactionIndex": "0x0", + "blockHash": "0xd37f8099532661ae71953e8f2eda9439f6edc76133910a9dd2dfe406c2d92da5", + "blockNumber": "0x14c00ca", + "gasUsed": "0xf01e0", + "effectiveGasPrice": "0x7cfe8ac8", + "blobGasPrice": "0x221cff9", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": null, + "contractAddress": "0x2ca60d89144d4cdf85da87af4fe12abf9265f28c" + } + ], + "libraries": [], + "pending": [], + "returns": { + "0": { + "internal_type": "contract IntentEngine", + "value": "0x2ca60d89144D4cdf85dA87af4FE12aBF9265F28C" + } + }, + "timestamp": 1738491205, + "chain": 1, + "commit": "1912bfd" +} \ No newline at end of file diff --git a/broadcast/DeployTradeIntent.sol/1/run-1738495606.json b/broadcast/DeployTradeIntent.sol/1/run-1738495606.json new file mode 100644 index 0000000..5e922b2 --- /dev/null +++ b/broadcast/DeployTradeIntent.sol/1/run-1738495606.json @@ -0,0 +1,52 @@ +{ + "transactions": [ + { + "hash": "0xfcd99e35081e7f93c085dd924f594cdafa984bf609df5f7b5771facdba27f515", + "transactionType": "CREATE", + "contractName": "IntentEngine", + "contractAddress": "0xf4fa0d1c10c47cde9f65d56c3ec977cbeb13449a", + "function": null, + "arguments": null, + "transaction": { + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "gas": "0x138270", + "value": "0x0", + "input": "0x6080806040523460ef57630eecae8d60e31b81525f600480830182905260249283902080546001600160a01b031990811673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21790915560408051637573646360e01b81528084018590528590208054831673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4817905580516264616960e81b8152600381018590526023902080548316736b175474e89094c44da98b954eedeac495271d0f1790558051637762746360e01b8152928301939093529290208054909216732260fac5e5542a773aa44fbcfedf7c193bc2c5991790915551610f5190816100f48239f35b5f80fdfe60806040526004361015610010575b005b5f3560e01c806308e90235146103625780631aeac183146100815763a3c7ed7f0361000e573461007d57602073ffffffffffffffffffffffffffffffffffffffff818061005c36610a1e565b604051928184925191829101835e81015f8152030190205416604051908152f35b5f80fd5b3461007d5761009761009236610a1e565b610bc4565b6100a86100a2610a7b565b82610cbc565b90600482510361033a576100c56100be83610ab6565b5182610e9f565b916101106100dc6100d583610af0565b5184610e9f565b926101096101036100fc6100f76100f1610a7b565b85610cbc565b610b00565b5183610e9f565b93610b10565b5190610e9f565b905f908051905f915f915f5b8281106101ea575b50505090155f1461019357509073ffffffffffffffffffffffffffffffffffffffff61016981610161670de0b6b3a764000061018f960297610b64565b541694610b64565b54169360405194859485526020850152604084015260806060840152608083019061093b565b0390f35b601281959295106101c6575b509073ffffffffffffffffffffffffffffffffffffffff6101698161016161018f95610b64565b601203600a0a9093029273ffffffffffffffffffffffffffffffffffffffff61019f565b6101f48183610bb3565b517fff0000000000000000000000000000000000000000000000000000000000000081167f300000000000000000000000000000000000000000000000000000000000000081101580610310575b156102a157508596600a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd09260f89897981c910201019561028b575b6001905b0193929361011c565b9360010193601285111561027e57939293610124565b7f2e00000000000000000000000000000000000000000000000000000000000000915095919495149081610307575b50156102df5760018093610282565b7f312a9f56000000000000000000000000000000000000000000000000000000005f5260045ffd5b905015896102d0565b507f3900000000000000000000000000000000000000000000000000000000000000811115610242565b7f1e3382cb000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461007d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261007d5760043567ffffffffffffffff811161007d573660238201121561007d57806004013567ffffffffffffffff811161007d57366024828401011161007d576103e0916100929160243692016109e8565b6103eb6100a2610a7b565b90600482510361033a576104016100be83610ab6565b9061042c6104116100fc85610af0565b916101096104266100fc6100f76100f1610a7b565b95610b10565b925f908051905f915f915f5b828110610813575b50505090155f146107f15750670de0b6b3a764000002915b6040516020810190610484602082885180838b01875e81015f838201520301601f1981018352826109a9565b51902060405160208101907f756e6973776170000000000000000000000000000000000000000000000000008252600781526104c16027826109a9565b519020146104e8575b505061018f604051928392835260406020840152604083019061093b565b5f604051926104f86060856109a9565b6002845273ffffffffffffffffffffffffffffffffffffffff6105338161052b6020880196601f19606001368937610b64565b541692610b64565b54168161053f86610ab6565b5261054985610af0565b52602073ffffffffffffffffffffffffffffffffffffffff61056a86610ab6565b51166064604051809581937f23b872dd0000000000000000000000000000000000000000000000000000000083523360048401523060248401528a60448401525af1908115610742575f926020926107d6575b506044604051809481937f095ea7b3000000000000000000000000000000000000000000000000000000008352737a250d5630b4cf539739df2c5dacb4c659f2488d60048401528960248401525af18015610742576107a9575b50610bb8420180421161077c5790916040519283917f38ed173900000000000000000000000000000000000000000000000000000000835260a48301908660048501525f602485015260a060448501525180915260c4830191905f5b81811061074d5750505081905f933360648401526084830152038183737a250d5630b4cf539739df2c5dacb4c659f2488d5af18015610742576106b7575b806104ca565b3d805f833e6106c681836109a9565b81019060208183031261007d5780519067ffffffffffffffff821161007d570181601f8201121561007d5780519060208061070084610b34565b61070d60405191826109a9565b848152019260051b82010192831161007d57602001905b8282106107325750506106b1565b8151815260209182019101610724565b6040513d5f823e3d90fd5b825173ffffffffffffffffffffffffffffffffffffffff16845286945060209384019390920191600101610673565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6107ca9060203d6020116107cf575b6107c281836109a9565b810190610b4c565b610617565b503d6107b8565b6107ec90833d85116107cf576107c281836109a9565b6105bd565b60128194929410610803575b50610458565b601203600a0a90920291846107fd565b61081d8183610bb3565b517fff0000000000000000000000000000000000000000000000000000000000000081167f300000000000000000000000000000000000000000000000000000000000000081101580610911575b156108ca57508596600a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd09260f89897981c91020101956108b4575b6001905b01939293610438565b936001019360128511156108a757939293610440565b7f2e00000000000000000000000000000000000000000000000000000000000000915095919495149081610908575b50156102df57600180936108ab565b905015896108f9565b507f390000000000000000000000000000000000000000000000000000000000000081111561086b565b90601f19601f602080948051918291828752018686015e5f8582860101520116010190565b6040810190811067ffffffffffffffff82111761097c57604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b90601f601f19910116810190811067ffffffffffffffff82111761097c57604052565b67ffffffffffffffff811161097c57601f01601f191660200190565b9291926109f4826109cc565b91610a0260405193846109a9565b82948184528183011161007d578281602093845f960137010152565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261007d576004359067ffffffffffffffff821161007d578060238301121561007d57816024610a78936004013591016109e8565b90565b60405190610a8a6040836109a9565b600182527f20000000000000000000000000000000000000000000000000000000000000006020830152565b805115610ac35760200190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b805160011015610ac35760400190565b805160021015610ac35760600190565b805160031015610ac35760800190565b8051821015610ac35760209160051b010190565b67ffffffffffffffff811161097c5760051b60200190565b9081602091031261007d5751801515810361007d5790565b60208091604051928184925191829101835e81015f81520301902090565b90610b8c826109cc565b610b9960405191826109a9565b828152601f19610ba982946109cc565b0190602036910137565b908151811015610ac3570160200190565b90610bcf8251610b82565b915f5b8151811015610cb857610be58183610bb3565b517fff0000000000000000000000000000000000000000000000000000000000000081167f410000000000000000000000000000000000000000000000000000000000000081101580610c8e575b15610c84575060f81c6020019060ff821161077c577fff0000000000000000000000000000000000000000000000000000000000000060019260f81b165b5f1a610c7d8287610bb3565b5301610bd2565b6001929150610c71565b507f5a00000000000000000000000000000000000000000000000000000000000000811115610c33565b5050565b91906001815103610e4157805115610ac357602001518251907fff00000000000000000000000000000000000000000000000000000000000000165f805b838110610dfa575060010193601f19610d2b610d1587610b34565b96610d2360405198896109a9565b808852610b34565b015f5b818110610dd7575050845f915f935f5b86811115610d4f5750505050505050565b8681148015610da2575b610d66575b600101610d3e565b9493610d979060405195610d7987610960565b86528660208701526001810195610d908287610b20565b5284610b20565b506001850194610d5e565b50817fff00000000000000000000000000000000000000000000000000000000000000610dcf8386610bb3565b511614610d59565b602090604051610de681610960565b5f81525f8382015282828a01015201610d2e565b827fff00000000000000000000000000000000000000000000000000000000000000610e268389610bb3565b511614610e36575b600101610cfa565b600190910190610e2e565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f44656c696d69746572206d757374206265206f6e6520636861726163746572006044820152fd5b919060208101518151810390811161077c57610eba90610b82565b905f5b8251811015610f155781519080820180921161077c577fff00000000000000000000000000000000000000000000000000000000000000610f0060019388610bb3565b51165f1a610f0e8286610bb3565b5301610ebd565b5050915056fea26469706673582212204978914b7c617b418b61ce2659c8ed3e36df35b90742285e1533499a05a8b99a64736f6c634300081c0033", + "nonce": "0x34e", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0xf01e0", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xfcd99e35081e7f93c085dd924f594cdafa984bf609df5f7b5771facdba27f515", + "transactionIndex": "0x0", + "blockHash": "0x57c06467b86456f6871177acd85827c86cbbddadc5217536a93c1f1e54997ffa", + "blockNumber": "0x14c0237", + "gasUsed": "0xf01e0", + "effectiveGasPrice": "0x9f9590bc", + "blobGasPrice": "0x36a4936", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": null, + "contractAddress": "0xf4fa0d1c10c47cde9f65d56c3ec977cbeb13449a" + } + ], + "libraries": [], + "pending": [], + "returns": { + "0": { + "internal_type": "contract IntentEngine", + "value": "0xf4fa0d1C10c47cDe9F65D56c3eC977CbEb13449A" + } + }, + "timestamp": 1738495606, + "chain": 1, + "commit": "eb03d24" +} \ No newline at end of file diff --git a/broadcast/DeployTradeIntent.sol/1/run-1738503199.json b/broadcast/DeployTradeIntent.sol/1/run-1738503199.json new file mode 100644 index 0000000..1f01832 --- /dev/null +++ b/broadcast/DeployTradeIntent.sol/1/run-1738503199.json @@ -0,0 +1,52 @@ +{ + "transactions": [ + { + "hash": "0x8d81bb57704c5b644882dd633909f279c202505478c97ee5458c3511a6161e29", + "transactionType": "CREATE", + "contractName": "IntentEngine", + "contractAddress": "0xf4fa0d1c10c47cde9f65d56c3ec977cbeb13449a", + "function": null, + "arguments": null, + "transaction": { + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "gas": "0x138270", + "value": "0x0", + "input": "0x6080806040523460ef57630eecae8d60e31b81525f600480830182905260249283902080546001600160a01b031990811673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21790915560408051637573646360e01b81528084018590528590208054831673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4817905580516264616960e81b8152600381018590526023902080548316736b175474e89094c44da98b954eedeac495271d0f1790558051637762746360e01b8152928301939093529290208054909216732260fac5e5542a773aa44fbcfedf7c193bc2c5991790915551610f5190816100f48239f35b5f80fdfe60806040526004361015610010575b005b5f3560e01c806308e90235146103625780631aeac183146100815763a3c7ed7f0361000e573461007d57602073ffffffffffffffffffffffffffffffffffffffff818061005c36610a1e565b604051928184925191829101835e81015f8152030190205416604051908152f35b5f80fd5b3461007d5761009761009236610a1e565b610bc4565b6100a86100a2610a7b565b82610cbc565b90600482510361033a576100c56100be83610ab6565b5182610e9f565b916101106100dc6100d583610af0565b5184610e9f565b926101096101036100fc6100f76100f1610a7b565b85610cbc565b610b00565b5183610e9f565b93610b10565b5190610e9f565b905f908051905f915f915f5b8281106101ea575b50505090155f1461019357509073ffffffffffffffffffffffffffffffffffffffff61016981610161670de0b6b3a764000061018f960297610b64565b541694610b64565b54169360405194859485526020850152604084015260806060840152608083019061093b565b0390f35b601281959295106101c6575b509073ffffffffffffffffffffffffffffffffffffffff6101698161016161018f95610b64565b601203600a0a9093029273ffffffffffffffffffffffffffffffffffffffff61019f565b6101f48183610bb3565b517fff0000000000000000000000000000000000000000000000000000000000000081167f300000000000000000000000000000000000000000000000000000000000000081101580610310575b156102a157508596600a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd09260f89897981c910201019561028b575b6001905b0193929361011c565b9360010193601285111561027e57939293610124565b7f2e00000000000000000000000000000000000000000000000000000000000000915095919495149081610307575b50156102df5760018093610282565b7f312a9f56000000000000000000000000000000000000000000000000000000005f5260045ffd5b905015896102d0565b507f3900000000000000000000000000000000000000000000000000000000000000811115610242565b7f1e3382cb000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461007d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261007d5760043567ffffffffffffffff811161007d573660238201121561007d57806004013567ffffffffffffffff811161007d57366024828401011161007d576103e0916100929160243692016109e8565b6103eb6100a2610a7b565b90600482510361033a576104016100be83610ab6565b9061042c6104116100fc85610af0565b916101096104266100fc6100f76100f1610a7b565b95610b10565b925f908051905f915f915f5b828110610813575b50505090155f146107f15750670de0b6b3a764000002915b6040516020810190610484602082885180838b01875e81015f838201520301601f1981018352826109a9565b51902060405160208101907f756e6973776170000000000000000000000000000000000000000000000000008252600781526104c16027826109a9565b519020146104e8575b505061018f604051928392835260406020840152604083019061093b565b5f604051926104f86060856109a9565b6002845273ffffffffffffffffffffffffffffffffffffffff6105338161052b6020880196601f19606001368937610b64565b541692610b64565b54168161053f86610ab6565b5261054985610af0565b52602073ffffffffffffffffffffffffffffffffffffffff61056a86610ab6565b51166064604051809581937f23b872dd0000000000000000000000000000000000000000000000000000000083523360048401523060248401528a60448401525af1908115610742575f926020926107d6575b506044604051809481937f095ea7b3000000000000000000000000000000000000000000000000000000008352737a250d5630b4cf539739df2c5dacb4c659f2488d60048401528960248401525af18015610742576107a9575b50610bb8420180421161077c5790916040519283917f38ed173900000000000000000000000000000000000000000000000000000000835260a48301908660048501525f602485015260a060448501525180915260c4830191905f5b81811061074d5750505081905f933360648401526084830152038183737a250d5630b4cf539739df2c5dacb4c659f2488d5af18015610742576106b7575b806104ca565b3d805f833e6106c681836109a9565b81019060208183031261007d5780519067ffffffffffffffff821161007d570181601f8201121561007d5780519060208061070084610b34565b61070d60405191826109a9565b848152019260051b82010192831161007d57602001905b8282106107325750506106b1565b8151815260209182019101610724565b6040513d5f823e3d90fd5b825173ffffffffffffffffffffffffffffffffffffffff16845286945060209384019390920191600101610673565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6107ca9060203d6020116107cf575b6107c281836109a9565b810190610b4c565b610617565b503d6107b8565b6107ec90833d85116107cf576107c281836109a9565b6105bd565b60128194929410610803575b50610458565b601203600a0a90920291846107fd565b61081d8183610bb3565b517fff0000000000000000000000000000000000000000000000000000000000000081167f300000000000000000000000000000000000000000000000000000000000000081101580610911575b156108ca57508596600a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd09260f89897981c91020101956108b4575b6001905b01939293610438565b936001019360128511156108a757939293610440565b7f2e00000000000000000000000000000000000000000000000000000000000000915095919495149081610908575b50156102df57600180936108ab565b905015896108f9565b507f390000000000000000000000000000000000000000000000000000000000000081111561086b565b90601f19601f602080948051918291828752018686015e5f8582860101520116010190565b6040810190811067ffffffffffffffff82111761097c57604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b90601f601f19910116810190811067ffffffffffffffff82111761097c57604052565b67ffffffffffffffff811161097c57601f01601f191660200190565b9291926109f4826109cc565b91610a0260405193846109a9565b82948184528183011161007d578281602093845f960137010152565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261007d576004359067ffffffffffffffff821161007d578060238301121561007d57816024610a78936004013591016109e8565b90565b60405190610a8a6040836109a9565b600182527f20000000000000000000000000000000000000000000000000000000000000006020830152565b805115610ac35760200190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b805160011015610ac35760400190565b805160021015610ac35760600190565b805160031015610ac35760800190565b8051821015610ac35760209160051b010190565b67ffffffffffffffff811161097c5760051b60200190565b9081602091031261007d5751801515810361007d5790565b60208091604051928184925191829101835e81015f81520301902090565b90610b8c826109cc565b610b9960405191826109a9565b828152601f19610ba982946109cc565b0190602036910137565b908151811015610ac3570160200190565b90610bcf8251610b82565b915f5b8151811015610cb857610be58183610bb3565b517fff0000000000000000000000000000000000000000000000000000000000000081167f410000000000000000000000000000000000000000000000000000000000000081101580610c8e575b15610c84575060f81c6020019060ff821161077c577fff0000000000000000000000000000000000000000000000000000000000000060019260f81b165b5f1a610c7d8287610bb3565b5301610bd2565b6001929150610c71565b507f5a00000000000000000000000000000000000000000000000000000000000000811115610c33565b5050565b91906001815103610e4157805115610ac357602001518251907fff00000000000000000000000000000000000000000000000000000000000000165f805b838110610dfa575060010193601f19610d2b610d1587610b34565b96610d2360405198896109a9565b808852610b34565b015f5b818110610dd7575050845f915f935f5b86811115610d4f5750505050505050565b8681148015610da2575b610d66575b600101610d3e565b9493610d979060405195610d7987610960565b86528660208701526001810195610d908287610b20565b5284610b20565b506001850194610d5e565b50817fff00000000000000000000000000000000000000000000000000000000000000610dcf8386610bb3565b511614610d59565b602090604051610de681610960565b5f81525f8382015282828a01015201610d2e565b827fff00000000000000000000000000000000000000000000000000000000000000610e268389610bb3565b511614610e36575b600101610cfa565b600190910190610e2e565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f44656c696d69746572206d757374206265206f6e6520636861726163746572006044820152fd5b919060208101518151810390811161077c57610eba90610b82565b905f5b8251811015610f155781519080820180921161077c577fff00000000000000000000000000000000000000000000000000000000000000610f0060019388610bb3565b51165f1a610f0e8286610bb3565b5301610ebd565b5050915056fea26469706673582212204978914b7c617b418b61ce2659c8ed3e36df35b90742285e1533499a05a8b99a64736f6c634300081c0033", + "nonce": "0x34e", + "chainId": "0x1" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0xf01e0", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x8d81bb57704c5b644882dd633909f279c202505478c97ee5458c3511a6161e29", + "transactionIndex": "0x0", + "blockHash": "0x0d83dd1358a191147737091adbdc37b94105481c6c6c614514fc9fc649f5be81", + "blockNumber": "0x14c04ac", + "gasUsed": "0xf01e0", + "effectiveGasPrice": "0x105aa07cf", + "blobGasPrice": "0x3fef4b2", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": null, + "contractAddress": "0xf4fa0d1c10c47cde9f65d56c3ec977cbeb13449a" + } + ], + "libraries": [], + "pending": [], + "returns": { + "0": { + "internal_type": "contract IntentEngine", + "value": "0xf4fa0d1C10c47cDe9F65D56c3eC977CbEb13449A" + } + }, + "timestamp": 1738503199, + "chain": 1, + "commit": "eb03d24" +} \ No newline at end of file diff --git a/broadcast/DeployTradeIntent.sol/1/run-latest.json b/broadcast/DeployTradeIntent.sol/1/run-latest.json index e25431b..490be81 100644 --- a/broadcast/DeployTradeIntent.sol/1/run-latest.json +++ b/broadcast/DeployTradeIntent.sol/1/run-latest.json @@ -1,18 +1,18 @@ { "transactions": [ { - "hash": "0x56cb1a990107354e36fc177d84eb1c324e5a40dedfb3654b8a49076ec4ac55fb", + "hash": "0x5431050222143ce6c33282e86ccc9509ce2065ddbdc312434c62e6553189087a", "transactionType": "CREATE", - "contractName": "IntentEngine", - "contractAddress": "0x2ca60d89144d4cdf85da87af4fe12abf9265f28c", + "contractName": "SimpleIE", + "contractAddress": "0x7c28fc9709650d49c8d0aed2f6ece6b191f192a9", "function": null, "arguments": null, "transaction": { "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "gas": "0x138270", + "gas": "0x29e389", "value": "0x0", - "input": "0x6080806040523460ef57630eecae8d60e31b81525f600480830182905260249283902080546001600160a01b031990811673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21790915560408051637573646360e01b81528084018590528590208054831673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4817905580516264616960e81b8152600381018590526023902080548316736b175474e89094c44da98b954eedeac495271d0f1790558051637762746360e01b8152928301939093529290208054909216732260fac5e5542a773aa44fbcfedf7c193bc2c5991790915551610f5190816100f48239f35b5f80fdfe60806040526004361015610010575b005b5f3560e01c806308e90235146103625780631aeac183146100815763a3c7ed7f0361000e573461007d57602073ffffffffffffffffffffffffffffffffffffffff818061005c36610a1e565b604051928184925191829101835e81015f8152030190205416604051908152f35b5f80fd5b3461007d5761009761009236610a1e565b610bc4565b6100a86100a2610a7b565b82610cbc565b90600482510361033a576100c56100be83610ab6565b5182610e9f565b916101106100dc6100d583610af0565b5184610e9f565b926101096101036100fc6100f76100f1610a7b565b85610cbc565b610b00565b5183610e9f565b93610b10565b5190610e9f565b905f908051905f915f915f5b8281106101ea575b50505090155f1461019357509073ffffffffffffffffffffffffffffffffffffffff61016981610161670de0b6b3a764000061018f960297610b64565b541694610b64565b54169360405194859485526020850152604084015260806060840152608083019061093b565b0390f35b601281959295106101c6575b509073ffffffffffffffffffffffffffffffffffffffff6101698161016161018f95610b64565b601203600a0a9093029273ffffffffffffffffffffffffffffffffffffffff61019f565b6101f48183610bb3565b517fff0000000000000000000000000000000000000000000000000000000000000081167f300000000000000000000000000000000000000000000000000000000000000081101580610310575b156102a157508596600a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd09260f89897981c910201019561028b575b6001905b0193929361011c565b9360010193601285111561027e57939293610124565b7f2e00000000000000000000000000000000000000000000000000000000000000915095919495149081610307575b50156102df5760018093610282565b7f312a9f56000000000000000000000000000000000000000000000000000000005f5260045ffd5b905015896102d0565b507f3900000000000000000000000000000000000000000000000000000000000000811115610242565b7f1e3382cb000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461007d5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261007d5760043567ffffffffffffffff811161007d573660238201121561007d57806004013567ffffffffffffffff811161007d57366024828401011161007d576103e0916100929160243692016109e8565b6103eb6100a2610a7b565b90600482510361033a576104016100be83610ab6565b9061042c6104116100fc85610af0565b916101096104266100fc6100f76100f1610a7b565b95610b10565b925f908051905f915f915f5b828110610813575b50505090155f146107f15750670de0b6b3a764000002915b6040516020810190610484602082885180838b01875e81015f838201520301601f1981018352826109a9565b51902060405160208101907f756e6973776170000000000000000000000000000000000000000000000000008252600781526104c16027826109a9565b519020146104e8575b505061018f604051928392835260406020840152604083019061093b565b5f604051926104f86060856109a9565b6002845273ffffffffffffffffffffffffffffffffffffffff6105338161052b6020880196601f19606001368937610b64565b541692610b64565b54168161053f86610ab6565b5261054985610af0565b52602073ffffffffffffffffffffffffffffffffffffffff61056a86610ab6565b51166064604051809581937f23b872dd0000000000000000000000000000000000000000000000000000000083523360048401523060248401528a60448401525af1908115610742575f926020926107d6575b506044604051809481937f095ea7b3000000000000000000000000000000000000000000000000000000008352737a250d5630b4cf539739df2c5dacb4c659f2488d60048401528960248401525af18015610742576107a9575b50610bb8420180421161077c5790916040519283917f38ed173900000000000000000000000000000000000000000000000000000000835260a48301908660048501525f602485015260a060448501525180915260c4830191905f5b81811061074d5750505081905f933360648401526084830152038183737a250d5630b4cf539739df2c5dacb4c659f2488d5af18015610742576106b7575b806104ca565b3d805f833e6106c681836109a9565b81019060208183031261007d5780519067ffffffffffffffff821161007d570181601f8201121561007d5780519060208061070084610b34565b61070d60405191826109a9565b848152019260051b82010192831161007d57602001905b8282106107325750506106b1565b8151815260209182019101610724565b6040513d5f823e3d90fd5b825173ffffffffffffffffffffffffffffffffffffffff16845286945060209384019390920191600101610673565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6107ca9060203d6020116107cf575b6107c281836109a9565b810190610b4c565b610617565b503d6107b8565b6107ec90833d85116107cf576107c281836109a9565b6105bd565b60128194929410610803575b50610458565b601203600a0a90920291846107fd565b61081d8183610bb3565b517fff0000000000000000000000000000000000000000000000000000000000000081167f300000000000000000000000000000000000000000000000000000000000000081101580610911575b156108ca57508596600a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd09260f89897981c91020101956108b4575b6001905b01939293610438565b936001019360128511156108a757939293610440565b7f2e00000000000000000000000000000000000000000000000000000000000000915095919495149081610908575b50156102df57600180936108ab565b905015896108f9565b507f390000000000000000000000000000000000000000000000000000000000000081111561086b565b90601f19601f602080948051918291828752018686015e5f8582860101520116010190565b6040810190811067ffffffffffffffff82111761097c57604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b90601f601f19910116810190811067ffffffffffffffff82111761097c57604052565b67ffffffffffffffff811161097c57601f01601f191660200190565b9291926109f4826109cc565b91610a0260405193846109a9565b82948184528183011161007d578281602093845f960137010152565b60207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261007d576004359067ffffffffffffffff821161007d578060238301121561007d57816024610a78936004013591016109e8565b90565b60405190610a8a6040836109a9565b600182527f20000000000000000000000000000000000000000000000000000000000000006020830152565b805115610ac35760200190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b805160011015610ac35760400190565b805160021015610ac35760600190565b805160031015610ac35760800190565b8051821015610ac35760209160051b010190565b67ffffffffffffffff811161097c5760051b60200190565b9081602091031261007d5751801515810361007d5790565b60208091604051928184925191829101835e81015f81520301902090565b90610b8c826109cc565b610b9960405191826109a9565b828152601f19610ba982946109cc565b0190602036910137565b908151811015610ac3570160200190565b90610bcf8251610b82565b915f5b8151811015610cb857610be58183610bb3565b517fff0000000000000000000000000000000000000000000000000000000000000081167f410000000000000000000000000000000000000000000000000000000000000081101580610c8e575b15610c84575060f81c6020019060ff821161077c577fff0000000000000000000000000000000000000000000000000000000000000060019260f81b165b5f1a610c7d8287610bb3565b5301610bd2565b6001929150610c71565b507f5a00000000000000000000000000000000000000000000000000000000000000811115610c33565b5050565b91906001815103610e4157805115610ac357602001518251907fff00000000000000000000000000000000000000000000000000000000000000165f805b838110610dfa575060010193601f19610d2b610d1587610b34565b96610d2360405198896109a9565b808852610b34565b015f5b818110610dd7575050845f915f935f5b86811115610d4f5750505050505050565b8681148015610da2575b610d66575b600101610d3e565b9493610d979060405195610d7987610960565b86528660208701526001810195610d908287610b20565b5284610b20565b506001850194610d5e565b50817fff00000000000000000000000000000000000000000000000000000000000000610dcf8386610bb3565b511614610d59565b602090604051610de681610960565b5f81525f8382015282828a01015201610d2e565b827fff00000000000000000000000000000000000000000000000000000000000000610e268389610bb3565b511614610e36575b600101610cfa565b600190910190610e2e565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f44656c696d69746572206d757374206265206f6e6520636861726163746572006044820152fd5b919060208101518151810390811161077c57610eba90610b82565b905f5b8251811015610f155781519080820180921161077c577fff00000000000000000000000000000000000000000000000000000000000000610f0060019388610bb3565b51165f1a610f0e8286610bb3565b5301610ebd565b5050915056fea26469706673582212204978914b7c617b418b61ce2659c8ed3e36df35b90742285e1533499a05a8b99a64736f6c634300081c0033", - "nonce": "0x34d", + "input": "0x6080806040523460155761258f908161001a8239f35b5f80fdfe60806040526004361015610026575b361561001e5761001c61110b565b005b61001c6110ee565b5f3560e01c80635615264d146100855780635cf3d346146100805780635fcc45001461007b5780636662c9e31461007657806369454b86146100715763bdfe7d470361000e576106ad565b6105f3565b61053b565b610374565b61022f565b60606003193601126100fc5760043567ffffffffffffffff81116100fc576100b19036906004016101b8565b60243567ffffffffffffffff81116100fc576100d19036906004016101b8565b906044359167ffffffffffffffff83116100fc576100f661001c9336906004016101b8565b91610812565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b90601f601f19910116810190811067ffffffffffffffff82111761015057604052565b610100565b6040519061016460408361012d565b565b67ffffffffffffffff811161015057601f01601f191660200190565b92919261018e82610166565b9161019c604051938461012d565b8294818452818301116100fc578281602093845f960137010152565b9080601f830112156100fc578160206101d393359101610182565b90565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100fc57565b90601f19601f602080948051918291828752018686015e5f8582860101520116010190565b9060206101d39281815201906101f9565b346100fc5760206003193601126100fc5773ffffffffffffffffffffffffffffffffffffffff61025d6101d6565b165f52600160205260405f20604051905f9080548060011c916001821691821561036a575b60208410831461033d57838652602086019290811561030257506001146102c4575b6102c0856102b48187038261012d565b6040519182918261021e565b0390f35b6102d4919293505f5260205f2090565b915f925b8184106102ee575050016102b4826102c06102a4565b8054848401526020909301926001016102d8565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168352505090151560051b0190506102b4826102c06102a4565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b92607f1692610282565b60206003193601126100fc5760043567ffffffffffffffff81116100fc57366023820112156100fc57806004013567ffffffffffffffff81116100fc5736602482840101116100fc576103d4916103cf916024369201610182565b611a55565b6103dd81611ba0565b7f73656e640000000000000000000000000000000000000000000000000000000081148015610512575b80156104e9575b1561042057506100f661001c91611da1565b7f737761700000000000000000000000000000000000000000000000000000000081149081156104bf575b8115610495575b501561046d5761046461001c91611cf5565b93929092610a48565b7f1e3382cb000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f65786368616e67650000000000000000000000000000000000000000000000009150145f610452565b7f73656c6c000000000000000000000000000000000000000000000000000000008114915061044b565b507f7061790000000000000000000000000000000000000000000000000000000000811461040e565b507f7472616e736665720000000000000000000000000000000000000000000000008114610407565b60a06003193601126100fc5760043567ffffffffffffffff81116100fc576105679036906004016101b8565b60243567ffffffffffffffff81116100fc576105879036906004016101b8565b9060443567ffffffffffffffff81116100fc576105a89036906004016101b8565b60643567ffffffffffffffff81116100fc576105c89036906004016101b8565b906084359367ffffffffffffffff85116100fc576105ed61001c9536906004016101b8565b93610a48565b346100fc5760406003193601126100fc5761060c6101d6565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036100fc5773ffffffffffffffffffffffffffffffffffffffff165f52600260205273ffffffffffffffffffffffffffffffffffffffff60405f2091165f52602052602073ffffffffffffffffffffffffffffffffffffffff60405f205416604051908152f35b60208091604051928184925191829101835e81015f81520301902090565b346100fc5760206003193601126100fc5760043567ffffffffffffffff81116100fc5773ffffffffffffffffffffffffffffffffffffffff6106fd6106f860209336906004016101b8565b61068f565b5416604051908152f35b60208151910151906020811061071b575090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060200360031b1b1690565b1561074f57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f496e76616c696420726563697069656e742061646472657373000000000000006044820152fd5b156107b457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f496e636f7272656374204554482076616c75652073656e7400000000000000006044820152fd5b905f91602a8451145f146109295761082984611583565b935b73ffffffffffffffffffffffffffffffffffffffff8516156108f9575b508051602a0361046d5761088e916108608592611583565b9361088273ffffffffffffffffffffffffffffffffffffffff86161515610748565b80156108e0579061178c565b9073ffffffffffffffffffffffffffffffffffffffff831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee036108d55761016492506108d08234146107ad565b6119f6565b61016492339061198f565b506108f36108ed836116a0565b60ff1690565b9061178c565b6109229194506109089061068f565b5473ffffffffffffffffffffffffffffffffffffffff1690565b925f610848565b915061093c61093784610707565b6111ec565b92909361082b565b6040519060a0820182811067ffffffffffffffff821117610150576040525f6080838281528260208201528260408201528260608201520152565b156100fc57565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f800000000000000000000000000000000000000000000000000000000000000081146109df575f0390565b610986565b91908260409103126100fc576020825192015190565b919360a0936101d3969573ffffffffffffffffffffffffffffffffffffffff809416855215156020850152604084015216606082015281608082015201906101f9565b6040513d5f823e3d90fd5b9293909193610a55610944565b925f915f96602a8151145f146110b857610a8e610a7182611583565b73ffffffffffffffffffffffffffffffffffffffff166040880152565b73ffffffffffffffffffffffffffffffffffffffff610ac4604088015173ffffffffffffffffffffffffffffffffffffffff1690565b1615611086575b508051602a0361105057610afe610ae182611583565b73ffffffffffffffffffffffffffffffffffffffff166060870152565b610b3b610b22606087015173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b1561101e575b505f958151610fbb575b5050835115938415610f5657505083925b7f800000000000000000000000000000000000000000000000000000000000000060808401948086521015610f2e57610df793604092610be573eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff610bdf8789015173ffffffffffffffffffffffffffffffffffffffff1690565b16148652565b8451151580610f1d575b610eff575b610c3873eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee610c30610b22606089015173ffffffffffffffffffffffffffffffffffffffff1690565b146020870152565b6020850151610ee0575b8051610ed1575033915b5f73ffffffffffffffffffffffffffffffffffffffff610ca6610c858789015173ffffffffffffffffffffffffffffffffffffffff1690565b606089015173ffffffffffffffffffffffffffffffffffffffff1690611dfa565b9889949195610cbf610cbb60208c0151151590565b1590565b8514610eca5787925b158514610eba5751965b858514610e9c57610dc26401000276a49a5b610db4610cf18251151590565b93610cff6020840151151590565b92610d4260608f610d269084015173ffffffffffffffffffffffffffffffffffffffff1690565b92015173ffffffffffffffffffffffffffffffffffffffff1690565b908e5196879533916020880194907fffffffffffffffffffffffffffffffffffffffff00000000000000000000000094856052989581958294151560f81b8a52151560f81b60018a015260601b16600288015260601b16601686015260601b16602a84015260601b16603e8201520190565b03601f19810183528261012d565b8851998a98899788957f128acb08000000000000000000000000000000000000000000000000000000008752600487016109fa565b0393165af1908115610e97575f905f92610e65575b5083610e19575b50505050565b610e289215610e5e57506109b3565b10610e36575f808080610e13565b7fc1328a53000000000000000000000000000000000000000000000000000000005f5260045ffd5b90506109b3565b9050610e89915060403d604011610e90575b610e81818361012d565b8101906109e4565b905f610e0c565b503d610e77565b610a3d565b610dc273fffd8963efd1fc6a506488495d951d5263988d259a610ce4565b610ec490516109b3565b96610cd2565b3092610cc8565b610eda90611583565b91610c4c565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26060860152610c42565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc285850152610bf4565b610f298351341461097f565b610bef565b7f35278d12000000000000000000000000000000000000000000000000000000005f5260045ffd5b610f83918015610f89575b604085015173ffffffffffffffffffffffffffffffffffffffff165b9161178c565b92610b5c565b50610fb66108ed610fb1604087015173ffffffffffffffffffffffffffffffffffffffff1690565b6116a0565b610f61565b919550610fe9918015610ff1575b606085015173ffffffffffffffffffffffffffffffffffffffff16610f7d565b935f80610b4b565b506110196108ed610fb1606087015173ffffffffffffffffffffffffffffffffffffffff1690565b610fc9565b61102d61090861104a9261068f565b73ffffffffffffffffffffffffffffffffffffffff166060860152565b5f610b41565b611081965061106161093782610707565b73ffffffffffffffffffffffffffffffffffffffff909116606087015296565b610afe565b6110956109086110b29261068f565b73ffffffffffffffffffffffffffffffffffffffff166040870152565b5f610acb565b6110e993506110c961093782610707565b73ffffffffffffffffffffffffffffffffffffffff909116604088015293565b610a8e565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc233036100fc57565b600435609a3560601c6024355f831315806111e2575b6111ba5761113460ae3560601c83611dfa565b928133036100fc576084355f1a15611195575050811561118c5761115783611eea565b6085355f1a61116557505050565b610164926111789215610e5e57506109b3565b61118181611f74565b60c23560601c6119f6565b61115781611eea565b6111ae9184156111b35785915b60863560601c9061198f565b611157565b83916111a2565b7f11157667000000000000000000000000000000000000000000000000000000005f5260045ffd5b505f811315611121565b5f915f917f65746800000000000000000000000000000000000000000000000000000000008114801561142a575b61140c577f757364630000000000000000000000000000000000000000000000000000000081146113ee577f7573647400000000000000000000000000000000000000000000000000000000811480156113c5575b6113a7577f64616900000000000000000000000000000000000000000000000000000000008114611389577f7765746800000000000000000000000000000000000000000000000000000000811461136b577f77627463000000000000000000000000000000000000000000000000000000008114908115611341575b8115611317575b506112fa57565b732260fac5e5542a773aa44fbcfedf7c193bc2c599925060089150565b7f626974636f696e000000000000000000000000000000000000000000000000009150145f6112f3565b7f6274630000000000000000000000000000000000000000000000000000000000811491506112ec565b5073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2925060129150565b50736b175474e89094c44da98b954eedeac495271d0f925060129150565b5073dac17f958d2ee523a2206206994597c13d831ec7925060069150565b507f7465746865720000000000000000000000000000000000000000000000000000811461126f565b5073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48925060069150565b5073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee925060129150565b507f6574686572000000000000000000000000000000000000000000000000000000811461121a565b908160041b91808304601014901517156109df57565b90600a820291808304600a14901517156109df57565b818102929181159184041417156109df57565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b9081518110156114d0570160200190565b611492565b60ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa99116019060ff82116109df57565b60ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc99116019060ff82116109df57565b60ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd09116019060ff82116109df57565b90600182018092116109df57565b919082018092116109df57565b90602a8251145f1461046d575f60025b602a81106115b6575073ffffffffffffffffffffffffffffffffffffffff169150565b906115c090611453565b6115fc6115f66115d084876114bf565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b60ff8116603081101580611695575b1561163157506001916116236108ed61162993611537565b90611576565b915b01611593565b60418110158061168a575b1561165a57506001916116236108ed61165493611506565b9161162b565b6061811015908161167e575b501561046d576001916116236108ed611654936114d5565b6066915011155f611666565b50604681111561163c565b50603981111561160b565b60208060ff9263313ce56760045260045f52815f5191620186a0fa601f3d1116602051021690565b604051906116d760208361012d565b5f8252565b604051906116eb60408361012d565b600382527f616c6c00000000000000000000000000000000000000000000000000000000006020830152565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd082019182116109df57565b919082039182116109df57565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146109df5760010190565b604d81116109df57600a0a90565b805160208201205f94939061179f6116dc565b6020815191012014611942575080515f905f925f5b8281106117fb575050506117d75750916117d16101d3929361177e565b9061147f565b908082106117e4575b5050565b6117f66101d39394926117d192611744565b61177e565b9091929661180c6115d083856114bf565b907fff0000000000000000000000000000000000000000000000000000000000000082167f300000000000000000000000000000000000000000000000000000000000000081101580611918575b156118a7575061187e899594939261187461188393611469565b9060f81c90611576565b611717565b97611893575b6001905b016117b4565b9361189f600191611751565b949050611889565b7f2e00000000000000000000000000000000000000000000000000000000000000919992509493929414908161190f575b50156118e7576001809361188d565b7f312a9f56000000000000000000000000000000000000000000000000000000005f5260045ffd5b9050155f6118d8565b507f390000000000000000000000000000000000000000000000000000000000000081111561185a565b929350505073ffffffffffffffffffffffffffffffffffffffff811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0361198457506101d3343331611576565b6101d390339061204d565b916040519360605260405260601b602c526f23b872dd000000000000000000000000600c5260205f6064601c82855af1908160015f511416156119d8575b50505f606052604052565b3b153d1710156119e9575f806119cd565b637939f4245f526004601cfd5b5f80809338935af115611a0557565b63b12d13eb5f526004601cfd5b90611a1c82610166565b611a29604051918261012d565b828152601f19611a398294610166565b0190602036910137565b60ff60209116019060ff82116109df57565b90611a608251611a12565b915f5b81518110156117e057807f4100000000000000000000000000000000000000000000000000000000000000611ac5611aa06115d0600195876114bf565b7fff000000000000000000000000000000000000000000000000000000000000001690565b101580611b48575b15611b2957611b15611aed611ae86115f66115d085886114bf565b611a43565b60f81b7fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a611b2182876114bf565b535b01611a63565b611b366115d082856114bf565b5f1a611b4282876114bf565b53611b23565b507f5a000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000611b986115d084876114bf565b161115611acd565b805190611bad6020610166565b90611bbb604051928361012d565b60208252611bc96020610166565b93601f196020840195013686375f94855b85871080611c97575b15611c8d577f20000000000000000000000000000000000000000000000000000000000000007fff00000000000000000000000000000000000000000000000000000000000000611c3489876114bf565b511614611c8d57611c81611c87917fff00000000000000000000000000000000000000000000000000000000000000611c6d8a886114bf565b51165f1a611c7b8a896114bf565b53611751565b96611751565b95611bda565b5051945092505050565b5060208710611be3565b8051600110156114d05760400190565b8051600210156114d05760600190565b8051600410156114d05760a00190565b8051600610156114d05760e00190565b80518210156114d05760209160051b010190565b611cfe816121ae565b805160058103611d52575090611d3d611d20611d1984611ca1565b5183612317565b91611d36611d30611d1986611cb1565b94611cc1565b5190612317565b9092611d476116c8565b9291906101d36116c8565b60070361046d57611d65611d1982611ca1565b611d91611d7b611d7484611cb1565b5185612317565b93611d36611d8b611d1986611cc1565b94611cd1565b9093611d9b6116c8565b93929190565b611daa816121ae565b9160048351145f1461046d578251600310156114d057611dce608084015183612317565b918351600110156114d057611df490611d36611dee604087015183612317565b95611cb1565b91929190565b9190915f73ffffffffffffffffffffffffffffffffffffffff841673ffffffffffffffffffffffffffffffffffffffff8316105f14611eb457506001925b611e428183612394565b803b611ead5750611e538183612485565b803b611ead5750611e6481836124cc565b91823b611ea757611e759250612513565b803b611ea3577f11157667000000000000000000000000000000000000000000000000000000005f5260045ffd5b9190565b50509190565b9150509190565b9290611e38565b3d15611ee5573d90611ecc82610166565b91611eda604051938461012d565b82523d5f602084013e565b606090565b5f8080809373c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af1611f0e611ebb565b5015611f1657565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f455448207772617070696e67206661696c6564000000000000000000000000006044820152fd5b5f809160405160208101917f2e1a7d4d000000000000000000000000000000000000000000000000000000008352602482015260248152611fb660448261012d565b51908273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc25af1611fd8611ebb565b5015611fe057565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f45544820756e7772617070696e67206661696c656400000000000000000000006044820152fd5b908160209103126100fc575190565b5f9190829160405173ffffffffffffffffffffffffffffffffffffffff60208201927f70a08231000000000000000000000000000000000000000000000000000000008452166024820152602481526120a760448261012d565b51915afa6120b3611ebb565b90156120cc57806020806101d39351830101910161203e565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f42616c616e636520636865636b206661696c65640000000000000000000000006044820152fd5b67ffffffffffffffff81116101505760051b60200190565b9061214c8261212a565b612159604051918261012d565b828152601f19612169829461212a565b015f5b81811061217857505050565b60405190604082019180831067ffffffffffffffff841117610150576020926040525f81525f838201528282860101520161216c565b9081519060015f5b8381106122a557506121c790612142565b915f905f905f5b81811061220157506121fe939495506121e5610155565b91825260208201526121f78286611ce1565b5283611ce1565b50565b7f20000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000006122506115d0848b6114bf565b161461225f575b6001016121ce565b91926122919061226d610155565b94855283602086015261227f81611751565b9461228a8289611ce1565b5286611ce1565b50600161229d83611568565b929050612257565b7f20000000000000000000000000000000000000000000000000000000000000007fff000000000000000000000000000000000000000000000000000000000000006122f46115d084896114bf565b1614612303575b6001016121b6565b9061230f600191611751565b9190506122fb565b91906020810151815181039081116109df5761233290611a12565b905f5b825181101561238d578151908082018092116109df577fff00000000000000000000000000000000000000000000000000000000000000612378600193886114bf565b51165f1a61238682866114bf565b5301612335565b5090925050565b610b22906101d39273ffffffffffffffffffffffffffffffffffffffff60405191816020840194168452166040820152610bb86060820152606081526123db60808261012d565b51902060405160208101917fff0000000000000000000000000000000000000000000000000000000000000083527f1f98431c8ad98523631ae4a59f267346ea31f984000000000000000000000000602183015260358201527fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5460558201526055815261246960758261012d565b51902073ffffffffffffffffffffffffffffffffffffffff1690565b610b22906101d39273ffffffffffffffffffffffffffffffffffffffff604051918160208401941684521660408201526101f46060820152606081526123db60808261012d565b610b22906101d39273ffffffffffffffffffffffffffffffffffffffff604051918160208401941684521660408201526127106060820152606081526123db60808261012d565b610b22906101d39273ffffffffffffffffffffffffffffffffffffffff6040519181602084019416845216604082015260646060820152606081526123db60808261012d56fea26469706673582212203c9c50923b9fb09a27acb84936521e0363b78acce37111fff72a7fd8336e7c3864736f6c634300081c0033", + "nonce": "0x920", "chainId": "0x1" }, "additionalContracts": [], @@ -22,31 +22,31 @@ "receipts": [ { "status": "0x1", - "cumulativeGasUsed": "0xf01e0", + "cumulativeGasUsed": "0x2038e0", "logs": [], "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "type": "0x2", - "transactionHash": "0x56cb1a990107354e36fc177d84eb1c324e5a40dedfb3654b8a49076ec4ac55fb", + "transactionHash": "0x5431050222143ce6c33282e86ccc9509ce2065ddbdc312434c62e6553189087a", "transactionIndex": "0x0", - "blockHash": "0x418aadfc8c5aa2e2538784fca50afac02e1439b89a78de8ef4a58916fc0f3700", - "blockNumber": "0x14bfbcf", - "gasUsed": "0xf01e0", - "effectiveGasPrice": "0x56f18f17", - "blobGasPrice": "0xcaa0f9d0", + "blockHash": "0x0147820ee03f59c8a8b6701ec8e2da597b9125bf29d1d74b42e3e5dc01188224", + "blockNumber": "0x1595f3d", + "gasUsed": "0x2038e0", + "effectiveGasPrice": "0x4c662f69", + "blobGasPrice": "0x1", "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", "to": null, - "contractAddress": "0x2ca60d89144d4cdf85da87af4fe12abf9265f28c" + "contractAddress": "0x7c28fc9709650d49c8d0aed2f6ece6b191f192a9" } ], "libraries": [], "pending": [], "returns": { "0": { - "internal_type": "contract IntentEngine", - "value": "0x2ca60d89144D4cdf85dA87af4FE12aBF9265F28C" + "internal_type": "contract SimpleIE", + "value": "0x7c28FC9709650D49c8d0aED2f6ece6b191F192a9" } }, - "timestamp": 1738475753, + "timestamp": 1749076830, "chain": 1, - "commit": "8204fea" + "commit": "05d3c79" } \ No newline at end of file diff --git a/cache/DeployTradeIntent.sol/1/run-1738490619.json b/cache/DeployTradeIntent.sol/1/run-1738490619.json new file mode 100644 index 0000000..3d489ae --- /dev/null +++ b/cache/DeployTradeIntent.sol/1/run-1738490619.json @@ -0,0 +1,7 @@ +{ + "transactions": [ + { + "rpc": "http://127.0.0.1:8545" + } + ] +} \ No newline at end of file diff --git a/cache/DeployTradeIntent.sol/1/run-1738491205.json b/cache/DeployTradeIntent.sol/1/run-1738491205.json new file mode 100644 index 0000000..3d489ae --- /dev/null +++ b/cache/DeployTradeIntent.sol/1/run-1738491205.json @@ -0,0 +1,7 @@ +{ + "transactions": [ + { + "rpc": "http://127.0.0.1:8545" + } + ] +} \ No newline at end of file diff --git a/cache/DeployTradeIntent.sol/1/run-1738495606.json b/cache/DeployTradeIntent.sol/1/run-1738495606.json new file mode 100644 index 0000000..3d489ae --- /dev/null +++ b/cache/DeployTradeIntent.sol/1/run-1738495606.json @@ -0,0 +1,7 @@ +{ + "transactions": [ + { + "rpc": "http://127.0.0.1:8545" + } + ] +} \ No newline at end of file diff --git a/cache/DeployTradeIntent.sol/1/run-1738503199.json b/cache/DeployTradeIntent.sol/1/run-1738503199.json new file mode 100644 index 0000000..3d489ae --- /dev/null +++ b/cache/DeployTradeIntent.sol/1/run-1738503199.json @@ -0,0 +1,7 @@ +{ + "transactions": [ + { + "rpc": "http://127.0.0.1:8545" + } + ] +} \ No newline at end of file diff --git a/cache/solidity-files-cache.json b/cache/solidity-files-cache.json index ebe4335..ec81c8f 100644 --- a/cache/solidity-files-cache.json +++ b/cache/solidity-files-cache.json @@ -1 +1 @@ -{"_format":"","paths":{"artifacts":"out","build_infos":"out/build-info","sources":"src","tests":"test","scripts":"script","libraries":["lib"]},"files":{"lib/forge-std/src/Base.sol":{"lastModificationDate":1738474223445,"contentHash":"ee13c050b1914464f1d3f90cde90204b","sourceName":"lib/forge-std/src/Base.sol","imports":["lib/forge-std/src/StdStorage.sol","lib/forge-std/src/Vm.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"CommonBase":{"0.8.28":{"default":{"path":"Base.sol/CommonBase.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}},"ScriptBase":{"0.8.28":{"default":{"path":"Base.sol/ScriptBase.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}},"TestBase":{"0.8.28":{"default":{"path":"Base.sol/TestBase.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}}},"seenByCompiler":true},"lib/forge-std/src/Script.sol":{"lastModificationDate":1738474223445,"contentHash":"ba325c778a7da8a21c2136aa32763c14","sourceName":"lib/forge-std/src/Script.sol","imports":["lib/forge-std/src/Base.sol","lib/forge-std/src/StdChains.sol","lib/forge-std/src/StdCheats.sol","lib/forge-std/src/StdJson.sol","lib/forge-std/src/StdMath.sol","lib/forge-std/src/StdStorage.sol","lib/forge-std/src/StdStyle.sol","lib/forge-std/src/StdUtils.sol","lib/forge-std/src/Vm.sol","lib/forge-std/src/console.sol","lib/forge-std/src/console2.sol","lib/forge-std/src/interfaces/IERC165.sol","lib/forge-std/src/interfaces/IERC20.sol","lib/forge-std/src/interfaces/IERC721.sol","lib/forge-std/src/interfaces/IMulticall3.sol","lib/forge-std/src/mocks/MockERC20.sol","lib/forge-std/src/mocks/MockERC721.sol","lib/forge-std/src/safeconsole.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"Script":{"0.8.28":{"default":{"path":"Script.sol/Script.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}}},"seenByCompiler":true},"lib/forge-std/src/StdChains.sol":{"lastModificationDate":1738474223446,"contentHash":"b039727c96bb3d5b9a59448fd16b1e0f","sourceName":"lib/forge-std/src/StdChains.sol","imports":["lib/forge-std/src/Vm.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"StdChains":{"0.8.28":{"default":{"path":"StdChains.sol/StdChains.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}}},"seenByCompiler":true},"lib/forge-std/src/StdCheats.sol":{"lastModificationDate":1738474223446,"contentHash":"96c712134b63f85d00461749d0c1611c","sourceName":"lib/forge-std/src/StdCheats.sol","imports":["lib/forge-std/src/StdStorage.sol","lib/forge-std/src/Vm.sol","lib/forge-std/src/console.sol","lib/forge-std/src/console2.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"StdCheats":{"0.8.28":{"default":{"path":"StdCheats.sol/StdCheats.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}},"StdCheatsSafe":{"0.8.28":{"default":{"path":"StdCheats.sol/StdCheatsSafe.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}}},"seenByCompiler":true},"lib/forge-std/src/StdJson.sol":{"lastModificationDate":1738474223473,"contentHash":"02209da5708eaee03e24a9c24a687370","sourceName":"lib/forge-std/src/StdJson.sol","imports":["lib/forge-std/src/Vm.sol"],"versionRequirement":">=0.6.0, <0.9.0","artifacts":{"stdJson":{"0.8.28":{"default":{"path":"StdJson.sol/stdJson.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}}},"seenByCompiler":true},"lib/forge-std/src/StdMath.sol":{"lastModificationDate":1738474223474,"contentHash":"9da8f453eba6bb98f3d75bc6822bfb29","sourceName":"lib/forge-std/src/StdMath.sol","imports":[],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"stdMath":{"0.8.28":{"default":{"path":"StdMath.sol/stdMath.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}}},"seenByCompiler":true},"lib/forge-std/src/StdStorage.sol":{"lastModificationDate":1738474223474,"contentHash":"ce68f6e336944f16d31351a47d0b19b8","sourceName":"lib/forge-std/src/StdStorage.sol","imports":["lib/forge-std/src/Vm.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"stdStorage":{"0.8.28":{"default":{"path":"StdStorage.sol/stdStorage.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}},"stdStorageSafe":{"0.8.28":{"default":{"path":"StdStorage.sol/stdStorageSafe.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}}},"seenByCompiler":true},"lib/forge-std/src/StdStyle.sol":{"lastModificationDate":1738474223475,"contentHash":"6281165a12aa639705c691fccefd855e","sourceName":"lib/forge-std/src/StdStyle.sol","imports":["lib/forge-std/src/Vm.sol"],"versionRequirement":">=0.4.22, <0.9.0","artifacts":{"StdStyle":{"0.8.28":{"default":{"path":"StdStyle.sol/StdStyle.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}}},"seenByCompiler":true},"lib/forge-std/src/StdUtils.sol":{"lastModificationDate":1738474223475,"contentHash":"b50717f17f251a2a96a5884c90add7bf","sourceName":"lib/forge-std/src/StdUtils.sol","imports":["lib/forge-std/src/Vm.sol","lib/forge-std/src/interfaces/IERC165.sol","lib/forge-std/src/interfaces/IERC20.sol","lib/forge-std/src/interfaces/IERC721.sol","lib/forge-std/src/interfaces/IMulticall3.sol","lib/forge-std/src/mocks/MockERC20.sol","lib/forge-std/src/mocks/MockERC721.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"StdUtils":{"0.8.28":{"default":{"path":"StdUtils.sol/StdUtils.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}}},"seenByCompiler":true},"lib/forge-std/src/Vm.sol":{"lastModificationDate":1738474223476,"contentHash":"707e31ca7be04756b2a1b853d9c110ac","sourceName":"lib/forge-std/src/Vm.sol","imports":[],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"Vm":{"0.8.28":{"default":{"path":"Vm.sol/Vm.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}},"VmSafe":{"0.8.28":{"default":{"path":"Vm.sol/VmSafe.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}}},"seenByCompiler":true},"lib/forge-std/src/console.sol":{"lastModificationDate":1738474223477,"contentHash":"ce19a9e49945b42118379ff99d853c05","sourceName":"lib/forge-std/src/console.sol","imports":[],"versionRequirement":">=0.4.22, <0.9.0","artifacts":{"console":{"0.8.28":{"default":{"path":"console.sol/console.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}}},"seenByCompiler":true},"lib/forge-std/src/console2.sol":{"lastModificationDate":1738474223477,"contentHash":"f65ad21034b111e70fb5342d5771efcd","sourceName":"lib/forge-std/src/console2.sol","imports":["lib/forge-std/src/console.sol"],"versionRequirement":">=0.4.22, <0.9.0","artifacts":{},"seenByCompiler":true},"lib/forge-std/src/interfaces/IERC165.sol":{"lastModificationDate":1738474223478,"contentHash":"90fe5e2e3ed432d6f3b408e7c9e8a739","sourceName":"lib/forge-std/src/interfaces/IERC165.sol","imports":[],"versionRequirement":">=0.6.2","artifacts":{"IERC165":{"0.8.28":{"default":{"path":"IERC165.sol/IERC165.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}}},"seenByCompiler":true},"lib/forge-std/src/interfaces/IERC20.sol":{"lastModificationDate":1738474223478,"contentHash":"8099161d518e5862a76750349d58e801","sourceName":"lib/forge-std/src/interfaces/IERC20.sol","imports":[],"versionRequirement":">=0.6.2","artifacts":{"IERC20":{"0.8.28":{"default":{"path":"interfaces/IERC20.sol/IERC20.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}}},"seenByCompiler":true},"lib/forge-std/src/interfaces/IERC721.sol":{"lastModificationDate":1738474223479,"contentHash":"efc26e7f9a2f76b68088c8760ceae2dc","sourceName":"lib/forge-std/src/interfaces/IERC721.sol","imports":["lib/forge-std/src/interfaces/IERC165.sol"],"versionRequirement":">=0.6.2","artifacts":{"IERC721":{"0.8.28":{"default":{"path":"IERC721.sol/IERC721.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}},"IERC721Enumerable":{"0.8.28":{"default":{"path":"IERC721.sol/IERC721Enumerable.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}},"IERC721Metadata":{"0.8.28":{"default":{"path":"IERC721.sol/IERC721Metadata.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}},"IERC721TokenReceiver":{"0.8.28":{"default":{"path":"IERC721.sol/IERC721TokenReceiver.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}}},"seenByCompiler":true},"lib/forge-std/src/interfaces/IMulticall3.sol":{"lastModificationDate":1738474223479,"contentHash":"7b131ca1ca32ef6378b7b9ad5488b901","sourceName":"lib/forge-std/src/interfaces/IMulticall3.sol","imports":[],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"IMulticall3":{"0.8.28":{"default":{"path":"IMulticall3.sol/IMulticall3.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}}},"seenByCompiler":true},"lib/forge-std/src/mocks/MockERC20.sol":{"lastModificationDate":1738474223479,"contentHash":"8e14d63e81e1d54dbc2d44df38ae9dec","sourceName":"lib/forge-std/src/mocks/MockERC20.sol","imports":["lib/forge-std/src/interfaces/IERC20.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"MockERC20":{"0.8.28":{"default":{"path":"MockERC20.sol/MockERC20.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}}},"seenByCompiler":true},"lib/forge-std/src/mocks/MockERC721.sol":{"lastModificationDate":1738474223480,"contentHash":"e91cd9dba7f88f03710c56a347d89d1e","sourceName":"lib/forge-std/src/mocks/MockERC721.sol","imports":["lib/forge-std/src/interfaces/IERC165.sol","lib/forge-std/src/interfaces/IERC721.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"MockERC721":{"0.8.28":{"default":{"path":"MockERC721.sol/MockERC721.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}}},"seenByCompiler":true},"lib/forge-std/src/safeconsole.sol":{"lastModificationDate":1738474223480,"contentHash":"1445aa2f47000e212173e0cefd6c7a77","sourceName":"lib/forge-std/src/safeconsole.sol","imports":[],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"safeconsole":{"0.8.28":{"default":{"path":"safeconsole.sol/safeconsole.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}}},"seenByCompiler":true},"lib/solady/src/utils/MetadataReaderLib.sol":{"lastModificationDate":1738474223517,"contentHash":"05b805166ce5f4cdf2f552e5a87d7243","sourceName":"lib/solady/src/utils/MetadataReaderLib.sol","imports":[],"versionRequirement":"^0.8.4","artifacts":{"MetadataReaderLib":{"0.8.28":{"default":{"path":"MetadataReaderLib.sol/MetadataReaderLib.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}}},"seenByCompiler":true},"lib/solady/src/utils/SafeTransferLib.sol":{"lastModificationDate":1738474223519,"contentHash":"3c77f8875c8385333ee7702c6c829954","sourceName":"lib/solady/src/utils/SafeTransferLib.sol","imports":[],"versionRequirement":"^0.8.4","artifacts":{"SafeTransferLib":{"0.8.28":{"default":{"path":"SafeTransferLib.sol/SafeTransferLib.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}}},"seenByCompiler":true},"script/DeployTradeIntent.sol":{"lastModificationDate":1738475666810,"contentHash":"1154d548615e2361cb7e58103ed62f97","sourceName":"script/DeployTradeIntent.sol","imports":["lib/forge-std/src/Base.sol","lib/forge-std/src/Script.sol","lib/forge-std/src/StdChains.sol","lib/forge-std/src/StdCheats.sol","lib/forge-std/src/StdJson.sol","lib/forge-std/src/StdMath.sol","lib/forge-std/src/StdStorage.sol","lib/forge-std/src/StdStyle.sol","lib/forge-std/src/StdUtils.sol","lib/forge-std/src/Vm.sol","lib/forge-std/src/console.sol","lib/forge-std/src/console2.sol","lib/forge-std/src/interfaces/IERC165.sol","lib/forge-std/src/interfaces/IERC20.sol","lib/forge-std/src/interfaces/IERC721.sol","lib/forge-std/src/interfaces/IMulticall3.sol","lib/forge-std/src/mocks/MockERC20.sol","lib/forge-std/src/mocks/MockERC721.sol","lib/forge-std/src/safeconsole.sol","src/IERC20.sol","src/IUniswap.sol","src/IntentEngineTrade.sol","src/UniswapRegistry.sol"],"versionRequirement":"^0.8.17","artifacts":{"DeployTradeIntent":{"0.8.28":{"default":{"path":"DeployTradeIntent.sol/DeployTradeIntent.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}}},"seenByCompiler":true},"src/CompoundETHManager2.sol":{"lastModificationDate":1738473588069,"contentHash":"6c2dd55e16e2c5f9bef9c6ae261b2bc0","sourceName":"src/CompoundETHManager2.sol","imports":[],"versionRequirement":"^0.8.17","artifacts":{"CompoundETHManager":{"0.8.28":{"default":{"path":"CompoundETHManager2.sol/CompoundETHManager.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}},"ICEth":{"0.8.28":{"default":{"path":"CompoundETHManager2.sol/ICEth.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}}},"seenByCompiler":true},"src/CompoundIntents.sol":{"lastModificationDate":1738473588069,"contentHash":"5ff78ec07714f3ebd8ac895a0e2c379d","sourceName":"src/CompoundIntents.sol","imports":["src/CompoundETHManager2.sol"],"versionRequirement":"^0.8.17","artifacts":{"CompoundIntents":{"0.8.28":{"default":{"path":"CompoundIntents.sol/CompoundIntents.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}}},"seenByCompiler":true},"src/IERC20.sol":{"lastModificationDate":1738473588069,"contentHash":"e8ec63056d9480976ec97e08842b4384","sourceName":"src/IERC20.sol","imports":[],"versionRequirement":"^0.8.20","artifacts":{"IERC20":{"0.8.28":{"default":{"path":"IERC20.sol/IERC20.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}}},"seenByCompiler":true},"src/IEth.sol":{"lastModificationDate":1738473588069,"contentHash":"879e5103d1b8edcd4df45a063cfd70a5","sourceName":"src/IEth.sol","imports":["lib/solady/src/utils/MetadataReaderLib.sol","lib/solady/src/utils/SafeTransferLib.sol"],"versionRequirement":"^0.8.19","artifacts":{"IENSHelper":{"0.8.28":{"default":{"path":"IEth.sol/IENSHelper.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}},"IETH":{"0.8.28":{"default":{"path":"IEth.sol/IETH.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}},"IEscrows":{"0.8.28":{"default":{"path":"IEth.sol/IEscrows.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}},"IExecutor":{"0.8.28":{"default":{"path":"IEth.sol/IExecutor.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}},"ISwapRouter":{"0.8.28":{"default":{"path":"IEth.sol/ISwapRouter.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}},"IToken":{"0.8.28":{"default":{"path":"IEth.sol/IToken.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}}},"seenByCompiler":true},"src/IUniswap.sol":{"lastModificationDate":1738473588069,"contentHash":"11a653812b0fdb68843887945fcc6db5","sourceName":"src/IUniswap.sol","imports":[],"versionRequirement":"^0.8.17","artifacts":{"IUniswap":{"0.8.28":{"default":{"path":"IUniswap.sol/IUniswap.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}}},"seenByCompiler":true},"src/IntentEngineTrade.sol":{"lastModificationDate":1738473588069,"contentHash":"0dc143f4ac69ab14c4d99bb595cbc679","sourceName":"src/IntentEngineTrade.sol","imports":["src/IERC20.sol","src/IUniswap.sol","src/UniswapRegistry.sol"],"versionRequirement":"^0.8.17","artifacts":{"IntentEngine":{"0.8.28":{"default":{"path":"IntentEngineTrade.sol/IntentEngine.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}}},"seenByCompiler":true},"src/UniswapRegistry.sol":{"lastModificationDate":1738473588070,"contentHash":"ffc08685b5f86d231bcfa0b633f0baf7","sourceName":"src/UniswapRegistry.sol","imports":[],"versionRequirement":"^0.8.17","artifacts":{"UniswapRegistry":{"0.8.28":{"default":{"path":"UniswapRegistry.sol/UniswapRegistry.json","build_id":"58c984fa81f30e09c0163b31124a40e6"}}}},"seenByCompiler":true}},"builds":["58c984fa81f30e09c0163b31124a40e6"],"profiles":{"default":{"solc":{"optimizer":{"enabled":true,"runs":9999},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode.object","evm.bytecode.sourceMap","evm.bytecode.linkReferences","evm.deployedBytecode.object","evm.deployedBytecode.sourceMap","evm.deployedBytecode.linkReferences","evm.deployedBytecode.immutableReferences","evm.methodIdentifiers","metadata"]}},"evmVersion":"cancun","viaIR":true,"libraries":{}},"vyper":{"evmVersion":"cancun","outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode"]}}}}}} \ No newline at end of file +{"_format":"","paths":{"artifacts":"out","build_infos":"out/build-info","sources":"src","tests":"test","scripts":"script","libraries":["lib","node_modules"]},"files":{"lib/chainlink-local/src/ccip/BurnMintERC677Helper.sol":{"lastModificationDate":1747768472703,"contentHash":"209ba77f901c6c33","interfaceReprHash":null,"sourceName":"lib/chainlink-local/src/ccip/BurnMintERC677Helper.sol","imports":["node_modules/@chainlink/contracts-ccip/src/v0.8/shared/access/ConfirmedOwner.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/access/ConfirmedOwnerWithProposal.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/access/OwnerIsCreator.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/interfaces/IERC677Receiver.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/interfaces/IOwnable.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/token/ERC20/IBurnMintERC20.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/token/ERC677/BurnMintERC677.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/token/ERC677/ERC677.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/token/ERC677/IERC677.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/ERC20.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/extensions/ERC20Burnable.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/utils/Context.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/utils/structs/EnumerableSet.sol"],"versionRequirement":"^0.8.19","artifacts":{"BurnMintERC677Helper":{"0.8.28":{"default":{"path":"BurnMintERC677Helper.sol/BurnMintERC677Helper.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"lib/chainlink-local/src/ccip/CCIPLocalSimulator.sol":{"lastModificationDate":1747768472703,"contentHash":"b1566342bdbd8cb6","interfaceReprHash":null,"sourceName":"lib/chainlink-local/src/ccip/CCIPLocalSimulator.sol","imports":["lib/chainlink-local/src/ccip/BurnMintERC677Helper.sol","lib/chainlink-local/src/shared/LinkToken.sol","lib/chainlink-local/src/shared/WETH9.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IAny2EVMMessageReceiver.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IGetCCIPAdmin.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IOwner.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IRouter.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IRouterClient.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/libraries/Client.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/libraries/Internal.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/libraries/MerkleMultiProof.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/test/mocks/MockRouter.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/access/ConfirmedOwner.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/access/ConfirmedOwnerWithProposal.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/access/OwnerIsCreator.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/call/CallWithExactGas.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/interfaces/IERC677Receiver.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/interfaces/IOwnable.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/token/ERC20/IBurnMintERC20.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/token/ERC677/BurnMintERC677.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/token/ERC677/ERC677.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/token/ERC677/IERC677.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/ERC20.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/extensions/ERC20Burnable.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/extensions/draft-IERC20Permit.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/utils/Address.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/utils/Context.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/utils/structs/EnumerableSet.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/access/AccessControl.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/access/IAccessControl.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/utils/Context.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/utils/introspection/ERC165.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/utils/introspection/ERC165Checker.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/utils/introspection/IERC165.sol"],"versionRequirement":"^0.8.19","artifacts":{"CCIPLocalSimulator":{"0.8.28":{"default":{"path":"CCIPLocalSimulator.sol/CCIPLocalSimulator.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"lib/chainlink-local/src/ccip/CCIPLocalSimulatorFork.sol":{"lastModificationDate":1747768472703,"contentHash":"17d64a467d93ac73","interfaceReprHash":null,"sourceName":"lib/chainlink-local/src/ccip/CCIPLocalSimulatorFork.sol","imports":["lib/chainlink-local/src/ccip/Register.sol","lib/forge-std/src/Base.sol","lib/forge-std/src/StdAssertions.sol","lib/forge-std/src/StdChains.sol","lib/forge-std/src/StdCheats.sol","lib/forge-std/src/StdError.sol","lib/forge-std/src/StdInvariant.sol","lib/forge-std/src/StdJson.sol","lib/forge-std/src/StdMath.sol","lib/forge-std/src/StdStorage.sol","lib/forge-std/src/StdStyle.sol","lib/forge-std/src/StdToml.sol","lib/forge-std/src/StdUtils.sol","lib/forge-std/src/Test.sol","lib/forge-std/src/Vm.sol","lib/forge-std/src/console.sol","lib/forge-std/src/console2.sol","lib/forge-std/src/interfaces/IERC165.sol","lib/forge-std/src/interfaces/IERC20.sol","lib/forge-std/src/interfaces/IERC721.sol","lib/forge-std/src/interfaces/IMulticall3.sol","lib/forge-std/src/mocks/MockERC20.sol","lib/forge-std/src/mocks/MockERC721.sol","lib/forge-std/src/safeconsole.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/libraries/Client.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/libraries/Internal.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/libraries/MerkleMultiProof.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"],"versionRequirement":"^0.8.19","artifacts":{"CCIPLocalSimulatorFork":{"0.8.28":{"default":{"path":"CCIPLocalSimulatorFork.sol/CCIPLocalSimulatorFork.json","build_id":"74cb76a3456a099e"}}},"IEVM2EVMOffRampFork":{"0.8.28":{"default":{"path":"CCIPLocalSimulatorFork.sol/IEVM2EVMOffRampFork.json","build_id":"74cb76a3456a099e"}}},"IRouterFork":{"0.8.28":{"default":{"path":"CCIPLocalSimulatorFork.sol/IRouterFork.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"lib/chainlink-local/src/ccip/Register.sol":{"lastModificationDate":1747768472703,"contentHash":"388a9b40b5fee7de","interfaceReprHash":null,"sourceName":"lib/chainlink-local/src/ccip/Register.sol","imports":[],"versionRequirement":"^0.8.0","artifacts":{"Register":{"0.8.28":{"default":{"path":"Register.sol/Register.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"lib/chainlink-local/src/shared/LinkToken.sol":{"lastModificationDate":1747768472704,"contentHash":"2680e0bb4447a2dc","interfaceReprHash":null,"sourceName":"lib/chainlink-local/src/shared/LinkToken.sol","imports":["node_modules/@chainlink/contracts-ccip/src/v0.8/shared/interfaces/IERC677Receiver.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/token/ERC677/ERC677.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/token/ERC677/IERC677.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/ERC20.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/utils/Context.sol"],"versionRequirement":"^0.8.19","artifacts":{"LinkToken":{"0.8.28":{"default":{"path":"LinkToken.sol/LinkToken.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"lib/chainlink-local/src/shared/WETH9.sol":{"lastModificationDate":1747768472704,"contentHash":"c0f29896c70d10f5","interfaceReprHash":null,"sourceName":"lib/chainlink-local/src/shared/WETH9.sol","imports":[],"versionRequirement":"^0.8.19","artifacts":{"WETH9":{"0.8.28":{"default":{"path":"WETH9.sol/WETH9.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"lib/forge-std/src/Base.sol":{"lastModificationDate":1747511394313,"contentHash":"6f3a6f93872b8615","interfaceReprHash":null,"sourceName":"lib/forge-std/src/Base.sol","imports":["lib/forge-std/src/StdStorage.sol","lib/forge-std/src/Vm.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"CommonBase":{"0.8.28":{"default":{"path":"Base.sol/CommonBase.json","build_id":"74cb76a3456a099e"}}},"ScriptBase":{"0.8.28":{"default":{"path":"Base.sol/ScriptBase.json","build_id":"74cb76a3456a099e"}}},"TestBase":{"0.8.28":{"default":{"path":"Base.sol/TestBase.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"lib/forge-std/src/Script.sol":{"lastModificationDate":1747511394313,"contentHash":"19ad35825bea6fa0","interfaceReprHash":null,"sourceName":"lib/forge-std/src/Script.sol","imports":["lib/forge-std/src/Base.sol","lib/forge-std/src/StdChains.sol","lib/forge-std/src/StdCheats.sol","lib/forge-std/src/StdJson.sol","lib/forge-std/src/StdMath.sol","lib/forge-std/src/StdStorage.sol","lib/forge-std/src/StdStyle.sol","lib/forge-std/src/StdUtils.sol","lib/forge-std/src/Vm.sol","lib/forge-std/src/console.sol","lib/forge-std/src/console2.sol","lib/forge-std/src/interfaces/IERC165.sol","lib/forge-std/src/interfaces/IERC20.sol","lib/forge-std/src/interfaces/IERC721.sol","lib/forge-std/src/interfaces/IMulticall3.sol","lib/forge-std/src/mocks/MockERC20.sol","lib/forge-std/src/mocks/MockERC721.sol","lib/forge-std/src/safeconsole.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"Script":{"0.8.28":{"default":{"path":"Script.sol/Script.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"lib/forge-std/src/StdAssertions.sol":{"lastModificationDate":1747511394313,"contentHash":"e29aa8aa08237766","interfaceReprHash":null,"sourceName":"lib/forge-std/src/StdAssertions.sol","imports":["lib/forge-std/src/Vm.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"StdAssertions":{"0.8.28":{"default":{"path":"StdAssertions.sol/StdAssertions.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"lib/forge-std/src/StdChains.sol":{"lastModificationDate":1747511394313,"contentHash":"ff4df795b838b25f","interfaceReprHash":null,"sourceName":"lib/forge-std/src/StdChains.sol","imports":["lib/forge-std/src/Vm.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"StdChains":{"0.8.28":{"default":{"path":"StdChains.sol/StdChains.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"lib/forge-std/src/StdCheats.sol":{"lastModificationDate":1747511394313,"contentHash":"bc5736ed4e6a9ad4","interfaceReprHash":null,"sourceName":"lib/forge-std/src/StdCheats.sol","imports":["lib/forge-std/src/StdStorage.sol","lib/forge-std/src/Vm.sol","lib/forge-std/src/console.sol","lib/forge-std/src/console2.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"StdCheats":{"0.8.28":{"default":{"path":"StdCheats.sol/StdCheats.json","build_id":"74cb76a3456a099e"}}},"StdCheatsSafe":{"0.8.28":{"default":{"path":"StdCheats.sol/StdCheatsSafe.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"lib/forge-std/src/StdError.sol":{"lastModificationDate":1747511394313,"contentHash":"a1a86c7115e2cdf3","interfaceReprHash":null,"sourceName":"lib/forge-std/src/StdError.sol","imports":[],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"stdError":{"0.8.28":{"default":{"path":"StdError.sol/stdError.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"lib/forge-std/src/StdInvariant.sol":{"lastModificationDate":1747511394313,"contentHash":"0111ef959dff6f54","interfaceReprHash":null,"sourceName":"lib/forge-std/src/StdInvariant.sol","imports":[],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"StdInvariant":{"0.8.28":{"default":{"path":"StdInvariant.sol/StdInvariant.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"lib/forge-std/src/StdJson.sol":{"lastModificationDate":1747511394314,"contentHash":"5fb1b35c8fb281fd","interfaceReprHash":null,"sourceName":"lib/forge-std/src/StdJson.sol","imports":["lib/forge-std/src/Vm.sol"],"versionRequirement":">=0.6.0, <0.9.0","artifacts":{"stdJson":{"0.8.28":{"default":{"path":"StdJson.sol/stdJson.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"lib/forge-std/src/StdMath.sol":{"lastModificationDate":1747511394314,"contentHash":"72584abebada1e7a","interfaceReprHash":null,"sourceName":"lib/forge-std/src/StdMath.sol","imports":[],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"stdMath":{"0.8.28":{"default":{"path":"StdMath.sol/stdMath.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"lib/forge-std/src/StdStorage.sol":{"lastModificationDate":1747511394314,"contentHash":"c05daa9a55282c5b","interfaceReprHash":null,"sourceName":"lib/forge-std/src/StdStorage.sol","imports":["lib/forge-std/src/Vm.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"stdStorage":{"0.8.28":{"default":{"path":"StdStorage.sol/stdStorage.json","build_id":"74cb76a3456a099e"}}},"stdStorageSafe":{"0.8.28":{"default":{"path":"StdStorage.sol/stdStorageSafe.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"lib/forge-std/src/StdStyle.sol":{"lastModificationDate":1747511394314,"contentHash":"ee166ef95092736e","interfaceReprHash":null,"sourceName":"lib/forge-std/src/StdStyle.sol","imports":["lib/forge-std/src/Vm.sol"],"versionRequirement":">=0.4.22, <0.9.0","artifacts":{"StdStyle":{"0.8.28":{"default":{"path":"StdStyle.sol/StdStyle.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"lib/forge-std/src/StdToml.sol":{"lastModificationDate":1747511394314,"contentHash":"fc667e4ecb7fa86c","interfaceReprHash":null,"sourceName":"lib/forge-std/src/StdToml.sol","imports":["lib/forge-std/src/Vm.sol"],"versionRequirement":">=0.6.0, <0.9.0","artifacts":{"stdToml":{"0.8.28":{"default":{"path":"StdToml.sol/stdToml.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"lib/forge-std/src/StdUtils.sol":{"lastModificationDate":1747511394314,"contentHash":"d57561738cb734cf","interfaceReprHash":null,"sourceName":"lib/forge-std/src/StdUtils.sol","imports":["lib/forge-std/src/Vm.sol","lib/forge-std/src/interfaces/IERC165.sol","lib/forge-std/src/interfaces/IERC20.sol","lib/forge-std/src/interfaces/IERC721.sol","lib/forge-std/src/interfaces/IMulticall3.sol","lib/forge-std/src/mocks/MockERC20.sol","lib/forge-std/src/mocks/MockERC721.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"StdUtils":{"0.8.28":{"default":{"path":"StdUtils.sol/StdUtils.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"lib/forge-std/src/Test.sol":{"lastModificationDate":1747511394314,"contentHash":"a18f53966ac7b768","interfaceReprHash":null,"sourceName":"lib/forge-std/src/Test.sol","imports":["lib/forge-std/src/Base.sol","lib/forge-std/src/StdAssertions.sol","lib/forge-std/src/StdChains.sol","lib/forge-std/src/StdCheats.sol","lib/forge-std/src/StdError.sol","lib/forge-std/src/StdInvariant.sol","lib/forge-std/src/StdJson.sol","lib/forge-std/src/StdMath.sol","lib/forge-std/src/StdStorage.sol","lib/forge-std/src/StdStyle.sol","lib/forge-std/src/StdToml.sol","lib/forge-std/src/StdUtils.sol","lib/forge-std/src/Vm.sol","lib/forge-std/src/console.sol","lib/forge-std/src/console2.sol","lib/forge-std/src/interfaces/IERC165.sol","lib/forge-std/src/interfaces/IERC20.sol","lib/forge-std/src/interfaces/IERC721.sol","lib/forge-std/src/interfaces/IMulticall3.sol","lib/forge-std/src/mocks/MockERC20.sol","lib/forge-std/src/mocks/MockERC721.sol","lib/forge-std/src/safeconsole.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"Test":{"0.8.28":{"default":{"path":"Test.sol/Test.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"lib/forge-std/src/Vm.sol":{"lastModificationDate":1747511394314,"contentHash":"661af5a30b0b3d73","interfaceReprHash":null,"sourceName":"lib/forge-std/src/Vm.sol","imports":[],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"Vm":{"0.8.28":{"default":{"path":"Vm.sol/Vm.json","build_id":"74cb76a3456a099e"}}},"VmSafe":{"0.8.28":{"default":{"path":"Vm.sol/VmSafe.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"lib/forge-std/src/console.sol":{"lastModificationDate":1747511394315,"contentHash":"bae85493a76fb054","interfaceReprHash":null,"sourceName":"lib/forge-std/src/console.sol","imports":[],"versionRequirement":">=0.4.22, <0.9.0","artifacts":{"console":{"0.8.28":{"default":{"path":"console.sol/console.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"lib/forge-std/src/console2.sol":{"lastModificationDate":1747511394315,"contentHash":"49a7da3dfc404603","interfaceReprHash":null,"sourceName":"lib/forge-std/src/console2.sol","imports":["lib/forge-std/src/console.sol"],"versionRequirement":">=0.4.22, <0.9.0","artifacts":{},"seenByCompiler":true},"lib/forge-std/src/interfaces/IERC165.sol":{"lastModificationDate":1747511394315,"contentHash":"32018de4ee034f09","interfaceReprHash":null,"sourceName":"lib/forge-std/src/interfaces/IERC165.sol","imports":[],"versionRequirement":">=0.6.2","artifacts":{"IERC165":{"0.8.28":{"default":{"path":"IERC165.sol/IERC165.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"lib/forge-std/src/interfaces/IERC20.sol":{"lastModificationDate":1747511394315,"contentHash":"776150aa4a93e925","interfaceReprHash":null,"sourceName":"lib/forge-std/src/interfaces/IERC20.sol","imports":[],"versionRequirement":">=0.6.2","artifacts":{"IERC20":{"0.8.28":{"default":{"path":"interfaces/IERC20.sol/IERC20.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"lib/forge-std/src/interfaces/IERC721.sol":{"lastModificationDate":1747511394316,"contentHash":"a4a12cc0c6148262","interfaceReprHash":null,"sourceName":"lib/forge-std/src/interfaces/IERC721.sol","imports":["lib/forge-std/src/interfaces/IERC165.sol"],"versionRequirement":">=0.6.2","artifacts":{"IERC721":{"0.8.28":{"default":{"path":"IERC721.sol/IERC721.json","build_id":"74cb76a3456a099e"}}},"IERC721Enumerable":{"0.8.28":{"default":{"path":"IERC721.sol/IERC721Enumerable.json","build_id":"74cb76a3456a099e"}}},"IERC721Metadata":{"0.8.28":{"default":{"path":"IERC721.sol/IERC721Metadata.json","build_id":"74cb76a3456a099e"}}},"IERC721TokenReceiver":{"0.8.28":{"default":{"path":"IERC721.sol/IERC721TokenReceiver.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"lib/forge-std/src/interfaces/IMulticall3.sol":{"lastModificationDate":1747511394316,"contentHash":"b680a332ebf10901","interfaceReprHash":null,"sourceName":"lib/forge-std/src/interfaces/IMulticall3.sol","imports":[],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"IMulticall3":{"0.8.28":{"default":{"path":"IMulticall3.sol/IMulticall3.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"lib/forge-std/src/mocks/MockERC20.sol":{"lastModificationDate":1747511394316,"contentHash":"91ed77cb7e32725c","interfaceReprHash":null,"sourceName":"lib/forge-std/src/mocks/MockERC20.sol","imports":["lib/forge-std/src/interfaces/IERC20.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"MockERC20":{"0.8.28":{"default":{"path":"MockERC20.sol/MockERC20.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"lib/forge-std/src/mocks/MockERC721.sol":{"lastModificationDate":1747511394316,"contentHash":"ce132f021987aaa3","interfaceReprHash":null,"sourceName":"lib/forge-std/src/mocks/MockERC721.sol","imports":["lib/forge-std/src/interfaces/IERC165.sol","lib/forge-std/src/interfaces/IERC721.sol"],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"MockERC721":{"0.8.28":{"default":{"path":"MockERC721.sol/MockERC721.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"lib/forge-std/src/safeconsole.sol":{"lastModificationDate":1747511394316,"contentHash":"621653b34a6691ea","interfaceReprHash":null,"sourceName":"lib/forge-std/src/safeconsole.sol","imports":[],"versionRequirement":">=0.6.2, <0.9.0","artifacts":{"safeconsole":{"0.8.28":{"default":{"path":"safeconsole.sol/safeconsole.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"lib/solady/src/utils/MetadataReaderLib.sol":{"lastModificationDate":1747511394337,"contentHash":"feaad9ceda616f89","interfaceReprHash":null,"sourceName":"lib/solady/src/utils/MetadataReaderLib.sol","imports":[],"versionRequirement":"^0.8.4","artifacts":{"MetadataReaderLib":{"0.8.28":{"default":{"path":"MetadataReaderLib.sol/MetadataReaderLib.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"lib/solady/src/utils/ReentrancyGuard.sol":{"lastModificationDate":1747511394337,"contentHash":"3aac10fe6191dfa5","interfaceReprHash":null,"sourceName":"lib/solady/src/utils/ReentrancyGuard.sol","imports":[],"versionRequirement":"^0.8.4","artifacts":{"ReentrancyGuard":{"0.8.28":{"default":{"path":"ReentrancyGuard.sol/ReentrancyGuard.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"lib/solady/src/utils/SafeTransferLib.sol":{"lastModificationDate":1747511394337,"contentHash":"8baf2bd7c314cf21","interfaceReprHash":null,"sourceName":"lib/solady/src/utils/SafeTransferLib.sol","imports":[],"versionRequirement":"^0.8.4","artifacts":{"SafeTransferLib":{"0.8.28":{"default":{"path":"SafeTransferLib.sol/SafeTransferLib.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IAny2EVMMessageReceiver.sol":{"lastModificationDate":1747773683746,"contentHash":"871447b42fe459d7","interfaceReprHash":null,"sourceName":"node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IAny2EVMMessageReceiver.sol","imports":["node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/libraries/Client.sol"],"versionRequirement":"^0.8.0","artifacts":{"IAny2EVMMessageReceiver":{"0.8.28":{"default":{"path":"IAny2EVMMessageReceiver.sol/IAny2EVMMessageReceiver.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IGetCCIPAdmin.sol":{"lastModificationDate":1747773683757,"contentHash":"7b6868839d54429b","interfaceReprHash":null,"sourceName":"node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IGetCCIPAdmin.sol","imports":[],"versionRequirement":"^0.8.0","artifacts":{"IGetCCIPAdmin":{"0.8.28":{"default":{"path":"IGetCCIPAdmin.sol/IGetCCIPAdmin.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IOwner.sol":{"lastModificationDate":1747773683765,"contentHash":"d07e6bf2193637e7","interfaceReprHash":null,"sourceName":"node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IOwner.sol","imports":[],"versionRequirement":"^0.8.0","artifacts":{"IOwner":{"0.8.28":{"default":{"path":"IOwner.sol/IOwner.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IRouter.sol":{"lastModificationDate":1747773683780,"contentHash":"aa707a45b0723faf","interfaceReprHash":null,"sourceName":"node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IRouter.sol","imports":["node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/libraries/Client.sol"],"versionRequirement":"^0.8.0","artifacts":{"IRouter":{"0.8.28":{"default":{"path":"IRouter.sol/IRouter.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IRouterClient.sol":{"lastModificationDate":1747773683783,"contentHash":"d0e220877b1594fe","interfaceReprHash":null,"sourceName":"node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IRouterClient.sol","imports":["node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/libraries/Client.sol"],"versionRequirement":"^0.8.4","artifacts":{"IRouterClient":{"0.8.28":{"default":{"path":"IRouterClient.sol/IRouterClient.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/libraries/Client.sol":{"lastModificationDate":1747773683602,"contentHash":"60f8cc51ed9c3017","interfaceReprHash":null,"sourceName":"node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/libraries/Client.sol","imports":[],"versionRequirement":"^0.8.0","artifacts":{"Client":{"0.8.28":{"default":{"path":"Client.sol/Client.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/libraries/Internal.sol":{"lastModificationDate":1747773683764,"contentHash":"8db87764a38263b2","interfaceReprHash":null,"sourceName":"node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/libraries/Internal.sol","imports":["node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/libraries/Client.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/libraries/MerkleMultiProof.sol"],"versionRequirement":"^0.8.4","artifacts":{"Internal":{"0.8.28":{"default":{"path":"Internal.sol/Internal.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/libraries/MerkleMultiProof.sol":{"lastModificationDate":1747773683853,"contentHash":"c776cda1699601f6","interfaceReprHash":null,"sourceName":"node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/libraries/MerkleMultiProof.sol","imports":[],"versionRequirement":"^0.8.4","artifacts":{"MerkleMultiProof":{"0.8.28":{"default":{"path":"MerkleMultiProof.sol/MerkleMultiProof.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/test/mocks/MockRouter.sol":{"lastModificationDate":1747773683860,"contentHash":"e24ae2a8695c05ae","interfaceReprHash":null,"sourceName":"node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/test/mocks/MockRouter.sol","imports":["node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IAny2EVMMessageReceiver.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IRouter.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IRouterClient.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/libraries/Client.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/libraries/Internal.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/libraries/MerkleMultiProof.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/call/CallWithExactGas.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/extensions/draft-IERC20Permit.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/utils/Address.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/utils/introspection/ERC165Checker.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/utils/introspection/IERC165.sol"],"versionRequirement":"^0.8.4","artifacts":{"MockCCIPRouter":{"0.8.28":{"default":{"path":"MockRouter.sol/MockCCIPRouter.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"node_modules/@chainlink/contracts-ccip/src/v0.8/shared/access/ConfirmedOwner.sol":{"lastModificationDate":1747773683605,"contentHash":"de8cf329a1f932b0","interfaceReprHash":null,"sourceName":"node_modules/@chainlink/contracts-ccip/src/v0.8/shared/access/ConfirmedOwner.sol","imports":["node_modules/@chainlink/contracts-ccip/src/v0.8/shared/access/ConfirmedOwnerWithProposal.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/interfaces/IOwnable.sol"],"versionRequirement":"^0.8.0","artifacts":{"ConfirmedOwner":{"0.8.28":{"default":{"path":"ConfirmedOwner.sol/ConfirmedOwner.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"node_modules/@chainlink/contracts-ccip/src/v0.8/shared/access/ConfirmedOwnerWithProposal.sol":{"lastModificationDate":1747773683606,"contentHash":"49d37ad33440637f","interfaceReprHash":null,"sourceName":"node_modules/@chainlink/contracts-ccip/src/v0.8/shared/access/ConfirmedOwnerWithProposal.sol","imports":["node_modules/@chainlink/contracts-ccip/src/v0.8/shared/interfaces/IOwnable.sol"],"versionRequirement":"^0.8.0","artifacts":{"ConfirmedOwnerWithProposal":{"0.8.28":{"default":{"path":"ConfirmedOwnerWithProposal.sol/ConfirmedOwnerWithProposal.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"node_modules/@chainlink/contracts-ccip/src/v0.8/shared/access/OwnerIsCreator.sol":{"lastModificationDate":1747773683863,"contentHash":"8080c29fefff1970","interfaceReprHash":null,"sourceName":"node_modules/@chainlink/contracts-ccip/src/v0.8/shared/access/OwnerIsCreator.sol","imports":["node_modules/@chainlink/contracts-ccip/src/v0.8/shared/access/ConfirmedOwner.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/access/ConfirmedOwnerWithProposal.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/interfaces/IOwnable.sol"],"versionRequirement":"^0.8.0","artifacts":{"OwnerIsCreator":{"0.8.28":{"default":{"path":"OwnerIsCreator.sol/OwnerIsCreator.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"node_modules/@chainlink/contracts-ccip/src/v0.8/shared/call/CallWithExactGas.sol":{"lastModificationDate":1747773683588,"contentHash":"366597a1760b3430","interfaceReprHash":null,"sourceName":"node_modules/@chainlink/contracts-ccip/src/v0.8/shared/call/CallWithExactGas.sol","imports":[],"versionRequirement":"^0.8.0","artifacts":{"CallWithExactGas":{"0.8.28":{"default":{"path":"CallWithExactGas.sol/CallWithExactGas.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"node_modules/@chainlink/contracts-ccip/src/v0.8/shared/interfaces/IERC677Receiver.sol":{"lastModificationDate":1747773683756,"contentHash":"28230d9b5c787382","interfaceReprHash":null,"sourceName":"node_modules/@chainlink/contracts-ccip/src/v0.8/shared/interfaces/IERC677Receiver.sol","imports":[],"versionRequirement":"^0.8.6","artifacts":{"IERC677Receiver":{"0.8.28":{"default":{"path":"IERC677Receiver.sol/IERC677Receiver.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"node_modules/@chainlink/contracts-ccip/src/v0.8/shared/interfaces/IOwnable.sol":{"lastModificationDate":1747773683765,"contentHash":"1405527fe21c4aed","interfaceReprHash":null,"sourceName":"node_modules/@chainlink/contracts-ccip/src/v0.8/shared/interfaces/IOwnable.sol","imports":[],"versionRequirement":"^0.8.0","artifacts":{"IOwnable":{"0.8.28":{"default":{"path":"IOwnable.sol/IOwnable.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"node_modules/@chainlink/contracts-ccip/src/v0.8/shared/token/ERC20/IBurnMintERC20.sol":{"lastModificationDate":1747773683750,"contentHash":"d51f1683963b3dcd","interfaceReprHash":null,"sourceName":"node_modules/@chainlink/contracts-ccip/src/v0.8/shared/token/ERC20/IBurnMintERC20.sol","imports":["node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"],"versionRequirement":"^0.8.0","artifacts":{"IBurnMintERC20":{"0.8.28":{"default":{"path":"IBurnMintERC20.sol/IBurnMintERC20.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"node_modules/@chainlink/contracts-ccip/src/v0.8/shared/token/ERC677/BurnMintERC677.sol":{"lastModificationDate":1747773683574,"contentHash":"1520d198e5b64e21","interfaceReprHash":null,"sourceName":"node_modules/@chainlink/contracts-ccip/src/v0.8/shared/token/ERC677/BurnMintERC677.sol","imports":["node_modules/@chainlink/contracts-ccip/src/v0.8/shared/access/ConfirmedOwner.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/access/ConfirmedOwnerWithProposal.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/access/OwnerIsCreator.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/interfaces/IERC677Receiver.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/interfaces/IOwnable.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/token/ERC20/IBurnMintERC20.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/token/ERC677/ERC677.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/token/ERC677/IERC677.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/ERC20.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/extensions/ERC20Burnable.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/utils/Context.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/utils/structs/EnumerableSet.sol"],"versionRequirement":"^0.8.0","artifacts":{"BurnMintERC677":{"0.8.28":{"default":{"path":"BurnMintERC677.sol/BurnMintERC677.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"node_modules/@chainlink/contracts-ccip/src/v0.8/shared/token/ERC677/ERC677.sol":{"lastModificationDate":1747773683732,"contentHash":"91a2f566d8156e0c","interfaceReprHash":null,"sourceName":"node_modules/@chainlink/contracts-ccip/src/v0.8/shared/token/ERC677/ERC677.sol","imports":["node_modules/@chainlink/contracts-ccip/src/v0.8/shared/interfaces/IERC677Receiver.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/token/ERC677/IERC677.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/ERC20.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/utils/Context.sol"],"versionRequirement":"^0.8.0","artifacts":{"ERC677":{"0.8.28":{"default":{"path":"ERC677.sol/ERC677.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"node_modules/@chainlink/contracts-ccip/src/v0.8/shared/token/ERC677/IERC677.sol":{"lastModificationDate":1747773683755,"contentHash":"2ff198a713060b80","interfaceReprHash":null,"sourceName":"node_modules/@chainlink/contracts-ccip/src/v0.8/shared/token/ERC677/IERC677.sol","imports":[],"versionRequirement":"^0.8.0","artifacts":{"IERC677":{"0.8.28":{"default":{"path":"IERC677.sol/IERC677.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/ERC20.sol":{"lastModificationDate":1747773683718,"contentHash":"e41a75d1ddd8e751","interfaceReprHash":null,"sourceName":"node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/ERC20.sol","imports":["node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/utils/Context.sol"],"versionRequirement":"^0.8.0","artifacts":{"ERC20":{"0.8.28":{"default":{"path":"ERC20.sol/ERC20.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol":{"lastModificationDate":1747773683753,"contentHash":"4fafbc83c25b48ec","interfaceReprHash":null,"sourceName":"node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol","imports":[],"versionRequirement":"^0.8.0","artifacts":{"IERC20":{"0.8.28":{"default":{"path":"ERC20/IERC20.sol/IERC20.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/extensions/ERC20Burnable.sol":{"lastModificationDate":1747773683722,"contentHash":"42edfabf7a410469","interfaceReprHash":null,"sourceName":"node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/extensions/ERC20Burnable.sol","imports":["node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/ERC20.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/utils/Context.sol"],"versionRequirement":"^0.8.0","artifacts":{"ERC20Burnable":{"0.8.28":{"default":{"path":"ERC20Burnable.sol/ERC20Burnable.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"lastModificationDate":1747773683754,"contentHash":"dd0cf8492ef40e1b","interfaceReprHash":null,"sourceName":"node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/extensions/IERC20Metadata.sol","imports":["node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol"],"versionRequirement":"^0.8.0","artifacts":{"IERC20Metadata":{"0.8.28":{"default":{"path":"IERC20Metadata.sol/IERC20Metadata.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/extensions/draft-IERC20Permit.sol":{"lastModificationDate":1747773683630,"contentHash":"b4c676e9c41467dc","interfaceReprHash":null,"sourceName":"node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/extensions/draft-IERC20Permit.sol","imports":[],"versionRequirement":"^0.8.0","artifacts":{"IERC20Permit":{"0.8.28":{"default":{"path":"draft-IERC20Permit.sol/IERC20Permit.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/utils/SafeERC20.sol":{"lastModificationDate":1747773683888,"contentHash":"4448c3983b10bb2c","interfaceReprHash":null,"sourceName":"node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/utils/SafeERC20.sol","imports":["node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/extensions/draft-IERC20Permit.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/utils/Address.sol"],"versionRequirement":"^0.8.0","artifacts":{"SafeERC20":{"0.8.28":{"default":{"path":"SafeERC20.sol/SafeERC20.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/utils/Address.sol":{"lastModificationDate":1747773683540,"contentHash":"68fb2dc78edd0244","interfaceReprHash":null,"sourceName":"node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/utils/Address.sol","imports":[],"versionRequirement":"^0.8.1","artifacts":{"Address":{"0.8.28":{"default":{"path":"Address.sol/Address.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/utils/Context.sol":{"lastModificationDate":1747773683609,"contentHash":"7c35406f2cc1969f","interfaceReprHash":null,"sourceName":"node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/utils/Context.sol","imports":[],"versionRequirement":"^0.8.0","artifacts":{"Context":{"0.8.28":{"default":{"path":"Context.sol/Context.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol":{"lastModificationDate":1747773683753,"contentHash":"36cb546777a44261","interfaceReprHash":null,"sourceName":"node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol","imports":[],"versionRequirement":"^0.8.0","artifacts":{"IERC165":{"0.8.28":{"default":{"path":"introspection/IERC165.sol/IERC165.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/utils/structs/EnumerableSet.sol":{"lastModificationDate":1747773683701,"contentHash":"2eb05850a193aa8f","interfaceReprHash":null,"sourceName":"node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/utils/structs/EnumerableSet.sol","imports":[],"versionRequirement":"^0.8.0","artifacts":{"EnumerableSet":{"0.8.28":{"default":{"path":"EnumerableSet.sol/EnumerableSet.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/access/AccessControl.sol":{"lastModificationDate":1747773683522,"contentHash":"25774403c5780e65","interfaceReprHash":null,"sourceName":"node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/access/AccessControl.sol","imports":["node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/access/IAccessControl.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/utils/Context.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/utils/introspection/ERC165.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/utils/introspection/IERC165.sol"],"versionRequirement":"^0.8.20","artifacts":{"AccessControl":{"0.8.28":{"default":{"path":"AccessControl.sol/AccessControl.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/access/IAccessControl.sol":{"lastModificationDate":1747773683745,"contentHash":"fa52fe56c26705de","interfaceReprHash":null,"sourceName":"node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/access/IAccessControl.sol","imports":[],"versionRequirement":"^0.8.20","artifacts":{"IAccessControl":{"0.8.28":{"default":{"path":"IAccessControl.sol/IAccessControl.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/utils/Context.sol":{"lastModificationDate":1747773683609,"contentHash":"16db1f8b2f7183f5","interfaceReprHash":null,"sourceName":"node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/utils/Context.sol","imports":[],"versionRequirement":"^0.8.20","artifacts":{"Context":{"0.8.28":{"default":{"path":"utils/Context.sol/Context.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/utils/introspection/ERC165.sol":{"lastModificationDate":1747773683711,"contentHash":"c94a6ee786077f73","interfaceReprHash":null,"sourceName":"node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/utils/introspection/ERC165.sol","imports":["node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/utils/introspection/IERC165.sol"],"versionRequirement":"^0.8.20","artifacts":{"ERC165":{"0.8.28":{"default":{"path":"ERC165.sol/ERC165.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/utils/introspection/ERC165Checker.sol":{"lastModificationDate":1747773683713,"contentHash":"bf986a84a47042e8","interfaceReprHash":null,"sourceName":"node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/utils/introspection/ERC165Checker.sol","imports":["node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/utils/introspection/IERC165.sol"],"versionRequirement":"^0.8.20","artifacts":{"ERC165Checker":{"0.8.28":{"default":{"path":"ERC165Checker.sol/ERC165Checker.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/utils/introspection/IERC165.sol":{"lastModificationDate":1747773683753,"contentHash":"bee068e5c1fc49b4","interfaceReprHash":null,"sourceName":"node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/utils/introspection/IERC165.sol","imports":[],"versionRequirement":"^0.8.20","artifacts":{"IERC165":{"0.8.28":{"default":{"path":"utils/introspection/IERC165.sol/IERC165.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"script/DeployAaveInteractorV3.sol":{"lastModificationDate":1748904200118,"contentHash":"7a71676540dee022","interfaceReprHash":null,"sourceName":"script/DeployAaveInteractorV3.sol","imports":["lib/forge-std/src/Base.sol","lib/forge-std/src/Script.sol","lib/forge-std/src/StdChains.sol","lib/forge-std/src/StdCheats.sol","lib/forge-std/src/StdJson.sol","lib/forge-std/src/StdMath.sol","lib/forge-std/src/StdStorage.sol","lib/forge-std/src/StdStyle.sol","lib/forge-std/src/StdUtils.sol","lib/forge-std/src/Vm.sol","lib/forge-std/src/console.sol","lib/forge-std/src/console2.sol","lib/forge-std/src/interfaces/IERC165.sol","lib/forge-std/src/interfaces/IERC20.sol","lib/forge-std/src/interfaces/IERC721.sol","lib/forge-std/src/interfaces/IMulticall3.sol","lib/forge-std/src/mocks/MockERC20.sol","lib/forge-std/src/mocks/MockERC721.sol","lib/forge-std/src/safeconsole.sol","src/aave/aave_core.sol"],"versionRequirement":"^0.8.10","artifacts":{"DeployAaveInteractorV3":{"0.8.28":{"default":{"path":"DeployAaveInteractorV3.sol/DeployAaveInteractorV3.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"script/DeployAll.sol":{"lastModificationDate":1749126385976,"contentHash":"bab4b4c5307b13bd","interfaceReprHash":null,"sourceName":"script/DeployAll.sol","imports":["lib/forge-std/src/Base.sol","lib/forge-std/src/Script.sol","lib/forge-std/src/StdChains.sol","lib/forge-std/src/StdCheats.sol","lib/forge-std/src/StdJson.sol","lib/forge-std/src/StdMath.sol","lib/forge-std/src/StdStorage.sol","lib/forge-std/src/StdStyle.sol","lib/forge-std/src/StdUtils.sol","lib/forge-std/src/Vm.sol","lib/forge-std/src/console.sol","lib/forge-std/src/console2.sol","lib/forge-std/src/interfaces/IERC165.sol","lib/forge-std/src/interfaces/IERC20.sol","lib/forge-std/src/interfaces/IERC721.sol","lib/forge-std/src/interfaces/IMulticall3.sol","lib/forge-std/src/mocks/MockERC20.sol","lib/forge-std/src/mocks/MockERC721.sol","lib/forge-std/src/safeconsole.sol","lib/solady/src/utils/MetadataReaderLib.sol","lib/solady/src/utils/ReentrancyGuard.sol","lib/solady/src/utils/SafeTransferLib.sol","src/aave/aave_core.sol","src/intent-engines/TradingEngine.sol","src/intent-engines/send-swap-ie.sol","src/interfaces/IERC20.sol"],"versionRequirement":"^0.8.19","artifacts":{"DeployAll":{"0.8.28":{"default":{"path":"DeployAll.sol/DeployAll.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"script/DeployTradingEngine.sol":{"lastModificationDate":1748988600194,"contentHash":"2307b86cb6b22b70","interfaceReprHash":null,"sourceName":"script/DeployTradingEngine.sol","imports":["lib/forge-std/src/Base.sol","lib/forge-std/src/Script.sol","lib/forge-std/src/StdChains.sol","lib/forge-std/src/StdCheats.sol","lib/forge-std/src/StdJson.sol","lib/forge-std/src/StdMath.sol","lib/forge-std/src/StdStorage.sol","lib/forge-std/src/StdStyle.sol","lib/forge-std/src/StdUtils.sol","lib/forge-std/src/Vm.sol","lib/forge-std/src/console.sol","lib/forge-std/src/console2.sol","lib/forge-std/src/interfaces/IERC165.sol","lib/forge-std/src/interfaces/IERC20.sol","lib/forge-std/src/interfaces/IERC721.sol","lib/forge-std/src/interfaces/IMulticall3.sol","lib/forge-std/src/mocks/MockERC20.sol","lib/forge-std/src/mocks/MockERC721.sol","lib/forge-std/src/safeconsole.sol","lib/solady/src/utils/ReentrancyGuard.sol","src/intent-engines/TradingEngine.sol","src/interfaces/IERC20.sol"],"versionRequirement":"^0.8.19","artifacts":{"DeployTradingEngine":{"0.8.28":{"default":{"path":"DeployTradingEngine.sol/DeployTradingEngine.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"script/deploy-send-swap-ie.sol":{"lastModificationDate":1747771012568,"contentHash":"635193a63cd047f5","interfaceReprHash":null,"sourceName":"script/deploy-send-swap-ie.sol","imports":["lib/forge-std/src/Base.sol","lib/forge-std/src/Script.sol","lib/forge-std/src/StdChains.sol","lib/forge-std/src/StdCheats.sol","lib/forge-std/src/StdJson.sol","lib/forge-std/src/StdMath.sol","lib/forge-std/src/StdStorage.sol","lib/forge-std/src/StdStyle.sol","lib/forge-std/src/StdUtils.sol","lib/forge-std/src/Vm.sol","lib/forge-std/src/console.sol","lib/forge-std/src/console2.sol","lib/forge-std/src/interfaces/IERC165.sol","lib/forge-std/src/interfaces/IERC20.sol","lib/forge-std/src/interfaces/IERC721.sol","lib/forge-std/src/interfaces/IMulticall3.sol","lib/forge-std/src/mocks/MockERC20.sol","lib/forge-std/src/mocks/MockERC721.sol","lib/forge-std/src/safeconsole.sol","lib/solady/src/utils/MetadataReaderLib.sol","lib/solady/src/utils/SafeTransferLib.sol","src/intent-engines/send-swap-ie.sol"],"versionRequirement":"^0.8.17","artifacts":{"DeployIntentEngine":{"0.8.28":{"default":{"path":"deploy-send-swap-ie.sol/DeployIntentEngine.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"src/aave/aave_core.sol":{"lastModificationDate":1748979191659,"contentHash":"c8eecec91a803ae5","interfaceReprHash":null,"sourceName":"src/aave/aave_core.sol","imports":[],"versionRequirement":"^0.8.10","artifacts":{"AaveV3Interactor":{"0.8.28":{"default":{"path":"aave_core.sol/AaveV3Interactor.json","build_id":"74cb76a3456a099e"}}},"IERC20":{"0.8.28":{"default":{"path":"aave_core.sol/IERC20.json","build_id":"74cb76a3456a099e"}}},"IPool":{"0.8.28":{"default":{"path":"aave_core.sol/IPool.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"src/cross-chain/helper.sol":{"lastModificationDate":1747511394355,"contentHash":"499ec67761284521","interfaceReprHash":null,"sourceName":"src/cross-chain/helper.sol","imports":[],"versionRequirement":null,"artifacts":{},"seenByCompiler":true},"src/cross-chain/token_transfer.sol":{"lastModificationDate":1747511394355,"contentHash":"6c36be6f6c3fed6f","interfaceReprHash":null,"sourceName":"src/cross-chain/token_transfer.sol","imports":[],"versionRequirement":null,"artifacts":{},"seenByCompiler":true},"src/intent-engines/IntentEngineDefi.sol":{"lastModificationDate":1747936467257,"contentHash":"eebad2f72b272461","interfaceReprHash":null,"sourceName":"src/intent-engines/IntentEngineDefi.sol","imports":["src/aave/aave_core.sol","src/interfaces/AAVETokenRegistry.sol","src/interfaces/IERC20.sol","src/interfaces/UniswapRegistry.sol"],"versionRequirement":"^0.8.17","artifacts":{"ICEth":{"0.8.28":{"default":{"path":"IntentEngineDefi.sol/ICEth.json","build_id":"74cb76a3456a099e"}}},"ICompoundETHManager":{"0.8.28":{"default":{"path":"IntentEngineDefi.sol/ICompoundETHManager.json","build_id":"74cb76a3456a099e"}}},"IUniswap":{"0.8.28":{"default":{"path":"IntentEngineDefi.sol/IUniswap.json","build_id":"74cb76a3456a099e"}}},"IntentEngine":{"0.8.28":{"default":{"path":"IntentEngineDefi.sol/IntentEngine.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"src/intent-engines/TradingEngine.sol":{"lastModificationDate":1748990565577,"contentHash":"dfb43c4e03b2c01a","interfaceReprHash":null,"sourceName":"src/intent-engines/TradingEngine.sol","imports":["lib/solady/src/utils/ReentrancyGuard.sol","src/interfaces/IERC20.sol"],"versionRequirement":"^0.8.17","artifacts":{"IUniswapV2Router":{"0.8.28":{"default":{"path":"TradingEngine.sol/IUniswapV2Router.json","build_id":"74cb76a3456a099e"}}},"TradingEngine":{"0.8.28":{"default":{"path":"TradingEngine.sol/TradingEngine.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"src/intent-engines/send-swap-ie.sol":{"lastModificationDate":1748121537760,"contentHash":"e2da1a9558efc46e","interfaceReprHash":null,"sourceName":"src/intent-engines/send-swap-ie.sol","imports":["lib/solady/src/utils/MetadataReaderLib.sol","lib/solady/src/utils/SafeTransferLib.sol"],"versionRequirement":"^0.8.19","artifacts":{"ISwapRouter":{"0.8.28":{"default":{"path":"send-swap-ie.sol/ISwapRouter.json","build_id":"74cb76a3456a099e"}}},"IToken":{"0.8.28":{"default":{"path":"send-swap-ie.sol/IToken.json","build_id":"74cb76a3456a099e"}}},"SimpleIE":{"0.8.28":{"default":{"path":"send-swap-ie.sol/SimpleIE.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"src/interfaces/AAVETokenRegistry.sol":{"lastModificationDate":1747511394356,"contentHash":"d108bc0c9836fab9","interfaceReprHash":null,"sourceName":"src/interfaces/AAVETokenRegistry.sol","imports":[],"versionRequirement":"^0.8.17","artifacts":{"AAVETokenRegistry":{"0.8.28":{"default":{"path":"AAVETokenRegistry.sol/AAVETokenRegistry.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"src/interfaces/IERC20.sol":{"lastModificationDate":1747511394356,"contentHash":"7f220de525110a13","interfaceReprHash":null,"sourceName":"src/interfaces/IERC20.sol","imports":[],"versionRequirement":"^0.8.20","artifacts":{"IERC20":{"0.8.28":{"default":{"path":"IERC20.sol/IERC20.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"src/interfaces/UniswapRegistry.sol":{"lastModificationDate":1747511394356,"contentHash":"2e881ec30ecc4855","interfaceReprHash":null,"sourceName":"src/interfaces/UniswapRegistry.sol","imports":[],"versionRequirement":"^0.8.17","artifacts":{"UniswapRegistry":{"0.8.28":{"default":{"path":"UniswapRegistry.sol/UniswapRegistry.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"test/aave/aave_core.t.sol":{"lastModificationDate":1748979190654,"contentHash":"ce4d60127240de26","interfaceReprHash":null,"sourceName":"test/aave/aave_core.t.sol","imports":["lib/forge-std/src/Base.sol","lib/forge-std/src/StdAssertions.sol","lib/forge-std/src/StdChains.sol","lib/forge-std/src/StdCheats.sol","lib/forge-std/src/StdError.sol","lib/forge-std/src/StdInvariant.sol","lib/forge-std/src/StdJson.sol","lib/forge-std/src/StdMath.sol","lib/forge-std/src/StdStorage.sol","lib/forge-std/src/StdStyle.sol","lib/forge-std/src/StdToml.sol","lib/forge-std/src/StdUtils.sol","lib/forge-std/src/Test.sol","lib/forge-std/src/Vm.sol","lib/forge-std/src/console.sol","lib/forge-std/src/console2.sol","lib/forge-std/src/interfaces/IERC165.sol","lib/forge-std/src/interfaces/IERC20.sol","lib/forge-std/src/interfaces/IERC721.sol","lib/forge-std/src/interfaces/IMulticall3.sol","lib/forge-std/src/mocks/MockERC20.sol","lib/forge-std/src/mocks/MockERC721.sol","lib/forge-std/src/safeconsole.sol","src/aave/aave_core.sol"],"versionRequirement":"^0.8.10","artifacts":{"AaveV3InteractorTest":{"0.8.28":{"default":{"path":"aave_core.t.sol/AaveV3InteractorTest.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"test/cross-chain/token_transfer.t.sol":{"lastModificationDate":1747511394357,"contentHash":"262a3d92a11e28aa","interfaceReprHash":null,"sourceName":"test/cross-chain/token_transfer.t.sol","imports":["lib/chainlink-local/src/ccip/BurnMintERC677Helper.sol","lib/chainlink-local/src/ccip/CCIPLocalSimulator.sol","lib/chainlink-local/src/ccip/CCIPLocalSimulatorFork.sol","lib/chainlink-local/src/ccip/Register.sol","lib/chainlink-local/src/shared/LinkToken.sol","lib/chainlink-local/src/shared/WETH9.sol","lib/forge-std/src/Base.sol","lib/forge-std/src/StdAssertions.sol","lib/forge-std/src/StdChains.sol","lib/forge-std/src/StdCheats.sol","lib/forge-std/src/StdError.sol","lib/forge-std/src/StdInvariant.sol","lib/forge-std/src/StdJson.sol","lib/forge-std/src/StdMath.sol","lib/forge-std/src/StdStorage.sol","lib/forge-std/src/StdStyle.sol","lib/forge-std/src/StdToml.sol","lib/forge-std/src/StdUtils.sol","lib/forge-std/src/Test.sol","lib/forge-std/src/Vm.sol","lib/forge-std/src/console.sol","lib/forge-std/src/console2.sol","lib/forge-std/src/interfaces/IERC165.sol","lib/forge-std/src/interfaces/IERC20.sol","lib/forge-std/src/interfaces/IERC721.sol","lib/forge-std/src/interfaces/IMulticall3.sol","lib/forge-std/src/mocks/MockERC20.sol","lib/forge-std/src/mocks/MockERC721.sol","lib/forge-std/src/safeconsole.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IAny2EVMMessageReceiver.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IGetCCIPAdmin.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IOwner.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IRouter.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IRouterClient.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/libraries/Client.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/libraries/Internal.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/libraries/MerkleMultiProof.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/ccip/test/mocks/MockRouter.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/access/ConfirmedOwner.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/access/ConfirmedOwnerWithProposal.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/access/OwnerIsCreator.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/call/CallWithExactGas.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/interfaces/IERC677Receiver.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/interfaces/IOwnable.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/token/ERC20/IBurnMintERC20.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/token/ERC677/BurnMintERC677.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/token/ERC677/ERC677.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/shared/token/ERC677/IERC677.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/ERC20.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/extensions/ERC20Burnable.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/extensions/IERC20Metadata.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/extensions/draft-IERC20Permit.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/utils/SafeERC20.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/utils/Address.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/utils/Context.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/utils/introspection/IERC165.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v4.8.3/contracts/utils/structs/EnumerableSet.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/access/AccessControl.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/access/IAccessControl.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/utils/Context.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/utils/introspection/ERC165.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/utils/introspection/ERC165Checker.sol","node_modules/@chainlink/contracts-ccip/src/v0.8/vendor/openzeppelin-solidity/v5.0.2/contracts/utils/introspection/IERC165.sol"],"versionRequirement":"^0.8.19","artifacts":{"Example01ForkTest":{"0.8.28":{"default":{"path":"token_transfer.t.sol/Example01ForkTest.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"test/simple-test.t.sol":{"lastModificationDate":1747774173940,"contentHash":"d8635ae28336d565","interfaceReprHash":null,"sourceName":"test/simple-test.t.sol","imports":["lib/forge-std/src/Base.sol","lib/forge-std/src/StdAssertions.sol","lib/forge-std/src/StdChains.sol","lib/forge-std/src/StdCheats.sol","lib/forge-std/src/StdError.sol","lib/forge-std/src/StdInvariant.sol","lib/forge-std/src/StdJson.sol","lib/forge-std/src/StdMath.sol","lib/forge-std/src/StdStorage.sol","lib/forge-std/src/StdStyle.sol","lib/forge-std/src/StdToml.sol","lib/forge-std/src/StdUtils.sol","lib/forge-std/src/Test.sol","lib/forge-std/src/Vm.sol","lib/forge-std/src/console.sol","lib/forge-std/src/console2.sol","lib/forge-std/src/interfaces/IERC165.sol","lib/forge-std/src/interfaces/IERC20.sol","lib/forge-std/src/interfaces/IERC721.sol","lib/forge-std/src/interfaces/IMulticall3.sol","lib/forge-std/src/mocks/MockERC20.sol","lib/forge-std/src/mocks/MockERC721.sol","lib/forge-std/src/safeconsole.sol","lib/solady/src/utils/MetadataReaderLib.sol","lib/solady/src/utils/SafeTransferLib.sol","src/intent-engines/send-swap-ie.sol"],"versionRequirement":"^0.8.19","artifacts":{"IERC20":{"0.8.28":{"default":{"path":"simple-test.t.sol/IERC20.json","build_id":"74cb76a3456a099e"}}},"IWETH9":{"0.8.28":{"default":{"path":"simple-test.t.sol/IWETH9.json","build_id":"74cb76a3456a099e"}}},"SimpleIETest":{"0.8.28":{"default":{"path":"simple-test.t.sol/SimpleIETest.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true},"test/testDefi.sol":{"lastModificationDate":1747511394357,"contentHash":"b060cd077da8199f","interfaceReprHash":null,"sourceName":"test/testDefi.sol","imports":["lib/forge-std/src/Base.sol","lib/forge-std/src/StdAssertions.sol","lib/forge-std/src/StdChains.sol","lib/forge-std/src/StdCheats.sol","lib/forge-std/src/StdError.sol","lib/forge-std/src/StdInvariant.sol","lib/forge-std/src/StdJson.sol","lib/forge-std/src/StdMath.sol","lib/forge-std/src/StdStorage.sol","lib/forge-std/src/StdStyle.sol","lib/forge-std/src/StdToml.sol","lib/forge-std/src/StdUtils.sol","lib/forge-std/src/Test.sol","lib/forge-std/src/Vm.sol","lib/forge-std/src/console.sol","lib/forge-std/src/console2.sol","lib/forge-std/src/interfaces/IERC165.sol","lib/forge-std/src/interfaces/IERC20.sol","lib/forge-std/src/interfaces/IERC721.sol","lib/forge-std/src/interfaces/IMulticall3.sol","lib/forge-std/src/mocks/MockERC20.sol","lib/forge-std/src/mocks/MockERC721.sol","lib/forge-std/src/safeconsole.sol","src/aave/aave_core.sol","src/intent-engines/IntentEngineDefi.sol","src/interfaces/AAVETokenRegistry.sol","src/interfaces/IERC20.sol","src/interfaces/UniswapRegistry.sol"],"versionRequirement":"^0.8.19","artifacts":{"IWETH":{"0.8.28":{"default":{"path":"testDefi.sol/IWETH.json","build_id":"74cb76a3456a099e"}}},"TestDefi":{"0.8.28":{"default":{"path":"testDefi.sol/TestDefi.json","build_id":"74cb76a3456a099e"}}}},"seenByCompiler":true}},"builds":["74cb76a3456a099e"],"profiles":{"default":{"solc":{"optimizer":{"enabled":true,"runs":9999},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"outputSelection":{"*":{"*":["abi","evm.bytecode.object","evm.bytecode.sourceMap","evm.bytecode.linkReferences","evm.deployedBytecode.object","evm.deployedBytecode.sourceMap","evm.deployedBytecode.linkReferences","evm.deployedBytecode.immutableReferences","evm.methodIdentifiers","metadata"]}},"evmVersion":"cancun","viaIR":true,"libraries":{}},"vyper":{"evmVersion":"cancun","outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode"]}}}}},"preprocessed":false,"mocks":[]} \ No newline at end of file diff --git a/docker-compose.anvil.yml b/docker-compose.anvil.yml new file mode 100644 index 0000000..dc5d73e --- /dev/null +++ b/docker-compose.anvil.yml @@ -0,0 +1,21 @@ +version: '3.8' + +services: + anvil: + build: + context: . + dockerfile: Dockerfile.anvil + container_name: anvil + environment: + ANVIL_IP_ADDR: "0.0.0.0" + FOUNDRY_DISABLE_NIGHTLY_WARNING: "true" + working_dir: /anvil + ports: + - "8545:8545" + restart: unless-stopped + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8545", "-X", "POST", "-H", "Content-Type: application/json", "-d", "{\"jsonrpc\":\"2.0\",\"method\":\"eth_chainId\",\"params\":[],\"id\":1}"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s \ No newline at end of file diff --git a/foundry.toml b/foundry.toml index 81c1ba6..a6d03fb 100644 --- a/foundry.toml +++ b/foundry.toml @@ -1,7 +1,7 @@ [profile.default] src = "src" out = "out" -libs = ["lib"] +libs = ["lib","node_modules"] optimizer = true @@ -9,6 +9,13 @@ optimizer_runs = 9999 via_ir = true - +remappings = [ + "@solady=lib/solady/", + "@forge=lib/forge-std/src/", + '@openzeppelin/contracts=lib/openzeppelin-contracts/contracts', + '@openzeppelin/contracts-upgradeable=lib/openzeppelin-contracts-upgradeable/contracts', + '@chainlink/local/=lib/chainlink-local/', + '@chainlink/contracts-ccip/=node_modules/@chainlink/contracts-ccip', +] [rpc_endpoints] main = "https://eth-mainnet.g.alchemy.com/v2/KywLaq2zlVzePOhip0BY3U8ztfHkYDmo" \ No newline at end of file diff --git a/frontend/.gitignore b/frontend/.gitignore deleted file mode 100644 index 3c3629e..0000000 --- a/frontend/.gitignore +++ /dev/null @@ -1 +0,0 @@ -node_modules diff --git a/frontend/package-lock.json b/frontend/package-lock.json index c24c8fa..e11f57a 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -22,9 +22,11 @@ "react": "^18.3.1", "react-dom": "^18.3.1", "react-router-dom": "^7.1.3", + "recharts": "^2.15.1", "tailwindcss": "^3.4.17", "tsconfig-paths": "^4.2.0", - "viem": "^2.22.14" + "viem": "^2.22.14", + "web3": "^4.16.0" }, "devDependencies": { "@eslint/js": "^9.17.0", @@ -42,16 +44,15 @@ "node_modules/@adraffy/ens-normalize": { "version": "1.10.1", "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", - "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==", - "license": "MIT" + "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==" }, "node_modules/@ai-sdk/openai": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-1.1.3.tgz", - "integrity": "sha512-U+LqNAyB5/4KmOrU1U8NEQMLlLTzKhuVkpKo8xvlpz662TnOBxyGjGnf8Kbqw7VXyeHg0tpuHincolOuvnpynA==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@ai-sdk/openai/-/openai-1.3.4.tgz", + "integrity": "sha512-BOw7dQpiTlpaqi1u/NU4Or2+jA6buzl6GOUuYyu/uFI7dxJs1zPkY8IjAp4DQhi+kQGH6GGbEPw0LkIbeK4BVA==", "dependencies": { - "@ai-sdk/provider": "1.0.6", - "@ai-sdk/provider-utils": "2.1.3" + "@ai-sdk/provider": "1.1.0", + "@ai-sdk/provider-utils": "2.2.1" }, "engines": { "node": ">=18" @@ -61,9 +62,9 @@ } }, "node_modules/@ai-sdk/provider": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.0.6.tgz", - "integrity": "sha512-hwj/gFNxpDgEfTaYzCYoslmw01IY9kWLKl/wf8xuPvHtQIzlfXWmmUwc8PnCwxyt8cKzIuV0dfUghCf68HQ0SA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.1.0.tgz", + "integrity": "sha512-0M+qjp+clUD0R1E5eWQFhxEvWLNaOtGQRUaBn8CUABnSKredagq92hUS9VjOzGsTm37xLfpaxl97AVtbeOsHew==", "dependencies": { "json-schema": "^0.4.0" }, @@ -72,12 +73,11 @@ } }, "node_modules/@ai-sdk/provider-utils": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.1.3.tgz", - "integrity": "sha512-NamxUnRCnG7aSnYhnhX5in5KZtwIIrafURABuAmrV3mGT5YZPzqfsXdnsXY0GbzDgbl+A7R1IPxrA4at2fU/XQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.2.1.tgz", + "integrity": "sha512-BuExLp+NcpwsAVj1F4bgJuQkSqO/+roV9wM7RdIO+NVrcT8RBUTdXzf5arHt5T58VpK7bZyB2V9qigjaPHE+Dg==", "dependencies": { - "@ai-sdk/provider": "1.0.6", - "eventsource-parser": "^3.0.0", + "@ai-sdk/provider": "1.1.0", "nanoid": "^3.3.8", "secure-json-parse": "^2.7.0" }, @@ -85,12 +85,7 @@ "node": ">=18" }, "peerDependencies": { - "zod": "^3.0.0" - }, - "peerDependenciesMeta": { - "zod": { - "optional": true - } + "zod": "^3.23.8" } }, "node_modules/@ai-sdk/react": { @@ -210,7 +205,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "license": "MIT", "engines": { "node": ">=10" }, @@ -223,7 +217,6 @@ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -245,7 +238,6 @@ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", @@ -256,32 +248,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", - "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", + "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", - "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", "dev": true, - "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.0", - "@babel/generator": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.0", - "@babel/parser": "^7.26.0", - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.26.0", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -297,14 +287,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", - "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.0.tgz", + "integrity": "sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.3", - "@babel/types": "^7.26.3", + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -314,13 +303,12 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz", + "integrity": "sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.9", + "@babel/compat-data": "^7.26.8", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -335,7 +323,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" @@ -349,7 +336,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9", @@ -363,11 +349,10 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", - "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -377,7 +362,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -387,7 +371,6 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -397,33 +380,30 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", + "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", - "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", + "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.26.3" + "@babel/types": "^7.27.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -437,7 +417,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -453,7 +432,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.25.9" }, @@ -464,33 +442,42 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/runtime": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", + "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", + "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.26.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", - "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.0.tgz", + "integrity": "sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.3", - "@babel/parser": "^7.26.3", - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.3", + "@babel/generator": "^7.27.0", + "@babel/parser": "^7.27.0", + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -503,17 +490,15 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/@babel/types": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", + "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" @@ -523,14 +508,13 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", - "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz", + "integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==", "cpu": [ "ppc64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "aix" @@ -540,14 +524,13 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", - "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz", + "integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" @@ -557,14 +540,13 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", - "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz", + "integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" @@ -574,14 +556,13 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", - "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz", + "integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" @@ -591,14 +572,13 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", - "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz", + "integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -608,14 +588,13 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", - "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz", + "integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -625,14 +604,13 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", - "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz", + "integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "freebsd" @@ -642,14 +620,13 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", - "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz", + "integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "freebsd" @@ -659,14 +636,13 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", - "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz", + "integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -676,14 +652,13 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", - "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz", + "integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -693,14 +668,13 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", - "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz", + "integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==", "cpu": [ "ia32" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -710,14 +684,13 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", - "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz", + "integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==", "cpu": [ "loong64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -727,14 +700,13 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", - "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz", + "integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==", "cpu": [ "mips64el" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -744,14 +716,13 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", - "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz", + "integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==", "cpu": [ "ppc64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -761,14 +732,13 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", - "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz", + "integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==", "cpu": [ "riscv64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -778,14 +748,13 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", - "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz", + "integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==", "cpu": [ "s390x" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -795,14 +764,13 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", - "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz", + "integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -812,14 +780,13 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", - "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz", + "integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "netbsd" @@ -829,14 +796,13 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", - "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz", + "integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "netbsd" @@ -846,14 +812,13 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", - "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz", + "integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "openbsd" @@ -863,14 +828,13 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", - "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz", + "integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "openbsd" @@ -880,14 +844,13 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", - "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz", + "integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "sunos" @@ -897,14 +860,13 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", - "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz", + "integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -914,14 +876,13 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", - "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz", + "integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==", "cpu": [ "ia32" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -931,14 +892,13 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", - "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz", + "integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -948,11 +908,10 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", - "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz", + "integrity": "sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==", "dev": true, - "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.4.3" }, @@ -971,7 +930,6 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -984,19 +942,17 @@ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, - "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/config-array": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz", - "integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.2.tgz", + "integrity": "sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.5", + "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" }, @@ -1004,12 +960,20 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/config-helpers": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.0.tgz", + "integrity": "sha512-yJLLmLexii32mGrhW29qvU3QBVTu0GUmEf/J4XsBtVhp4JkIUFN/BjWqTF63yRvGApIDpZm5fa97LtYtINmfeQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/@eslint/core": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.1.tgz", - "integrity": "sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.12.0.tgz", + "integrity": "sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@types/json-schema": "^7.0.15" }, @@ -1018,11 +982,10 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", - "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -1046,7 +1009,6 @@ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -1055,44 +1017,52 @@ } }, "node_modules/@eslint/js": { - "version": "9.17.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.17.0.tgz", - "integrity": "sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==", + "version": "9.23.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.23.0.tgz", + "integrity": "sha512-35MJ8vCPU0ZMxo7zfev2pypqTwWTofFZO6m4KAtdoFhRpLJUpHTZZ+KB3C7Hb1d7bULYwO4lJXGCi5Se+8OMbw==", "dev": true, - "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/object-schema": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz", - "integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.4.tgz", - "integrity": "sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==", + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.7.tgz", + "integrity": "sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==", "dev": true, - "license": "Apache-2.0", "dependencies": { + "@eslint/core": "^0.12.0", "levn": "^0.4.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@ethereumjs/rlp": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", + "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", + "bin": { + "rlp": "bin/rlp" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=18.18.0" } @@ -1102,7 +1072,6 @@ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" @@ -1116,7 +1085,6 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=18.18" }, @@ -1130,7 +1098,6 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -1140,11 +1107,10 @@ } }, "node_modules/@humanwhocodes/retry": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", - "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.2.tgz", + "integrity": "sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=18.18" }, @@ -1157,7 +1123,6 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "license": "ISC", "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -1174,7 +1139,6 @@ "version": "0.3.8", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -1188,7 +1152,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -1197,7 +1160,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -1205,14 +1167,12 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "license": "MIT" + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -1222,7 +1182,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", - "license": "MIT", "dependencies": { "@noble/hashes": "1.3.2" }, @@ -1234,7 +1193,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", - "license": "MIT", "engines": { "node": ">= 16" }, @@ -1246,7 +1204,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -1259,7 +1216,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "license": "MIT", "engines": { "node": ">= 8" } @@ -1268,7 +1224,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -1345,273 +1300,266 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "license": "MIT", "optional": true, "engines": { "node": ">=14" } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.29.1.tgz", - "integrity": "sha512-ssKhA8RNltTZLpG6/QNkCSge+7mBQGUqJRisZ2MDQcEGaK93QESEgWK2iOpIDZ7k9zPVkG5AS3ksvD5ZWxmItw==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.38.0.tgz", + "integrity": "sha512-ldomqc4/jDZu/xpYU+aRxo3V4mGCV9HeTgUBANI3oIQMOL+SsxB+S2lxMpkFp5UamSS3XuTMQVbsS24R4J4Qjg==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.29.1.tgz", - "integrity": "sha512-CaRfrV0cd+NIIcVVN/jx+hVLN+VRqnuzLRmfmlzpOzB87ajixsN/+9L5xNmkaUUvEbI5BmIKS+XTwXsHEb65Ew==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.38.0.tgz", + "integrity": "sha512-VUsgcy4GhhT7rokwzYQP+aV9XnSLkkhlEJ0St8pbasuWO/vwphhZQxYEKUP3ayeCYLhk6gEtacRpYP/cj3GjyQ==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.29.1.tgz", - "integrity": "sha512-2ORr7T31Y0Mnk6qNuwtyNmy14MunTAMx06VAPI6/Ju52W10zk1i7i5U3vlDRWjhOI5quBcrvhkCHyF76bI7kEw==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.38.0.tgz", + "integrity": "sha512-buA17AYXlW9Rn091sWMq1xGUvWQFOH4N1rqUxGJtEQzhChxWjldGCCup7r/wUnaI6Au8sKXpoh0xg58a7cgcpg==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.29.1.tgz", - "integrity": "sha512-j/Ej1oanzPjmN0tirRd5K2/nncAhS9W6ICzgxV+9Y5ZsP0hiGhHJXZ2JQ53iSSjj8m6cRY6oB1GMzNn2EUt6Ng==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.38.0.tgz", + "integrity": "sha512-Mgcmc78AjunP1SKXl624vVBOF2bzwNWFPMP4fpOu05vS0amnLcX8gHIge7q/lDAHy3T2HeR0TqrriZDQS2Woeg==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.29.1.tgz", - "integrity": "sha512-91C//G6Dm/cv724tpt7nTyP+JdN12iqeXGFM1SqnljCmi5yTXriH7B1r8AD9dAZByHpKAumqP1Qy2vVNIdLZqw==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.38.0.tgz", + "integrity": "sha512-zzJACgjLbQTsscxWqvrEQAEh28hqhebpRz5q/uUd1T7VTwUNZ4VIXQt5hE7ncs0GrF+s7d3S4on4TiXUY8KoQA==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.29.1.tgz", - "integrity": "sha512-hEioiEQ9Dec2nIRoeHUP6hr1PSkXzQaCUyqBDQ9I9ik4gCXQZjJMIVzoNLBRGet+hIUb3CISMh9KXuCcWVW/8w==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.38.0.tgz", + "integrity": "sha512-hCY/KAeYMCyDpEE4pTETam0XZS4/5GXzlLgpi5f0IaPExw9kuB+PDTOTLuPtM10TlRG0U9OSmXJ+Wq9J39LvAg==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.29.1.tgz", - "integrity": "sha512-Py5vFd5HWYN9zxBv3WMrLAXY3yYJ6Q/aVERoeUFwiDGiMOWsMs7FokXihSOaT/PMWUty/Pj60XDQndK3eAfE6A==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.38.0.tgz", + "integrity": "sha512-mimPH43mHl4JdOTD7bUMFhBdrg6f9HzMTOEnzRmXbOZqjijCw8LA5z8uL6LCjxSa67H2xiLFvvO67PT05PRKGg==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.29.1.tgz", - "integrity": "sha512-RiWpGgbayf7LUcuSNIbahr0ys2YnEERD4gYdISA06wa0i8RALrnzflh9Wxii7zQJEB2/Eh74dX4y/sHKLWp5uQ==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.38.0.tgz", + "integrity": "sha512-tPiJtiOoNuIH8XGG8sWoMMkAMm98PUwlriOFCCbZGc9WCax+GLeVRhmaxjJtz6WxrPKACgrwoZ5ia/uapq3ZVg==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.29.1.tgz", - "integrity": "sha512-Z80O+taYxTQITWMjm/YqNoe9d10OX6kDh8X5/rFCMuPqsKsSyDilvfg+vd3iXIqtfmp+cnfL1UrYirkaF8SBZA==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.38.0.tgz", + "integrity": "sha512-wZco59rIVuB0tjQS0CSHTTUcEde+pXQWugZVxWaQFdQQ1VYub/sTrNdY76D1MKdN2NB48JDuGABP6o6fqos8mA==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.29.1.tgz", - "integrity": "sha512-fOHRtF9gahwJk3QVp01a/GqS4hBEZCV1oKglVVq13kcK3NeVlS4BwIFzOHDbmKzt3i0OuHG4zfRP0YoG5OF/rA==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.38.0.tgz", + "integrity": "sha512-fQgqwKmW0REM4LomQ+87PP8w8xvU9LZfeLBKybeli+0yHT7VKILINzFEuggvnV9M3x1Ed4gUBmGUzCo/ikmFbQ==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.29.1.tgz", - "integrity": "sha512-5a7q3tnlbcg0OodyxcAdrrCxFi0DgXJSoOuidFUzHZ2GixZXQs6Tc3CHmlvqKAmOs5eRde+JJxeIf9DonkmYkw==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.38.0.tgz", + "integrity": "sha512-hz5oqQLXTB3SbXpfkKHKXLdIp02/w3M+ajp8p4yWOWwQRtHWiEOCKtc9U+YXahrwdk+3qHdFMDWR5k+4dIlddg==", "cpu": [ "loong64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.29.1.tgz", - "integrity": "sha512-9b4Mg5Yfz6mRnlSPIdROcfw1BU22FQxmfjlp/CShWwO3LilKQuMISMTtAu/bxmmrE6A902W2cZJuzx8+gJ8e9w==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.38.0.tgz", + "integrity": "sha512-NXqygK/dTSibQ+0pzxsL3r4Xl8oPqVoWbZV9niqOnIHV/J92fe65pOir0xjkUZDRSPyFRvu+4YOpJF9BZHQImw==", "cpu": [ "ppc64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.29.1.tgz", - "integrity": "sha512-G5pn0NChlbRM8OJWpJFMX4/i8OEU538uiSv0P6roZcbpe/WfhEO+AT8SHVKfp8qhDQzaz7Q+1/ixMy7hBRidnQ==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.38.0.tgz", + "integrity": "sha512-GEAIabR1uFyvf/jW/5jfu8gjM06/4kZ1W+j1nWTSSB3w6moZEBm7iBtzwQ3a1Pxos2F7Gz+58aVEnZHU295QTg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.38.0.tgz", + "integrity": "sha512-9EYTX+Gus2EGPbfs+fh7l95wVADtSQyYw4DfSBcYdUEAmP2lqSZY0Y17yX/3m5VKGGJ4UmIH5LHLkMJft3bYoA==", "cpu": [ "riscv64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.29.1.tgz", - "integrity": "sha512-WM9lIkNdkhVwiArmLxFXpWndFGuOka4oJOZh8EP3Vb8q5lzdSCBuhjavJsw68Q9AKDGeOOIHYzYm4ZFvmWez5g==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.38.0.tgz", + "integrity": "sha512-Mpp6+Z5VhB9VDk7RwZXoG2qMdERm3Jw07RNlXHE0bOnEeX+l7Fy4bg+NxfyN15ruuY3/7Vrbpm75J9QHFqj5+Q==", "cpu": [ "s390x" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.29.1.tgz", - "integrity": "sha512-87xYCwb0cPGZFoGiErT1eDcssByaLX4fc0z2nRM6eMtV9njAfEE6OW3UniAoDhX4Iq5xQVpE6qO9aJbCFumKYQ==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.38.0.tgz", + "integrity": "sha512-vPvNgFlZRAgO7rwncMeE0+8c4Hmc+qixnp00/Uv3ht2x7KYrJ6ERVd3/R0nUtlE6/hu7/HiiNHJ/rP6knRFt1w==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.29.1.tgz", - "integrity": "sha512-xufkSNppNOdVRCEC4WKvlR1FBDyqCSCpQeMMgv9ZyXqqtKBfkw1yfGMTUTs9Qsl6WQbJnsGboWCp7pJGkeMhKA==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.38.0.tgz", + "integrity": "sha512-q5Zv+goWvQUGCaL7fU8NuTw8aydIL/C9abAVGCzRReuj5h30TPx4LumBtAidrVOtXnlB+RZkBtExMsfqkMfb8g==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.29.1.tgz", - "integrity": "sha512-F2OiJ42m77lSkizZQLuC+jiZ2cgueWQL5YC9tjo3AgaEw+KJmVxHGSyQfDUoYR9cci0lAywv2Clmckzulcq6ig==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.38.0.tgz", + "integrity": "sha512-u/Jbm1BU89Vftqyqbmxdq14nBaQjQX1HhmsdBWqSdGClNaKwhjsg5TpW+5Ibs1mb8Es9wJiMdl86BcmtUVXNZg==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.29.1.tgz", - "integrity": "sha512-rYRe5S0FcjlOBZQHgbTKNrqxCBUmgDJem/VQTCcTnA2KCabYSWQDrytOzX7avb79cAAweNmMUb/Zw18RNd4mng==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.38.0.tgz", + "integrity": "sha512-mqu4PzTrlpNHHbu5qleGvXJoGgHpChBlrBx/mEhTPpnAL1ZAYFlvHD7rLK839LLKQzqEQMFJfGrrOHItN4ZQqA==", "cpu": [ "ia32" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.29.1.tgz", - "integrity": "sha512-+10CMg9vt1MoHj6x1pxyjPSMjHTIlqs8/tBztXvPAx24SKs9jwVnKqHJumlH/IzhaPUaj3T6T6wfZr8okdXaIg==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.38.0.tgz", + "integrity": "sha512-jjqy3uWlecfB98Psxb5cD6Fny9Fupv9LrDSPTQZUROqjvZmcCqNu4UMl7qqhlUUGpwiAkotj6GYu4SZdcr/nLw==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -1709,9 +1657,9 @@ } }, "node_modules/@splinetool/runtime": { - "version": "1.9.59", - "resolved": "https://registry.npmjs.org/@splinetool/runtime/-/runtime-1.9.59.tgz", - "integrity": "sha512-EX+/4xCMAr22dR7ZgR+HNVc0ZwDO8y9CxlKJMqP2BEUP3oe5RAouTyn5uUHgOEHQ1JQ0VSV8vARfdigQ/hyI7w==", + "version": "1.9.82", + "resolved": "https://registry.npmjs.org/@splinetool/runtime/-/runtime-1.9.82.tgz", + "integrity": "sha512-qfNTnezSGuh7nPUPgRVfpH+g2FYywvYmHzOLmp8dahMxuY7HshOwLEhKVapaaWxIpq4h/WweU83pBWb48bwA8A==", "peer": true, "dependencies": { "on-change": "^4.0.0", @@ -1723,7 +1671,6 @@ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -1737,7 +1684,6 @@ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" } @@ -1747,18 +1693,16 @@ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, - "license": "MIT", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__traverse": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", + "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", "dev": true, - "license": "MIT", "dependencies": { "@babel/types": "^7.20.7" } @@ -1766,8 +1710,61 @@ "node_modules/@types/cookie": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", - "license": "MIT" + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==" + }, + "node_modules/@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==" }, "node_modules/@types/diff-match-patch": { "version": "1.0.36", @@ -1775,24 +1772,21 @@ "integrity": "sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==" }, "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true, - "license": "MIT" + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "dev": true }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/node": { "version": "22.7.5", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", - "license": "MIT", "dependencies": { "undici-types": "~6.19.2" } @@ -1810,15 +1804,13 @@ "version": "15.7.14", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/react": { - "version": "18.3.18", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz", - "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==", + "version": "18.3.20", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.20.tgz", + "integrity": "sha512-IPaCZN7PShZK/3t6Q87pfTkRm6oLTd4vztyoj+cbHUF1g3FfVb2tFIL79uCRKEfv16AhqDMBywP2VW3KIZUvcg==", "dev": true, - "license": "MIT", "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -1829,17 +1821,23 @@ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.5.tgz", "integrity": "sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==", "dev": true, - "license": "MIT", "peerDependencies": { "@types/react": "^18.0.0" } }, + "node_modules/@types/ws": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@vitejs/plugin-react": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", "integrity": "sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==", "dev": true, - "license": "MIT", "dependencies": { "@babel/core": "^7.26.0", "@babel/plugin-transform-react-jsx-self": "^7.25.9", @@ -1886,11 +1884,10 @@ } }, "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "dev": true, - "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -1903,7 +1900,6 @@ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, - "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -1911,8 +1907,7 @@ "node_modules/aes-js": { "version": "4.0.0-beta.5", "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", - "license": "MIT" + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" }, "node_modules/agentkeepalive": { "version": "4.6.0", @@ -1992,7 +1987,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -2008,7 +2002,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "license": "MIT", "engines": { "node": ">=12" }, @@ -2020,7 +2013,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -2034,14 +2026,12 @@ "node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "license": "MIT" + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -2053,22 +2043,19 @@ "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "license": "MIT" + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" + "dev": true }, "node_modules/array-buffer-byte-length": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" @@ -2085,7 +2072,6 @@ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -2106,7 +2092,6 @@ "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -2127,7 +2112,6 @@ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", @@ -2146,7 +2130,6 @@ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", @@ -2165,7 +2148,6 @@ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -2182,7 +2164,6 @@ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dev": true, - "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", @@ -2199,15 +2180,24 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/autoprefixer": { - "version": "10.4.20", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", - "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", "funding": [ { "type": "opencollective", @@ -2222,13 +2212,12 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "browserslist": "^4.23.3", - "caniuse-lite": "^1.0.30001646", + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.1", + "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "bin": { @@ -2245,8 +2234,6 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" }, @@ -2268,14 +2255,12 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "license": "MIT", "engines": { "node": ">=8" }, @@ -2286,15 +2271,13 @@ "node_modules/blurhash": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.5.tgz", - "integrity": "sha512-cRygWd7kGBQO3VEhPiTgq4Wc43ctsM+o46urrmPOiuAe+07fzlSB9OJVdpgDL0jPqXUVQ9ht7aq7kxOeJHRK+w==", - "license": "MIT" + "integrity": "sha512-cRygWd7kGBQO3VEhPiTgq4Wc43ctsM+o46urrmPOiuAe+07fzlSB9OJVdpgDL0jPqXUVQ9ht7aq7kxOeJHRK+w==" }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2304,7 +2287,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -2313,9 +2295,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", - "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "funding": [ { "type": "opencollective", @@ -2330,7 +2312,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", @@ -2348,8 +2329,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "dev": true, - "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", @@ -2364,11 +2343,9 @@ } }, "node_modules/call-bind-apply-helpers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", - "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", - "dev": true, - "license": "MIT", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -2378,14 +2355,12 @@ } }, "node_modules/call-bound": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", - "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", - "dev": true, - "license": "MIT", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "get-intrinsic": "^1.2.6" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -2399,7 +2374,6 @@ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -2408,15 +2382,14 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001690", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", - "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", + "version": "1.0.30001707", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001707.tgz", + "integrity": "sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==", "funding": [ { "type": "opencollective", @@ -2430,15 +2403,13 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ], - "license": "CC-BY-4.0" + ] }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -2454,7 +2425,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -2478,7 +2448,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -2486,11 +2455,18 @@ "node": ">= 6" } }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -2501,8 +2477,7 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/combined-stream": { "version": "1.0.8", @@ -2519,7 +2494,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "license": "MIT", "engines": { "node": ">= 6" } @@ -2528,30 +2502,45 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/cookie": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", - "license": "MIT", "engines": { "node": ">=18" } }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/cross-fetch": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.1.0.tgz", + "integrity": "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw==", + "dependencies": { + "node-fetch": "^2.7.0" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -2565,7 +2554,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, @@ -2577,15 +2565,123 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true, "license": "MIT" }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "dev": true, - "license": "MIT", + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", @@ -2603,7 +2699,6 @@ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", @@ -2621,7 +2716,6 @@ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -2639,7 +2733,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -2652,19 +2745,21 @@ } } }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==" + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -2682,7 +2777,6 @@ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, - "license": "MIT", "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", @@ -2714,8 +2808,7 @@ "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "license": "Apache-2.0" + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" }, "node_modules/diff-match-patch": { "version": "1.0.5", @@ -2725,15 +2818,13 @@ "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "license": "MIT" + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" }, "node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, - "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -2741,6 +2832,15 @@ "node": ">=0.10.0" } }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "node_modules/dotenv": { "version": "16.4.7", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", @@ -2756,8 +2856,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", @@ -2770,27 +2868,23 @@ "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, "node_modules/electron-to-chromium": { - "version": "1.5.76", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.76.tgz", - "integrity": "sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==", - "license": "ISC" + "version": "1.5.128", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.128.tgz", + "integrity": "sha512-bo1A4HH/NS522Ws0QNFIzyPcyUUNV/yyy70Ho1xqfGYzPUme2F/xr4tlEOuM6/A538U1vDA7a4XfCd1CKRegKQ==" }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" }, "node_modules/es-abstract": { - "version": "1.23.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.7.tgz", - "integrity": "sha512-OygGC8kIcDhXX+6yAZRGLqwi2CmEXCbLQixeGUgYeR+Qwlppqmo7DIDr8XibtEBZp+fJcoYpoatp5qwLMEdcqQ==", + "version": "1.23.9", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", + "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", "dev": true, - "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", @@ -2803,10 +2897,11 @@ "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", + "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.2.6", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.0", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", @@ -2827,9 +2922,12 @@ "object-inspect": "^1.13.3", "object-keys": "^1.1.1", "object.assign": "^4.1.7", + "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.3", "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", @@ -2851,8 +2949,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" } @@ -2861,8 +2957,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" } @@ -2872,7 +2966,6 @@ "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -2896,11 +2989,9 @@ } }, "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dev": true, - "license": "MIT", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "dependencies": { "es-errors": "^1.3.0" }, @@ -2909,28 +3000,29 @@ } }, "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dev": true, - "license": "MIT", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dependencies": { - "get-intrinsic": "^1.2.4", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", "dev": true, - "license": "MIT", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/es-to-primitive": { @@ -2938,7 +3030,6 @@ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dev": true, - "license": "MIT", "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", @@ -2952,12 +3043,11 @@ } }, "node_modules/esbuild": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", - "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz", + "integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==", "dev": true, "hasInstallScript": true, - "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -2965,38 +3055,37 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.2", - "@esbuild/android-arm": "0.24.2", - "@esbuild/android-arm64": "0.24.2", - "@esbuild/android-x64": "0.24.2", - "@esbuild/darwin-arm64": "0.24.2", - "@esbuild/darwin-x64": "0.24.2", - "@esbuild/freebsd-arm64": "0.24.2", - "@esbuild/freebsd-x64": "0.24.2", - "@esbuild/linux-arm": "0.24.2", - "@esbuild/linux-arm64": "0.24.2", - "@esbuild/linux-ia32": "0.24.2", - "@esbuild/linux-loong64": "0.24.2", - "@esbuild/linux-mips64el": "0.24.2", - "@esbuild/linux-ppc64": "0.24.2", - "@esbuild/linux-riscv64": "0.24.2", - "@esbuild/linux-s390x": "0.24.2", - "@esbuild/linux-x64": "0.24.2", - "@esbuild/netbsd-arm64": "0.24.2", - "@esbuild/netbsd-x64": "0.24.2", - "@esbuild/openbsd-arm64": "0.24.2", - "@esbuild/openbsd-x64": "0.24.2", - "@esbuild/sunos-x64": "0.24.2", - "@esbuild/win32-arm64": "0.24.2", - "@esbuild/win32-ia32": "0.24.2", - "@esbuild/win32-x64": "0.24.2" + "@esbuild/aix-ppc64": "0.25.1", + "@esbuild/android-arm": "0.25.1", + "@esbuild/android-arm64": "0.25.1", + "@esbuild/android-x64": "0.25.1", + "@esbuild/darwin-arm64": "0.25.1", + "@esbuild/darwin-x64": "0.25.1", + "@esbuild/freebsd-arm64": "0.25.1", + "@esbuild/freebsd-x64": "0.25.1", + "@esbuild/linux-arm": "0.25.1", + "@esbuild/linux-arm64": "0.25.1", + "@esbuild/linux-ia32": "0.25.1", + "@esbuild/linux-loong64": "0.25.1", + "@esbuild/linux-mips64el": "0.25.1", + "@esbuild/linux-ppc64": "0.25.1", + "@esbuild/linux-riscv64": "0.25.1", + "@esbuild/linux-s390x": "0.25.1", + "@esbuild/linux-x64": "0.25.1", + "@esbuild/netbsd-arm64": "0.25.1", + "@esbuild/netbsd-x64": "0.25.1", + "@esbuild/openbsd-arm64": "0.25.1", + "@esbuild/openbsd-x64": "0.25.1", + "@esbuild/sunos-x64": "0.25.1", + "@esbuild/win32-arm64": "0.25.1", + "@esbuild/win32-ia32": "0.25.1", + "@esbuild/win32-x64": "0.25.1" } }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", "engines": { "node": ">=6" } @@ -3006,7 +3095,6 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -3015,22 +3103,22 @@ } }, "node_modules/eslint": { - "version": "9.17.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.17.0.tgz", - "integrity": "sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==", + "version": "9.23.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.23.0.tgz", + "integrity": "sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.19.0", - "@eslint/core": "^0.9.0", - "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.17.0", - "@eslint/plugin-kit": "^0.2.3", + "@eslint/config-array": "^0.19.2", + "@eslint/config-helpers": "^0.2.0", + "@eslint/core": "^0.12.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.23.0", + "@eslint/plugin-kit": "^0.2.7", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.1", + "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", @@ -3038,7 +3126,7 @@ "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.2.0", + "eslint-scope": "^8.3.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", @@ -3075,11 +3163,10 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.37.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.3.tgz", - "integrity": "sha512-DomWuTQPFYZwF/7c9W2fkKkStqZmBd3uugfqBYLdkZ3Hii23WzZuOLUskGxB8qkSKqftxEeGL1TB2kMhrce0jA==", + "version": "7.37.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.4.tgz", + "integrity": "sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==", "dev": true, - "license": "MIT", "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", @@ -3108,11 +3195,10 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0.tgz", - "integrity": "sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -3121,21 +3207,19 @@ } }, "node_modules/eslint-plugin-react-refresh": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.16.tgz", - "integrity": "sha512-slterMlxAhov/DZO8NScf6mEeMBBXodFUolijDvrtTxyezyLoTQaa73FyYus/VbTdftd8wBgBxPMRk3poleXNQ==", + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.19.tgz", + "integrity": "sha512-eyy8pcr/YxSYjBoqIFSrlbn9i/xvxUFa8CjzAYo9cFjgGXqq1hyjihcpZvxRLalpaWmueWR81xn7vuKmAFijDQ==", "dev": true, - "license": "MIT", "peerDependencies": { "eslint": ">=8.40" } }, "node_modules/eslint-scope": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", - "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", + "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -3152,7 +3236,6 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -3165,7 +3248,6 @@ "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", @@ -3183,7 +3265,6 @@ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -3196,7 +3277,6 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -3209,7 +3289,6 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -3219,11 +3298,76 @@ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, + "node_modules/ethereum-cryptography": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", + "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", + "dependencies": { + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" + } + }, + "node_modules/ethereum-cryptography/node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ethereum-cryptography/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ethereum-cryptography/node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ethereum-cryptography/node_modules/@scure/bip32": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", + "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", + "dependencies": { + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ethereum-cryptography/node_modules/@scure/bip39": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", + "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", + "dependencies": { + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/ethers": { "version": "6.13.5", "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.5.tgz", @@ -3238,7 +3382,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@adraffy/ens-normalize": "1.10.1", "@noble/curves": "1.2.0", @@ -3286,9 +3429,9 @@ "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" }, "node_modules/eventsource-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.0.tgz", - "integrity": "sha512-T1C0XCUimhxVQzW4zFipdx0SficT651NnkR0ZSH3yQwh+mFMdLfgjABVi4YtMTtaL4s168593DaoaRLMqryavA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.1.tgz", + "integrity": "sha512-VARTJ9CYeuQYb0pZEPbzi740OWFgpHe7AYJ2WFZVnUDUQp5Dk2yJUgF36YsZ81cOyxT0QxmXD2EQpapAouzWVA==", "engines": { "node": ">=18.0.0" } @@ -3297,20 +3440,26 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" + "dev": true + }, + "node_modules/fast-equals": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.2.2.tgz", + "integrity": "sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==", + "engines": { + "node": ">=6.0.0" + } }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "license": "MIT", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" @@ -3320,7 +3469,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -3332,21 +3480,18 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/fastq": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz", - "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==", - "license": "ISC", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dependencies": { "reusify": "^1.0.4" } @@ -3356,7 +3501,6 @@ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, - "license": "MIT", "dependencies": { "flat-cache": "^4.0.0" }, @@ -3368,7 +3512,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -3381,7 +3524,6 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -3398,7 +3540,6 @@ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, - "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" @@ -3408,11 +3549,10 @@ } }, "node_modules/flatted": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", - "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", - "dev": true, - "license": "ISC" + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true }, "node_modules/follow-redirects": { "version": "1.15.9", @@ -3434,22 +3574,25 @@ } }, "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "license": "MIT", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dependencies": { - "is-callable": "^1.1.3" + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "license": "ISC", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dependencies": { - "cross-spawn": "^7.0.0", + "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" }, "engines": { @@ -3460,12 +3603,13 @@ } }, "node_modules/form-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", - "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", "mime-types": "^2.1.12" }, "engines": { @@ -3493,7 +3637,6 @@ "version": "4.3.7", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "license": "MIT", "engines": { "node": "*" }, @@ -3507,7 +3650,6 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "hasInstallScript": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -3520,7 +3662,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3530,7 +3671,6 @@ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -3551,7 +3691,6 @@ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3561,28 +3700,25 @@ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/get-intrinsic": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz", - "integrity": "sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==", - "dev": true, - "license": "MIT", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "dunder-proto": "^1.0.0", + "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.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.0.0" + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -3591,12 +3727,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-symbol-description": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", @@ -3613,7 +3760,6 @@ "version": "10.4.5", "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -3633,7 +3779,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -3645,7 +3790,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -3654,7 +3798,6 @@ "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -3666,11 +3809,10 @@ } }, "node_modules/globals": { - "version": "15.14.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.14.0.tgz", - "integrity": "sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==", + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" }, @@ -3683,7 +3825,6 @@ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, - "license": "MIT", "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" @@ -3699,8 +3840,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -3713,7 +3852,6 @@ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -3726,7 +3864,6 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -3735,8 +3872,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, @@ -3749,7 +3884,6 @@ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, - "license": "MIT", "dependencies": { "dunder-proto": "^1.0.0" }, @@ -3764,8 +3898,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -3777,8 +3909,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, @@ -3793,7 +3923,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -3814,17 +3943,15 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, - "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -3841,17 +3968,20 @@ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.19" } }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, "node_modules/internal-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, - "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", @@ -3861,12 +3991,34 @@ "node": ">= 0.4" } }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-array-buffer": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -3880,13 +4032,16 @@ } }, "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "dev": true, - "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -3900,7 +4055,6 @@ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, - "license": "MIT", "dependencies": { "has-bigints": "^1.0.2" }, @@ -3915,7 +4069,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -3924,13 +4077,12 @@ } }, "node_modules/is-boolean-object": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.1.tgz", - "integrity": "sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dev": true, - "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", + "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" }, "engines": { @@ -3944,8 +4096,6 @@ "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -3957,7 +4107,6 @@ "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "license": "MIT", "dependencies": { "hasown": "^2.0.2" }, @@ -3973,7 +4122,6 @@ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", @@ -3991,7 +4139,6 @@ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" @@ -4007,7 +4154,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4017,7 +4163,6 @@ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3" }, @@ -4032,19 +4177,19 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "license": "MIT", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -4057,7 +4202,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -4070,7 +4214,6 @@ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4082,7 +4225,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -4092,7 +4234,6 @@ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" @@ -4108,8 +4249,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", @@ -4128,7 +4267,6 @@ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4141,7 +4279,6 @@ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3" }, @@ -4157,7 +4294,6 @@ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" @@ -4174,7 +4310,6 @@ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", @@ -4191,8 +4326,6 @@ "version": "1.1.15", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "dev": true, - "license": "MIT", "dependencies": { "which-typed-array": "^1.1.16" }, @@ -4208,7 +4341,6 @@ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4217,13 +4349,12 @@ } }, "node_modules/is-weakref": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.0.tgz", - "integrity": "sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dev": true, - "license": "MIT", "dependencies": { - "call-bound": "^1.0.2" + "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -4237,7 +4368,6 @@ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" @@ -4253,14 +4383,20 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isomorphic-ws": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", + "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", + "peerDependencies": { + "ws": "*" + } }, "node_modules/isows": { "version": "1.0.6", @@ -4277,17 +4413,16 @@ } }, "node_modules/iterator.prototype": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.4.tgz", - "integrity": "sha512-x4WH0BWmrMmg4oHHl+duwubhrvczGlyuGAZu3nvrf0UXOfPu8IhZObFEr7DE/iv01YgVZrsOiRcqw2srkKEDIA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", "dev": true, - "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", "has-symbols": "^1.1.0", - "reflect.getprototypeof": "^1.0.8", "set-function-name": "^2.0.2" }, "engines": { @@ -4298,7 +4433,6 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -4313,7 +4447,6 @@ "version": "1.21.7", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "license": "MIT", "bin": { "jiti": "bin/jiti.js" } @@ -4321,15 +4454,13 @@ "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -4342,7 +4473,6 @@ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, - "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, @@ -4354,8 +4484,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/json-schema": { "version": "0.4.0", @@ -4366,21 +4495,18 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -4420,7 +4546,6 @@ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", "dev": true, - "license": "MIT", "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", @@ -4436,7 +4561,6 @@ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, - "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } @@ -4446,7 +4570,6 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, - "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -4459,7 +4582,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "license": "MIT", "engines": { "node": ">=14" }, @@ -4470,15 +4592,13 @@ "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -4489,24 +4609,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "license": "MIT" + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -4519,7 +4641,6 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^3.0.2" } @@ -4528,7 +4649,6 @@ "version": "0.469.0", "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.469.0.tgz", "integrity": "sha512-28vvUnnKQ/dBwiCQtwJw7QauYnE7yd2Cyp4tTTJpvglX4EMpbflcdBgrgToX2j71B3YvugK/NH3BGUk+E/p/Fw==", - "license": "ISC", "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } @@ -4537,8 +4657,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" } @@ -4547,7 +4665,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", "engines": { "node": ">= 8" } @@ -4556,7 +4673,6 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -4589,7 +4705,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -4609,7 +4724,6 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } @@ -4617,14 +4731,12 @@ "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "license": "MIT", "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", @@ -4632,16 +4744,15 @@ } }, "node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -4653,8 +4764,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/node-domexception": { "version": "1.0.0", @@ -4696,14 +4806,12 @@ "node_modules/node-releases": { "version": "2.0.19", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "license": "MIT" + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==" }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4712,7 +4820,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4721,7 +4828,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4730,17 +4836,15 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "license": "MIT", "engines": { "node": ">= 6" } }, "node_modules/object-inspect": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", - "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -4753,7 +4857,6 @@ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" } @@ -4763,7 +4866,6 @@ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -4780,15 +4882,15 @@ } }, "node_modules/object.entries": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", - "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "es-object-atoms": "^1.1.1" }, "engines": { "node": ">= 0.4" @@ -4799,7 +4901,6 @@ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -4818,7 +4919,6 @@ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -4836,7 +4936,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/on-change/-/on-change-4.0.2.tgz", "integrity": "sha512-cMtCyuJmTx/bg2HCpHo3ZLeF7FZnBOapLqZHr2AlLeJ5Ul0Zu2mUJJz051Fdwu/Et2YW04ZD+TtU+gVy0ACNCA==", - "license": "MIT", "peer": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -4846,9 +4945,9 @@ } }, "node_modules/openai": { - "version": "4.80.1", - "resolved": "https://registry.npmjs.org/openai/-/openai-4.80.1.tgz", - "integrity": "sha512-+6+bbXFwbIE88foZsBEt36bPkgZPdyFN82clAXG61gnHb2gXdZApDyRrcAHqEtpYICywpqaNo57kOm9dtnb7Cw==", + "version": "4.90.0", + "resolved": "https://registry.npmjs.org/openai/-/openai-4.90.0.tgz", + "integrity": "sha512-YCuHMMycqtCg1B8G9ezkOF0j8UnBWD3Al/zYaelpuXwU1yhCEv+Y4n9G20MnyGy6cH4GsFwOMrgstQ+bgG1PtA==", "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", @@ -4875,9 +4974,9 @@ } }, "node_modules/openai/node_modules/@types/node": { - "version": "18.19.74", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.74.tgz", - "integrity": "sha512-HMwEkkifei3L605gFdV+/UwtpxP6JSzM+xFk2Ia6DNFSwSVBRh9qp5Tgf4lNFOMfPVuU0WnkcWpXZpgn5ufO4A==", + "version": "18.19.84", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.84.tgz", + "integrity": "sha512-ACYy2HGcZPHxEeWTqowTF7dhXN+JU1o7Gr4b41klnn6pj2LD6rsiGqSZojMdk1Jh2ys3m76ap+ae1vvE4+5+vg==", "dependencies": { "undici-types": "~5.26.4" } @@ -4892,7 +4991,6 @@ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, - "license": "MIT", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -4905,10 +5003,27 @@ "node": ">= 0.8.0" } }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/ox": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/ox/-/ox-0.6.7.tgz", - "integrity": "sha512-17Gk/eFsFRAZ80p5eKqv89a57uXjd3NgIf1CaXojATPBuujVc/fQSVhBeAU9JCRB+k7J50WQAyWTxK19T9GgbA==", + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/ox/-/ox-0.6.9.tgz", + "integrity": "sha512-wi5ShvzE4eOcTwQVsIPdFr+8ycyX+5le/96iAJutaZAvCes1J0+RvpEPg5QDPDiaR0XQQAvZVl7AwqQcINuUug==", "funding": [ { "type": "github", @@ -4963,7 +5078,6 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -4979,7 +5093,6 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -4993,15 +5106,13 @@ "node_modules/package-json-from-dist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "license": "BlueOak-1.0.0" + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -5014,7 +5125,6 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -5023,7 +5133,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", "engines": { "node": ">=8" } @@ -5031,14 +5140,12 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-scurry": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -5053,20 +5160,17 @@ "node_modules/path-scurry/node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", "engines": { "node": ">=8.6" }, @@ -5078,34 +5182,30 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "license": "MIT", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", "engines": { "node": ">= 6" } }, "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true, - "license": "MIT", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", "engines": { "node": ">= 0.4" } }, "node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", "funding": [ { "type": "opencollective", @@ -5120,9 +5220,8 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", + "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -5134,7 +5233,6 @@ "version": "15.1.0", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "license": "MIT", "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", @@ -5151,7 +5249,6 @@ "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "license": "MIT", "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", @@ -5171,7 +5268,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "license": "MIT", "dependencies": { "camelcase-css": "^2.0.1" }, @@ -5200,7 +5296,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "lilconfig": "^3.0.0", "yaml": "^2.3.4" @@ -5235,7 +5330,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "postcss-selector-parser": "^6.1.1" }, @@ -5250,7 +5344,6 @@ "version": "6.1.2", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -5262,15 +5355,13 @@ "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "license": "MIT" + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8.0" } @@ -5279,7 +5370,6 @@ "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", @@ -5292,7 +5382,6 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -5314,14 +5403,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/react": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" }, @@ -5333,7 +5420,6 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -5346,14 +5432,12 @@ "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true, "license": "MIT" }, "node_modules/react-merge-refs": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/react-merge-refs/-/react-merge-refs-2.1.1.tgz", "integrity": "sha512-jLQXJ/URln51zskhgppGJ2ub7b2WFKGq3cl3NYKtlHoTG+dN2q7EzWrn3hN3EgPsTMvpR9tpq5ijdp7YwFZkag==", - "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/gregberge" @@ -5364,16 +5448,14 @@ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-router": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.1.3.tgz", - "integrity": "sha512-EezYymLY6Guk/zLQ2vRA8WvdUhWFEj5fcE3RfWihhxXBW7+cd1LsIiA3lmx+KCmneAGQuyBv820o44L2+TtkSA==", - "license": "MIT", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.4.1.tgz", + "integrity": "sha512-Vmizn9ZNzxfh3cumddqv3kLOKvc7AskUT0dC1prTabhiEi0U4A33LmkDOJ79tXaeSqCqMBXBU/ySX88W85+EUg==", "dependencies": { "@types/cookie": "^0.6.0", "cookie": "^1.0.1", @@ -5394,12 +5476,11 @@ } }, "node_modules/react-router-dom": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.1.3.tgz", - "integrity": "sha512-qQGTE+77hleBzv9SIUIkGRvuFBQGagW+TQKy53UTZAO/3+YFNBYvRsNIZ1GT17yHbc63FylMOdS+m3oUriF1GA==", - "license": "MIT", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.4.1.tgz", + "integrity": "sha512-L3/4tig0Lvs6m6THK0HRV4eHUdpx0dlJasgCxXKnavwhh4tKYgpuZk75HRYNoRKDyDWi9QgzGXsQ1oQSBlWpAA==", "dependencies": { - "react-router": "7.1.3" + "react-router": "7.4.1" }, "engines": { "node": ">=20.0.0" @@ -5409,11 +5490,39 @@ "react-dom": ">=18" } }, + "node_modules/react-smooth": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.4.tgz", + "integrity": "sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==", + "dependencies": { + "fast-equals": "^5.0.1", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "license": "MIT", "dependencies": { "pify": "^2.3.0" } @@ -5422,28 +5531,66 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "license": "MIT", "dependencies": { - "picomatch": "^2.2.1" + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/recharts": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.15.1.tgz", + "integrity": "sha512-v8PUTUlyiDe56qUj82w/EDVuzEFXwEHp9/xOowGAZwfLjB9uAy3GllQVIYMWF6nU+qibx85WF75zD7AjqoT54Q==", + "dependencies": { + "clsx": "^2.0.0", + "eventemitter3": "^4.0.1", + "lodash": "^4.17.21", + "react-is": "^18.3.1", + "react-smooth": "^4.0.4", + "recharts-scale": "^0.4.4", + "tiny-invariant": "^1.3.1", + "victory-vendor": "^36.6.8" }, "engines": { - "node": ">=8.10.0" + "node": ">=14" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/recharts-scale": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz", + "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==", + "dependencies": { + "decimal.js-light": "^2.4.1" } }, + "node_modules/recharts/node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/recharts/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + }, "node_modules/reflect.getprototypeof": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.9.tgz", - "integrity": "sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "dunder-proto": "^1.0.1", - "es-abstract": "^1.23.6", + "es-abstract": "^1.23.9", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "gopd": "^1.2.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" }, "engines": { @@ -5453,16 +5600,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, "node_modules/regexp.prototype.flags": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", - "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "dev": true, - "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", "set-function-name": "^2.0.2" }, "engines": { @@ -5477,7 +5630,6 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, - "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -5495,29 +5647,26 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "license": "MIT", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, "node_modules/rollup": { - "version": "4.29.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.29.1.tgz", - "integrity": "sha512-RaJ45M/kmJUzSWDs1Nnd5DdV4eerC98idtUOVr6FfKcgxqvjwHmxc5upLF9qZU9EpsVzzhleFahrT3shLuJzIw==", + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.38.0.tgz", + "integrity": "sha512-5SsIRtJy9bf1ErAOiFMFzl64Ex9X5V7bnJ+WlFMb+zmP459OSWCEG7b0ERZ+PEU7xPt4OG3RHbrp1LJlXxYTrw==", "dev": true, - "license": "MIT", "dependencies": { - "@types/estree": "1.0.6" + "@types/estree": "1.0.7" }, "bin": { "rollup": "dist/bin/rollup" @@ -5527,25 +5676,26 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.29.1", - "@rollup/rollup-android-arm64": "4.29.1", - "@rollup/rollup-darwin-arm64": "4.29.1", - "@rollup/rollup-darwin-x64": "4.29.1", - "@rollup/rollup-freebsd-arm64": "4.29.1", - "@rollup/rollup-freebsd-x64": "4.29.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.29.1", - "@rollup/rollup-linux-arm-musleabihf": "4.29.1", - "@rollup/rollup-linux-arm64-gnu": "4.29.1", - "@rollup/rollup-linux-arm64-musl": "4.29.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.29.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.29.1", - "@rollup/rollup-linux-riscv64-gnu": "4.29.1", - "@rollup/rollup-linux-s390x-gnu": "4.29.1", - "@rollup/rollup-linux-x64-gnu": "4.29.1", - "@rollup/rollup-linux-x64-musl": "4.29.1", - "@rollup/rollup-win32-arm64-msvc": "4.29.1", - "@rollup/rollup-win32-ia32-msvc": "4.29.1", - "@rollup/rollup-win32-x64-msvc": "4.29.1", + "@rollup/rollup-android-arm-eabi": "4.38.0", + "@rollup/rollup-android-arm64": "4.38.0", + "@rollup/rollup-darwin-arm64": "4.38.0", + "@rollup/rollup-darwin-x64": "4.38.0", + "@rollup/rollup-freebsd-arm64": "4.38.0", + "@rollup/rollup-freebsd-x64": "4.38.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.38.0", + "@rollup/rollup-linux-arm-musleabihf": "4.38.0", + "@rollup/rollup-linux-arm64-gnu": "4.38.0", + "@rollup/rollup-linux-arm64-musl": "4.38.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.38.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.38.0", + "@rollup/rollup-linux-riscv64-gnu": "4.38.0", + "@rollup/rollup-linux-riscv64-musl": "4.38.0", + "@rollup/rollup-linux-s390x-gnu": "4.38.0", + "@rollup/rollup-linux-x64-gnu": "4.38.0", + "@rollup/rollup-linux-x64-musl": "4.38.0", + "@rollup/rollup-win32-arm64-msvc": "4.38.0", + "@rollup/rollup-win32-ia32-msvc": "4.38.0", + "@rollup/rollup-win32-x64-msvc": "4.38.0", "fsevents": "~2.3.2" } }, @@ -5567,7 +5717,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } @@ -5577,7 +5726,6 @@ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", @@ -5592,12 +5740,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-regex-test": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -5614,7 +5776,6 @@ "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" } @@ -5629,7 +5790,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -5638,21 +5798,17 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", - "license": "MIT", "peer": true }, "node_modules/set-cookie-parser": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", - "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", - "license": "MIT" + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==" }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -5670,7 +5826,6 @@ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, - "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -5681,11 +5836,29 @@ "node": ">= 0.4" } }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -5697,7 +5870,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", "engines": { "node": ">=8" } @@ -5707,7 +5879,6 @@ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dev": true, - "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", @@ -5727,7 +5898,6 @@ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "dev": true, - "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" @@ -5744,7 +5914,6 @@ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -5763,7 +5932,6 @@ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -5782,7 +5950,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", "engines": { "node": ">=14" }, @@ -5794,7 +5961,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -5803,7 +5969,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -5821,7 +5986,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -5835,7 +5999,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", "engines": { "node": ">=8" } @@ -5843,14 +6006,12 @@ "node_modules/string-width-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/string-width-cjs/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -5863,7 +6024,6 @@ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", @@ -5891,7 +6051,6 @@ "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", "dev": true, - "license": "MIT", "dependencies": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" @@ -5902,7 +6061,6 @@ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", @@ -5924,7 +6082,6 @@ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", @@ -5943,7 +6100,6 @@ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", @@ -5960,7 +6116,6 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -5976,7 +6131,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -5988,7 +6142,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", "engines": { "node": ">=8" } @@ -6006,7 +6159,6 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -6018,7 +6170,6 @@ "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", @@ -6041,7 +6192,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -6053,7 +6203,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -6062,9 +6211,9 @@ } }, "node_modules/swr": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.0.tgz", - "integrity": "sha512-NyZ76wA4yElZWBHzSgEJc28a0u6QZvhb6w0azeL2k7+Q1gAzVK+IqQYXhVOC/mzi+HZIozrZvBVeSeOZNR2bqA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.3.tgz", + "integrity": "sha512-dshNvs3ExOqtZ6kJBaAsabhPdHyeY4P2cKwRCniDVifBMoG/SVI7tfLWqPXriVspf2Rg4tPzXJTnwaihIeFw2A==", "dependencies": { "dequal": "^2.0.3", "use-sync-external-store": "^1.4.0" @@ -6077,7 +6226,6 @@ "version": "3.4.17", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", - "license": "MIT", "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -6114,7 +6262,6 @@ "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "license": "MIT", "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", @@ -6134,7 +6281,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "license": "MIT", "dependencies": { "any-promise": "^1.0.0" } @@ -6143,7 +6289,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "license": "MIT", "dependencies": { "thenify": ">= 3.1.0 < 4" }, @@ -6165,14 +6310,17 @@ "node_modules/thumbhash": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/thumbhash/-/thumbhash-0.1.1.tgz", - "integrity": "sha512-kH5pKeIIBPQXAOni2AiY/Cu/NKdkFREdpH+TLdM0g6WA7RriCv0kPLgP731ady67MhTAqrVG/4mnEeibVuCJcg==", - "license": "MIT" + "integrity": "sha512-kH5pKeIIBPQXAOni2AiY/Cu/NKdkFREdpH+TLdM0g6WA7RriCv0kPLgP731ady67MhTAqrVG/4mnEeibVuCJcg==" + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -6188,8 +6336,7 @@ "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "license": "Apache-2.0" + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" }, "node_modules/tsconfig-paths": { "version": "4.2.0", @@ -6207,21 +6354,18 @@ "node_modules/tslib": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", - "license": "0BSD" + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" }, "node_modules/turbo-stream": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz", - "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==", - "license": "ISC" + "integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==" }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, - "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -6234,7 +6378,6 @@ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", @@ -6249,7 +6392,6 @@ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", @@ -6269,7 +6411,6 @@ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "dev": true, - "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", @@ -6291,7 +6432,6 @@ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", @@ -6307,12 +6447,24 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/typescript": { + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", + "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "node_modules/unbox-primitive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", @@ -6329,13 +6481,12 @@ "node_modules/undici-types": { "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "license": "MIT" + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" }, "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "funding": [ { "type": "opencollective", @@ -6350,10 +6501,9 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -6367,29 +6517,60 @@ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/use-sync-external-store": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz", - "integrity": "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", + "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dependencies": { + "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" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/victory-vendor": { + "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz", + "integrity": "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } }, "node_modules/viem": { - "version": "2.22.14", - "resolved": "https://registry.npmjs.org/viem/-/viem-2.22.14.tgz", - "integrity": "sha512-HfWnMmSPHNY+F3+I01ZKvIbwdn8qZUEhV/rzBi094F6gmqHA1KBXdF7P9po5/OYkvBjzxduUlLBgownyZkV+uA==", + "version": "2.24.2", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.24.2.tgz", + "integrity": "sha512-lUGoTHhMYlR4ktQiOrbTPmYvrMn3jKUdn2PSmB9QLICxnsQJxMkSCeGRoJFq7hi7K6PCMQgAyLMR/9J1key5cg==", "funding": [ { "type": "github", @@ -6403,8 +6584,8 @@ "@scure/bip39": "1.5.4", "abitype": "1.0.8", "isows": "1.0.6", - "ox": "0.6.7", - "ws": "8.18.0" + "ox": "0.6.9", + "ws": "8.18.1" }, "peerDependencies": { "typescript": ">=5.0.4" @@ -6441,15 +6622,14 @@ } }, "node_modules/vite": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.6.tgz", - "integrity": "sha512-NSjmUuckPmDU18bHz7QZ+bTYhRR0iA72cs2QAxCqDpafJ0S6qetco0LB3WW2OxlMHS0JmAv+yZ/R3uPmMyGTjQ==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.3.tgz", + "integrity": "sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg==", "dev": true, - "license": "MIT", "dependencies": { - "esbuild": "^0.24.2", - "postcss": "^8.4.49", - "rollup": "^4.23.0" + "esbuild": "^0.25.0", + "postcss": "^8.5.3", + "rollup": "^4.30.1" }, "bin": { "vite": "bin/vite.js" @@ -6520,6 +6700,354 @@ "node": ">= 14" } }, + "node_modules/web3": { + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/web3/-/web3-4.16.0.tgz", + "integrity": "sha512-SgoMSBo6EsJ5GFCGar2E/pR2lcR/xmUSuQ61iK6yDqzxmm42aPPxSqZfJz2z/UCR6pk03u77pU8TGV6lgMDdIQ==", + "dependencies": { + "web3-core": "^4.7.1", + "web3-errors": "^1.3.1", + "web3-eth": "^4.11.1", + "web3-eth-abi": "^4.4.1", + "web3-eth-accounts": "^4.3.1", + "web3-eth-contract": "^4.7.2", + "web3-eth-ens": "^4.4.0", + "web3-eth-iban": "^4.0.7", + "web3-eth-personal": "^4.1.0", + "web3-net": "^4.1.0", + "web3-providers-http": "^4.2.0", + "web3-providers-ws": "^4.0.8", + "web3-rpc-methods": "^1.3.0", + "web3-rpc-providers": "^1.0.0-rc.4", + "web3-types": "^1.10.0", + "web3-utils": "^4.3.3", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-4.7.1.tgz", + "integrity": "sha512-9KSeASCb/y6BG7rwhgtYC4CvYY66JfkmGNEYb7q1xgjt9BWfkf09MJPaRyoyT5trdOxYDHkT9tDlypvQWaU8UQ==", + "dependencies": { + "web3-errors": "^1.3.1", + "web3-eth-accounts": "^4.3.1", + "web3-eth-iban": "^4.0.7", + "web3-providers-http": "^4.2.0", + "web3-providers-ws": "^4.0.8", + "web3-types": "^1.10.0", + "web3-utils": "^4.3.3", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + }, + "optionalDependencies": { + "web3-providers-ipc": "^4.0.7" + } + }, + "node_modules/web3-errors": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/web3-errors/-/web3-errors-1.3.1.tgz", + "integrity": "sha512-w3NMJujH+ZSW4ltIZZKtdbkbyQEvBzyp3JRn59Ckli0Nz4VMsVq8aF1bLWM7A2kuQ+yVEm3ySeNU+7mSRwx7RQ==", + "dependencies": { + "web3-types": "^1.10.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-eth": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-4.11.1.tgz", + "integrity": "sha512-q9zOkzHnbLv44mwgLjLXuyqszHuUgZWsQayD2i/rus2uk0G7hMn11bE2Q3hOVnJS4ws4VCtUznlMxwKQ+38V2w==", + "dependencies": { + "setimmediate": "^1.0.5", + "web3-core": "^4.7.1", + "web3-errors": "^1.3.1", + "web3-eth-abi": "^4.4.1", + "web3-eth-accounts": "^4.3.1", + "web3-net": "^4.1.0", + "web3-providers-ws": "^4.0.8", + "web3-rpc-methods": "^1.3.0", + "web3-types": "^1.10.0", + "web3-utils": "^4.3.3", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-eth-abi": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-4.4.1.tgz", + "integrity": "sha512-60ecEkF6kQ9zAfbTY04Nc9q4eEYM0++BySpGi8wZ2PD1tw/c0SDvsKhV6IKURxLJhsDlb08dATc3iD6IbtWJmg==", + "dependencies": { + "abitype": "0.7.1", + "web3-errors": "^1.3.1", + "web3-types": "^1.10.0", + "web3-utils": "^4.3.3", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-eth-abi/node_modules/abitype": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-0.7.1.tgz", + "integrity": "sha512-VBkRHTDZf9Myaek/dO3yMmOzB/y2s3Zo6nVU7yaw1G+TvCHAjwaJzNGN9yo4K5D8bU/VZXKP1EJpRhFr862PlQ==", + "peerDependencies": { + "typescript": ">=4.9.4", + "zod": "^3 >=3.19.1" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, + "node_modules/web3-eth-accounts": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-4.3.1.tgz", + "integrity": "sha512-rTXf+H9OKze6lxi7WMMOF1/2cZvJb2AOnbNQxPhBDssKOllAMzLhg1FbZ4Mf3lWecWfN6luWgRhaeSqO1l+IBQ==", + "dependencies": { + "@ethereumjs/rlp": "^4.0.1", + "crc-32": "^1.2.2", + "ethereum-cryptography": "^2.0.0", + "web3-errors": "^1.3.1", + "web3-types": "^1.10.0", + "web3-utils": "^4.3.3", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-eth-contract": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-4.7.2.tgz", + "integrity": "sha512-3ETqs2pMNPEAc7BVY/C3voOhTUeJdkf2aM3X1v+edbngJLHAxbvxKpOqrcO0cjXzC4uc2Q8Zpf8n8zT5r0eLnA==", + "dependencies": { + "@ethereumjs/rlp": "^5.0.2", + "web3-core": "^4.7.1", + "web3-errors": "^1.3.1", + "web3-eth": "^4.11.1", + "web3-eth-abi": "^4.4.1", + "web3-types": "^1.10.0", + "web3-utils": "^4.3.3", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-eth-contract/node_modules/@ethereumjs/rlp": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-5.0.2.tgz", + "integrity": "sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA==", + "bin": { + "rlp": "bin/rlp.cjs" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/web3-eth-ens": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-4.4.0.tgz", + "integrity": "sha512-DeyVIS060hNV9g8dnTx92syqvgbvPricE3MerCxe/DquNZT3tD8aVgFfq65GATtpCgDDJffO2bVeHp3XBemnSQ==", + "dependencies": { + "@adraffy/ens-normalize": "^1.8.8", + "web3-core": "^4.5.0", + "web3-errors": "^1.2.0", + "web3-eth": "^4.8.0", + "web3-eth-contract": "^4.5.0", + "web3-net": "^4.1.0", + "web3-types": "^1.7.0", + "web3-utils": "^4.3.0", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-eth-iban": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-4.0.7.tgz", + "integrity": "sha512-8weKLa9KuKRzibC87vNLdkinpUE30gn0IGY027F8doeJdcPUfsa4IlBgNC4k4HLBembBB2CTU0Kr/HAOqMeYVQ==", + "dependencies": { + "web3-errors": "^1.1.3", + "web3-types": "^1.3.0", + "web3-utils": "^4.0.7", + "web3-validator": "^2.0.3" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-eth-personal": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-4.1.0.tgz", + "integrity": "sha512-RFN83uMuvA5cu1zIwwJh9A/bAj0OBxmGN3tgx19OD/9ygeUZbifOL06jgFzN0t+1ekHqm3DXYQM8UfHpXi7yDQ==", + "dependencies": { + "web3-core": "^4.6.0", + "web3-eth": "^4.9.0", + "web3-rpc-methods": "^1.3.0", + "web3-types": "^1.8.0", + "web3-utils": "^4.3.1", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-net": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-4.1.0.tgz", + "integrity": "sha512-WWmfvHVIXWEoBDWdgKNYKN8rAy6SgluZ0abyRyXOL3ESr7ym7pKWbfP4fjApIHlYTh8tNqkrdPfM4Dyi6CA0SA==", + "dependencies": { + "web3-core": "^4.4.0", + "web3-rpc-methods": "^1.3.0", + "web3-types": "^1.6.0", + "web3-utils": "^4.3.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-providers-http": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-4.2.0.tgz", + "integrity": "sha512-IPMnDtHB7dVwaB7/mMxAZzyq7d5ezfO1+Vw0bNfAeIi7gaDlJiggp85SdyAfOgov8AMUA/dyiY72kQ0KmjXKvQ==", + "dependencies": { + "cross-fetch": "^4.0.0", + "web3-errors": "^1.3.0", + "web3-types": "^1.7.0", + "web3-utils": "^4.3.1" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-providers-ipc": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-4.0.7.tgz", + "integrity": "sha512-YbNqY4zUvIaK2MHr1lQFE53/8t/ejHtJchrWn9zVbFMGXlTsOAbNoIoZWROrg1v+hCBvT2c9z8xt7e/+uz5p1g==", + "optional": true, + "dependencies": { + "web3-errors": "^1.1.3", + "web3-types": "^1.3.0", + "web3-utils": "^4.0.7" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-providers-ws": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-4.0.8.tgz", + "integrity": "sha512-goJdgata7v4pyzHRsg9fSegUG4gVnHZSHODhNnn6J93ykHkBI1nz4fjlGpcQLUMi4jAMz6SHl9Ibzs2jj9xqPw==", + "dependencies": { + "@types/ws": "8.5.3", + "isomorphic-ws": "^5.0.0", + "web3-errors": "^1.2.0", + "web3-types": "^1.7.0", + "web3-utils": "^4.3.1", + "ws": "^8.17.1" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-rpc-methods": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/web3-rpc-methods/-/web3-rpc-methods-1.3.0.tgz", + "integrity": "sha512-/CHmzGN+IYgdBOme7PdqzF+FNeMleefzqs0LVOduncSaqsppeOEoskLXb2anSpzmQAP3xZJPaTrkQPWSJMORig==", + "dependencies": { + "web3-core": "^4.4.0", + "web3-types": "^1.6.0", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-rpc-providers": { + "version": "1.0.0-rc.4", + "resolved": "https://registry.npmjs.org/web3-rpc-providers/-/web3-rpc-providers-1.0.0-rc.4.tgz", + "integrity": "sha512-PXosCqHW0EADrYzgmueNHP3Y5jcSmSwH+Dkqvn7EYD0T2jcsdDAIHqk6szBiwIdhumM7gv9Raprsu/s/f7h1fw==", + "dependencies": { + "web3-errors": "^1.3.1", + "web3-providers-http": "^4.2.0", + "web3-providers-ws": "^4.0.8", + "web3-types": "^1.10.0", + "web3-utils": "^4.3.3", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-types": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-types/-/web3-types-1.10.0.tgz", + "integrity": "sha512-0IXoaAFtFc8Yin7cCdQfB9ZmjafrbP6BO0f0KT/khMhXKUpoJ6yShrVhiNpyRBo8QQjuOagsWzwSK2H49I7sbw==", + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-4.3.3.tgz", + "integrity": "sha512-kZUeCwaQm+RNc2Bf1V3BYbF29lQQKz28L0y+FA4G0lS8IxtJVGi5SeDTUkpwqqkdHHC7JcapPDnyyzJ1lfWlOw==", + "dependencies": { + "ethereum-cryptography": "^2.0.0", + "eventemitter3": "^5.0.1", + "web3-errors": "^1.3.1", + "web3-types": "^1.10.0", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/web3-validator/-/web3-validator-2.0.6.tgz", + "integrity": "sha512-qn9id0/l1bWmvH4XfnG/JtGKKwut2Vokl6YXP5Kfg424npysmtRLe9DgiNBM9Op7QL/aSiaA0TVXibuIuWcizg==", + "dependencies": { + "ethereum-cryptography": "^2.0.0", + "util": "^0.12.5", + "web3-errors": "^1.2.0", + "web3-types": "^1.6.0", + "zod": "^3.21.4" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -6538,7 +7066,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -6554,7 +7081,6 @@ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "dev": true, - "license": "MIT", "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", @@ -6574,7 +7100,6 @@ "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", "dev": true, - "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", @@ -6602,7 +7127,6 @@ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, - "license": "MIT", "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", @@ -6617,16 +7141,15 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", - "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", - "dev": true, - "license": "MIT", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "for-each": "^0.3.3", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" }, @@ -6642,7 +7165,6 @@ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6651,7 +7173,6 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "license": "MIT", "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -6669,7 +7190,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -6686,7 +7206,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", "engines": { "node": ">=8" } @@ -6694,14 +7213,12 @@ "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/wrap-ansi-cjs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -6715,7 +7232,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -6727,7 +7243,6 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "license": "MIT", "engines": { "node": ">=12" }, @@ -6736,9 +7251,9 @@ } }, "node_modules/ws": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", "engines": { "node": ">=10.0.0" }, @@ -6759,14 +7274,12 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/yaml": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz", - "integrity": "sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==", - "license": "ISC", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", + "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", "bin": { "yaml": "bin.mjs" }, @@ -6779,7 +7292,6 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -6788,18 +7300,17 @@ } }, "node_modules/zod": { - "version": "3.24.1", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.1.tgz", - "integrity": "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==", - "peer": true, + "version": "3.24.2", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz", + "integrity": "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==", "funding": { "url": "https://github.com/sponsors/colinhacks" } }, "node_modules/zod-to-json-schema": { - "version": "3.24.1", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.1.tgz", - "integrity": "sha512-3h08nf3Vw3Wl3PK+q3ow/lIil81IT2Oa7YpQyUUDsEWbXveMesdfK1xBd2RhCkynwZndAxixji/7SYJJowr62w==", + "version": "3.24.5", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.5.tgz", + "integrity": "sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==", "peerDependencies": { "zod": "^3.24.1" } diff --git a/frontend/package.json b/frontend/package.json index 578f515..527c289 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -24,9 +24,11 @@ "react": "^18.3.1", "react-dom": "^18.3.1", "react-router-dom": "^7.1.3", + "recharts": "^2.15.1", "tailwindcss": "^3.4.17", "tsconfig-paths": "^4.2.0", - "viem": "^2.22.14" + "viem": "^2.22.14", + "web3": "^4.16.0" }, "devDependencies": { "@eslint/js": "^9.17.0", diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index e7bbffa..3678e88 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -1,9 +1,11 @@ import React, { useState } from 'react'; import { BrowserRouter as Router, Routes, Route, NavLink } from 'react-router-dom'; import { MessageSquare, TrendingUp, Menu } from 'lucide-react'; -import GeneralChat from './components/GeneralChat'; -import TradingChat from './components/TradingChat'; +import GeneralAI from './components/GeneralChat'; +import DefiChat from './components/DefiChat'; import Homepage from './components/Homepage'; +import TokenPortfolio from './components/TokenPortfolio'; +import IntentAI2 from "./components/TradingChatRSIAlgos.jsx" function App() { const [isMenuOpen, setIsMenuOpen] = useState(false); @@ -14,8 +16,10 @@ function App() {
} /> - } /> - } /> + } /> + } /> + } /> + } />
diff --git a/frontend/src/abi/SimpleIE.json b/frontend/src/abi/SimpleIE.json new file mode 100644 index 0000000..182f366 --- /dev/null +++ b/frontend/src/abi/SimpleIE.json @@ -0,0 +1,166 @@ +[ + { + "type": "fallback", + "stateMutability": "payable" + }, + { + "type": "receive", + "stateMutability": "payable" + }, + { + "type": "function", + "name": "addresses", + "inputs": [ + { + "name": "name", + "type": "string", + "internalType": "string" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "command", + "inputs": [ + { + "name": "intent", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "names", + "inputs": [ + { + "name": "addresses", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "pairs", + "inputs": [ + { + "name": "token0", + "type": "address", + "internalType": "address" + }, + { + "name": "token1", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "send", + "inputs": [ + { + "name": "to", + "type": "string", + "internalType": "string" + }, + { + "name": "amount", + "type": "string", + "internalType": "string" + }, + { + "name": "token", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "swap", + "inputs": [ + { + "name": "amountIn", + "type": "string", + "internalType": "string" + }, + { + "name": "amountOutMin", + "type": "string", + "internalType": "string" + }, + { + "name": "tokenIn", + "type": "string", + "internalType": "string" + }, + { + "name": "tokenOut", + "type": "string", + "internalType": "string" + }, + { + "name": "receiver", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "error", + "name": "InsufficientSwap", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidCharacter", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidSwap", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidSyntax", + "inputs": [] + }, + { + "type": "error", + "name": "Overflow", + "inputs": [] + } + ] \ No newline at end of file diff --git a/frontend/src/components/DefiChat.jsx b/frontend/src/components/DefiChat.jsx new file mode 100644 index 0000000..c6604fd --- /dev/null +++ b/frontend/src/components/DefiChat.jsx @@ -0,0 +1,316 @@ +import React, { useState, useRef, useEffect } from "react"; +import { + Send, + Loader, + Home, + Wallet, +} from "lucide-react"; +import { useNavigate } from "react-router-dom"; +import Spline from "@splinetool/react-spline"; +import { + connectWallet, + fetchTokenBalances, + commandToAave, +} from "../utils/web3functions"; +import config from "../config/config"; + +const DefiChat = () => { + const navigate = useNavigate(); + const chatContainerRef = useRef(null); + const [isLoading, setIsLoading] = useState(false); + const [messages, setMessages] = useState([ + { + type: "bot", + content: "🏦 Welcome to DeFi Assistant! I can help you interact with Aave protocol. You can deposit collateral, borrow assets, repay loans, and withdraw collateral. How can I help you today?", + }, + ]); + const [input, setInput] = useState(""); + const [account, setAccount] = useState(""); + const [balances, setBalances] = useState({}); + + // Auto-scroll chat container + useEffect(() => { + if (chatContainerRef.current) { + chatContainerRef.current.scrollTop = chatContainerRef.current.scrollHeight; + } + }, [messages]); + + const handleConnectWallet = async () => { + try { + const { account } = await connectWallet(); + setAccount(account); + const balancesObj = await fetchTokenBalances(account); + setBalances(balancesObj); + } catch (error) { + console.error("Wallet connection failed:", error); + } + }; + + const handleSend = async () => { + if (!input.trim()) return; + + // Check if wallet is connected + if (!account) { + setMessages((prev) => [ + ...prev, + { type: "bot", content: "Please connect your wallet first to interact with Aave protocol." }, + ]); + return; + } + + // Add user message to chat + const userMessage = { type: "user", content: input }; + setMessages((prev) => [...prev, userMessage]); + setInput(""); + setIsLoading(true); + + try { + // Get all messages for context + const updatedMessages = [...messages, userMessage]; + const prompt = updatedMessages + .map((msg) => `${msg.type === "user" ? "User" : "Assistant"}: ${msg.content}`) + .join("\n"); + + // Use config for backend URL + const NODE_BACKEND_URL = config.NODE_BACKEND_URL; + + // Call backend API for DeFi chat + const response = await fetch(`${NODE_BACKEND_URL}/api/defichat`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + prompt, + balances, + account, + }), + }); + + if (!response.ok) { + throw new Error("Server error"); + } + + const data = await response.json(); + console.log("Response from backend:", data); + + if (!data.response) { + throw new Error("Invalid response from server"); + } + + // Parse the command from the response + let commandObj; + try { + commandObj = JSON.parse(data.response); + console.log("Parsed command object:", commandObj); + } catch (error) { + console.error("Error parsing command:", error); + throw new Error("Invalid command format from server"); + } + + if (!commandObj || (!commandObj.command && !commandObj.message)) { + throw new Error("Invalid command format from server"); + } + + // If it's just a message (no action needed) + if (commandObj.message && !commandObj.command) { + setMessages((prev) => [ + ...prev, + { type: "bot", content: commandObj.message }, + ]); + return; + } + + // Add AI response to chat + setMessages((prev) => [ + ...prev, + { type: "bot", content: `I'll help you with that. Executing: ${commandObj.command}` }, + ]); + + // Execute the DeFi command using the Aave contract + console.log("Executing DeFi command:", commandObj.command); + const tx = await commandToAave(commandObj.command); + console.log("Aave transaction result:", tx); + + // Add success message + setMessages((prev) => [ + ...prev, + { type: "bot", content: `DeFi operation executed successfully! πŸŽ‰\nTransaction hash: ${tx.transactionHash}` }, + ]); + + } catch (error) { + console.error("Error:", error); + let errorMessage = "Something went wrong. Please try again."; + + if (error.message.includes("User denied")) { + errorMessage = "Transaction was rejected in your wallet."; + } else if (error.message.includes("Invalid command format")) { + errorMessage = "Invalid command format received from server."; + } else if (error.message.includes("Server error")) { + errorMessage = "Server is busy. Please try again in a few moments."; + } else if (error.message.includes("insufficient funds")) { + errorMessage = "You don't have enough funds to complete this transaction."; + } else if (error.message.includes("Unsupported token")) { + errorMessage = "The specified token is not supported. Please use DAI, WETH, WBTC, or USDC."; + } else if (error.message.includes("Invalid command format")) { + errorMessage = "Please specify a valid command format. Example: 'deposit 100 usdc' or 'borrow 0.5 weth'"; + } + + setMessages((prev) => [ + ...prev, + { type: "bot", content: errorMessage }, + ]); + } finally { + setIsLoading(false); + } + }; + + const handleKeyPress = (e) => { + if (e.key === "Enter" && !e.shiftKey) { + e.preventDefault(); + handleSend(); + } + }; + + return ( +
+ {/* Background gradients */} +
+
+ + {/* Glowing orbs */} +
+
+ + {/* Left Side - 3D Spline Scene */} +
+
+ {/* Header Badge */} +
+
+
+ +

+ DeFi-Powered β€’ Aave Protocol β€’ Smart Contracts +

+
+
+
+ + {/* Title Section */} +
+

+ + DeFi + + + Assistant + +

+

+ Seamlessly interact with Aave protocol - deposit collateral, borrow assets, + repay loans, and withdraw with AI-powered assistance! +

+
+ + {/* Spline Container */} +
+ +
+
+
+ + {/* Right Side - Chat Interface */} +
+ {/* Header */} +
+
+ +
+

DeFi Assistant

+

Aave Protocol Integration

+
+
+ {!account ? ( + + ) : ( +
+ Connected: {account.slice(0, 6)}...{account.slice(-4)} +
+ )} +
+ + {/* Chat Messages */} +
+ {messages.map((message, index) => ( +
+
+

{message.content}

+
+
+ ))} + {isLoading && ( +
+
+
+ + Processing... +
+
+
+ )} +
+ + {/* Input Area */} +
+
+
+